# HG changeset patch # User hgs # Date 1288087978 -3600 # Node ID 94f2adf59133616aa9b17241fb677ef1316d3dae # Parent 0659d0e1a03c7ab05f9f4dbfa480468e98e09d37 201043_02 diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/group/release.txt --- a/kernel/eka/debug/crashMonitor/group/release.txt Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -# All rights reserved. -# This component and the accompanying materials are made available -# under the terms of the License "Eclipse Public License v1.0" -# which accompanies this distribution, and is available -# at the URL "http://www.eclipse.org/legal/epl-v10.html". -# -# Initial Contributors: -# Nokia Corporation - initial contribution. -# -# Contributors: -# -# Description: -# Version information for crash monitor data -# - -Version 1.00.002 -================= -(Made by XXXX XXXX XX/06/2009) - -1. OliverStuart - 1. MINOR CHANGE: CR1970: Adding missing S60 distribution files and correcting IDs. - 2. MINOR CHANGE: CR1994: Updating incorrect copyright headers. - -Version 1.00.001 -================= -(Made by Vino Jose 09/06/2009) - -1. OliverStuart - 1. MINOR CHANGE: CR1970: Setting correct IDs on S60 distribution policy files. - 2. MINOR CHANGE: CR1994: Replacing Symbian copyright notices with SF notices. - -Version 1.00.000 -================= - -(Made by stephenroberts 17/11/2008) - -1. stephenroberts - MILESTONE: Capari,GT0441,MS3.x,DSx: PREQ1700: Extend core dump server to capture system crash data - Initial release of PREQ1700. The System Crash Monitor and Crash Log Walker supports the following data types: - TCrashOffsetsHeader version 1 - TCrashInfoHeader version 1 - TRawData version 1 - TThreadData version 1 - TThreadStack version 1 - TRegisterValue version 1 - TRegisterSet version 1 - TMemoryDump version 1 - TCodeSegmentSet version 1 - TCodeSegment version 1 - TCodeSegment version 1 - TVariantSpecificData version 1 - TRomHeaderData version 1 - TSCMLockData version 1 - TScmChecksum version 1 \ No newline at end of file diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/group/scmkern_lib.mmp --- a/kernel/eka/debug/crashMonitor/group/scmkern_lib.mmp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32/kernel/scmlib.mmh -// -// - -ALWAYS_BUILD_AS_ARM - -TARGET scmkern_lib.lib -TARGETTYPE klib - -#include "scmlib.mmh" \ No newline at end of file diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/group/scmlib.mmh --- a/kernel/eka/debug/crashMonitor/group/scmlib.mmh Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\kernel\scmlib.mmh -// -// - -USERINCLUDE ../inc -USERINCLUDE ../../../include/nkern -USERINCLUDE ../../../include/kernel - -OS_LAYER_SYSTEMINCLUDE_SYMBIAN -#ifdef SYMBIAN_OLD_EXPORT_LOCATION -SYMBIAN_BASE_SYSTEMINCLUDE(drivers) -#endif - -SOURCEPATH ../src -SOURCE scmdatatypes.cpp -SOURCE scmbytestreamutil.cpp -SOURCE crashlogwalker.cpp -SOURCE scmconfigitem.cpp -SOURCE scmconfig.cpp -SOURCE scmchksum.cpp -SOURCE scmthreaddata.cpp -SOURCE scmprocessdata.cpp -SOURCE scmlockdata.cpp -SOURCE scmvariantdata.cpp -SOURCE scmromdata.cpp -SOURCE scmmulticrashinfo.cpp diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/group/scmonitor.mmp --- a/kernel/eka/debug/crashMonitor/group/scmonitor.mmp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32/kernel/scmonitor.mmp -// -// - -#ifdef EPOC32 - -#define INCLUDE_EKERN_LIB -#include "../../../kernel/kern_int.mmh" - - -targettype kext - -#ifndef SMP - -//userinclude ../../../include/drivers -//userinclude ../../../kernel -//userinclude ../inc - - -sourcepath ../src/arm -source cscmdatasave.cpp - -sourcepath ../src -source scmdatasave.cpp -source scmonitor.cpp - -library exmoncommon.lib -staticlibrary scmkern_lib.lib - - -epocallowdlldata - -noexportlibrary - -linkas scmonitor.dll - -#endif //SMP endif - -#endif //EPOC32 endif - - -//#define SCM_COMM_OUTPUT // use this define for writing debug data to comm port - diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/group/scmusr_lib.mmp --- a/kernel/eka/debug/crashMonitor/group/scmusr_lib.mmp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32/kernel/scmlib.mmp -// -// - -ALWAYS_BUILD_AS_ARM - -TARGET scmusr_lib.lib -TARGETTYPE lib - -#include "scmlib.mmh" \ No newline at end of file diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/inc/crashlogwalker.h --- a/kernel/eka/debug/crashMonitor/inc/crashlogwalker.h Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// some utility classes for writing data to buffer -// -// - -/** - @file - @internalTechnology -*/ -#ifndef __CRASH_LOG_WALKER_H_INCLUDED__ -#define __CRASH_LOG_WALKER_H_INCLUDED__ - -#include - -#include - -namespace Debug - { - - /** - * This class provides functionality to walk through a crash log in a data buffer - * ensuring it is valid and getting the information we require back - */ - class TCrashLogWalker - { - public: - TCrashLogWalker(TDesC8& aBuffer); - - TInt ReadLogHeader(const TInt aStartPoint); - TInt GetCrashSize() const; - TInt GetCrashId() const; - const TRmdArmExcInfo& GetCrashContext() const; - const TCrashInfoHeader& GetCrashHeader() const; - const TCrashOffsetsHeader& GetOffsetsHeader() const; - -#ifndef __KERNEL_MODE__ - MByteStreamSerializable* GetNextDataTypeL(TInt& aPos, SCMStructId& aId, TInt& aBufferSize); - TRawData* GetRawDataTypeL(TInt& aPos, TInt& aBufferSize, TDes8& aRawBuf, TInt aStartRawPosition = 0); -#endif - - void UpdateBuffer(TDesC8& aBuffer); - - private: - - void HelpAssignRegisterToContext(const TRegisterValue& aRegVal); - - private: - TDesC8& iBuffer; //buffer containing data for the log we are walking - not all of it, just the bit of interest - TCrashInfoHeader iCrashHeader; //Stores the header of the log we are walking - TCrashOffsetsHeader iOffsets; //Stores the offsets header of the log we are walking - TRmdArmExcInfo iContext; //Stores the register context of the log we are walking - - TByteStreamReader iReader; - - private: - TInt VerifyHeader(); - - }; - - } - -#endif // __CRASH_LOG_WALKER_H_INCLUDED__ diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/inc/scmbytestreamutil.h --- a/kernel/eka/debug/crashMonitor/inc/scmbytestreamutil.h Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// some utility classes for writing data to buffer -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without notice. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - -/** - @file - @internalTechnology -*/ -#ifndef __SCMBYTESTREAMUTIL_H_ -#define __SCMBYTESTREAMUTIL_H_ - -#include -#include -#include - - -namespace Debug - { - /** - * Base class for byte stream write - simply deals with the supplied buffer & position - */ - class TByteStreamBase - { - public: - TByteStreamBase(TUint8* aBuffer); - virtual void SetPosition(TInt aPosition); - virtual TInt CurrentPosition() const; - - protected: - - /** - * Pointer to the buffer we will use to write/read to - */ - TUint8* iBuffer; - - /** - * Current position in buffer - */ - TInt iPos; - }; - - /** - * Class for reading byte stream - */ - class TByteStreamReader : public TByteStreamBase - { - public: - TByteStreamReader(TUint8* aBuffer); - inline virtual TUint8 ReadByte(); - inline TUint16 ReadShort(); - inline TUint32 ReadInt(); - inline TUint64 ReadInt64(); - }; - - /** - * Class for writing byte stream - */ - class TByteStreamWriter : public TByteStreamBase - { - public: - TByteStreamWriter(TUint8* aBuffer, TBool aPhsEnabled = ETrue); - virtual void WriteByte(TUint8 aValue); - inline void WriteShort(TUint16 aValue); - inline void WriteInt(TUint32 aValue); - inline void WriteInt64(TUint64 aValue); - inline virtual void EnablePhysicalWriting(); - inline virtual void DisablePhysicalWriting(); - inline virtual TBool PhysicalWritingEnabled() const {return iPhysEnabled;}; - inline TInt GetBytesWritten() const {return iBytesWritten;}; - void ResetBytesWritten(); - - protected: - - /** - * This records whether or not physical writing via DoPhysical write from set writer - */ - TBool iPhysEnabled; - - /** - * Records the number of bytes we have written to our buffer - */ - TInt iBytesWritten; - }; - - /** - * This is the interface to write to flash - */ - class MPhysicalWriterImpl - { - public: - virtual void DoPhysicalWrite(TAny* aData,TInt aPos, TInt aLen) = 0; - }; - - - /** - *Class for writing byte stream via cache - */ - class TCachedByteStreamWriter : public TByteStreamWriter - { - public: - - TCachedByteStreamWriter(TUint8* aCacheBuffer, TInt aCacheSize, TBool aPhysEnabled = ETrue); - virtual TInt CurrentPosition() const; - virtual void WriteByte(TUint8 aValue); - virtual TInt FlushCache(); - void SetWriterImpl(MPhysicalWriterImpl* aPhysicalWriter); - TInt GetCacheSize() const {return iCacheSize; }; - - protected: - TInt iCacheSize; - TUint8* iCacheBuffer; - MPhysicalWriterImpl* iPhysicalWriter; - }; - - /** - * Serialization implementation interface - */ - class MByteStreamSerializable - { - public: - virtual TInt Serialize(TByteStreamWriter& aWriter) = 0; - virtual TInt Deserialize(TByteStreamReader& aReader) = 0; - virtual TInt GetSize() const = 0; - }; - } - - -#include - - - -#endif /*BYTESTREAMUTIL_H_*/ diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/inc/scmbytestreamutil.inl --- a/kernel/eka/debug/crashMonitor/inc/scmbytestreamutil.inl Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without noticed. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - -#include - -namespace Debug - { - /** - * TByteStreamReader implementation - */ - - /** - * Returns the next byte from the stream - * @return TUint8 byte requested - */ - inline TUint8 TByteStreamReader::ReadByte() - { - return iBuffer[iPos++]; - } - - /** - * Returns the next short from the stream - * @return TUint16 short requested - */ - inline TUint16 TByteStreamReader::ReadShort() - { - TUint8 b1 = ReadByte(); - TUint8 b2 = ReadByte(); - return (TUint16)(b1 + (b2 << 8)); - } - - /** - * Returns the next TUInt32 from the stream - * @return TUInt32 TUInt32 requested - */ - inline TUint32 TByteStreamReader::ReadInt() - { - TUint16 s1 = ReadShort(); - TUint16 s2 = ReadShort(); - return s1 + (s2 << 16); - } - - /** - * Returns the next TUInt64 from the stream - * @return TUInt64 TUInt64 requested - */ - inline TUint64 TByteStreamReader::ReadInt64() - { - TUint32 high = ReadInt(); - TUint32 low = ReadInt(); - return MAKE_TUINT64(high, low) ; - } - - /** - * TByteStreamWriter implementation - */ - - /** - * Writes a short to the stream - * @param aValue Value to write to stream - */ - inline void TByteStreamWriter::WriteShort(TUint16 aValue) - { - WriteByte((TUint8) aValue); - WriteByte((TUint8) (aValue >> 8)); - } - - /** - * Writes an int to the stream - * @param aValue Value to write to stream - */ - inline void TByteStreamWriter::WriteInt(TUint32 aValue) - { - WriteByte((TUint8)aValue); - WriteByte((TUint8) (aValue >> 8)); - WriteByte((TUint8) (aValue >> 16)); - WriteByte((TUint8) (aValue >> 24)); - } - - /** - * Writes a 64 bit int to the stream - * @param aValue Value to write to stream - */ - inline void TByteStreamWriter::WriteInt64(TUint64 aValue) - { - WriteInt(I64HIGH(aValue)); - WriteInt(I64LOW(aValue)); - } - - /** - * Enables physical writing such that the physical writers DoPhysicalWrite - * method will be invoked upon a write. This may write to a given media - * as defined by the implementation of this method - */ - inline void TByteStreamWriter::EnablePhysicalWriting() - { - iPhysEnabled = ETrue; - } - - /** - * Disables physical writing such that the physical writers DoPhysicalWrite - * method will not be invoked upon a write. - */ - inline void TByteStreamWriter::DisablePhysicalWriting() - { - iPhysEnabled = EFalse; - } - } - - -//eof diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/inc/scmconfig.h --- a/kernel/eka/debug/crashMonitor/inc/scmconfig.h Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ - -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without notice. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - -/** - @file - @internalTechnology -*/ -#ifndef __SCMCONFIG_H_INCLUDED__ -#define __SCMCONFIG_H_INCLUDED__ - - -#include - -#include -#include - -namespace Debug{ - - //Note -- Changing the size of this requires a change in KScmConfigMaxSize - _LIT8(KScmConfigHeaderString, "SCMCONFIG"); - - /** - * This class handles the configuration section of the crash partition. - * It is responsible for reading and writing it - */ - class SCMConfiguration : public MByteStreamSerializable - { - - public: - - //The 9 here refers to the size of KScmConfigHeaderString which is serialised - static const TInt KScmConfigMaxSize = TConfigItem::ELast * sizeof(TConfigItem) + 9; - - SCMConfiguration(); - virtual ~SCMConfiguration(); - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - TConfigItem* GetNextItem(); - TInt SetDefaultConfig(); - - TInt CreateConfigItem(const TConfigItem::TSCMDataType aDataType, const TUint8 aPriority, const TInt32 aSizeToDump); - TInt ModifyConfigItemPriority(const TConfigItem::TSCMDataType aDataType, const TUint8 aPriority); - - void ResetToHighestPriority(); - - TBool operator == (const SCMConfiguration& aOther) const; - - TConfigItem* ConfigList() const; - TInt InsertToList(TConfigItem* aItem); - void ClearList(); - - private: - - /** - * This is an ordered linked list of TConfigItems. The first is the highest priority and so on until the lowest priority - */ - TConfigItem* iConfigList; - - /** - * Everytime GetNextItemToDump is called this moves down along the list - */ - TConfigItem* iNextItem; - - private: - TInt RemoveFromList(TConfigItem* aItem); - - - }; - } - -#endif /*__SCMCONFIG_H_INCLUDED__*/ diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/inc/scmconfigitem.h --- a/kernel/eka/debug/crashMonitor/inc/scmconfigitem.h Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// some utility classes for writing data to flash buffer -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without notice. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - -/** - @file - @internalTechnology -*/ - -#ifndef __SCMCONFIGITEM_H_INCLUDED__ -#define __SCMCONFIGITEM_H_INCLUDED__ - - -#include -#ifndef __KERNEL_MODE__ -#include -#endif // ! __KERNEL_MODE__ - -#include - - -namespace Debug - { - /** - * This object represents a data type to dump - */ - class TConfigItem : public MByteStreamSerializable - { - public: - enum TSCMDataType - { - EExceptionStacks, /**< Dumps exception stacks */ - EVariantSpecificData, /**< Dumps Variant Specific data */ - ERomInfo, /**< Dumps ROM Build Info */ - ELocks, /**< Dumps Kernel Lock Info */ - EKernelHeap, /**< Dumps the Kernel Heap */ - ETraceData, /**< Dumps any trace data we find */ - EProcessCodeSegs, /**< Dumps System wide Code Segments for each Process */ - EThreadsUsrStack, /**< Dumps System wide User Stacks for each thread */ - EThreadsSvrStack, /**< Dumps System wide Supervisor Stacks for each thread */ - EThreadsUsrRegisters, /**< Dumps User Registers available for every thread in the System */ - EThreadsSvrRegisters, /**< Dumps Supervisor Registers available for every thread in the System */ - EProcessMetaData, /**< Dumps the Process List */ - EThreadsMetaData, /**< Dumps the Thread List */ - ECrashedProcessCodeSegs, /**< Dumps the Code Segments for the process that has crashed */ - ECrashedProcessUsrStacks, /**< Dumps the User stacks for each thread in the process that has crashed */ - ECrashedProcessSvrStacks, /**< Dumps the Supervisor stacks for each thread in the process that has crashed */ - ECrashedProcessMetaData, /**< Dumps Info about the process that has crashed */ - ECrashedThreadMetaData, /**< Dumps Info about the Thread that has crashed */ - ELast /**< End Marker */ - }; - - TConfigItem(); - TConfigItem(TSCMDataType aDataType, TUint8 aPriority, TInt32 aSizeToDump); - - TSCMDataType GetDataType() const; - TInt GetPriority() const; - TInt GetSizeToDump() const; - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - void SetSpaceRequired(TUint aSpaceReq); - TUint GetSpaceRequired(); - - void Print() const; - TBool operator == (const TConfigItem& aOther) const; - TConfigItem* Next() const; - -#ifndef __KERNEL_MODE__ - static const TDesC& GetSCMConfigOptionText(TConfigItem::TSCMDataType aType); -#endif // ! __KERNEL_MODE__ - - private: - TSCMDataType iDataType; /** The type this data represents */ - TUint iSizeToDump; /** the size of the data to dump */ - TUint iSpaceRequiredToDump; /** If known, this will contain the size of the data we need to dump */ - TUint8 iPriority; /** Priority of this data (0 is not required) */ - TConfigItem* iNext; /** Next config item in list */ - - friend class SCMConfiguration; - - }; - } - - -#endif // __SCMCONFIGITEM_H_INCLUDED__ diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/inc/scmdatasave.h --- a/kernel/eka/debug/crashMonitor/inc/scmdatasave.h Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,193 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\include\kernel\scmdatasave.h -// Kernel System crash data save header file -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without notice. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - -#ifndef SCMDATASAVE_H -#define SCMDATASAVE_H - -/** - @file - @internalComponent - */ - -#include -#include -#include -#include -#include - -#include -#include -#include - -using namespace Debug; - -IMPORT_C TInt64 CrashTime(); - - -_LIT8(KKernelHeapChunkName, "ekern.exe::SvHeap"); -_LIT8(KKernelProcessName, "ekern.exe"); - - -/** - * This class handles gathering of the kernel data and writing it to flash - * - */ -class SCMDataSave : MPhysicalWriterImpl - { - public: - enum TRegisterSetType - { - EUserRegisters = 0, - ESupervisorRegisters = 1, - EFullCPURegisters = 2, - ERegSetNone = 3, - ERegLast - }; - - enum TStackType - { - EUsrStack = 0, - ESvrStack = 1, - EStackTypeNone = 2, - EStackLast - }; - - enum TDumpScope - { - EThreadSpecific = 0, - EProcessSpecific = 1, - ESystemWide = 2, - EDumpLast - }; - - /** - * This structure defines the type of data we wish to dump for a given kernel object - */ - struct TDataToDump - { - TBool iMetaData; /**< Dump meta data about object */ - TBool iCodeSegs; /**< Dump DProcess code segs (ignored for other objects) */ - TStackType iStk; /**< Dump this stack type */ - TRegisterSetType iReg; /**< Dump this register set */ - - TDataToDump() - { - //upon construction, nothing is set to be dumped - iMetaData = EFalse; - iCodeSegs = EFalse; - iStk = EStackTypeNone; - iReg = ERegSetNone; - } - - }; - - enum TWriteSelect - { - EWriteFlash = 0, /**< write data to flash */ - EWriteComm =1, /**< write data to comm port */ - ELast - }; - - public: - - IMPORT_C SCMDataSave(Monitor* aMonitor, CrashFlash* aFlash); - virtual ~SCMDataSave(); - - - TInt LogCrashHeader(const TDesC8& aCategory, TInt aReason, TInt aCrashId, TUint& aSizeDumped); - TInt LogThreadData(DThread* aThread, TUint& aSizeDumped); - TInt LogProcessData(DProcess* aProcess, TUint& aSizeDumped); - TInt LogCodeSegments(DProcess* aProcess, TUint& aSizeDumped); - - TInt LogThreadUserStack(DThread* aThread, TBool aFullStack, TUint& aSizeDumped); - TInt LogThreadSupervisorStack(DThread* aThread, TBool aFullStack, TUint& aSizeDumped); - - TInt LogRegisters(DThread* aThread, const TRegisterSetType& aRegType, TUint& aSizeDumped); - TInt LogCPURegisters(TUint& aSizeDumped); - TInt ReadUserRegisters(DThread* aThread, TArmRegSet& aRegs, TUint32& aAvailableRegs); - TInt ReadSystemRegisters(DThread* aThread, TArmRegSet& aRegs, TUint32& aAvailableRegs); - void ReadCPURegisters(SFullArmRegSet& aRegs); - - TInt LogMemory(const TUint8* aStartAddress, TInt aLength, const DThread* aThread, TUint& aSizeDumped); - TInt LogExceptionStacks(TUint& aSizeDumped); - TInt LogTraceBuffer(TInt aSizeToDump, TUint& aSizeDumped); - TInt LogLocks(TUint& aSizeDumped); - TInt LogRawData(const TDesC8& aData, TUint& aSizeDumped); - TInt LogVariantSpecificData(TUint& aSizeDumped); - TInt LogRomInfo(TUint& aSizeDumped); - - TInt LogKernelHeap(TUint& aSizeDumped); - TInt FindKernelHeap(TInt32& aHeapLocation, TInt32& aHeapSize); - - TInt LogConfig(SCMConfiguration& aConfig); - TInt ReadConfig(SCMConfiguration& aScmConfig); - - - void Write(const TAny* aSomething, TInt aSize); - static void WriteUart(const TUint8* aData, TInt aSize); - static void WriteUart(const TDesC8& aDes); - virtual void DoPhysicalWrite(TAny* aData, TInt aPos, TInt aLen); - - void WriteCrashFlash(TInt aPos, TInt& aSize, const TDesC8& aBuffer); - - TInt GetRegisterType(const TRegisterSetType& aSetType, TInt32& aRegNumber, TUint32& aRegisterType); - TInt GetByteCount(); - void SetByteCount(TInt aByte); - - - TWriteSelect GetWriteSelect(); - void SetWriteSelect(TWriteSelect aWriteSelect); - - TUint SpaceRemaining(); - TUint MaxLogSize(); - - void SetCrashStartingPoint(TUint32 aStart); - TUint32 GetCrashStartingPoint() {return iStartingPointForCrash;} - - public: - - /** Offsets header to assist parsing */ - TCrashOffsetsHeader iHdr; - - /** Basic crash info */ - TCrashInfoHeader iCrashInf; - - /** Writer for physical writing */ - TCachedByteStreamWriter* iWriter; - - private: - Monitor* iMonitor; //need to use this to map memory and things like that - CrashFlash* iFlash; - TTraceDump iTrace; - - TInt iByteCount; - - //This is a pointer to memory on the heap we can use that is the same size as iFlash.GetFlashBlockSize() - HBuf8* iFlashCache; - - TWriteSelect iWriteSelect; - TBool iPerformChecksum; - TScmChecksum iChecksum; - - TUint32 iStartingPointForCrash; - }; - -#endif /*SCMDATASAVE_H*/ diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/inc/scmdatatypes.h --- a/kernel/eka/debug/crashMonitor/inc/scmdatatypes.h Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,804 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// Definitions for the data types the SCM stores to flash -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without notice. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - - -#ifndef __SCMDATATYPES_H_INCLUDED__ -#define __SCMDATATYPES_H_INCLUDED__ - - -#include - -#include -#include - -/** - @file - @internalComponent - */ - -namespace Debug -{ - /** SCM Data Types Major Number */ - static const TInt KSCMDataTypesMajorVersion = 1; - - /** SCM Data Types Minor Number */ - static const TInt KSCMDataTypesMinorVersion = 0; - - /** SCM Data Types Build Number */ - static const TInt KSCMDataTypesBuildNumber = 0; - - /** - Specifies the type of a code segment. - @see TCodeSegListEntry - */ - enum TCodeSegType - { - EUnknownCodeSegType = 0, /**< Signifies an unknown code segment type. */ - EExeCodeSegType = 1, /**< Signifies a code segment belonging to an executable. */ - EDllCodeSegType = 2 /**< Signifies a code segment belonging to a library. */ - }; - - - /** - Used for storing the contents of a 32 bit register - */ - typedef TUint32 TRegisterValue32; - - /** - Structure containing information about the state of the registers when a - hardware exception occurred - */ - class TRmdArmExcInfo - { - public: - /** Enumeration detailing the types of exception which may occur. */ - enum TExceptionType - { - /** Enumerator signifying that a prefetch abort error has occurred. */ - EPrefetchAbort = 0, - /** Enumerator signifying that a data abort error has occurred. */ - EDataAbort = 1, - /** Enumerator signifying that an undefined instruction error has occurred. */ - EUndef =2 - }; - - /** Value of CPSR. */ - TRegisterValue32 iCpsr; - /** Type of exception which has occurred. */ - TExceptionType iExcCode; - /** Value of R13 supervisor mode banked register. */ - TRegisterValue32 iR13Svc; - /** Value of user mode register R4. */ - TRegisterValue32 iR4; - /** Value of user mode register R5. */ - TRegisterValue32 iR5; - /** Value of user mode register R6. */ - TRegisterValue32 iR6; - /** Value of user mode register R7. */ - TRegisterValue32 iR7; - /** Value of user mode register R8. */ - TRegisterValue32 iR8; - /** Value of user mode register R9. */ - TRegisterValue32 iR9; - /** Value of user mode register R10. */ - TRegisterValue32 iR10; - /** Value of user mode register R11. */ - TRegisterValue32 iR11; - /** Value of R14 supervisor mode banked register. */ - TRegisterValue32 iR14Svc; - /** Address which caused exception (System Control Coprocessor Fault Address Register) */ - TRegisterValue32 iFaultAddress; - /** Value of System Control Coprocessor Fault Status Register. */ - TRegisterValue32 iFaultStatus; - /** Value of SPSR supervisor mode banked register. */ - TRegisterValue32 iSpsrSvc; - /** Value of user mode register R13. */ - TRegisterValue32 iR13; - /** Value of user mode register R14. */ - TRegisterValue32 iR14; - /** Value of user mode register R0. */ - TRegisterValue32 iR0; - /** Value of user mode register R1. */ - TRegisterValue32 iR1; - /** Value of user mode register R2. */ - TRegisterValue32 iR2; - /** Value of user mode register R3. */ - TRegisterValue32 iR3; - /** Value of user mode register R12. */ - TRegisterValue32 iR12; - /** Value of user mode register R15, points to instruction which caused exception. */ - TRegisterValue32 iR15; - }; - /** - * This enum defines the type of struct we are dealing with when we - * are serialising/deserialising - */ - enum SCMStructId - { - ESCMFirst, - ESCMOffsetsHeader, - ESCMTCrashInfo, - ESCMProcessData, - ESCMThreadData, - ESCMThreadStack, - ESCMRegisterValue, - ESCMRegisterSet, - ESCMMemory, - ESCMCodeSegSet, - ESCMCodeSeg, - ESCMRawData, - ESCMTraceData, - ESCMLocks, - ESCMKernelHeap, - ESCMVariantData, - ESCMRomHeader, - ESCMLast - }; - - /** - * This class represents the header at the start of a crash log - * describing the size of the crash log and minimal location - * information - */ - class TCrashOffsetsHeader : public MByteStreamSerializable - { - public: - - static const TInt KSCMCrashOffsetsMaxSize = 20 * sizeof(TUint32) + sizeof(TUint16); - - enum TCrashHeaderVersion - { - EChVersion1 = 1 - }; - - TCrashOffsetsHeader(); - - //From MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - TBool operator == (const TCrashOffsetsHeader& aOther) const; - - SCMStructId iId; - TCrashHeaderVersion iVersion; - - //These next members are offsets to the crash data in the log - TUint32 iCTFullRegOffset; - TUint32 iCTUsrStkOffset; - TUint32 iCTSvrStkOffset; - TUint32 iCPMetaOffset; - TUint32 iCTMetaOffset; - TUint32 iCPCodeSegOffset; - TUint32 iSysUsrStkOffset; - TUint32 iSysSvrStkOffset; - TUint32 iSysUsrRegOffset; - TUint32 iSysSvrRegOffset; - TUint32 iTLstOffset; - TUint32 iPLstOffset; - TUint32 iSysCodeSegOffset; - TUint32 iExcStkOffset; - TUint32 iTraceOffset; - TUint32 iScmLocksOffset; - TUint32 iKernelHeapOffset; - TUint32 iVarSpecInfOffset; - TUint32 iRomInfoOffset; - - TUint32 iSpare1; - TUint32 iSpare2; - TUint32 iSpare3; - TUint32 iSpare4; - TUint32 iSpare5; - TUint32 iSpare6; - - }; - - /** - * This class stores meta data for a given crash - */ - class TCrashInfoHeader : public MByteStreamSerializable - { - public: - - static const TInt KMaxCatSize = 80; - static const TInt KSCMCrashInfoMaxSize = 76 + KMaxCatSize; - - enum TCrashInfoHeaderVersion { ECiVersion1 = 1 }; - TCrashInfoHeader(); - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - TBool operator == (const TCrashInfoHeader& aOther) const; - - - SCMStructId iId; - TCrashInfoHeaderVersion iVersion; - TInt32 iLogSize; - TInt32 iFlashAlign; - TInt32 iCachedWriterSize; - TUint64 iPid; - TUint64 iTid; - TInt32 iExitType; - TInt32 iExitReason; - TInt32 iExcCode; - TInt64 iCrashTime; - TInt32 iCrashId; - TInt32 iFlashBlockSize; - TInt32 iFlashPartitionSize; - TVersion iSCMDataTypesVersion; - TUint32 iCategorySize; - TBuf8 iCategory; - - TInt32 iSpare1; - TInt32 iSpare2; - }; - - /** - * This class is used for a raw memory dump. It will always be preceded by a TMemoryDump. - * - * Note: This class contains a TPtr8 to store the data - * name. Due to us not being able to allocate memory when the system - * is down, we assume that the memory to which this points is owned - * by someone else. It is constructed to point to NULL. To make use - * of this, before serialising the data, ensure to set it to point to - * the location required. Equally, when derserialising, ensure to allocate - * a descriptor of required bytes (determined from TMemoryDump) and set it to iData, otherwise - * the name will be ignored upon reading. - */ - class TRawData : public MByteStreamSerializable - { - public: - - //Note this doesnt include the data, as this number is not determinable - static const TInt KSCMRawDataMaxSize = 2 * sizeof(TUint32) + sizeof(TUint16); - - enum TTRawDataVersion { ETRawData1 = 1 }; - TRawData(); - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - TInt Deserialize(TInt aStartPos, TByteStreamReader& aReader); - - SCMStructId iId; - TTRawDataVersion iVersion; - - TInt32 iLength; - TPtr8 iData; - - }; - - /** - * This class stores meta data for a given process - */ - class TProcessData : public MByteStreamSerializable - { - public: - - static const TInt KSCMProcessDataMaxSize = sizeof(TUint16) + sizeof(TUint64) + 2 * sizeof(TUint32) + KMaxProcessName; - - enum TProcessDataVersion { EProcData1 = 1 }; - TProcessData(); - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - SCMStructId iId; - TProcessDataVersion iVersion; - - TUint64 iPid; - TUint32 iNamesize; //Length of process filename in bytes - TInt32 iPriority; - - TBuf8 iName; - - TInt32 iSpare1; - TInt32 iSpare2; - TInt32 iSpare3; - }; - - /** - * This class stores meta data for a given thread - */ - class TThreadData : public MByteStreamSerializable - { - public: - - static const TInt KMaxThreadName = KMaxProcessName; - static const TInt KSCMThreadDataMaxSize = sizeof(TUint32) + sizeof(TUint16) + 11 * sizeof(TUint32) + 2 * sizeof(TUint64) + KMaxThreadName; - - enum TThreadDataVersion { EThreadData1 = 1 }; - TThreadData(); - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - SCMStructId iId; - TInt32 iVersion; - TInt32 iPriority; - TUint64 iTid; - TUint64 iOwnerId; - TInt32 iSvcSP; - TInt32 iSvcStack; - TInt32 iSvcStacksize; - TInt32 iUsrSP; - TInt32 iUsrStack; - TInt32 iUsrStacksize; - TUint32 iNamesize; - TUint32 iLastCpu; - TInt32 iSvcHeap; - TInt32 iSvcHeapSize; - - TBuf8 iName; - - TInt32 iSpare1; - TInt32 iSpare2; - }; - - /** - * This class stores the stack for a given thread. The type (user or supervisor) is given - * by iStackType. It will be followed by a TMemoryDump containing the stack - */ - class TThreadStack : public MByteStreamSerializable - { - public: - - static const TInt KSCMThreadStackMaxSize = sizeof(TUint32) + sizeof(TUint16) + 2 * sizeof(TUint32) + sizeof(TUint64); - - enum TThreadStackVersion { EStackVersion1 = 1 }; - - enum TThreadStackType - { - EUsrStack, - ESvrStack, - EIRQStack, - EFIQStack, - ELast - }; - - TThreadStack(); - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - SCMStructId iId; - TThreadStackVersion iVersion; - TThreadStackType iStackType; - TUint64 iThreadId; - TUint32 iStackSize; - - TInt32 iSpare1; - TInt32 iSpare2; - }; - - /** - * Stores the value of a given register and tells you its type - */ - class TRegisterValue : public MByteStreamSerializable - { - public: - - static const TInt KSCMRegisterValueMaxSize = sizeof(TUint32) + sizeof(TUint16) + 2 * sizeof(TUint8) + sizeof(TUint16) + sizeof(TUint32) + 2 * sizeof(TUint64); - - TRegisterValue(); - - enum TRegisterValueVersion { ERegisterValueVersion1 = 1 }; - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - SCMStructId iId; - TRegisterValueVersion iVersion; - TInt64 iOwnId; - - /** - * Same as Sym32_reginfod::rd_id - * if rid_class == ESYM_REG_CORE - * rd_id is one of rm_debug_api.h::TFunctionalityRegister - * else - * rd_id is CoProcessor number, eg 15 for ARM CP15 - */ - TUint32 iType; - - TUint8 iClass; //Same as Sym32_reginfod::rid_class - TUint16 iSubId; //used for coprocessors - - /** - * Same as Sym32_reginfod::rd_repre - * ESYM_REG_8 == 0, - * ESYM_REG_16 == 1, - * ESYM_REG_32 == 2, - * ESYM_REG_64 == 3 - */ - TUint8 iSize; //register size - - // Register value - union - { - // Value of an 8 bit register - TUint8 iValue8; - - // Value of a 16 bit register - TUint16 iValue16; - - // Value of a 32 bit register - TUint32 iValue32; - - // Value of a 64 bit register - TUint64 iValue64; - }; - - - }; - - /** - * This class is a header for our register set. - */ - class TRegisterSet : public MByteStreamSerializable - { - public: - - static const TInt KSCMRegisterSetMaxSize = sizeof(TUint32) + sizeof(TUint16) + sizeof(TUint32); - - TRegisterSet(); - - enum TRegisterSetVersion { ETRegisterSetVersion1 = 1 }; - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - TRegisterSetVersion iVersion; - SCMStructId iId; - TInt32 iNumRegisters; - }; - - /** - * This class describes a memory dump and will be followed by a TRawData - */ - class TMemoryDump : public MByteStreamSerializable - { - public: - - static const TInt KSCMMemDumpMaxSize = sizeof(TUint32) + sizeof(TUint16) + 2 * sizeof(TUint32) + sizeof(TUint64); - - enum TMemDumpVersionVersion { EMemDumpVersion1 = 1 }; - - TMemoryDump(); - - //From MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - SCMStructId iId; - TMemDumpVersionVersion iVersion; - TUint32 iStartAddress; - - TInt64 iPid; - TInt32 iLength; - }; - - /** - * class to represent a set of code segs corrosponding to a given process - */ - class TCodeSegmentSet : public MByteStreamSerializable - { - public: - - static const TInt KSCMCodeSegSetMaxSize = KMaxProcessName; - - TCodeSegmentSet(); - - enum TCodeSegmentSetVersion { ETCodeSegmentSetVersion1 = 1 }; - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - TInt GetMaxSize() const; - - SCMStructId iId; /**< Id that uniquely identifies this data */ - TCodeSegmentSetVersion iVersion; /**< Version of this data */ - TInt32 iNumSegs; /**< The number of code segments following this struct that relate to this process ID */ - TInt64 iPid; /**< Process Id that owns the following code segments */ - }; - - /** - * class to represent a code segment in the SCM Log - */ - class TCodeSegment : public MByteStreamSerializable - { - public: - - static const TInt KMaxSegmentNameSize = KMaxProcessName; - - //50 is the sum of the size of members that get serialised - static const TInt KSCMCodeSegMaxSize = 50 + KMaxSegmentNameSize; - - TCodeSegment(); - - enum TCodeSegmentVersion { ETCodeSegmentVersion1 = 1 }; - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - TInt GetMaxSize() const; - - SCMStructId iId; /**< Id that uniquely identifies this data */ - TCodeSegmentVersion iVersion; /**< Version of this data */ - TCodeSegType iCodeSegType; /**< @see TCodeSegType */ - TModuleMemoryInfo iCodeSegMemInfo; /**< holds the memory info for this code segment (8 TUint32's)*/ - TBool iXip; /**< If this code segment is XIP */ - TInt32 iNameLength; /**< Length of the name of this code segment name */ - TBuf8 iName; /**< Name of this code segment */ - - }; - - /** - * This class represents a trace dump in the crash log. It will be immediately followed - * in the crash log by a TRawData structure - */ - class TTraceDump : public MByteStreamSerializable - { - public: - - static const TInt KSCMTraceDumpMaxSize = sizeof(TUint32) + sizeof(TUint16) + 2 * sizeof(TUint32); - - TTraceDump(); - - enum TTraceDumpVersion { ETraceDumpVersion1 = 1 }; - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - SCMStructId iId; /**< Id that uniquely identifies this data */ - TTraceDumpVersion iVersion; /**< Version of this data */ - TInt32 iSizeOfMemory; /**< Size of the trace data that will be dumped in the following Memory Dump */ - TInt32 iNumberOfParts; /**< Number of TRawData structs that will follow */ - - }; - - /** - * This represents variant specific data in the crash log. It will be followed - * immediately by a TRawData that contains the data - */ - class TVariantSpecificData : public MByteStreamSerializable - { - public: - - //sizeof(TUint32) + sizeof(TUint16) + sizeof(TUint32) - static const TInt KSCMVarSpecMaxSize = 10; - - TVariantSpecificData(); - - enum TVariantSpecificDataVersion { EVariantSpecificDataVersion1 = 1 }; - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - SCMStructId iId; /**< Id that uniquely identifies this data */ - TVariantSpecificDataVersion iVersion; /**< Version of this data */ - TUint32 iSize; /**< Size of the raw data (ie the var spec info) that will follow */ - }; - - /** - * This represents the Rom Header Data in the crash Log - */ - class TRomHeaderData : public MByteStreamSerializable - { - public: - - static const TInt KSCMRomHdrMaxSize = sizeof(TUint32) + sizeof(TUint16) + sizeof(TUint64) + 2 * sizeof(TUint8) +sizeof(TUint16); - - TRomHeaderData(); - - enum TRomHeaderDataVersion { ERomHeaderDataVersion1 = 1 }; - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - SCMStructId iId; /**< Id that uniquely identifies this data */ - TRomHeaderDataVersion iVersion; /**< Version of this data */ - TUint8 iMajorVersion; /**< Major Version of ROM build */ - TUint8 iMinorVersion; /**< Minor Version of ROM build */ - TUint16 iBuildNumber; /**< ROM build number */ - TUint64 iTime; /**< Build time of ROM in miliseconds */ - }; - - /** - * This represents the kernel lock info in the crash log - */ - class TSCMLockData : public MByteStreamSerializable - { - public: - - static const TInt KSCMLockDataMaxSize = sizeof(TUint32) + 3 * sizeof(TUint16); - - TSCMLockData(); - - // from MByteStreamSerializable - virtual TInt Serialize(TByteStreamWriter& aWriter); - virtual TInt Deserialize(TByteStreamReader& aReader); - virtual TInt GetSize() const; - - TInt MutexHoldCount() const; - void SetMutexHoldCount(TInt aMutexHoldCount); - - TInt MutexThreadWaitCount() const; - void SetMutexThreadWaitCount(TInt aMutexThreadWaitCount); - - TInt LockCount() const; - void SetLockCount(TInt aLockCount); - - TBool operator == (const TSCMLockData& aOther) const; - TBool operator != (const TSCMLockData& aOther) const; - - private: - SCMStructId iId; - TInt iMutexHoldCount; // if mutex is valid number of holds on the mutex from current thread - TInt iMutexThreadWaitCount; // if mutex is valid number of threads waiting on the mutex - TInt iLockCount; - - }; - - /** - * TScmChecksum class is used to provide a level of sanity checking for the data it processes - * the check sum produced is not intended to be computationally unique - * This implementation has been chosen as there are restrictions in the data may only be available - * in small chunks and the entire data may not be unable to be read (ie comm port implementation) - * These restrictions rule out the use of more sophisticated checksums that produce a checksum value for - * an entire block of data - */ - class TScmChecksum : MByteStreamSerializable - { - public: - TScmChecksum(); - - void ChecksumBlock(const TUint8* aData, TUint aLen); - void ChecksumBlock(const TDesC8& aDes); - TBool operator == (const TScmChecksum& aOther) const; - TBool operator != (const TScmChecksum& aOther) const; - void Reset(); - - // from MByteStreamSerializable - TInt Serialize(TByteStreamWriter& aWriter); - TInt Deserialize(TByteStreamReader& aReader); - TInt GetSize() const; - - private: - /** Total length of all data in bytes*/ - TUint32 iLength; - /** Sum of all bytes*/ - TUint32 iSum; - /** Count of Bytes with value 0*/ - TUint32 iZeroCount; - - }; - - /** class to describe a flash block */ - class SCMCrashBlockEntry - { - public: - - SCMCrashBlockEntry() - : iBlockNumber(0) - , iBlockOffset(0) - , iBlockSize(0) - , iNext(NULL) - { - - } - - SCMCrashBlockEntry(TInt aBlockNumber, TInt aBlockOffset, TInt aBlockSize) - : iBlockNumber(aBlockNumber) - , iBlockOffset(aBlockOffset) - , iBlockSize(aBlockSize) - , iNext(NULL) - { - - } - - /** The offset in bytes to this block from start of flash*/ - TInt iBlockNumber; - /** The offset in bytes to this block from start of flash*/ - TInt iBlockOffset; - /** the size of the flash block in bytes */ - TInt iBlockSize; - /** pointer to next in list*/ - SCMCrashBlockEntry* iNext; - - }; - - /** Because of limitations in flash memory driver available to the - * system crash monitor - this class is used to describe the locations - * on flash where crashes will be stored - * we store 1 crash per block of flash ! This eliminates the - * need to for the scmonitor to hold memory required for bufering write data to flash - * class used to describe locations (typically in flash) - * where - * holds a linked list of SCMCrashBlockEntry which describe an area we can write to - */ - class SCMMultiCrashInfo - { - public: - - /** constructor */ - SCMMultiCrashInfo(); - - /** destructor */ - ~SCMMultiCrashInfo(); - - /** add a pointer to a block to the list - takes ownership of block */ - void AddBlock(SCMCrashBlockEntry* aBlockEntry); - - /** GetNextBlock returns NULL when no more blocks */ - SCMCrashBlockEntry* GetNextBlock(); - - /** sets current block to first in list */ - void Reset(); - - /** clear all entries in the list */ - void ClearList(); - - - private: - SCMCrashBlockEntry* iFirstBlock; - SCMCrashBlockEntry* iCurrentBlock; - TInt iSpare; - }; - - /** - * This constant gives us the maximum size of the Core Crash Header which consists of the Crash Info, the Offsets - * Header and the Core Registers - */ - static const TInt KMaxCoreHeaderSize = TCrashInfoHeader::KSCMCrashInfoMaxSize //Crash Info - always there - + TCrashOffsetsHeader::KSCMCrashOffsetsMaxSize //offsets header - optional - + TRegisterSet::KSCMRegisterSetMaxSize //The crash context - always there - + TRegisterValue::KSCMRegisterValueMaxSize * 37; //could be up to 37 register values - - } - -#endif //__SCMDATATYPES_H_INCLUDED__ - -//eof scmdatatypes.h diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/inc/scmonitor.h --- a/kernel/eka/debug/crashMonitor/inc/scmonitor.h Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\include\kernel\scmonitor.h -// Kernel System crash monitor header file -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without notice. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - -/** - @file - @internalComponent -*/ - -#ifndef __SCMONITOR_H__ -#define __SCMONITOR_H__ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -using namespace Debug; - -class CrashFlash; - -const TInt KFlashAlignment = sizeof(TInt32); - -const TInt KFlashEraseAttempts = 10; -/** - * System crash monitor responsible for writing crash data to flash in - * the event of a crash - */ -class SCMonitor: public Monitor - { - public: - SCMonitor(); - ~SCMonitor(); - - virtual void Print(const TDesC8& aDes); - virtual TInt Init2(TAny* aCategory, TInt aReason); - - void VariantInit(); - TInt InitFlash(); - - void StableConstruction(); - - public: - CrashFlash* iFlash; - - protected: - void DumpVariantSpecific(); - - enum TSysCrashLogState - { - EUndefined = 0 - }; - - - private: - TInt ProcessCrash(const SCMCrashBlockEntry& aBlockEntry, const TUint aCrashId, TBool aCommit); - TInt LogProcessMetaData(SCMDataSave::TDumpScope aDumpScope, TUint& aSizeDumped) const; - TInt LogThreadMetaData(SCMDataSave::TDumpScope aDumpScope, TUint& aSizeDumped) const; - TInt LogObjectContainers(TObjectType aObjectType, SCMDataSave::TDumpScope aDumpScope, const SCMDataSave::TDataToDump& aDataToDump, TUint& aSizeDumped) const; - TInt GetNextCrashStartPoint(SCMCrashBlockEntry& aBlockEntry); - void DoCrash(TAny* aCategory, TInt aReason); - - private: - TInt HelpDumpStacks(DObject* aObject, TObjectType aObjectType, TUint& aSizeDumped, SCMDataSave::TStackType aStkType) const; - TInt HelpDumpMetaData(DObject* aObject, TObjectType aObjectType, TUint& aSizeDumped) const; - TInt EraseFlashBlock(const SCMCrashBlockEntry& aBlock); - TInt EraseEntireFlashPartition(); - - private: - SCMDataSave* iDataSave; - Debug::SCMConfiguration* iScmConfig; - SCMMultiCrashInfo* iMultiCrashInfo; - }; - - - -#endif //__SCMONITOR_H__ -//EOF scmonitor.h diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/inc/scmtrace.h --- a/kernel/eka/debug/crashMonitor/inc/scmtrace.h Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// scmdatatypes.h -// -// WARNING: This file contains some APIs which are internal and are subject -// to change without notice. Such APIs should therefore not be used -// outside the Kernel and Hardware Services package. -// - - -#ifndef __SCMTRACE_H_INCLUDED__ -#define __SCMTRACE_H_INCLUDED__ - -#ifdef _DEBUG - #define __SCMFUNCTIONLOGGING __PRETTY_FUNCTION__ -#else - #define __SCMFUNCTIONLOGGING "" -#endif - -// logger macro -#ifdef __KERNEL_MODE__ - -#include -#include - -#define LOG_CONTEXT //__KTRACE_OPT(KALWAYS, Kern::Printf("Context --> <%s>", __SCMFUNCTIONLOGGING)); -#define CLTRACE(s) __KTRACE_OPT(KDEBUGGER, Kern::Printf(s)); -#define CLTRACE1(s, p1) __KTRACE_OPT(KDEBUGGER, Kern::Printf(s, p1)); -#define CLTRACE2(s, p1, p2) __KTRACE_OPT(KDEBUGGER, Kern::Printf(s, p1, p2)); -#define CLTRACE3(s, p1, p2, p3) __KTRACE_OPT(KDEBUGGER, Kern::Printf(s, p1, p2, p3)); -#define CLTRACE4(s, p1, p2, p3, p4) __KTRACE_OPT(KDEBUGGER, Kern::Printf(s, p1, p2, p3, p4)); -#define CLTRACE5(s, p1, p2, p3, p4, p5) __KTRACE_OPT(KDEBUGGER, Kern::Printf(s, p1, p2, p3, p4, p5)); - -#else - -#include - -#define LOG_CONTEXT RDebug::Printf("Context --> <%s>", __SCMFUNCTIONLOGGING); -#define CLTRACE(s) RDebug::Printf(s) ; -#define CLTRACE1(s, p1) RDebug::Printf(s, p1) ; -#define CLTRACE2(s, p1, p2) RDebug::Printf(s, p1, p2) ; -#define CLTRACE3(s, p1, p2, p3) RDebug::Printf(s, p1, p2, p3); -#define CLTRACE4(s, p1, p2, p3, p4) RDebug::Printf(s, p1, p2, p3, p4); -#define CLTRACE5(s, p1, p2, p3, p4, p5) RDebug::Printf(s, p1, p2, p3, p4, p5); - - -#endif - - -#endif /*__SCMTRACE_H_INCLUDED__*/ diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/arm/cscmdatasave.cpp --- a/kernel/eka/debug/crashMonitor/src/arm/cscmdatasave.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\kernel\arm\cscmdatasave.cpp -// SCM - Arm portion -// -// - -#define __INCLUDE_REG_OFFSETS__ // for SP_R13U in nk_plat.h - - -#include "arm_mem.h" -#include "nk_plat.h" -#include -#include - - -/** - * Reads the CPU registers at the time of the crash - * @param aRegs struct to store the resulting CPU registers - */ -void SCMDataSave::ReadCPURegisters(SFullArmRegSet& aRegs) - { - aRegs =*(SFullArmRegSet*)iMonitor->iRegs; - } - -/** - * Reads the user registers for a given thread - may not be the current thread - * @param aThread thread whose registers we want to read - * @param aRegs registers will be written here if available - * @return KErrArgument if aThread is the current thread or any of the system wide error codes - */ -TInt SCMDataSave::ReadUserRegisters(DThread* aThread, TArmRegSet& aRegs, TUint32& aAvailableRegs) - { - TFileName filename; - aThread->TraceAppendFullName(filename, EFalse); - - //we retrieve the registers differently for the current thread - if(aThread == &Kern::CurrentThread()) - { - return KErrArgument; - } - - TUint32* stackPointer = (TUint32*)aThread->iNThread.iSavedSP; //Still need to check pointer somehow - TUint32* stackTop = (TUint32*)((TUint32)aThread->iNThread.iStackBase +(TUint32)aThread->iNThread.iStackSize); - TArmReg* out = (TArmReg*)(&aRegs); - - //Get a pointer to this threads context table - NThread::TUserContextType type = aThread->iNThread.UserContextType(); - const TArmContextElement* table = aThread->iNThread.UserContextTables()[type]; - - aAvailableRegs = 0; - for(TInt i = 0; iTraceAppendFullName(filename, EFalse); - - TUint32* stackPointer = (TUint32*)aThread->iNThread.iSavedSP; - TUint32* stackTop = (TUint32*)((TUint32)aThread->iNThread.iStackBase +(TUint32)aThread->iNThread.iStackSize); - TArmReg* out = (TArmReg*)(&aRegs); - - //Get a pointer to this threads context table - const TArmContextElement* table = aThread->iNThread.UserContextTables()[NThread::EContextKernel]; - - aAvailableRegs = 0; - for(TInt i = 0; i= stackTop) - continue; - - value = stackPointer[value]; - aAvailableRegs |= (1<iNThread.iStackBase) - continue; - - value = stackTop[-value]; - aAvailableRegs |= (1< -#include -#include -#include -#endif - -#include "scmtrace.h" -#include "crashlogwalker.h" - -namespace Debug - { - /** - * Constructor for log walker - * @param aBuffer The buffer containing the crash data - */ - TCrashLogWalker::TCrashLogWalker(TDesC8& aBuffer) : - iBuffer(aBuffer), - iReader(const_cast(iBuffer.Ptr())) - { - } - - /** - * This reads in the crash header from the buffer from the given start point - * @param aStartPoint Point to begin reading in buffer - * @return One of the OS wide codes - */ - TInt TCrashLogWalker::ReadLogHeader(const TInt aStartPoint) - { - iReader.SetPosition(aStartPoint); - - TInt err = iCrashHeader.Deserialize(iReader); - if(err != KErrNone) - { - CLTRACE("(TCrashLogWalker::ReadLogHeader) - failed to read crash header"); - return KErrCorrupt; - } - - err = iOffsets.Deserialize(iReader); - if(err != KErrNone) - { - CLTRACE("(TCrashLogWalker::ReadLogHeader) - failed to read offsets"); - return KErrCorrupt; - } - - TRegisterSet set; - err = set.Deserialize(iReader); - if(err != KErrNone) - { - CLTRACE("(TCrashLogWalker::ReadLogHeader) - failed to read register set"); - return KErrCorrupt; - } - - for(TInt cnt = 0; cnt < set.iNumRegisters; cnt++) - { - TRegisterValue val; - err = val.Deserialize(iReader); - if(err != KErrNone) - { - CLTRACE1("(TCrashLogWalker::ReadLogHeader) - failed to read TRegisterValue cnt = %d", cnt); - return KErrCorrupt; - } - - HelpAssignRegisterToContext(val); - } - - return VerifyHeader(); - } - - /** - * Getter for the crash context - This is the CPU register set at the time of crash - * @return Crash Context - */ - const TRmdArmExcInfo& TCrashLogWalker::GetCrashContext() const - { - return iContext; - } - - /** - * Returns the crash size for the crash that has just been read, provided the - * reading of the header was succesful. - * @see ReadLogHeader - * @return Crash Log size - */ - TInt TCrashLogWalker::GetCrashSize() const - { - return iCrashHeader.iLogSize; - } - - /** - * Returns the crash ID for the crash that has just been read, provided the - * reading of the header was succesful. - * @see ReadLogHeader - * @return Crash Log ID - */ - TInt TCrashLogWalker::GetCrashId() const - { - return iCrashHeader.iCrashId; - } - - /** - * Looks at the member crash log header and checks that it is valid. - * @see ReadLogHeader - * @return one of the OS wide codes - */ - TInt TCrashLogWalker::VerifyHeader() - { - if(iCrashHeader.iId == ESCMTCrashInfo) - { - CLTRACE("TCrashLogWalker::VerifyHeader() OK"); - return KErrNone; - } - else - { - CLTRACE("TCrashLogWalker::VerifyHeader() FAILED"); - return KErrCorrupt; - } - } - - /** - * Updates the buffer being used by the crash walker and resets reader to use - * the beginning of this - * @param aBuffer New buffer - */ - void TCrashLogWalker::UpdateBuffer(TDesC8& aBuffer) - { - iBuffer = aBuffer; - - //Read from start of this buffer - iReader = TByteStreamReader(const_cast(aBuffer.Ptr())); - } - -#ifndef __KERNEL_MODE__ - /** - * Gets the next data type from the buffer. If this is NULL it means the buffer was too small. - * Call again with a larger buffer. It assumes the buffer contains valid data and leaves with KErrCorrupt - * if it isnt. Note for raw data types, the data will be empty. This should be read with GetRawDataTypeL after reseting the reader to the - * correct position. If you just want to skip a raw data type, move the buffer along the size of (contained in the returned struct) - * - * @see GetRawDataTypeL - * @see UpdateBuffer - * @param aPos Next position that will be read. If we return NULL, this is the position the next buffer should - * begin from - * @param aId ID of the MByteStreamSerializable returned - * @param buffer size to be used the next time. Unchanged if the current buffer is ok - * @return MByteStreamSerializable pointer. Ownership is passed to caller. NULL if failed - * @leave KErrCorrupt if the buffer cant be read - */ - MByteStreamSerializable* TCrashLogWalker::GetNextDataTypeL(TInt& aPos, SCMStructId& aId, TInt& aBufferSize) - { - MByteStreamSerializable* data = NULL; - - TInt roomInBuffer = iBuffer.Length() - iReader.CurrentPosition(); - //make sure we have at LEAST 4 bytes in the buffer - if(roomInBuffer < (TInt)(sizeof(TInt))) - { - aBufferSize = sizeof(TInt); - return NULL; - } - - //this stores the required size in which to deserialize a structure - to make sure - //there is room in the buffer - TInt maxSize = 0; - aPos = iReader.CurrentPosition(); - aBufferSize = iBuffer.Length(); - - //all these data types are defined by their first byte - aId = (SCMStructId)iBuffer.Ptr()[iReader.CurrentPosition()]; - - //ensure we have a valid structure found - if(aId <= 0 || aId >= ESCMLast) - { - //oddness is afoot and the mist of corruption reigns thick - User::Leave(KErrCorrupt); - } - - switch(aId) - { - case ESCMOffsetsHeader: - { - data = new TCrashOffsetsHeader(); - maxSize = TCrashOffsetsHeader::KSCMCrashOffsetsMaxSize; - break; - } - case ESCMTCrashInfo: - { - data = new TCrashInfoHeader(); - maxSize = TCrashInfoHeader::KSCMCrashInfoMaxSize; - break; - } - case ESCMProcessData: - { - data = new TProcessData(); - maxSize = TProcessData::KSCMProcessDataMaxSize; - break; - } - case ESCMThreadData: - { - data = new TThreadData(); - maxSize = TThreadData::KSCMThreadDataMaxSize; - break; - } - case ESCMThreadStack: - { - data = new TThreadStack(); - maxSize = TThreadStack::KSCMThreadStackMaxSize; - break; - } - case ESCMRegisterValue: - { - data = new TRegisterValue(); - maxSize = TRegisterValue::KSCMRegisterValueMaxSize; - break; - } - case ESCMRegisterSet: - { - data = new TRegisterSet(); - maxSize = TRegisterSet::KSCMRegisterSetMaxSize; - break; - } - case ESCMMemory: - { - data = new TMemoryDump(); - maxSize = TMemoryDump::KSCMMemDumpMaxSize; - break; - } - case ESCMCodeSegSet: - { - data = new TCodeSegmentSet(); - maxSize = TCodeSegmentSet::KSCMCodeSegSetMaxSize; - break; - } - case ESCMCodeSeg: - { - data = new TCodeSegment(); - maxSize = TCodeSegment::KMaxSegmentNameSize; - break; - } - case ESCMLocks: - { - data = new TSCMLockData(); - maxSize = TSCMLockData::KSCMLockDataMaxSize; - break; - } - case ESCMVariantData: - { - data = new TVariantSpecificData(); - maxSize = TVariantSpecificData::KSCMVarSpecMaxSize; - break; - } - case ESCMRomHeader: - { - data = new TRomHeaderData(); - maxSize = TRomHeaderData::KSCMRomHdrMaxSize; - break; - } - case ESCMRawData: - { - data = new TRawData(); - - //This is a special case. The data in here can be any length, so we need to deserialise it - //to find this length out. The MAX_SIZE of this class is the max size minus data - //which is fine if we dont assign the TPtr8. - if(TRawData::KSCMRawDataMaxSize > roomInBuffer ) - { - aBufferSize = (maxSize > aBufferSize) ? maxSize : aBufferSize; - - if(data) - delete data; - - return NULL; - } - else - { - data->Deserialize(iReader); - maxSize = data->GetSize(); - - aPos = iReader.CurrentPosition(); - return data; - } - } - case ESCMTraceData: - { - data = new TTraceDump(); - maxSize = TTraceDump::KSCMTraceDumpMaxSize; - break; - } - default : - { - User::Panic(_L("Unexpected Null. Unrecognised Data type from crash log."), KErrGeneral); //Programming error - } - } - - __ASSERT_ALWAYS((data != NULL), User::Panic(_L("Unexpected Null"), KErrGeneral)); - - if(maxSize > roomInBuffer ) - { - //Not enough room in buffer to read this. Tell caller where in the current buffer - //we were via aPos, and what minimum size buffer should be used next time to allow reading - aBufferSize = maxSize; - if(data) - { - delete data; - } - - return NULL; - } - - if(!data) - { - CLTRACE("Unable to create data structure"); - User::Leave(KErrAbort); - } - - data->Deserialize(iReader); - aPos = iReader.CurrentPosition(); - - return data; - } - - /** - * Assuming the next type in the buffer is a TRawData type, this will return the TRawData - * types data pointer pointing to the buffer passed via aRawBuf. - * - * The difference between this call and GetNextDataTypeL is that GetNextDataTypeL only lets you move along the buffer - * it doesnt allow you to specify a buffer in which to store the raw data. - * - * @see GetNextDataTypeL - * @return TRawData* This is the TRawData object that holds the data via the buffer passed in. Ownership is passed to the caller - * @param aPos position in buffer its been found. If we return NULL, this is the position the next buffer should - * begin from - * @param aBufferSize Should we return NULL, that means the descriptor passed in was not big enough and should be of at least aBufferSize bytes - * @param aRawBuf The buffer to store the data refered to by the TRawData returned - * @param aStartRawPosition The point in the raw data at which we will start to put it into the buffer - * @leave One of the OS wide codes - */ - TRawData* TCrashLogWalker::GetRawDataTypeL(TInt& aPos, TInt& aBufferSize, TDes8& aRawBuf, TInt aStartRawPosition) - { - //make sure we have at LEAST the size of the struct in the buffer - if(iBuffer.Length() < TRawData::KSCMRawDataMaxSize) - { - aBufferSize = TRawData::KSCMRawDataMaxSize; - return NULL; - } - - //this stores the required size in which to deserialize a structure - to make sure - //there is room in the buffer - aPos = iReader.CurrentPosition(); - aBufferSize = iBuffer.Length(); - - //all these data types are defined by their first byte - TInt id = (SCMStructId)iBuffer.Ptr()[iReader.CurrentPosition()]; - if(id != ESCMRawData) - { - User::Leave(KErrCorrupt); - } - - //Deserialise once to get the length (this will ignore the data in the absence of a Tptr) - TRawData* data = new TRawData(); - data->Deserialize(iReader); - - //reset reader to where the raw data starts again - iReader.SetPosition(aPos); - - //now we know we have room, deserialize into this descriptor - aRawBuf.SetMax(); - data->iData.Set(aRawBuf.MidTPtr(0)); - User::LeaveIfError(data->Deserialize(aStartRawPosition, iReader)); - - return data; - } - -#endif - - /** - * This is a helper function to convert between the two formats of register - * @param aRegVal Resulting register values - */ - void TCrashLogWalker::HelpAssignRegisterToContext(const TRegisterValue& aRegVal) - { - //only interested in core registers at the moment - if(aRegVal.iClass != 0 || aRegVal.iSize != 2) - { - return; - } - - //Is there a cleverer way to do this with bitmasks and FOFF ? - switch(aRegVal.iType) - { - case 0x0 : - { - iContext.iR0 = aRegVal.iValue32; - break; - } - case 0x100 : - { - iContext.iR1 = aRegVal.iValue32; - break; - } - case 0x200 : - { - iContext.iR2 = aRegVal.iValue32; - break; - } - case 0x300 : - { - iContext.iR3 = aRegVal.iValue32; - break; - } - case 0x400 : - { - iContext.iR4 = aRegVal.iValue32; - break; - } - case 0x500 : - { - iContext.iR5 = aRegVal.iValue32; - break; - } - case 0x600 : - { - iContext.iR6 = aRegVal.iValue32; - break; - } - case 0x700 : - { - iContext.iR7 = aRegVal.iValue32; - break; - } - case 0x800 : - { - iContext.iR8 = aRegVal.iValue32; - break; - } - case 0x900 : - { - iContext.iR9 = aRegVal.iValue32; - break; - } - case 0xa00 : - { - iContext.iR10 = aRegVal.iValue32; - break; - } - case 0xb00 : - { - iContext.iR11 = aRegVal.iValue32; - break; - } - case 0xc00 : - { - iContext.iR12 = aRegVal.iValue32; - break; - } - case 0xd00 : - { - iContext.iR13 = aRegVal.iValue32; - break; - } - case 0xe00 : - { - iContext.iR14 = aRegVal.iValue32; - break; - } - case 0xf00 : - { - iContext.iR15 = aRegVal.iValue32; - break; - } - case 0x1000 : - { - iContext.iCpsr = aRegVal.iValue32; - break; - } - case 0x1100 : - { - iContext.iR13Svc = aRegVal.iValue32; - break; - } - case 0x1200 : - { - iContext.iR14Svc = aRegVal.iValue32; - break; - } - default : - { - return; - } - } - } - - /** - * Getter for crash header - * @return header - */ - const TCrashInfoHeader& TCrashLogWalker::GetCrashHeader() const - { - return iCrashHeader; - } - - /** - * Getter for crash offsets header - * @return header - */ - const TCrashOffsetsHeader& TCrashLogWalker::GetOffsetsHeader() const - { - return iOffsets; - } - - } -//eof - diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmbytestreamutil.cpp --- a/kernel/eka/debug/crashMonitor/src/scmbytestreamutil.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmbytestreamutil.cpp -// some utility classes for writing data to flash buffer -// -// - -/** - @file - @internalTechnology -*/ - - -#include "scmbytestreamutil.h" -#include "scmtrace.h" - - - -namespace Debug - { - /** - * TByteStreamBase Constructor - * @param aBuffer - pointer to buffer that this utility will use - */ - TByteStreamBase::TByteStreamBase(TUint8* aBuffer) - : iBuffer(aBuffer) - , iPos(0) - { - } - - /** - * SetPosition - * @param aBuffer - Sets iPos - * @return void - */ - void TByteStreamBase::SetPosition(TInt aPos) - { - iPos = aPos; - } - - /** - * CurrentPosition - * @param aBuffer - Returns the current value of iPos - * @return Tint - */ - TInt TByteStreamBase::CurrentPosition() const - { - return iPos; - } - - /** - * TByteStreamReader Constructor - * @param aBuffer - pointer to buffer that this utility will use - */ - TByteStreamReader::TByteStreamReader(TUint8* aBuffer) - : TByteStreamBase(aBuffer) - { - } - - - /** - * Constructor for TByteStreamWriter - * @param aBuffer buffer for writing - * @param aPhysEnabled whether or not physical writing to another media is enabled - */ - TByteStreamWriter::TByteStreamWriter(TUint8* aBuffer, TBool aPhysEnabled) - : TByteStreamBase(aBuffer) - , iPhysEnabled(aPhysEnabled) - , iBytesWritten(0) - { - } - - /** - * Writes a byte to the buffer - * @param aValue Byte to write - */ - void TByteStreamWriter::WriteByte(TUint8 aValue) - { - if(iBuffer) - { - iBuffer[iPos++] = aValue; - ++iBytesWritten; - } - } - - /** - * Resets the byte counter back to zero - */ - void TByteStreamWriter::ResetBytesWritten() - { - iBytesWritten = 0; - } - - /** - * TCachedByteStreamWriter Constructor - * @param aBuffer - pointer to buffer that this utility will use - * @param aCacheSize - suggested length of cache to use if greater than EMaxCache - * cache length of EMaxCache will be used - */ - TCachedByteStreamWriter::TCachedByteStreamWriter(TUint8* aCacheBuffer, TInt aCacheSize, TBool aPhysEnabled) - : TByteStreamWriter(NULL, aPhysEnabled) - , iCacheSize(aCacheSize) - , iCacheBuffer(aCacheBuffer) - , iPhysicalWriter(NULL) - { - } - - - /** - * FlushCache - * Writes the contents of the cache to buffer amd/or to physical writer implementation - * if one is currently set - * @return void - */ - TInt TCachedByteStreamWriter::FlushCache() - { - TInt padCount = iCacheSize - iPos; - if(padCount > 0) - { - for(TInt i=0;iDoPhysicalWrite(iCacheBuffer, iBytesWritten, iPos); - } - } - - iPos = 0; - return KErrNone; - } - - /** - * Writes a byte to the cached buffer - * @param aValue Byte to write - */ - void TCachedByteStreamWriter::WriteByte(TUint8 aValue) - { - if(iPos == iCacheSize) - { - FlushCache(); - } - iCacheBuffer[iPos++] = aValue; - ++iBytesWritten; - } - - /** - * CurrentPosition - * @param aBuffer - need to return the position in buffer plus the write pos into cache - * @return Tint - */ - TInt TCachedByteStreamWriter::CurrentPosition() const - { - return iBytesWritten; - } - - /** - * SetWriterImpl - * @param aPhysicalWriter - sets the physical writer implementation to be used when the cache is flushed - * pass NULL to remove a previous writer implementation - * @return void - */ - void TCachedByteStreamWriter::SetWriterImpl(MPhysicalWriterImpl* aPhysicalWriter) - { - iPhysicalWriter = aPhysicalWriter; - } - } - -//eof - diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmchksum.cpp --- a/kernel/eka/debug/crashMonitor/src/scmchksum.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmchksum.cpp -// -// - -/** - @file - @internalTechnology -*/ - -#include - -namespace Debug - { - /** - * Constructor - */ - TScmChecksum::TScmChecksum() - : iLength(0) - , iSum(0) - , iZeroCount(0) - { - } - - /** - * ChecksumBlock - calculate checksum values for given data - * @param aData - the data to checksum - * @param aLen - the length of the data to checksum - * @return void - */ - void TScmChecksum::ChecksumBlock(const TUint8* aData, TUint aLen) - { - /** - * - * Note there is Symbian CRC implementation to be found in the following - * \src\cedar\generic\tools\e32tools\elf2e32\source\checksum.h - * \src\cedar\generic\tools\e32tools\elf2e32\source\checksum.cpp - * this however may be no good to us - * as we need to produce a single checksum even though the entire data may be - * read in different size blocks - and the entire data may not be available - * (the comm port requirement is for read only ) - * If we do however want to use the CRC then this is the place to insert the code - */ - if(!aData) - { - return; - } - - for(TUint i=0;i -#include -#include - -#include -#include -#include - -namespace Debug - { - /** - * SCMConfiguration constructor - * Initialises the configuration object to default values - */ - SCMConfiguration::SCMConfiguration() - : iConfigList(NULL) - { - } - - /** - * SCMConfiguration destructor - */ - SCMConfiguration::~SCMConfiguration() - { - ClearList(); - } - - /** - * Goes to the flash and reads the configuration block and populates the object state - * accordingly - * @return one of the system wide error codes - */ - TInt SCMConfiguration::Deserialize(TByteStreamReader& aReader) - { - if( !iConfigList) - { - // we need to set up a default configuration to load the data into - TInt err = SetDefaultConfig(); - if(err != KErrNone) - { - CLTRACE1("SCMConfiguration::Deserialize SetDefaultConfig failed err = %d", err); - return err; - } - } - - TInt startPos = aReader.CurrentPosition(); - - TBuf8<10> magicNumbers; - // try and read the magic numbers - if they dont exist then - // there is not an scm config there - const TInt KLen = KScmConfigHeaderString().Length(); - for(TInt i=0;iDeserialize(aReader); - item = item->iNext; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("SCMConfiguration::Deserialize size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * This writes the current configuration object state to flash. This configuration will be used on the next crash - * @return one of the system wide error codes - */ - TInt SCMConfiguration::Serialize(TByteStreamWriter& aWriter) - { - if( !iConfigList) - { - CLTRACE("SCMConfiguration::Serialize ERROR - NO LIST!!"); - return KErrNotReady; - } - - TInt startPos = aWriter.CurrentPosition(); - - // write the number of crashes and magic numbers - - // try and read the magic numbers - if they dont exist then - // there is not an scm config there - const TInt KLen = KScmConfigHeaderString().Length(); - const TDesC8& des = KScmConfigHeaderString(); - for(TInt i=0;iSerialize(aWriter); - item = item->iNext; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("SCMConfiguration::Serialize size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns entire size of the SCMConfiguration block - * @return Size - */ - TInt SCMConfiguration::GetSize() const - { - // returns the size of all the config items when serialized to disk / flash - return (TConfigItem::ELast * iConfigList->GetSize()) + KScmConfigHeaderString().Length(); - } - - /** - * This will return, one at a time, the highest priority. - * @see ResetToHighestPriority() - * @param aSizeToDump this will contain the size in bytes of data to dump for this type - 0 means dump all - * @return Data type to dump - */ - TConfigItem* SCMConfiguration::GetNextItem() - { - if(!iNextItem) - { - return NULL; - } - - //get the values we need - TConfigItem* item = iNextItem; - - //Now move iNextItem to be next in the list - iNextItem = iNextItem->iNext; - return item; - } - - /** - * Deletes the linked list - * @return system wide OS code - */ - void SCMConfiguration::ClearList() - { - if(!iConfigList) - { - return; - } - - //all we need to do in here is delete the members of our linked list - TConfigItem* item = iConfigList; - - do{ - TConfigItem* tmp = item->iNext; - delete item; - item = tmp; - } - while(item != NULL); - - iConfigList = NULL; - } - - /** - * Rather than reading the configuration from the flash, this method sets up the configuration object - * to a default configuration type - * @return one of the system wide error codes - */ - TInt SCMConfiguration::SetDefaultConfig() - { - //flush the object first - ClearList(); - - //This is a predefined default config - in the future we may have multiple defaults based on use case - // currently however we use a fixed size list of config items of size TConfigItem::ELast - // also the TSCMDataType of each item must be unique - - for(TInt cnt = TConfigItem::ELast - 1; cnt >= 0; cnt --) - { - TInt priority = cnt + 1; - - //Lets not do these by default - if((TConfigItem::TSCMDataType)cnt == TConfigItem::EThreadsUsrStack || (TConfigItem::TSCMDataType)cnt == TConfigItem::EThreadsSvrStack) - { - priority = 0; - } - - //set it with the priority of its enum (ie. assume that the enum is listed in its priority - it is) - //by default dump everything until we run out of space - TInt err = CreateConfigItem((TConfigItem::TSCMDataType)cnt, priority, 0); - if(KErrNone != err) - { - return err; - } - } - - return KErrNone; - } - - /** - * This configures the required data for a given configuration item - * Note that aSizeToDump is only used in the case of memory dumps such as stacks - * @param aDataType - Type of data to dump - * @param aPriority - its priority 0-256. 0 Means do not dump and 256 is highest priority - * @param aSizeToDump - amount in bytes to dump. Only relevant for memory dumps and ignored when aPriority is 0 - * @return one of the OS wide return codes - */ - TInt SCMConfiguration::CreateConfigItem(const TConfigItem::TSCMDataType aDataType, const TUint8 aPriority, const TInt32 aSizeToDump) - { - //create the config item - TConfigItem* item = new TConfigItem(aDataType, aPriority, aSizeToDump); - - //insert to priority list - return InsertToList(item); - } - - - /** - * ModifyConfigItemPriority - modifies prioity for a given configuration item - * @param aDataType - The unique type of the config item - * @param aPriority - its priority 0-256. 0 Means do not dump and 256 is highest priority - * @return one of the OS wide return codes - */ - TInt SCMConfiguration::ModifyConfigItemPriority(const TConfigItem::TSCMDataType aDataType, const TUint8 aPriority) - { - - // find the item with the matching data type - TConfigItem* item = iConfigList; - while(item) - { - if(item->iDataType == aDataType) - { - break; - } - item = item->iNext; - } - - if(!item) - { - return KErrNotFound; - } - - item->iPriority = aPriority; - - // now reorder the list according to new priority - TInt err = RemoveFromList(item); - if(err != KErrNone) - { - return err; - } - - err = InsertToList(item); - - if(err != KErrNone) - { - return err; - } - - return KErrNone; - } - -/** - * Removes item from the linked list - * @param aItem - item to remove - * @return OS code - */ -TInt SCMConfiguration::RemoveFromList(TConfigItem* aItem) - { - if(!aItem) - { - return KErrArgument; - } - - if(!iConfigList) - { - return KErrCorrupt; // oops no list to remove - } - - - if(aItem == iConfigList) - { - // special case remove from beginning of list - iConfigList = iConfigList->iNext; - return KErrNone; - } - - TConfigItem* item = iConfigList; - while(item) - { - // is the next item the match ? - if(item->iNext == aItem) - { - item->iNext = aItem->iNext; - return KErrNone; - } - item = item->iNext; - } - - return KErrNotFound; - } - -/** - * Inserts a priority item into the linked list in its correct location - * @param aItem - item to insert - * @return OS code - */ -TInt SCMConfiguration::InsertToList(TConfigItem* aItem) - { - - //if the list is empty, then this is the only item - if(!iConfigList) - { - iConfigList = aItem; - return KErrNone; - } - - //should it go at the start? special case not covered by while loop - TConfigItem* temp; - - if(aItem->iPriority >= iConfigList->iPriority) - { - temp = iConfigList; - iConfigList = aItem; - aItem->iNext = temp; - return KErrNone; - } - - TConfigItem* item = iConfigList; - - do{ - //if we get to the end of the list and the item still hasnt been assigned then it must be lowest priority - if(item->iNext == NULL) - { - item->iNext = aItem; - return KErrNone; - } - - //check if its priority is between these - if(aItem->iPriority < item->iPriority && aItem->iPriority >= item->iNext->iPriority) - { - //insert between these nodes - temp = item->iNext; - item->iNext = aItem; - aItem->iNext = temp; - return KErrNone; - } - - item = item->iNext; - } - while(item != NULL); - - //should never get here - return KErrUnknown; - } - -/** - * This resets the next item counter back to the highest priority item in the list - */ -void SCMConfiguration::ResetToHighestPriority() - { - //set the next item counter back to the head of the list - iNextItem = iConfigList; - } - -/** - * Overloaded == operator - * @param aOther Item to compare - * @return - */ -TBool SCMConfiguration::operator == (const SCMConfiguration& aOther) const - { - - if(!iConfigList && !aOther.iConfigList) - { - return ETrue; - } - - if((!iConfigList && aOther.iConfigList) || (iConfigList && !aOther.iConfigList)) - { - return EFalse; - } - - - TConfigItem* item1 = iConfigList; - TConfigItem* item2 = aOther.iConfigList; - - while(item1 && item2) - { - if(!(*item1 == *item2)) - { - return EFalse; - } - - item1 = item1->iNext; - item2 = item2->iNext; - } - - if( item1 != item2) // both should now be null - if not then lists were different lengths - { - return EFalse; - } - - return ETrue; - - } - -/** - * Getter for the head of the SCMConfig list - * @return Head of List - */ -TConfigItem* SCMConfiguration::ConfigList() const - { - // returns the head of the list - return iConfigList; - } -} //End of debug namespace - -//eof - - - - diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmconfigitem.cpp --- a/kernel/eka/debug/crashMonitor/src/scmconfigitem.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,264 +0,0 @@ -// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmconfigitem.cpp -// -// - -/** - @file - @internalTechnology -*/ -#include -#include - -#include -#include -#include - -namespace Debug - { - -/** - * TConfigItem constructor - */ -TConfigItem::TConfigItem() -: iDataType(ELast) -, iSizeToDump(0) -, iSpaceRequiredToDump(0) -, iPriority(0) -, iNext(NULL) - { - } - -/** - * TConfigItem constructor - * @param aDataType - data type id - * @param aSizeToDump - size of the config data - * @param aPriority - priority of this data type (if 0 then not used) - */ -TConfigItem::TConfigItem(TSCMDataType aDataType, TUint8 aPriority, TInt32 aSizeToDump) -: iDataType(aDataType) -, iSizeToDump(aSizeToDump) -, iPriority(aPriority) -, iNext(NULL) - { - } - -/** - * Serialize - writes this object to the supplied byte stream - * @param aItem - aWriter - the TByteStreamWriter that will be written to - * @return one of the OS wide codes - */ -TInt TConfigItem::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - aWriter.WriteByte((TUint8)iDataType); - aWriter.WriteInt(iSizeToDump); - aWriter.WriteByte(iPriority); - - TInt sizeWritten = aWriter.CurrentPosition() - startPos; - if(sizeWritten != GetSize()) - { - // error between actual size & real size in data - CLTRACE2("TConfigItem serialization size error sizeWritten %d GetSize() %d", sizeWritten, GetSize()); - return KErrCorrupt; - } - - return KErrNone; - } - - -/** - * Deserialize - read this objects state from the supplied byte stream - * @param aItem - aReader - the TByteStreamReader that will be read from - * @return One of the OS wide codes - */ -TInt TConfigItem::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iDataType = (TSCMDataType) aReader.ReadByte(); - iSizeToDump = aReader.ReadInt(); - iPriority = aReader.ReadByte(); - - TInt sizeRead = aReader.CurrentPosition() - startPos; - if(sizeRead != GetSize()) - { - // error between actual size & real size in data - CLTRACE("(TConfigItem::Deserialize) ERROR size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - -/** - * GetDataType - * @return data type of this config item - */ - TConfigItem::TSCMDataType TConfigItem::GetDataType() const - { - return iDataType; - } - -/** - * GetPriority - * @return priority of this config item (0-255) - */ -TInt TConfigItem::GetPriority() const - { - return iPriority; - } - -/** - * GetSize - * @return size to dump in bytes - */ -TInt TConfigItem::GetSizeToDump() const - { - return iSizeToDump; - } - -/** - * GetSize - * @return size of this object when streamed in bytes - */ -TInt TConfigItem::GetSize() const - { - return 6; - } - - - -/** - * Returns next item - * @return Next item - */ -TConfigItem* TConfigItem::Next() const - { - return iNext; - } - - /** - * Print - displays info about this TConfigItem - * @return void - */ - void TConfigItem::Print() const - { - CLTRACE3( "(TConfigItem::Print) iDataType = %d iPriority = %d iSizeToDump = %d" - , iDataType, iPriority, iSizeToDump); - } - - TBool TConfigItem::operator == (const TConfigItem& aOther) const - { - return (iDataType == aOther.iDataType && iSizeToDump == aOther.iSizeToDump && iPriority == aOther.iPriority); - } - -/** - * Sets the space required parameter for this config item - * @param aSpaceReq Space required - */ -void TConfigItem::SetSpaceRequired(TUint aSpaceReq) - { - iSpaceRequiredToDump = aSpaceReq; - } - -/** - * Gets the space required to store this config item - * @return - */ -TUint TConfigItem::GetSpaceRequired() - { - return iSpaceRequiredToDump; - } - -#ifndef __KERNEL_MODE__ - -// human readable strings for TSCMDataType -_LIT(KExceptionStacks, "Exception Stacks"); -_LIT(KTraceData, "Trace data"); -_LIT(KProcessCodeSegs, "ProcessCodeSegs"); -_LIT(KThreadsUsrStack, "Threads UserStack"); -_LIT(KThreadsSvrStack, "Threads Supervisor Stack"); -_LIT(KKernelHeap, "Kernel Heap"); -_LIT(KThreadsUsrRegisters, "Threads User Registers"); -_LIT(KThreadsSvrRegisters, "Threads Supervisor Registers"); -_LIT(KProcessMetaData, "Process Meta Data"); -_LIT(KThreadsMetaData, "Threads Meta Data"); -_LIT(KCrashedProcessCodeSegs, "Crashed Process Code Segs"); -_LIT(KCrashedProcessUsrStacks, "Crashed Process' User Stack's"); -_LIT(KCrashedProcessSvrStacks, "Crashed Process' Supervisor Stack's"); -_LIT(KCrashedProcessMetaData, "Crashed Process Meta Data"); -_LIT(KCrashedThreadMetaData, "Crashed Thread Meta Data"); -_LIT(KLocks, "SCM Locks"); -_LIT(KVariantSpecific, "Variant Specific Data"); -_LIT(KRomInfo, "ROM Info"); -_LIT(KUnknown, "Unknown"); - -/** - * helper function for converting TSCMDataType enul to human readable form - */ - const TDesC& TConfigItem::GetSCMConfigOptionText(TConfigItem::TSCMDataType aType) - { - switch (aType) - { - case TConfigItem::EExceptionStacks: - return KExceptionStacks; - case TConfigItem::ETraceData: - return KTraceData; - case TConfigItem::EProcessCodeSegs: - return KProcessCodeSegs(); - case TConfigItem::EThreadsUsrStack: - return KThreadsUsrStack(); - case TConfigItem::EThreadsSvrStack: - return KThreadsSvrStack; - case TConfigItem::EThreadsUsrRegisters: - return KThreadsUsrRegisters(); - case TConfigItem::EThreadsSvrRegisters: - return KThreadsSvrRegisters(); - case TConfigItem::EProcessMetaData: - return KProcessMetaData(); - case TConfigItem::EThreadsMetaData: - return KThreadsMetaData(); - case TConfigItem::ECrashedProcessCodeSegs: - return KCrashedProcessCodeSegs(); - case TConfigItem::ECrashedProcessUsrStacks: - return KCrashedProcessUsrStacks(); - case TConfigItem::ECrashedProcessSvrStacks: - return KCrashedProcessSvrStacks(); - case TConfigItem::ECrashedProcessMetaData: - return KCrashedProcessMetaData(); - case TConfigItem::ECrashedThreadMetaData: - return KCrashedThreadMetaData(); - case TConfigItem::ELocks: - return KLocks(); - case TConfigItem::EKernelHeap: - return KKernelHeap(); - case TConfigItem::EVariantSpecificData: - return KVariantSpecific(); - case TConfigItem::ERomInfo: - return KRomInfo(); - case TConfigItem::ELast: - default: - return KUnknown(); - } - } -#endif // ! __KERNEL_MODE__ -} - -//eof - - diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmdatasave.cpp --- a/kernel/eka/debug/crashMonitor/src/scmdatasave.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1266 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmdatasave.cpp -// -// - -#define __INCLUDE_REG_OFFSETS__ // for SP_R13U in nk_plat.h - -#include -#include "arm_mem.h" -#include "nk_plat.h" -#include -#include -#include - -/** - * @file - * @internal technology - */ - -/** - * SCMDataSave constructor - * @param aMonitor - the monitor which has caught the syetem crash this object is saving data for - * @param aFlash - the flash memory data will be written to, note the CrashFlash interface is - * rather limited and does not support partial block writes - * @param aFlashInfo - data describing the structure of the flash data - */ -EXPORT_C SCMDataSave::SCMDataSave(Monitor* aMonitor, CrashFlash* aFlash) - : iMonitor(aMonitor) - ,iFlash(aFlash) - ,iByteCount(0) -#ifdef SCM_COMM_OUTPUT - ,iWriteSelect(EWriteComm) // write data to debug port -#else - ,iWriteSelect(EWriteFlash) // write data to flash -#endif - ,iPerformChecksum(ETrue) // checksum data - ,iStartingPointForCrash(0) - { - const TInt KCacheSize = 128; - iFlashCache = HBuf8::New(KCacheSize); - CLTRACE1("(SCMDataSave) Creating writer with cache size = %d", KCacheSize); - iWriter = new TCachedByteStreamWriter(const_cast(iFlashCache->Ptr()), KCacheSize); - iWriter->SetWriterImpl(this); - } - -/** - * Destructor - */ -SCMDataSave::~SCMDataSave() - { - delete iFlashCache; - } - -/** - * Getter for the current byte count. This is the amount of data that has currently - * been written to given media for this crash log - * @return The number of bytes written already to given media - */ -TInt SCMDataSave::GetByteCount() - { - return iByteCount; - } - -/** - * Logs the user stack for a given DThread object if it is available - * @param aThread - thread whose stack we wish to log - * @param aSizeDumped Holds the size of the data dumped - * @return one of the OS codes - */ -TInt SCMDataSave::LogThreadUserStack(DThread* aThread, TBool aFullStack, TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - TUint memDumped = 0; - - TUint svSp, usrSp; - iMonitor->GetStackPointers(&(aThread->iNThread), svSp, usrSp ); - - //first we check for a user stack... - if (aThread->iUserStackRunAddress && aThread->iUserStackSize) - { - //Get data together - TThreadStack usrStack; - usrStack.iStackType = TThreadStack::EUsrStack; - usrStack.iThreadId = (TUint64)aThread->iId; - - //map in the user stack - TUint8* usrStart = (TUint8*)iMonitor->MapAndLocateUserStack(aThread); //What about Demand paging?? - TUint8* usrEnd = (TUint8*)(usrStart + aThread->iUserStackSize); - if(usrStart) - { - TUint8* stackPointer = (TUint8*)usrSp; - - //check the stack pointer is in the range of the stack... - if (stackPointer < usrStart || stackPointer >= usrEnd) - { - stackPointer = usrStart; - } - - //log the size of the stack we are dumping - usrStack.iStackSize = aFullStack || (stackPointer == usrStart) ? usrEnd - usrStart : usrEnd - stackPointer; - TUint8* dumpFrom = aFullStack ? usrStart : stackPointer; - - //write the stack - aSizeDumped+= usrStack.GetSize(); - usrStack.Serialize(*iWriter); - - //now we dump the actual stack - //if there is a memErr when we read, there isnt much we can do - possibly a bit in the struct to say available/not available? - //-1 because we dont want to write the byte at usrEnd - MTRAPD(memErr, LogMemory(dumpFrom, usrStack.iStackSize, aThread, memDumped)); - if(KErrNone != memErr) - { - CLTRACE("Failed to log usr stack"); - } - - aSizeDumped+= memDumped; - } - else - { - //write the struct - aSizeDumped+=usrStack.GetSize(); - usrStack.Serialize(*iWriter); - } - } - return KErrNone; - } - -/** - * Logs the supervisor stack for a given DThread object - * @param aThread - thread whose stack we wish to log - * @param aSizeDumped Holds the size of the data dumped - * @return one of the system wide codes - */ -TInt SCMDataSave::LogThreadSupervisorStack(DThread* aThread, TBool aFullStack, TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - TUint memDumped = 0; - - TUint svSp, usrSp; - iMonitor->GetStackPointers(&(aThread->iNThread), svSp, usrSp ); - - //now we dump the supervisor stack - TThreadStack svrStack; - svrStack.iStackType = TThreadStack::ESvrStack; - svrStack.iThreadId = (TUint64)aThread->iId; - - if (aThread->iSupervisorStack && aThread->iSupervisorStackSize) - { - TUint8* svrStart = (TUint8*)aThread->iSupervisorStack; - TUint8* svrEnd = (TUint8*)(svrStart + aThread->iSupervisorStackSize); - TUint8* svrStackPointer = (TUint8*)svSp; - - //size of stack we are to dump - svrStack.iStackSize = aFullStack ? svrEnd - svrStart : svrEnd - svrStackPointer; - - if(svrStart) - { - //check the stack pointer is in the range of the stack... - if (svrStackPointer < svrStart || svrStackPointer >= svrEnd) - { - svrStackPointer = svrStart; - } - - //write struct to flash - aSizeDumped += svrStack.GetSize(); - svrStack.Serialize(*iWriter); - - //now we dump the actual stack - //if there is a memErr when we read, there isnt much we can do - possibly a bit in the struct to say available/not available? - MTRAPD(memErr, LogMemory(svrStart, svrStack.iStackSize, aThread, memDumped)); - aSizeDumped += memDumped; - - if(KErrNone != memErr) - { - CLTRACE("Failed to log supervisor stack"); - } - } - else - { - //write the struct - aSizeDumped += svrStack.GetSize(); - svrStack.Serialize(*iWriter); - } - } - - return KErrNone; - } - -/** - * Takes a DProcess kernel object and logs its corrosponding code segments - * @param aProcess - * @param aSizeDumped Holds the size of the data dumped - * @return one of the OS wide error codes - */ -TInt SCMDataSave::LogCodeSegments(DProcess* aProc, TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - - //the code segment set for this process - TCodeSegmentSet segSet; - segSet.iPid = (TUint64)aProc->iId; - - //make sure list mutex is ok - if(Kern::CodeSegLock()->iHoldCount) - { - return KErrCorrupt; - } - - //get code seg list - SDblQue queue; - aProc->TraverseCodeSegs(&queue, NULL, DCodeSeg::EMarkDebug, DProcess::ETraverseFlagAdd); - - //iterate through the list - TInt codeSegCnt = 0; - for(SDblQueLink* codeSegPtr= queue.First(); codeSegPtr!=(SDblQueLink*) (&queue); codeSegPtr=codeSegPtr->iNext) - { - //get the code seg - DEpocCodeSeg* codeSeg = (DEpocCodeSeg*)_LOFF(codeSegPtr,DCodeSeg, iTempLink); - - if(codeSeg) - { - codeSegCnt++; - } - } - - if(codeSegCnt == 0) - { - return KErrNone; - } - - segSet.iNumSegs = codeSegCnt; - segSet.Serialize(*iWriter); - aSizeDumped+=segSet.GetSize(); - - TModuleMemoryInfo memoryInfo; - - //now we write each code segment - for(SDblQueLink* codeSegPtr= queue.First(); codeSegPtr!=(SDblQueLink*) (&queue); codeSegPtr=codeSegPtr->iNext) - { - //get the code seg - DEpocCodeSeg* codeSeg = (DEpocCodeSeg*)_LOFF(codeSegPtr,DCodeSeg, iTempLink); - - if(codeSeg) - { - TCodeSegment seg; - seg.iXip = (codeSeg->iXIP) ? ETrue : EFalse; - - //Get the code seg type - if(codeSeg->IsExe()) - { - seg.iCodeSegType = EExeCodeSegType; - } - else if(codeSeg->IsDll()) - { - seg.iCodeSegType = EDllCodeSegType; - } - - TInt err = codeSeg->GetMemoryInfo(memoryInfo, NULL); - if(KErrNone == err) - { - seg.iCodeSegMemInfo = memoryInfo; - } - else - { - seg.iCodeSegMemInfo.iCodeSize = 0; - - // Still need to indicate it wasnt available somehow - } - - //Get filename - seg.iNameLength = codeSeg->iFileName->Length(); - seg.iName = *(codeSeg->iFileName); - - aSizeDumped+=seg.GetSize(); - seg.Serialize(*iWriter); - } - } - - //Empty this queue and clear marks - DCodeSeg::EmptyQueue(queue, DCodeSeg::EMarkDebug); - - return KErrNone; - } - -/** - * This logs the rom version and header information to the crash media - * @param aSizeDumped amount of data occupied - * @return one of the OS wide codes - */ -TInt SCMDataSave::LogRomInfo(TUint& aSizeDumped) - { - aSizeDumped = 0; - - TRomHeaderData romData; - - TRomHeader rHdr = Epoc::RomHeader(); - - romData.iMajorVersion = rHdr.iVersion.iMajor; - romData.iMinorVersion = rHdr.iVersion.iMinor; - romData.iBuildNumber = rHdr.iVersion.iBuild; - romData.iTime = rHdr.iTime; - - TInt err = romData.Serialize(*iWriter); - if(KErrNone != err) - { - return err; - } - - aSizeDumped += romData.GetSize(); - - return KErrNone; - } - -/** - * Takes a DProcess kernel object and logs to flash - * @param aProc - * @param aSizeDumped Holds the size of the data dumped - * @return one of the OS wide error codes - */ -TInt SCMDataSave::LogProcessData(DProcess* aProc, TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - - TProcessData procData; - DCodeSeg* codeSeg = aProc->iCodeSeg; - - procData.iPriority = aProc->iPriority; - procData.iPid = (TUint64)aProc->iId; - - //the code segment is not always available - if(codeSeg) - { - procData.iNamesize = codeSeg->iFileName->Length(); - procData.iName = *(codeSeg->iFileName); - } - - aSizeDumped += procData.GetSize(); - procData.Serialize(*iWriter); - - return KErrNone; - } - -/** - * Creates meta data about the crash such as time of crash, exit reason etc. to be logged - * later on when we have log size. - * @param aCategory - crash category - * @param aReason - crash reason - * @param aSizeDumped Holds the size of the data dumped - * @return one of the OS wide codes - */ -TInt SCMDataSave::LogCrashHeader(const TDesC8& aCategory, TInt aReason, TInt aCrashId, TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - - //the thread that crashed is the context in which we are running - DThread* crashedThread = &Kern::CurrentThread(); - - iCrashInf.iPid = crashedThread->iOwningProcess->iId; - iCrashInf.iTid = crashedThread->iId; - iCrashInf.iCrashTime = CrashTime(); - iCrashInf.iExitType = 0; // Not yet done: Exception or Fault - should be in category - iCrashInf.iExitReason = aReason; - iCrashInf.iFlashAlign = KFlashAlignment; //record the flash alignment (word aligned for now) - iCrashInf.iCachedWriterSize = iWriter->GetCacheSize(); - - iCrashInf.iCategorySize = aCategory.Length(); - iCrashInf.iCategory = aCategory; - iCrashInf.iCrashId = aCrashId; - - iCrashInf.iFlashBlockSize = KCrashLogBlockSize;; - iCrashInf.iFlashPartitionSize = KCrashLogSize;; - - TSuperPage& sp=Kern::SuperPage(); - iCrashInf.iExcCode = sp.iKernelExcId; - - //These will be updated with more info at end of crash - aSizeDumped+=iCrashInf.GetSize(); - iCrashInf.Serialize(*iWriter); - - aSizeDumped+=iHdr.GetSize(); - iHdr.Serialize(*iWriter); - - CLTRACE1("(SCMDataSave::LogCrashHeader) finished bytes written= %d", iWriter->GetBytesWritten()); - return KErrNone; - } - -/** - * Logs meta data about a given DThread object - * @param aThread Thread to dump - * @param aSizeDumped Holds the size of the data dumped - * @return - */ -TInt SCMDataSave::LogThreadData(DThread* aThread, TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - - //struct to hold data that gets written to flash - TThreadData threadData; - - threadData.iTid = (TUint64)aThread->iId; - threadData.iOwnerId = (TUint64)aThread->iOwningProcess->iId; - threadData.iPriority = aThread->iThreadPriority; - - //Get the stack pointers - TUint svSp, usrSp; - iMonitor->GetStackPointers(&(aThread->iNThread), svSp, usrSp ); - threadData.iUsrSP = usrSp; - threadData.iSvcSP = svSp; - - //supervisor and user stack details - threadData.iSvcStack = (TInt32)aThread->iSupervisorStack; - threadData.iSvcStacksize = aThread->iSupervisorStackSize; - threadData.iUsrStack = aThread->iUserStackRunAddress; - threadData.iUsrStacksize = aThread->iUserStackSize; - - //currently we can only get the kernels heap - if(aThread == &Kern::CurrentThread()) - { - TInt32 heapLoc = 0; - TInt32 heapSz = 0; - TInt err = FindKernelHeap(heapLoc,heapSz); - if(KErrNone == err) - { - threadData.iSvcHeap = heapLoc; - threadData.iSvcHeapSize = heapSz; - } - else - { - CLTRACE("\tError: Unable to get kernel heap"); - } - } - - //get filename - TFileName filename; - aThread->TraceAppendFullName(filename, EFalse); - - threadData.iName.Copy(filename); - threadData.iNamesize = threadData.iName.Length(); - - -#ifdef __INCLUDE_NTHREADBASE_DEFINES__ - threadData.iLastCpu = aThread->iNThread.iLastCpu; -#else - threadData.iLastCpu = aThread->iNThread.iSpare3; -#endif - - threadData.Serialize(*iWriter); - aSizeDumped+=threadData.GetSize(); - - return KErrNone; - } - -/** - * Logs the arm exception stacks - * @param aSizeDumped Holds the size of the data dumped - * @return one of the OS wide codes - */ -TInt SCMDataSave::LogExceptionStacks(TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - TUint memDumped = 0; - - #if defined(__EPOC32__) && !defined(__CPU_X86) - - TStackInfo& stackInfo = Kern::SuperPage().iStackInfo; - - TThreadStack irqStack; - irqStack.iStackType = TThreadStack::EIRQStack; - irqStack.iStackSize = stackInfo.iIrqStackSize; - - aSizeDumped+=irqStack.GetSize(); - irqStack.Serialize(*iWriter); - - //now dump the IRQ memory - not much we can do in the event of an error - MTRAPD(irqErr, LogMemory((TUint8*)stackInfo.iIrqStackBase, stackInfo.iIrqStackSize, &Kern::CurrentThread(), memDumped)); - - if(KErrNone != irqErr) - { - CLTRACE("*****Failed to log IRQ stack"); - } - aSizeDumped+=memDumped; - - //Next, we do the FIQ stack - TThreadStack fiqStack; - fiqStack.iStackType = TThreadStack::EFIQStack; - fiqStack.iStackSize = stackInfo.iFiqStackSize; - - aSizeDumped+=fiqStack.GetSize(); - fiqStack.Serialize(*iWriter); - - //Now dump the stack itself - MTRAPD(fiqErr, LogMemory((TUint8*)stackInfo.iFiqStackBase, stackInfo.iFiqStackSize, &Kern::CurrentThread(), memDumped)); - - if(KErrNone != fiqErr ) - { - CLTRACE("*****Failed to log FIQ stack"); - } - aSizeDumped+=memDumped; - - #endif - - return KErrNone; - } - -/** - * Logs the CPU Registers at the time of crash - * @param aSizeDumped Holds the size of the data dumped - * @return system wide OS code - */ -TInt SCMDataSave::LogCPURegisters(TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - - TInt32 fullSet = 37; - - //meta data about the thread set - TRegisterSet threadSet; - threadSet.iNumRegisters = fullSet; - - aSizeDumped+=threadSet.GetSize(); - threadSet.Serialize(*iWriter); - - SFullArmRegSet regSet; - ReadCPURegisters(regSet); - TArmReg* regs = (TArmReg*)®Set; - - TInt32 cnt = 0; - for(cnt = 0; cnt < fullSet; cnt++) - { - //this is the struct to store the register value in - TRegisterValue regVal; - regVal.iType = cnt * 0x100; - regVal.iValue32 = regs[cnt]; - regVal.iOwnId = Kern::CurrentThread().iId; - - aSizeDumped+=regVal.GetSize(); - regVal.Serialize(*iWriter); - } - - return KErrNone; - } - -/** - * This logs the registers for a given thread to the flash memory - * @param aThread - thread whose registers we want - * @param aRegType - type of register set required such as user, supervisor etc - * @param aSizeDumped Holds the size of the data dumped - * @return one of the OS return codes - */ -TInt SCMDataSave::LogRegisters(DThread* aThread, const TRegisterSetType& aRegType, TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - - TArmRegSet regs; - TUint32 availableRegs; - TInt err; - - //for the current thread we do things differently - if(aThread == &Kern::CurrentThread() && aRegType == EFullCPURegisters) - { - err = LogCPURegisters(aSizeDumped); - return err; - } - else if(aThread == &Kern::CurrentThread()) - { - //only do full cpu reg for the current thread - return KErrNotSupported; - } - - //Read the appropriate registers - switch(aRegType) - { - case EUserRegisters : - { - err = ReadUserRegisters(aThread, regs, availableRegs); - break; - } - case ESupervisorRegisters : - { - err = ReadSystemRegisters(aThread, regs, availableRegs); - break; - } - default : return KErrNotSupported; - } - - if(err != KErrNone) - { - return err; - } - - //meta data about the thread set - TRegisterSet threadSet; - - //to get the number of registers in advance, we need to count the number of times 1 is set in the bit field of availableRegs - TUint numR = 0; - for(TInt cnt =0; cnt< 8*sizeof(availableRegs); cnt++) //cycle through 1 bit at a time - { - if(0x1 & (availableRegs>>cnt)) - numR++; - } - - threadSet.iNumRegisters = numR; - - if(numR == 0) - return KErrNone; - - threadSet.Serialize(*iWriter); - aSizeDumped += threadSet.GetSize(); - - TInt32 currentRegister = 1; - TArmReg* reg = (TArmReg*)(®s); - - for(TInt32 cnt = 0; cnt < KArmRegisterCount; cnt++) - { - //look at the unavailable bitmask to see current register is available - //only write the registers we have values for - if(currentRegister & availableRegs) - { - //this is the struct to store the register value in - TRegisterValue regVal; - - //get register type as per symbian elf docs - TUint32 registerType; - err = GetRegisterType(aRegType, cnt, registerType); - if(err != KErrNone) - { - continue; - } - regVal.iType = registerType; - regVal.iOwnId = aThread->iId; - - //set value - regVal.iValue32 = reg[cnt]; - - aSizeDumped+=regVal.GetSize(); - regVal.Serialize(*iWriter); - } - - currentRegister<<=1; - } - - return KErrNone; - } - -/** - * This logs memory in the specified area - * @param aStartAddress - address to start from - * @param aEndAddress - address to finish - * @param aThread - process whose memory this is in - * @param aSizeDumped Holds the size of the data dumped - * @return one of the system wide codes - */ -TInt SCMDataSave::LogMemory(const TUint8* aStartAddress, TInt aLength, const DThread* aThread, TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - - if(aThread->iOwningProcess != &Kern::CurrentProcess()) - { - TInt err = iMonitor->SwitchAddressSpace(aThread->iOwningProcess, ETrue); - if(KErrNone != err) - { - return err; - } - } - - TMemoryDump memDump; - memDump.iStartAddress = (TUint32)aStartAddress; - memDump.iLength = aLength; - memDump.iPid = aThread->iOwningProcess->iId; - - aSizeDumped+=memDump.GetSize(); - memDump.Serialize(*iWriter); - - if(!aStartAddress) - { - return KErrArgument; - } - - TRawData theMemory; - theMemory.iData.Set(const_cast(aStartAddress), aLength, aLength); - - theMemory.Serialize(*iWriter); - aSizeDumped+=theMemory.GetSize(); - - return KErrNone; - } - -/** - * This logs the locks held by system at time of crash - * @param aSizeDumped Holds the size of the data dumped - * @return one of the system wide codes - */ -TInt SCMDataSave::LogLocks(TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - - // get the mutex logs & waits & log via a TLockData object - TSCMLockData lockData; - - const TInt KMaxLockCheck = 20; // so no possibility of infinite loop - - TInt lockCount = 0; - // check for kernel locks - - for(TInt i=0;iiHoldCount); - lockData.SetMutexThreadWaitCount(mutex->iWaitCount); - } - else - { - // no mutex held set to -1 - lockData.SetMutexHoldCount(0); - lockData.SetMutexThreadWaitCount(0); - } - - aSizeDumped+=lockData.GetSize(); - TInt err = lockData.Serialize(*iWriter); - - return err; - } - -/** - * Writes the SCM Configuration to the start of the media - * @param aScmConfig Configuration to write - * @return one of the system wide codes - */ -TInt SCMDataSave::LogConfig(SCMConfiguration& aScmConfig) - { - iWriter->SetPosition(0); - - TInt err = aScmConfig.Serialize(*iWriter); - - if( err != KErrNone) - { - CLTRACE1("SCMDataSave::LogConfig failed err = %d", err); - } - - return err; - } - -/** - * Reads the SCM Configuration from the media - * @param aScmConfig - * @return one of the system wide codes - */ -TInt SCMDataSave::ReadConfig(SCMConfiguration& aScmConfig) - { - const TInt KBufSize = 135; //Not yet done: Put in header, beside config defn - - if( KBufSize < aScmConfig.GetSize()) - { - CLTRACE2("(SCMDataSave::ReadConfig) ** ERROR Inadequate buffer actual = %d req = %d" - , KBufSize, aScmConfig.GetSize()); - } - - // try and read the configuration - TBuf8 buf; - buf.SetLength(KBufSize); - - iFlash->SetReadPos(0); // config always at 0 - iFlash->Read(buf); - - TByteStreamReader reader(const_cast(buf.Ptr())); - TInt err = aScmConfig.Deserialize(reader); - if(err == KErrNotReady) - { - CLTRACE("(SCMDataSave::ReadConfig) no config saved - use default"); - } - else if(err == KErrNone) - { - CLTRACE("(SCMDataSave::ReadConfig) Config read ok"); - } - else - { - CLTRACE1("(SCMDataSave::ReadConfig) error reading config err = %d", err); - } - - return err; - } - -/** - * This is a look up table to map the register type and number to the symbian elf definition - * of register type - * @param aSetType this is the register set type - user, supervisor etc - * @param aRegNumber this is the number of the register as per TArmRegisters in arm_types.h - * @param aSizeDumped Holds the size of the data dumped - * @return One of the OS wide codes - */ -TInt SCMDataSave::GetRegisterType(const TRegisterSetType& aSetType, TInt32& aRegNumber, TUint32& aRegisterType) - { - //validate arguments - if(aRegNumber < EArmR0 || aRegNumber > EArmFlags) - { - return KErrArgument; - } - - //look at what type we are using - switch(aSetType) - { - case EUserRegisters : - { - aRegisterType = aRegNumber * 0x100; //for R0 to R16 (CPSR) it just increments in 0x100 from 0x0 to 0x1000 - break; - } - case ESupervisorRegisters : - { - //same as EUserRegisters except R13 and R14 are different - if(aRegNumber == EArmSp) - { - aRegisterType = 0x1100; - break; - } - else if(aRegNumber == EArmLr) - { - aRegisterType = 0x1200; - break; - } - else - { - aRegisterType = aRegNumber * 0x100; - break; - } - } - default : return KErrNotSupported; - } - - return KErrNone; - } - -/** - * Writes the trace buffer to the crash log. - * @param aSizeToDump Number of bytes to dump. If this is zero we attempt to write the entire buffer - * @param aSizeDumped Holds the size of the data dumped - * @return One of the OS wide codes - */ -TInt SCMDataSave::LogTraceBuffer(TInt aSizeToDump, TUint& aSizeDumped) - { - LOG_CONTEXT - aSizeDumped = 0; - TUint memDumped = 0; - - TBool dumpAll = (aSizeToDump == 0) ? ETrue : EFalse; - - //Because the btrace buffer is a circular one, we need to save it in two parts - //this corrosponds to how we read it - TUint8* data; - TUint sizeOfPartRead; - TInt spaceRemaining = aSizeToDump; - - //This structure will be filled after the first pass and cached so by the time we ARE writing it will - //contain the data we want - aSizeDumped+=iTrace.GetSize(); - iTrace.Serialize(*iWriter); - - //read first part - TInt err = BTrace::Control(BTrace::ECtrlCrashReadFirst,&data,&sizeOfPartRead); - - while(KErrNone == err && sizeOfPartRead > 0) - { - TUint rawSize = 0; //how much of this read data want we to dump - - if(dumpAll) - { - rawSize = sizeOfPartRead; - } - else //Otherwise see what room is left for dumpage - { - rawSize = ((sizeOfPartRead + iTrace.iSizeOfMemory) > aSizeToDump) ? spaceRemaining : sizeOfPartRead; - } - - //Only relevant if restricting the dump - if(spaceRemaining <= 0 && !dumpAll) - break; - - TPtrC8 ptr(data, rawSize); - err = LogRawData(ptr, memDumped); - if(KErrNone != err) - { - CLTRACE1("Logging Raw data failed - [%d]", err); - err = BTrace::Control(BTrace::ECtrlCrashReadNext,&data,&sizeOfPartRead); - continue; - } - - aSizeDumped+=memDumped; - - iTrace.iSizeOfMemory += rawSize; - iTrace.iNumberOfParts++; - spaceRemaining -= rawSize; - - err = BTrace::Control(BTrace::ECtrlCrashReadNext,&data,&sizeOfPartRead); - } - - return KErrNone; - } - -/** - * Logs the data in a TRawData struct - * @param aData - * @param aSizeDumped Holds the size of the data dumped - * @return One of the OS wide codes - */ -TInt SCMDataSave::LogRawData(const TDesC8& aData, TUint& aSizeDumped) - { - TRawData theData; - theData.iLength = aData.Length(); - theData.iData.Set(const_cast(aData.Ptr()), aData.Length(), aData.Length()); - - aSizeDumped+=theData.GetSize(); - return theData.Serialize(*iWriter); - } - - -/** - * Logs the kernels heap and returns the size dumped via aSizeDumped - * @param aSizeDumped Holds the size of the data dumped - * @return - */ -TInt SCMDataSave::LogKernelHeap(TUint& aSizeDumped) - { - LOG_CONTEXT - - TInt32 heapLoc = 0; - TInt32 heapSize = 0; - TInt32 err = FindKernelHeap(heapLoc, heapSize); - if(KErrNone == err) - { - return LogMemory((TUint8*)heapLoc, heapSize, &Kern::CurrentThread(), aSizeDumped); - } - - CLTRACE1("\tCouldnt find the kernel heap: [%d]", err); - return err; - } - -/** - * Iterates the object containers and finds the kernel heap - * @param aHeapLocation Contains the memory location of the kernel heap - * @param aHeapSize Contains the size of the Heap - * @return One of the OS wide codes - */ -TInt SCMDataSave::FindKernelHeap(TInt32& aHeapLocation, TInt32& aHeapSize) - { - LOG_CONTEXT - - //Get process object container - DObjectCon* objectContainer = Kern::Containers()[EProcess]; - if(objectContainer == NULL) - { - CLTRACE("\tFailed to get object container for the processes"); - return KErrNotFound; - } - - //Must check the mutex on this is ok otherwise the data will be in an inconsistent state - if(objectContainer->Lock()->iHoldCount) - { - CLTRACE("\tChunk Container is in an inconsistant state"); - return KErrCorrupt; - } - - TInt numObjects = objectContainer->Count(); - - DProcess* kernelProcess = NULL; - for(TInt cnt = 0; cnt < numObjects; cnt ++) - { - DProcess* candidateProcess = (DProcess*)(*objectContainer)[cnt]; - - //Get the objects name - TBuf8 name; - candidateProcess->TraceAppendFullName(name,EFalse); - if(name == KKernelProcessName) - { - kernelProcess = candidateProcess; - } - } - if (!kernelProcess) - return KErrNotFound; - - //Get chunk object container - objectContainer = Kern::Containers()[EChunk]; - if(objectContainer == NULL) - { - CLTRACE("\tFailed to get object container for the chunks"); - return KErrNotFound; - } - - //Must check the mutex on this is ok otherwise the data will be in an inconsistent state - if(objectContainer->Lock()->iHoldCount) - { - CLTRACE("\tChunk Container is in an inconsistant state"); - return KErrCorrupt; - } - - numObjects = objectContainer->Count(); - for(TInt cnt = 0; cnt < numObjects; cnt ++) - { - DChunk* candidateHeapChunk = (DChunk*)(*objectContainer)[cnt]; - - //Get the objects name - TBuf8 name; - candidateHeapChunk->TraceAppendFullName(name,EFalse); - - if(name == KKernelHeapChunkName) - { - aHeapLocation = (TInt32)candidateHeapChunk->Base(kernelProcess); - aHeapSize = candidateHeapChunk->iSize; - return KErrNone; - } - } - - return KErrNotFound; - } - -/** - * This logs the variant specific descriptor data to the crash log - * @param aSizeDumped records how much was dumped by this function - * @return one of the OS wide codes - */ -TInt SCMDataSave::LogVariantSpecificData(TUint& aSizeDumped) - { - LOG_CONTEXT - - aSizeDumped = 0; - - //Change this descriptor as required for your needs - _LIT(KVariantSpecificData, "This is the variant specific data. Put your own here"); - - TVariantSpecificData varData; - varData.iSize = KVariantSpecificData().Size(); - - TInt err = varData.Serialize(*iWriter); - if(KErrNone != err) - { - CLTRACE1("\tLogging variant specific data failed with code [%d]", err); - return err; - } - aSizeDumped+=varData.GetSize(); - - TUint rawDataSize = 0; - err = LogRawData(KVariantSpecificData(), rawDataSize); - if(KErrNone != err) - { - CLTRACE1("\tLogging variant specific data failed with code [%d]", err); - return err; - } - - aSizeDumped+=rawDataSize; - - return KErrNone; - } - - -/** - * This method is the callback used by MPhysicalWriterImpl interface - * if the TCachedByteStreamWriter is configured to use this interface - * the callback avoids the need for temp buffers & can interface directly with the - * flash writer methods - * @param aData - data to write - * @param aLen - length of data to write - * @param aPos - writers internal position - */ -void SCMDataSave::DoPhysicalWrite(TAny* aData, TInt aPos, TInt aLen) - { - if(iPerformChecksum) - { - iChecksum.ChecksumBlock((TUint8*)aData, aLen); - } - - if( this->iWriteSelect == EWriteComm) - { - WriteUart((TUint8*)aData, aLen); - } - else // EWriteFlash - { - Write(aData, aLen); - } - } - -/** - * Writes data to Flash - * @param aSomething Pointer to the data - * @param aSize Size of the data - */ -void SCMDataSave::Write(const TAny* aSomething, TInt aSize) - { - TPtrC8 data((const TUint8 *)aSomething, aSize); - - TInt written = 0; - - WriteCrashFlash(iByteCount, written, data); - iByteCount+= written; - } - -/** - * Writes a descriptor to the crash flash - * @param aPos Position in flash to write - * @param aSize Holds the size of the data written after the call - * @param aBuffer Descriptor to write - */ -void SCMDataSave::WriteCrashFlash(TInt aPos, TInt& aSize, const TDesC8& aBuffer) - { - //Set write position in the flash - iFlash->SetWritePos(aPos); - iFlash->Write(aBuffer); - - //get bytes written - aSize += iFlash->BytesWritten(); - - if(aSize != aBuffer.Length()) - { - CLTRACE2("(SCMDataSave::WriteCrashFlash) Over the limit aSize = %d aBuffer.Length() = %d", - aSize, aBuffer.Length()); - } - } - -/** - * Writes a descriptor via serial - * @param aDes Descriptor to write - */ -void SCMDataSave::WriteUart(const TDesC8& aDes) - { - WriteUart(aDes.Ptr(), aDes.Length()); - } - -/** - * Writes data via serial - * @param aData Data to write - * @param aSize Size of data to write - */ -void SCMDataSave::WriteUart(const TUint8* aData, TInt aSize) - { - OMAP* assp = ((OMAP*)Arch::TheAsic()); - TOmapDbgPrt* dbg = assp->DebugPort(); - - if (dbg) - { - for(TInt i=0;iDebugOutput(*(aData+i)); - } - } - else - { - CLTRACE("SCMDataSave::WriteUart ERROR - dbg was null"); - } - } - -/** - * Setter for the current number of bytes written for this crash log - * If aByte is not word aligned, it will be rounded up to be so - * @param aByte Current bytes written - */ -void SCMDataSave::SetByteCount(TInt aByte) - { - //ensure aligned - if(aByte % iWriter->GetCacheSize() == 0) - { - iByteCount = aByte; - } - else - { - iByteCount = aByte + (iWriter->GetCacheSize() - (aByte % iWriter->GetCacheSize())); - } - } - -/** - * Gets the output target selection - * @return TScmWriteSelect output target selection - * @param void - */ -SCMDataSave::TWriteSelect SCMDataSave::GetWriteSelect() - { - return iWriteSelect; - } - -/** - * Sets the output target selection - * @return void - * @param TScmWriteSelect aWriteSelect output target selection - */ -void SCMDataSave::SetWriteSelect(SCMDataSave::TWriteSelect aWriteSelect) - { - iWriteSelect = aWriteSelect; - } - -/** - * Gets the amount of space remaining for the media of choice - * @return - */ -TUint SCMDataSave::SpaceRemaining() - { - TInt currentPosition = iWriter->GetBytesWritten() + iStartingPointForCrash; - - return MaxLogSize() - currentPosition; - } - -/** - * To find the max size of a log for a given media - * @return the max size of a log for a given media - */ -TUint SCMDataSave::MaxLogSize() - { - //see what write media is being used - switch(GetWriteSelect()) - { - case EWriteFlash: - { - return KMaxCrashLogSize; - } - case EWriteComm: - { - return 0xFFFFFFFF; - } - default: - { - return 0; - } - } - } - -/** - * Records the offset in the flash partition where this crash begins - * @param aStart Offset in flash - */ -void SCMDataSave::SetCrashStartingPoint(TUint32 aStart) - { - iStartingPointForCrash = aStart; - } - -//eof - diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmdatatypes.cpp --- a/kernel/eka/debug/crashMonitor/src/scmdatatypes.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1618 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmdatatypes.cpp -// Core dump server - Data Types for System Crash -// -// - -/** - @file - @internalTechnology -*/ -#include -#include -#include - -namespace Debug - { - /** - * TCrashOffsetsHeader implementation - * @internal technology - */ - - /** - * TCrashOffsetsHeader Constructor - */ - TCrashOffsetsHeader::TCrashOffsetsHeader(): - iId(ESCMOffsetsHeader), - iVersion(EChVersion1), - iCTFullRegOffset(0), - iCTUsrStkOffset(0), - iCTSvrStkOffset(0), - iCPMetaOffset(0), - iCTMetaOffset(0), - iCPCodeSegOffset(0), - iSysUsrStkOffset(0), - iSysSvrStkOffset(0), - iSysUsrRegOffset(0), - iSysSvrRegOffset(0), - iTLstOffset(0), - iPLstOffset(0), - iSysCodeSegOffset(0), - iExcStkOffset(0), - iTraceOffset(0), - iScmLocksOffset(0), - iKernelHeapOffset(0), - iVarSpecInfOffset(0), - iRomInfoOffset(0), - iSpare1(0), - iSpare2(0), - iSpare3(0), - iSpare4(0), - iSpare5(0), - iSpare6(0) - { - } - - /** - * Writes this class to the specified byte stream - * @param aWriter Byte stream to use - * @return One of the OS wide codes - */ - TInt TCrashOffsetsHeader::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - if(iId != ESCMOffsetsHeader) - { - CLTRACE("TCrashOffsetsHeader::Serialize Corrupt ID"); - return KErrCorrupt; - } - - // ID saved first - aWriter.WriteInt(iId); // 4 - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == EChVersion1) - { - // write data v1 format - aWriter.WriteInt(iCTFullRegOffset); // 4 - aWriter.WriteInt(iCTUsrStkOffset); // 4 - aWriter.WriteInt(iCTSvrStkOffset); // 4 - aWriter.WriteInt(iCPMetaOffset); // 4 - aWriter.WriteInt(iCTMetaOffset); // 4 - aWriter.WriteInt(iCPCodeSegOffset); // 4 - aWriter.WriteInt(iSysUsrStkOffset); // 4 - aWriter.WriteInt(iSysSvrStkOffset); // 4 - aWriter.WriteInt(iSysUsrRegOffset); // 4 - aWriter.WriteInt(iSysSvrRegOffset); // 4 - aWriter.WriteInt(iTLstOffset); // 4 - aWriter.WriteInt(iPLstOffset); // 4 - aWriter.WriteInt(iSysCodeSegOffset); // 4 - aWriter.WriteInt(iExcStkOffset); // 4 - aWriter.WriteInt(iTraceOffset); // 4 - aWriter.WriteInt(iScmLocksOffset); // 4 - aWriter.WriteInt(iKernelHeapOffset); // 4 - aWriter.WriteInt(iVarSpecInfOffset); // 4 - aWriter.WriteInt(iRomInfoOffset); // 4 - } - else - { - CLTRACE("TCrashOffsetsHeader::Serialize Unsupported version"); - } - - TInt sizeWritten = aWriter.CurrentPosition() - startPos; - if(sizeWritten != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TCrashOffsetsHeader serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TCrashOffsetsHeader::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMOffsetsHeader) - { - CLTRACE("TCrashOffsetsHeader::Deserialize Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TCrashHeaderVersion)aReader.ReadShort(); //2 - - if(iVersion == EChVersion1) - { - iCTFullRegOffset = aReader.ReadInt(); // 4 - iCTUsrStkOffset = aReader.ReadInt(); // 4 - iCTSvrStkOffset = aReader.ReadInt(); // 4 - iCPMetaOffset = aReader.ReadInt(); // 4 - iCTMetaOffset = aReader.ReadInt(); // 4 - iCPCodeSegOffset = aReader.ReadInt(); // 4 - iSysUsrStkOffset = aReader.ReadInt(); // 4 - iSysSvrStkOffset = aReader.ReadInt(); // 4 - iSysUsrRegOffset = aReader.ReadInt(); // 4 - iSysSvrRegOffset = aReader.ReadInt(); // 4 - iTLstOffset = aReader.ReadInt(); // 4 - iPLstOffset = aReader.ReadInt(); // 4 - iSysCodeSegOffset = aReader.ReadInt();// 4 - iExcStkOffset = aReader.ReadInt(); // 4 - iTraceOffset = aReader.ReadInt(); // 4 - iScmLocksOffset = aReader.ReadInt(); // 4 - iKernelHeapOffset = aReader.ReadInt(); // 4 - iVarSpecInfOffset = aReader.ReadInt(); // 4 - iRomInfoOffset = aReader.ReadInt(); // 4 - } - else - { - CLTRACE("TCrashOffsetsHeader::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TCrashOffsetsHeader deserialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Get the externalised size of this class - * @return TInt the Size - */ - TInt TCrashOffsetsHeader::GetSize() const - { - // return the size in bytes that this struct uses to serialize - deserialize itself - if(iVersion == EChVersion1) - { - return 82; - } - else - { - CLTRACE("TCrashOffsetsHeader::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - TBool TCrashOffsetsHeader::operator == (const TCrashOffsetsHeader& aOther) const - { - return (iId == aOther.iId && - iVersion == aOther.iVersion && - iCTFullRegOffset == aOther.iCTFullRegOffset && - iCTUsrStkOffset == aOther.iCTUsrStkOffset && - iCTSvrStkOffset == aOther.iCTSvrStkOffset && - iCPMetaOffset == aOther.iCPMetaOffset && - iCTMetaOffset == aOther.iCTMetaOffset && - iSysUsrStkOffset == aOther.iSysUsrStkOffset && - iSysSvrStkOffset == aOther.iSysSvrStkOffset && - iSysUsrRegOffset == aOther.iSysUsrRegOffset && - iSysSvrRegOffset == aOther.iSysSvrRegOffset && - iTLstOffset == aOther.iTLstOffset && - iPLstOffset == aOther.iPLstOffset && - iExcStkOffset == aOther.iExcStkOffset && - iCPCodeSegOffset == aOther.iCPCodeSegOffset && - iSysCodeSegOffset == aOther.iSysCodeSegOffset && - iTraceOffset == aOther.iTraceOffset && - iScmLocksOffset == aOther.iScmLocksOffset && - iVarSpecInfOffset == aOther.iVarSpecInfOffset && - iKernelHeapOffset == aOther.iKernelHeapOffset && - iRomInfoOffset == aOther.iRomInfoOffset); - } - - - /** - * TCrashInfoHeader implementation - * @internal technology - */ - - /** - * TCrashInfoHeader constructor - */ - TCrashInfoHeader::TCrashInfoHeader(): - iId(ESCMTCrashInfo), - iVersion(ECiVersion1), - iLogSize(0), - iFlashAlign(0), - iCachedWriterSize(0), - iPid(0), - iTid(0), - iExitType(0), - iExitReason(0), - iExcCode(0), - iCrashTime(0), - iCrashId(0), - iFlashBlockSize(0), - iFlashPartitionSize(0), - iCategorySize(0), - iSpare1(0), - iSpare2(0) - { - TVersion ver(KSCMDataTypesMajorVersion, KSCMDataTypesMinorVersion, KSCMDataTypesBuildNumber); - iSCMDataTypesVersion = ver; - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TCrashInfoHeader::Serialize(TByteStreamWriter& aWriter) - { - - //CLTRACE("TCrashInfoHeader::Serialize"); - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - aWriter.WriteInt(iId); // 4 - if(iId != ESCMTCrashInfo) - { - CLTRACE("TCrashInfoHeader::Serialize Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == ECiVersion1) - { - // write data v1 format - aWriter.WriteInt(iLogSize); // 4 - aWriter.WriteByte((TUint8)iFlashAlign); // 1 - aWriter.WriteByte((TUint8)iCachedWriterSize); // 1 - aWriter.WriteInt64(iPid); // 8 - aWriter.WriteInt64(iTid); // 8 - aWriter.WriteInt(iExitType); // 4 - aWriter.WriteInt(iExitReason); // 4 - aWriter.WriteInt(iExcCode); // 4 - aWriter.WriteInt64(iCrashTime); // 8 - aWriter.WriteInt(iCrashId); // 4 - aWriter.WriteInt(iFlashBlockSize); // 4 - aWriter.WriteInt(iFlashPartitionSize); // 4 - aWriter.WriteInt(iSCMDataTypesVersion.iMajor); // 4 - aWriter.WriteInt(iSCMDataTypesVersion.iMinor); // 4 - aWriter.WriteInt(iSCMDataTypesVersion.iBuild); // 4 - - if(iCategory.Ptr()) - { - aWriter.WriteInt(iCategory.Length()); // 4 - for(TInt cnt = 0; cnt < iCategory.Length(); cnt++) - { - aWriter.WriteByte(iCategory[cnt]); //iCategorySize bytes - } - } - else - { - aWriter.WriteInt(0); - } - } - else - { - CLTRACE("TCrashInfoHeader::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE2("TCrashInfoHeader::Serialize serialization size error. Wrote [%d] but expected [%d]", endPos - startPos, GetSize()); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TCrashInfoHeader::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); - if(iId != ESCMTCrashInfo) - { - CLTRACE("TCrashInfoHeader::Deserialize Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TCrashInfoHeaderVersion)aReader.ReadShort(); // 2 - - if(iVersion == ECiVersion1) - { - // read data v1 format - iLogSize = aReader.ReadInt(); // 4 - iFlashAlign = aReader.ReadByte(); // 1 - iCachedWriterSize = aReader.ReadByte(); // 1 - iPid = aReader.ReadInt64(); // 8 - iTid = aReader.ReadInt64(); // 8 - iExitType = aReader.ReadInt(); // 4 - iExitReason = aReader.ReadInt(); // 4 - iExcCode = aReader.ReadInt(); // 4 - iCrashTime = aReader.ReadInt64(); // 8 - iCrashId = aReader.ReadInt(); // 4 - iFlashBlockSize = aReader.ReadInt(); // 4 - iFlashPartitionSize = aReader.ReadInt(); // 4 - iSCMDataTypesVersion.iMajor = aReader.ReadInt(); // 4 - iSCMDataTypesVersion.iMinor = aReader.ReadInt(); // 4 - iSCMDataTypesVersion.iBuild = aReader.ReadInt(); // 4 - - - iCategorySize = aReader.ReadInt(); // 4 - - if(iCategory.MaxLength() >= (TInt)iCategorySize) - { - iCategory.SetLength(0); - - for(TUint cnt = 0; cnt < iCategorySize; cnt++) - { - iCategory.Append(aReader.ReadByte()); //iCategorySize bytes - } - } - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TCrashInfoHeader::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE2("TCrashInfoHeader::Deserialize serialization size error. Read [%d] but expected [%d]", endPos - startPos, GetSize()); - iId = ESCMLast; //unrecognised header - - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TCrashInfoHeader::GetSize() const - { - if(iVersion == ECiVersion1) - { - return 76 + iCategory.Length(); - } - else - { - CLTRACE("TCrashInfoHeader::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - TBool TCrashInfoHeader::operator == (const TCrashInfoHeader& aOther) const - { - return ( - iId == aOther.iId && - iVersion == aOther.iVersion && - iLogSize == aOther.iLogSize && - iFlashAlign == aOther.iFlashAlign && - iCachedWriterSize == aOther.iCachedWriterSize && - iPid == aOther.iPid && - iTid == aOther.iTid && - iExitType == aOther.iExitType && - iExitReason == aOther.iExitReason && - iCrashTime == aOther.iCrashTime && - iCategorySize == aOther.iCategorySize && - iCategory == aOther.iCategory && - iSCMDataTypesVersion.iMajor == aOther.iSCMDataTypesVersion.iMajor && - iSCMDataTypesVersion.iMinor == aOther.iSCMDataTypesVersion.iMinor && - iSCMDataTypesVersion.iBuild == aOther.iSCMDataTypesVersion.iBuild); - } - - /** - * TThreadStack implementation - * @internal technology - */ - - - /** - * TThreadStack Constructor - */ - TThreadStack::TThreadStack(): - iId(ESCMThreadStack), - iVersion(EStackVersion1), - iStackType(ELast), - iThreadId(0), - iStackSize(0), - iSpare1(0), - iSpare2(0) - { - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TThreadStack::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - if(iId != ESCMThreadStack) - { - CLTRACE("TThreadStack::Serialize failed - corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteInt(iId); // 4 - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == EStackVersion1) - { - // write data v1 format - aWriter.WriteInt(iStackType); // 4 - aWriter.WriteInt64(iThreadId); // 8 - aWriter.WriteInt(iStackSize); // 4 - } - else - { - CLTRACE("TThreadStack::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TThreadStack::Serialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TThreadStack::GetSize() const - { - if(iVersion == EStackVersion1) - { - return 22; - } - else - { - CLTRACE("TThreadStack::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TThreadStack::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMThreadStack) - { - CLTRACE("TThreadStack::Deserialize failed Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TThreadStackVersion)aReader.ReadShort(); // 2 - - if(iVersion == EStackVersion1) - { - // read data v1 format - iStackType = (TThreadStackType)aReader.ReadInt(); // 4 - iThreadId = aReader.ReadInt64(); // 8 - iStackSize = aReader.ReadInt(); // 4 - - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TThreadStack::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TThreadStack::Deserialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * TRegisterValue implementation - * @internal technology - */ - - /** - * TRegisterValue Constructor - */ - TRegisterValue::TRegisterValue(): - iId(ESCMRegisterValue), - iVersion(ERegisterValueVersion1), - iOwnId(0), - iType(0), - iClass(0), //core reg by default - iSubId(0), - iSize(2) //default for core registers - { - } - - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TRegisterValue::GetSize() const - { - if(iVersion == ERegisterValueVersion1) - { - TInt baseSize = 22; - - //variant for union - if(iSize == 0) - { - return baseSize + 1; - } - else if(iSize == 1) - { - return baseSize + 2; - } - else if(iSize == 2) - { - return baseSize + 4; - } - else if(iSize == 3) - { - return baseSize + 8; - } - else - { - CLTRACE("TRegisterValue::GetSize() Corrupt size"); - return 0; - } - } - else - { - CLTRACE("TRegisterValue::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TRegisterValue::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - if(iId != ESCMRegisterValue) - { - CLTRACE("TRegisterValue::Serialize Error - Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteInt(iId); // 4 - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == ERegisterValueVersion1) - { - // write data v1 format - aWriter.WriteInt64(iOwnId); // 8 - aWriter.WriteInt(iType); // 4 - aWriter.WriteByte(iClass); // 1 - aWriter.WriteShort(iSubId); // 2 - aWriter.WriteByte(iSize); // 1 - - //variant for union - if(iSize == 0) - { - aWriter.WriteByte(iValue8); - } - else if(iSize == 1) - { - aWriter.WriteShort(iValue16); - } - else if(iSize == 2) - { - aWriter.WriteInt(iValue32); - } - else if(iSize == 3) - { - aWriter.WriteInt64(iValue64); - } - else - { - CLTRACE("TRegisterValue::Serialize() Corrupt size"); - return KErrCorrupt; - } - } - else - { - CLTRACE("TRegisterValue::Serialize Unsupported version"); - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TRegisterValue::Serialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TRegisterValue::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); - if(iId != ESCMRegisterValue) - { - CLTRACE("TRegisterValue::Deserialize() ERROR Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TRegisterValueVersion)aReader.ReadShort(); // 2 - - if(iVersion == ERegisterValueVersion1) - { - // read data v1 format - iOwnId = aReader.ReadInt64(); // 8 - iType = aReader.ReadInt(); // 4 - iClass = aReader.ReadByte(); // 1 - iSubId = aReader.ReadShort(); // 2 - iSize = aReader.ReadByte(); // 1 - - //variant for union - if(iSize == 0) - { - iValue8 = aReader.ReadByte(); - } - else if(iSize == 1) - { - iValue16 = aReader.ReadShort(); - } - else if(iSize == 2) - { - iValue32 = aReader.ReadInt(); - } - else if(iSize == 3) - { - iValue64 = aReader.ReadInt64(); - } - else - { - CLTRACE("TRegisterValue::Serialize() Corrupt size"); - return KErrCorrupt; - } - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TRegisterValue::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TRegisterValue::Deserialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - /** - * TRegisterSet implementation - * @internal technology - */ - - /** - * TRegisterSet Constructor - */ - TRegisterSet::TRegisterSet(): - iVersion(ETRegisterSetVersion1), - iId(ESCMRegisterSet), - iNumRegisters(0) - { - - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TRegisterSet::GetSize() const - { - if(iVersion == ETRegisterSetVersion1) - { - return 10; - } - else - { - CLTRACE("TRegisterSet::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TRegisterSet::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - if(iId != ESCMRegisterSet) - { - CLTRACE("TRegisterSet::Serialize Error - Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteInt(iId); // 4 - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == ETRegisterSetVersion1) - { - // write data v1 format - aWriter.WriteInt(iNumRegisters); // 4 - } - else - { - CLTRACE("TRegisterSet::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TRegisterSet::Serialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TRegisterSet::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); - if(iId != ESCMRegisterSet) - { - CLTRACE("TRegisterSet::Deserialize() ERROR Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TRegisterSetVersion)aReader.ReadShort(); // 2 - - if(iVersion == ETRegisterSetVersion1) - { - // read data v1 format - iNumRegisters = aReader.ReadInt(); // 8 - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TRegisterSet::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TRegisterSet::Deserialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * TCodeSegmentSet implementation - * @internal technology - */ - - /** - * TCodeSegmentSet Constructor - */ - TCodeSegmentSet::TCodeSegmentSet(): - iId(ESCMCodeSegSet), - iVersion(ETCodeSegmentSetVersion1), - iNumSegs(0), - iPid(0) - { - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TCodeSegmentSet::GetSize() const - { - if(iVersion == ETCodeSegmentSetVersion1) - { - return 18; - } - else - { - CLTRACE("TCodeSegmentSet::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - /** - * This returns the largest size this class can be - */ - TInt TCodeSegmentSet::GetMaxSize() const - { - return 18; - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TCodeSegmentSet::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - if(iId != ESCMCodeSegSet) - { - CLTRACE("TCodeSegmentSet::Serialize Error - Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteInt(iId); // 4 - if(iId != ESCMCodeSegSet) - { - CLTRACE("TCodeSegmentSet::Serialize Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == ETCodeSegmentSetVersion1) - { - // write data v1 format - aWriter.WriteInt(iNumSegs); // 4 - aWriter.WriteInt64(iPid); // 8 - } - else - { - CLTRACE("TCodeSegmentSet::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TCodeSegmentSet::Serialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TCodeSegmentSet::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); - if(iId != ESCMCodeSegSet) - { - CLTRACE("TCodeSegmentSet::Deserialize() ERROR Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TCodeSegmentSetVersion)aReader.ReadShort(); // 2 - - if(iVersion == ETCodeSegmentSetVersion1) - { - // read data v1 format - iNumSegs = aReader.ReadInt(); // 4 - iPid = aReader.ReadInt64(); // 8 - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TRegisterSet::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TRegisterSet::Deserialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - - /** - * TCodeSegment implementation - * @internal technology - */ - - /** - * TCodeSegment constructor - */ - TCodeSegment::TCodeSegment(): - iId(ESCMCodeSeg), - iVersion(ETCodeSegmentVersion1), - iCodeSegType(EUnknownCodeSegType), - iXip(0), - iNameLength(0) - { - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TCodeSegment::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - aWriter.WriteInt(iId); // 4 - if(iId != ESCMCodeSeg) - { - CLTRACE("TCodeSegment::Serialize Error - Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == ETCodeSegmentVersion1) - { - // write data v1 format - aWriter.WriteInt(iCodeSegType); - aWriter.WriteInt(iCodeSegMemInfo.iCodeBase); - aWriter.WriteInt(iCodeSegMemInfo.iCodeSize); - aWriter.WriteInt(iCodeSegMemInfo.iConstDataBase); - aWriter.WriteInt(iCodeSegMemInfo.iConstDataSize); - aWriter.WriteInt(iCodeSegMemInfo.iInitialisedDataBase); - aWriter.WriteInt(iCodeSegMemInfo.iInitialisedDataSize); - aWriter.WriteInt(iCodeSegMemInfo.iUninitialisedDataBase); - aWriter.WriteInt(iCodeSegMemInfo.iUninitialisedDataSize); - aWriter.WriteInt(iXip); - - if(iName.Ptr()) - { - aWriter.WriteInt(iName.Length()); // 4 - for(TInt cnt = 0; cnt < iName.Length(); cnt++) - { - aWriter.WriteByte(iName[cnt]); //iCategorySize bytes - } - } - else - { - aWriter.WriteInt(0); - } - } - else - { - CLTRACE("TCodeSegment::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE2("TCodeSegment::Serialize serialization size error. Wrote [%d] but expected [%d]", endPos - startPos, GetSize()); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TCodeSegment::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); - if(iId != ESCMCodeSeg) - { - CLTRACE("TCodeSegment::Deserialize Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TCodeSegmentVersion)aReader.ReadShort(); // 2 - - if(iVersion == ETCodeSegmentVersion1) - { - // read data v1 format - iCodeSegType = (TCodeSegType)aReader.ReadInt(); - iCodeSegMemInfo.iCodeBase = aReader.ReadInt(); - iCodeSegMemInfo.iCodeSize = aReader.ReadInt(); - iCodeSegMemInfo.iConstDataBase = aReader.ReadInt(); - iCodeSegMemInfo.iConstDataSize = aReader.ReadInt(); - iCodeSegMemInfo.iInitialisedDataBase = aReader.ReadInt(); - iCodeSegMemInfo.iInitialisedDataSize = aReader.ReadInt(); - iCodeSegMemInfo.iUninitialisedDataBase = aReader.ReadInt(); - iCodeSegMemInfo.iUninitialisedDataSize = aReader.ReadInt(); - iXip = aReader.ReadInt(); - iNameLength = aReader.ReadInt(); // 4 - - if(iName.Ptr() && iName.MaxLength() >= iNameLength) - { - iName.SetLength(0); - - for(TInt cnt = 0; cnt < iNameLength; cnt++) - { - iName.Append(aReader.ReadByte()); //iCategorySize bytes - } - } - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TCodeSegment::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE2("TCodeSegment::Deserialize serialization size error. Read [%d] but expected [%d]", endPos - startPos, GetSize()); - iId = ESCMLast; //unrecognised header - - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TCodeSegment::GetSize() const - { - if(iVersion == ETCodeSegmentVersion1) - { - return 50 + iName.Length(); - } - else - { - CLTRACE("TCodeSegment::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - /** - * This returns the largest size this class can be - */ - TInt TCodeSegment::GetMaxSize() const - { - return 50 + KMaxSegmentNameSize; - } - /** - * TRawData implementation - * @internal technology - */ - - /** - * TRawData constructor - */ - TRawData::TRawData(): - iId(ESCMRawData), - iVersion(ETRawData1), - iLength(0), - iData(NULL, 0) - { - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TRawData::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - aWriter.WriteInt(iId); // 4 - if(iId != ESCMRawData) - { - CLTRACE("TRawData::Serialize Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == ETRawData1) - { - if(iData.Ptr()) - { - aWriter.WriteInt(iData.Length()); // 4 - iLength = iData.Length(); - - for(TInt cnt = 0; cnt < iData.Length(); cnt++) - { - //Kern::Printf("cnt = %d \t\t\t0x%X", cnt, cnt); - aWriter.WriteByte(iData[cnt]); //iLength bytes - } - } - else - { - aWriter.WriteInt(0); - } - } - else - { - CLTRACE("TRawData::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE2("TRawData::Serialize serialization size error. Wrote [%d] but expected [%d]", endPos - startPos, GetSize()); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TRawData::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMRawData) - { - CLTRACE("TRawData::Deserialize Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TTRawDataVersion)aReader.ReadShort(); // 2 - - if(iVersion == ETRawData1) - { - iLength = aReader.ReadInt(); // 4 - - if(iData.Ptr()) - { - //Deserialise as much as we can into this buffer - it may be that the caller doesnt want all of it - iData.SetLength(0); - TUint amtToRead = (iData.MaxLength() >= iLength) ? iLength : iData.MaxLength(); - - for(TUint cnt = 0; cnt < amtToRead; cnt++) - { - iData.Append(aReader.ReadByte()); //iCategorySize bytes - } - - //move reader along what we havent read - aReader.SetPosition(aReader.CurrentPosition() + (iLength - amtToRead)); - } - else - { - aReader.SetPosition(aReader.CurrentPosition() + iLength); - } - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TRawData::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE2("TRawData::Deserialize serialization size error. Read [%d] but expected [%d]", endPos - startPos, GetSize()); - iId = ESCMLast; //unrecognised header - - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Same as Deserialise except it only starts copying data into the buffer - * when it reaches aStartPos bytes into the data - * @param aStartPos - * @param aReader - * @return - */ - TInt TRawData::Deserialize(TInt aStartPos, TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMRawData) - { - CLTRACE("TRawData::Deserialize Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TTRawDataVersion)aReader.ReadShort(); // 2 - - if(iVersion == ETRawData1) - { - iLength = aReader.ReadInt(); // 4 - - if(iData.Ptr()) - { - //Deserialise as much as we can into this buffer - it may be that the caller doesnt want all of it - iData.SetLength(0); - aReader.SetPosition(aReader.CurrentPosition() + aStartPos); - - TUint amtToRead = (iData.MaxLength() >= iLength) ? iLength : iData.MaxLength(); - - for(TUint cnt = 0; cnt < amtToRead; cnt++) - { - iData.Append(aReader.ReadByte()); //iCategorySize bytes - } - - //move reader along what we havent read - aReader.SetPosition(aReader.CurrentPosition() + (iLength - (amtToRead + aStartPos))); - } - else - { - aReader.SetPosition(aReader.CurrentPosition() + iLength); - } - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TRawData::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE2("TRawData::Deserialize serialization size error. Read [%d] but expected [%d]", endPos - startPos, GetSize()); - iId = ESCMLast; //unrecognised header - - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TRawData::GetSize() const - { - if(iVersion == ETRawData1) - { - return 10 + iLength; - } - else - { - CLTRACE("TRawData::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - - /** - * TMemoryDump implementation - * @internal technology - */ - - /** - * TMemoryDump Constructor - */ - TMemoryDump::TMemoryDump(): - iId(ESCMMemory), - iVersion(EMemDumpVersion1), - iStartAddress(0), - iPid(0), - iLength(0) - { - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TMemoryDump::GetSize() const - { - if(iVersion == EMemDumpVersion1) - { - return 22; - } - else - { - CLTRACE("TMemoryDump::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TMemoryDump::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - aWriter.WriteInt(iId); // 4 - if(iId != ESCMMemory) - { - CLTRACE("TMemoryDump::Serialize Error - Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == EMemDumpVersion1) - { - // write data v1 format - aWriter.WriteInt(iStartAddress); // 4 - aWriter.WriteInt64(iPid); // 8 - aWriter.WriteInt(iLength); // 4 - } - else - { - CLTRACE("TMemoryDump::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TMemoryDump::Serialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TMemoryDump::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMMemory) - { - CLTRACE("TMemoryDump::Deserialize() ERROR Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TMemDumpVersionVersion)aReader.ReadShort(); // 2 - - if(iVersion == EMemDumpVersion1) - { - // read data v1 format - iStartAddress = aReader.ReadInt(); // 4 - iPid = aReader.ReadInt64(); // 8 - iLength = aReader.ReadInt(); // 4 - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TMemoryDump::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TMemoryDump::Deserialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - /** - * TTraceDump implementation - * @internal technology - */ - - /** - * TTraceDump Constructor - */ - TTraceDump::TTraceDump(): - iId(ESCMTraceData), - iVersion(ETraceDumpVersion1), - iSizeOfMemory(0), - iNumberOfParts(0) - { - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TTraceDump::GetSize() const - { - if(iVersion == ETraceDumpVersion1) - { - return 14; - } - else - { - CLTRACE("TTraceDump::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TTraceDump::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - aWriter.WriteInt(iId); // 4 - if(iId != ESCMTraceData) - { - CLTRACE("TTraceDump::Serialize Error - Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == ETraceDumpVersion1) - { - // write data v1 format - aWriter.WriteInt(iSizeOfMemory); // 4 - aWriter.WriteInt(iNumberOfParts); // 4 - } - else - { - CLTRACE("TTraceDump::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TTraceDump::Serialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TTraceDump::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMTraceData) - { - CLTRACE("TTraceDump::Deserialize() Error: Corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TTraceDumpVersion)aReader.ReadShort(); // 2 - - if(iVersion == ETraceDumpVersion1) - { - // read data v1 format - iSizeOfMemory = aReader.ReadInt(); // 4 - iNumberOfParts = aReader.ReadInt(); // 4 - - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TTraceDump::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TTraceDump::Deserialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - } - -//eof diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmlockdata.cpp --- a/kernel/eka/debug/crashMonitor/src/scmlockdata.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,190 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmlockdata.cpp -// some utility classes for writing data to flash buffer -// -// - -/** - @file - @internalTechnology -*/ - - -#include - -namespace Debug - { - - /** - * TSCMLockData constructor - * @param none - */ - TSCMLockData::TSCMLockData() - : iId(ESCMLocks) - , iMutexHoldCount(-1) - , iMutexThreadWaitCount(-1) - { - } - - /** - * TSCMLockData Serialize - * @param aWriter byte stream to use - * @return N/A - */ - TInt TSCMLockData::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - if(iId != ESCMLocks) - { - CLTRACE("TSCMLockData::Serialize Corrupt ID"); - return KErrCorrupt; - } - - // write id first - aWriter.WriteInt(iId); // 4 - // 2 counts written as shorts (should be enough range!) - aWriter.WriteShort((TInt16) iMutexHoldCount); // 2 - aWriter.WriteShort((TInt16) iMutexThreadWaitCount); // 2 - aWriter.WriteShort((TInt16) iLockCount); // 2 - - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TSCMLockData::Serialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return void - */ - TInt TSCMLockData::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMLocks) - { - CLTRACE("TSCMLockData::Deserialize Corrupt ID read"); - return KErrCorrupt; - } - - iMutexHoldCount = (TInt) aReader.ReadShort(); - iMutexThreadWaitCount = (TInt) aReader.ReadShort(); - iLockCount = (TInt) aReader.ReadShort(); - - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - CLTRACE("TSCMLockData::Deserialize size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TSCMLockData::GetSize() const - { - return KSCMLockDataMaxSize; - } - - /** - * MutexHoldCount - * @param none - * @return mutex hold count - */ - TInt TSCMLockData::MutexHoldCount() const - { - return iMutexHoldCount; - } - - /** - * SetMutexHoldCount - * @param - * @return - */ - void TSCMLockData::SetMutexHoldCount(TInt aMutexHoldCount) - { - iMutexHoldCount = aMutexHoldCount; - } - - /** - * MutexThreadWaitCount - * @param none - * @return number of threads waiting on held mutex - will only be valid if - * MutexHoldCount > 0 - */ - TInt TSCMLockData::MutexThreadWaitCount() const - { - return iMutexThreadWaitCount; - } - - /** - * SetMutexThreadWaitCount - * @param TInt - number of threads waiting on held mutex(es) - * @return void - */ - void TSCMLockData::SetMutexThreadWaitCount(TInt aMutexThreadWaitCount) - { - iMutexThreadWaitCount = aMutexThreadWaitCount; - } - - /** - * LockCount - * @param none - * @return TIOnt - the lock count - */ - TInt TSCMLockData::LockCount() const - { - return iLockCount; - } - - /** - * SetLockCount - * @param TInt - number of locks held - * @return void - */ - void TSCMLockData::SetLockCount(TInt aLockCount) - { - iLockCount = aLockCount; - } - - TBool TSCMLockData::operator == (const TSCMLockData& aOther) const - { - return ( iId == aOther.iId && - iMutexHoldCount == aOther.iMutexHoldCount && - iMutexThreadWaitCount == aOther.iMutexThreadWaitCount && - iLockCount == aOther.iLockCount ); - } - - TBool TSCMLockData::operator != (const TSCMLockData& aOther) const - { - return !(*this == aOther); - } - } - - diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmmulticrashinfo.cpp --- a/kernel/eka/debug/crashMonitor/src/scmmulticrashinfo.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmmulticrashinfo.cpp -// Class to store info about the crash flash to enable multiple crashes -// -// - -/** - @file - @internalTechnology -*/ - -#include - -namespace Debug - { - /** - * constructor - */ - SCMMultiCrashInfo::SCMMultiCrashInfo() - : iFirstBlock(NULL) - , iCurrentBlock(NULL) - { - } - - /** - * destructor - */ - SCMMultiCrashInfo::~SCMMultiCrashInfo() - { - ClearList(); - } - - /** add a pointer to a block to the list - takes ownership of block - * @param SCMCrashBlockEntry* aBlockEntry block to add - */ - void SCMMultiCrashInfo::AddBlock(SCMCrashBlockEntry* aBlockEntry) - { - if(aBlockEntry) - { - CLTRACE4("SCMMultiCrashInfo::AddBlock iBlockOffset = [%d] [0x%X] iBlockSize = [%d] [0x%X]" - , aBlockEntry->iBlockOffset,aBlockEntry->iBlockOffset, aBlockEntry->iBlockSize, aBlockEntry->iBlockSize); - if(!iFirstBlock) - { - // adding to empty list - iFirstBlock = aBlockEntry; - iCurrentBlock = iFirstBlock; - } - else - { - SCMCrashBlockEntry* p = iFirstBlock; - while(p->iNext) - { - p = p->iNext; - } - p->iNext = aBlockEntry; - } - } - else - { - CLTRACE("SCMMultiCrashInfo::AddBlock Adding a NULL block !"); - } - } - - - /** add a pointer to a block to the list - takes ownership of block - * @return SCMCrashBlockEntry* returns NULL when no more blocks - * @param none - */ - SCMCrashBlockEntry* SCMMultiCrashInfo::GetNextBlock() - { - SCMCrashBlockEntry* p = iCurrentBlock; - if(iCurrentBlock) - { - iCurrentBlock = iCurrentBlock->iNext; - } - return p; - } - - /** - * sets current block to first in list - */ - void SCMMultiCrashInfo::Reset() - { - iCurrentBlock = iFirstBlock; - } - - /** - * Clears all entries in the list - */ - void SCMMultiCrashInfo::ClearList() - { - SCMCrashBlockEntry* p = iFirstBlock; - - while(p) - { - SCMCrashBlockEntry* tmp = p; - p = p->iNext; - delete tmp; - } - - iFirstBlock = iCurrentBlock = NULL; - } - } - -//eof - diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmonitor.cpp --- a/kernel/eka/debug/crashMonitor/src/scmonitor.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1032 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmonitor.cpp -// Core dump server - Kernel side crash monitor -// -// - -/** - @file - @internalTechnology -*/ - -#include -#include -#include -#include -#include -#include -#include - -#include "scmdatasave.h" - -GLDEF_D SCMonitor TheSCMonitor; //global definition of SCMonitor - -//keep things 4 byte aligned -const TInt KRestartType = SCMonitor::ESoftRestart; - -/** -SCMonitor constructor -*/ -SCMonitor::SCMonitor() - : iMultiCrashInfo(NULL) - { - } - -SCMonitor::~SCMonitor() - { - delete iMultiCrashInfo; - } - -/** - Print data to the corresponding output channel. Derived from monitor - @param aDes the buffer containing the data - */ -void SCMonitor::Print (const TDesC8& aDes ) - { - //intended to do nothing - } - -/** - * Allocates resources for SCMonitor - * cant fully construct in constructor as we are a kernel extension and resources are limited when we are created - */ -void SCMonitor::StableConstruction() - { - LOG_CONTEXT - iDataSave = new SCMDataSave(this, TheSCMonitor.iFlash); - - //Configuration object for use upon crash - iScmConfig = new SCMConfiguration(); - TInt err = iScmConfig->SetDefaultConfig(); - if(KErrNone != err) - { - CLTRACE1("SCMonitor::StableConstruction - Unable to set default config err = %d", err); - } - - -#ifdef NO_MULTICRASHINFO - iMultiCrashInfo = NULL; -#else - - //We need to take a look at the flash map from variant_norflash_layout.h - iMultiCrashInfo = new SCMMultiCrashInfo(); - - TUint numberBlocks = KCrashLogSize / KCrashLogBlockSize; - for(TUint32 cnt = 0; cnt < numberBlocks; cnt++) - { - iMultiCrashInfo->AddBlock(new SCMCrashBlockEntry(cnt, cnt * KCrashLogBlockSize, KCrashLogBlockSize)); - } -#endif - } - -/** - * Start a secondary DFC queue for the Flash and Init the flash in the variant(h4) - * @param aAny - */ -void StartSecondary (TAny* ) - { - LOG_CONTEXT - //InitFlash is implemented in the variant as it creates a variant - //specific derived CrashFlash - TheSCMonitor.InitFlash ( ); - TheSCMonitor.StableConstruction(); - } - -/** - * Global method to create a dfc queue - * @param Method to intialise the flash. - * @param Null - * @param Gets the address of the supervisor thread DFC queue - * @param TDfcQ priority number - * @return a DFC object - */ -GLDEF_C TDfc StartSecondaryDfc(&StartSecondary, NULL, Kern::SvMsgQue(), KMaxDfcPriority-1); - -/** - * Kernel Main module entry - Own implementation( similar to crash logger) - * @param aReason reason to enter to the method - * @return One of the system wide codes - */ -GLDEF_C TInt KernelModuleEntry(TInt aReason) - { - if(aReason==KModuleEntryReasonVariantInit0) - { - new(&TheSCMonitor) SCMonitor; - // We are going to register the system Crash monitor here so that the order - // the monitor modules are placed in rom is preserved. - // The monitor is not fully intialised here. - //the variant target is missing as we still have to finalise on the crash flash - //implementation. H2 & H4 doesnt support currently. - LOG_CONTEXT - CLTRACE("Installing System Crash Monitor"); - Monitor::RegisterMonitorImpl (&TheSCMonitor ); - return KErrNone; - } - else if (aReason==KModuleEntryReasonExtensionInit0 ) - { - return KErrNone; - } - else if (aReason==KModuleEntryReasonExtensionInit1 ) - { - LOG_CONTEXT - CLTRACE("Enqueing dfc to init crash flash for System Crash Monitor after all modules loaded"); - StartSecondaryDfc.Enque ( ); - return KErrNone; - } - return KErrArgument; - } - -/** - Method to intialize the system crash monitor - @param aCategory the fault category type - @param aReason the reason for crash - @return restart type - */ -TInt SCMonitor::Init2 (TAny* aCategory, TInt aReason ) - { - LOG_CONTEXT - __KTRACE_OPT(KALWAYS, Kern::Printf("\n\nSystem Crash Monitor Launched: To Analyse Crash Produced Use Core Dump Server\n")); - - //Start logging the data: - //Need to lock kernel to access object containers (it technically is anyway, but flag isnt set) - NKern::Lock(); - DoCrash(aCategory, aReason); - NKern::Unlock(); - - __KTRACE_OPT(KALWAYS, Kern::Printf("System Crash Monitor Finished: Log Size = [%d]\n", iDataSave->iCrashInf.iLogSize)); - - return KRestartType; - } - -/** - * This is responsible for setting up any structures required for processing of the crash - * @param aCategory the fault category type - * @param aReason - */ -void SCMonitor::DoCrash(TAny* aCategory, TInt aReason ) - { - // get debug mask - TInt dbgMask = Kern::SuperPage().iDebugMask[0]; - - // if we are writing to the comm port then we need to turn off other debug messages - if( iDataSave->GetWriteSelect() == SCMDataSave::EWriteComm) - { - Kern::SuperPage().iDebugMask[0] = 0; - } - - if(!aCategory) - { - CLTRACE("\tNULL category retrieved and returning"); - TheSCMonitor.iFlash->EndTransaction(); - return; - } - - iFrame = NULL; - - CLTRACE("\tAbout to set category -- note: can occasionaly crash board"); - iFaultCategory = *(const TDesC8*)aCategory; // this crashes the board sometimes - iFaultReason = aReason; - Epoc::SetMonitorExceptionHandler ((TLinAddr)HandleException ); - - // get the first start block - // will retieve start of flash by default - SCMCrashBlockEntry block; - TInt err = GetNextCrashStartPoint(block); // will also attempt to read iScmConfig - - if(KErrNone == err) - { - CLTRACE2("SCMonitor::DoCrash next crash will be written at blocknumber = %d offset %d" - , block.iBlockNumber, block.iBlockOffset); - } - else - { - CLTRACE1("SCMonitor::DoCrash Failed to find a valid block to write to, can not continue. err = [%d]", err); - return; - } - - TUint crashId = block.iBlockNumber; - iDataSave->iWriter->ResetBytesWritten(); - - //Write the crash (1st pass is to gather header data) - TInt spaceRequired = ProcessCrash(block, crashId, EFalse); - - // now do the real write - // prepare flash for data - TheSCMonitor.iFlash->StartTransaction(); - TheSCMonitor.iFlash->SetWritePos(block.iBlockOffset); - - //write the crash this time - ProcessCrash(block, crashId, ETrue); - - TheSCMonitor.iFlash->EndTransaction(); - - // restore debug mask - Kern::SuperPage().iDebugMask[0] = dbgMask; - } - - -/** - * This walks the existing crash log and finds out where current crashes finish - * @param aBlockEntry Block to use. Only valid if KErrNone is returned. - * @return One of the OS wide codes - */ -TInt SCMonitor::GetNextCrashStartPoint(SCMCrashBlockEntry& aBlockEntry) - { - LOG_CONTEXT - - //First thing is to try and read the config - TBool configFound = (iDataSave->ReadConfig(*iScmConfig) == KErrNone); - - if( iMultiCrashInfo) - { - /** - * data save has been configured to use multicrash info to find the next block we are on we need to scan each - * block to see if it contains a valid header. if we find an empty block in our block list then that is the - * one we will use if we find no empty blocks then we have no room left - */ - iMultiCrashInfo->Reset(); - SCMCrashBlockEntry* block = iMultiCrashInfo->GetNextBlock(); - TBool blockFound = EFalse; - - //For any crashes in flash, we need to record where they end, so that we can then go to the next - //block after the one in which it ends - TInt crashEndPoint = 0; - - while(block) - { - CLTRACE1("SCMonitor::GetNextCrashStartPoint Processing block number %d", block->iBlockNumber ); - - //If we have already found our block, we should erase subsequent ones for use - if(blockFound) - { - TInt err = EraseFlashBlock(*block); - if(err != KErrNone) - { - return err; - } - - block = iMultiCrashInfo->GetNextBlock(); - continue; - } - - //is this block before a crash end? if it is, we cant use it as a crash can span multiple blocks - if(block->iBlockOffset >= crashEndPoint) - { - //special condition if we have a config - TUint startPos = block->iBlockOffset; - TUint skipBytes = 0; - if(configFound && block->iBlockOffset == 0) - { - startPos+=iScmConfig->GetSize(); - - //must align to flash for read - skipBytes = startPos % KFlashAlignment; - startPos -= skipBytes; - } - - // try and read an info header at these flash coords - TBuf8 buf; - buf.SetLength(TCrashInfoHeader::KSCMCrashInfoMaxSize + KFlashAlignment); - - CLTRACE1("(SCMonitor::GetNextCrashStartPoint) reading at offset %d", block->iBlockOffset); - - TheSCMonitor.iFlash->SetReadPos(startPos); - TheSCMonitor.iFlash->Read(buf); - - // create the buffer applying the offset of bytes skipped - TByteStreamReader reader(const_cast (buf.Ptr() + skipBytes)); - - TCrashInfoHeader header; - TInt err = header.Deserialize(reader); - - if(err == KErrCorrupt) - { - CLTRACE2("(SCMonitor::GetNextCrashStartPoint) Found empty block blocknumber %d blockoffset = %d" - , block->iBlockNumber, block->iBlockOffset); - - blockFound = ETrue; - aBlockEntry = *block; - - continue; //Dont get next block, as next run will erase this current block for use - } - else - { - crashEndPoint = header.iLogSize + startPos; - CLTRACE3("(SCMonitor::GetNextCrashStartPoint) In block [%d] we found a valid crash header. This crash finishes at [%d] [0x%X]", block->iBlockNumber, crashEndPoint, crashEndPoint); - } - } - - block = iMultiCrashInfo->GetNextBlock(); - } - - if(blockFound) - { - return KErrNone; - } - else - { - //CLTRACE("(SCMonitor::GetNextCrashStartPoint) No available blocks TREATING as NO MULTICRASH INFO will write to default block"); - //In this case should we just overwrite old crashes and return the first block as the comment above suggests - //return blockFound; - } - } - - // no multi crash info supplied - use default first block settings - TInt err = EraseEntireFlashPartition(); - if(err != KErrNone) - { - CLTRACE1("Unable to delete area required to log to flash. Aborting. Error - [%d]", err); - return err; - } - - aBlockEntry = SCMCrashBlockEntry(0,0,0); - return KErrNone; - } - -/** - * Handles the processing of the crash - * @return The size of the crash log (including header) that has been/will be written - */ -TInt SCMonitor::ProcessCrash(const SCMCrashBlockEntry& aBlock, TUint aCrashId, TBool aCommit) - { - LOG_CONTEXT - CLTRACE5("aBlock.iBlockOffset = [%d] [0x%X] aBlock.iBlockNumber = %d aBlock.iBlockSize = [%d] [0x%X]", - aBlock.iBlockOffset, aBlock.iBlockOffset, aBlock.iBlockNumber, aBlock.iBlockSize, aBlock.iBlockSize); - - // reset writer for start of each crash - iDataSave->iWriter->ResetBytesWritten(); - TInt logLevel = 0; - - if(aCommit) - { - logLevel = KALWAYS; - iDataSave->iWriter->EnablePhysicalWriting(); - } - else - { -#if defined(_DEBUG) - logLevel = KDEBUGGER; -#else - logLevel = KALWAYS; //Doesnt matter, KTRACE OPT is empty for rel builds - if(logLevel != KALWAYS) - { - //This is to avoid warning - } -#endif - - iDataSave->iWriter->DisablePhysicalWriting(); - } - - iDataSave->SetByteCount(aBlock.iBlockOffset); - if(aBlock.iBlockOffset == 0 && aBlock.iBlockNumber == 0) - { - // this is the first crash - we need to save the config here first - CLTRACE("(SCMonitor::ProcessCrash) - this is block 0 - WRITING CONFIG"); - iDataSave->LogConfig(*iScmConfig); - - //Config is not part of crash so reset bytes written - iDataSave->SetCrashStartingPoint(iDataSave->iWriter->GetBytesWritten()); - } - else - { - iDataSave->SetCrashStartingPoint(aBlock.iBlockOffset); - } - - iDataSave->iWriter->ResetBytesWritten(); - - TUint32 logSize = 0; - TUint sizeOfObjectDumped = 0; - - TInt err = iDataSave->LogCrashHeader(iFaultCategory, iFaultReason, aCrashId, sizeOfObjectDumped); - if(KErrNone != err) - { - CLTRACE("System Crash Monitor: Failed to create crash info header - (TCrashInfo)"); - return KRestartType; - } - - logSize += sizeOfObjectDumped; - - //Now we must read the configuration to use. This is held at the start of our flash partition - //and managed by the iConfig object - iScmConfig->ResetToHighestPriority(); - - //Always want the crash context - iDataSave->iHdr.iCTFullRegOffset = logSize + iDataSave->GetCrashStartingPoint(); - - err = iDataSave->LogCPURegisters(sizeOfObjectDumped); - if(KErrNone != err) - { - CLTRACE1("\tError logging full registers = %d", err); - } - - logSize += sizeOfObjectDumped; - - CLTRACE("\tAbout to enter processing loop"); - SCMDataSave::TDataToDump dump; - - for(;;) - { - //now we get each item by priority from the configuration - TConfigItem* configItem = iScmConfig->GetNextItem(); - - if(!configItem) - { - // end of list - break; - } - - CLTRACE1("\nLooking at item type [%d]", configItem->GetDataType()); - if(configItem->GetSpaceRequired() > iDataSave->SpaceRemaining()) - { - __KTRACE_OPT(logLevel, Kern::Printf("\t\tFor Item Type [%d]: Unable to log [0x%X] [%d] bytes because we only have [0x%X] [%d] bytes left", configItem->GetDataType(), configItem->GetSpaceRequired(), configItem->GetSpaceRequired(), iDataSave->SpaceRemaining(), iDataSave->SpaceRemaining())); - continue; - } - else - { - CLTRACE1("Will require [%d] bytes for this item", configItem->GetSpaceRequired()); - } - - // only interested in logging items with priority > 0 - if( configItem->GetPriority() <= 0) - { - CLTRACE1("\tIgnored config item type %d priority 0", configItem->GetDataType()); - continue; - } - - //there are a lot of TUints in the hdr to record where we wrote this item. - //This will point to the one of interest for this configItem - TUint32* offsetPointer = NULL; - - //now we check the type of data we wish to dump - switch(configItem->GetDataType()) - { - case TConfigItem::ECrashedThreadMetaData: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: ECrashedThreadMetaData at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - err = LogThreadMetaData(SCMDataSave::EThreadSpecific, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iCTMetaOffset); - - break; - } - case TConfigItem::EThreadsMetaData: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EThreadsMetaData at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - //record location we are writing to in the header - iDataSave->iHdr.iTLstOffset = iDataSave->iWriter->GetBytesWritten(); - err = LogThreadMetaData(SCMDataSave::ESystemWide, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iTLstOffset); - - break; - } - case TConfigItem::ECrashedProcessMetaData: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: ECrashedProcessMetaData at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - err = LogProcessMetaData(SCMDataSave::EProcessSpecific, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iCPMetaOffset); - - break; - } - case TConfigItem::EProcessMetaData: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EProcessMetaData at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - err = LogProcessMetaData(SCMDataSave::ESystemWide, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iPLstOffset); - - break; - } - case TConfigItem::ECrashedProcessUsrStacks: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: ECrashedProcessUsrStacks at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - //define what we wish to dump - dump.iMetaData = EFalse; - dump.iCodeSegs = EFalse; - dump.iStk = SCMDataSave::EUsrStack; - dump.iReg = SCMDataSave::ERegSetNone; - err = LogObjectContainers(EThread, SCMDataSave::EProcessSpecific, dump, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iCTUsrStkOffset); - - break; - } - case TConfigItem::EThreadsUsrStack: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EThreadsUsrStack at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - //define what we wish to dump - dump.iMetaData = EFalse; - dump.iCodeSegs = EFalse; - dump.iStk = SCMDataSave::EUsrStack; - dump.iReg = SCMDataSave::ERegSetNone; - - err = LogObjectContainers(EThread, SCMDataSave::ESystemWide, dump, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iSysSvrStkOffset); - - break; - } - case TConfigItem::ECrashedProcessSvrStacks: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: ECrashedProcessSvrStacks at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - //define what we wish to dump - dump.iMetaData = EFalse; - dump.iCodeSegs = EFalse; - dump.iStk = SCMDataSave::ESvrStack; - dump.iReg = SCMDataSave::ERegSetNone; - - err = LogObjectContainers(EThread, SCMDataSave::EProcessSpecific, dump, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iCTSvrStkOffset); - - break; - } - case TConfigItem::EThreadsSvrStack: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EThreadsSvrStack at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - //define what we wish to dump - dump.iMetaData = EFalse; - dump.iCodeSegs = EFalse; - dump.iStk = SCMDataSave::ESvrStack; - dump.iReg = SCMDataSave::ERegSetNone; - - err = LogObjectContainers(EThread, SCMDataSave::ESystemWide, dump, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iSysSvrStkOffset); - - break; - } - case TConfigItem::EThreadsUsrRegisters: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EThreadsUsrRegisters at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - //define what we wish to dump - dump.iMetaData = EFalse; - dump.iCodeSegs = EFalse; - dump.iStk = SCMDataSave::EStackTypeNone; - dump.iReg = SCMDataSave::EUserRegisters; - - err = LogObjectContainers(EThread, SCMDataSave::ESystemWide, dump, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iSysUsrRegOffset); - - break; - } - case TConfigItem::EThreadsSvrRegisters: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EThreadsSvrRegisters at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - //define what we wish to dump - dump.iMetaData = EFalse; - dump.iCodeSegs = EFalse; - dump.iStk = SCMDataSave::EStackTypeNone; - dump.iReg = SCMDataSave::ESupervisorRegisters; - - err = LogObjectContainers(EThread, SCMDataSave::ESystemWide, dump, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iSysSvrRegOffset); - - break; - } - case TConfigItem::EExceptionStacks: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EExceptionStacks at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - err = iDataSave->LogExceptionStacks(sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iExcStkOffset); - - break; - } - case TConfigItem::ECrashedProcessCodeSegs: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: ECrashedProcessCodeSegs at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - //define what we wish to dump - dump.iMetaData = EFalse; - dump.iCodeSegs = ETrue; - dump.iStk = SCMDataSave::EStackTypeNone; - dump.iReg = SCMDataSave::ERegSetNone; - - err = LogObjectContainers(EProcess, SCMDataSave::EProcessSpecific, dump, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iCPCodeSegOffset); - - break; - } - case TConfigItem::EProcessCodeSegs: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EProcessCodeSegs at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - //define what we wish to dump - dump.iMetaData = EFalse; - dump.iCodeSegs = ETrue; - dump.iStk = SCMDataSave::EStackTypeNone; - dump.iReg = SCMDataSave::ERegSetNone; - err = LogObjectContainers(EProcess, SCMDataSave::ESystemWide, dump, sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iSysCodeSegOffset); - - break; - } - case TConfigItem::ETraceData: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: ETraceData at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - err = iDataSave->LogTraceBuffer(configItem->GetSizeToDump(), sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iTraceOffset); - - break; - } - case TConfigItem::ELocks: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: ELocks at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - err = iDataSave->LogLocks(sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iScmLocksOffset); - - break; - } - case TConfigItem::EKernelHeap: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EKernelHeap at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - err = iDataSave->LogKernelHeap(sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iKernelHeapOffset); - - break; - } - case TConfigItem::EVariantSpecificData: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: EVariantSpecificData at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - err = iDataSave->LogVariantSpecificData(sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iVarSpecInfOffset); - - break; - } - case TConfigItem::ERomInfo: - { - __KTRACE_OPT(logLevel, Kern::Printf("\tDoing: ERomInfo at [%d] offset from [%d]", iDataSave->iWriter->GetBytesWritten(), iDataSave->GetCrashStartingPoint())); - - err = iDataSave->LogRomInfo(sizeOfObjectDumped); - offsetPointer = &(iDataSave->iHdr.iRomInfoOffset); - - break; - } - //unknown configuration type - something bad is going on - default: return 0; - } - - if(KErrNone != err) - { - __KTRACE_OPT(logLevel, Kern::Printf("\tError logging data: [%d] Type = [%d]", err, aBlock.iBlockOffset)); - continue; - } - - //Set the space required so next time around we will know in advance how much space we need - configItem->SetSpaceRequired(sizeOfObjectDumped); - - //Note: the following steps are only required for the first time we call process crash. The second time, - //when physical writing is enabled, these will have been written already and so they dont matter - - //update the offset and logsize if we are going to dump this item - TUint32 absoluteLogPos = logSize + iDataSave->GetCrashStartingPoint(); - if(absoluteLogPos+sizeOfObjectDumped < iDataSave->MaxLogSize()) - { - //now, we must record where in the crash log this item will be dumped - *offsetPointer = absoluteLogPos; - logSize += sizeOfObjectDumped; - } - } - - iDataSave->iCrashInf.iLogSize = logSize; - iDataSave->iWriter->FlushCache(); - - return iDataSave->iCrashInf.iLogSize; - } - -/** - * Logs the meta data for processes - * @param aCurrentProcess - scope to dump - * @return one of the OS wide codes - */ -TInt SCMonitor::LogProcessMetaData(SCMDataSave::TDumpScope aScope, TUint& aSizeDumped) const - { - LOG_CONTEXT - - SCMDataSave::TDataToDump dump; - dump.iMetaData = ETrue; - - return LogObjectContainers(EProcess, aScope, dump, aSizeDumped); - } - -/** - * - * @param aCurrentThread - to only do the current (crashed thread) or to do all the others - * @return one of the OS wide codes - */ -TInt SCMonitor::LogThreadMetaData(SCMDataSave::TDumpScope aScope, TUint& aSizeDumped) const - { - LOG_CONTEXT - - SCMDataSave::TDataToDump dump; - dump.iMetaData = ETrue; - - return LogObjectContainers(EThread, aScope, dump, aSizeDumped); - } - -/** - * Generic method that looks at all kernel objects of aObjectType - * @param aObjectType - * @param aDumpScope - if you wish to dump for the the current process, current thread or entire system - * @param aDataToDump - data you wish to dump - * @param aSizeDumped - records how much was dumped - * @return - */ -TInt SCMonitor::LogObjectContainers(TObjectType aObjectType, SCMDataSave::TDumpScope aDumpScope, const SCMDataSave::TDataToDump& aDataToDump, TUint& aSizeDumped) const - { - aSizeDumped = 0; - - if(aObjectType >= ENumObjectTypes) - { - return KErrArgument; - } - - //Get the object container for the given object type - DObjectCon* objectContainer = Kern::Containers()[aObjectType]; - if(objectContainer == NULL) - { - CLTRACE("tFailed to get object container"); - return KErrNotFound; - } - - //Must check the mutex on this is ok otherwise the data will be in an inconsistent state - if(objectContainer->iMutex->iHoldCount) - { - CLTRACE("\tObject Container is in an inconsistant state"); - return KErrCorrupt; - } - - TInt numObjects = objectContainer->Count(); - TInt err = KErrNone; - - for(TInt cnt = 0; cnt< numObjects; cnt ++) - { - DObject* object = (*objectContainer)[cnt]; - - //Are we interested in the object? scope only relevant for thread and process objects, for others, the scope is implicit - if(aObjectType == EThread) - { - switch(aDumpScope) - { - case SCMDataSave::EThreadSpecific : - { - //if we are interested in the current thread and this is not it, continue - if(((DThread*)object) != &Kern::CurrentThread()) - continue; - break; - } - case SCMDataSave::EProcessSpecific : - { - //if we are interested in the current proc and this is not it, continue - if(((DThread*)object)->iOwningProcess != &Kern::CurrentProcess()) - continue; - break; - } - case SCMDataSave::ESystemWide : - default: - break; - } - } - else if(aObjectType == EProcess) - { - switch(aDumpScope) - { - case SCMDataSave::EProcessSpecific : - { - if((DProcess*)object != &Kern::CurrentProcess()) - continue; - break; - } - case SCMDataSave::EThreadSpecific : //thread specific process doesnt make sense - return KErrArgument; - case SCMDataSave::ESystemWide : - default: - break; - } - } - - //Now we look at the data we have been asked to dump - if(aDataToDump.iMetaData) - { - TUint dumped = 0; - err = HelpDumpMetaData(object, aObjectType, dumped); - if(KErrNone != err) - { - CLTRACE1("Failed to meta data: [%d]", err); - return err; - } - aSizeDumped += dumped; - } - - if(aDataToDump.iCodeSegs) - { - if(aObjectType != EProcess) - { - return KErrArgument; - } - - TUint dumped = 0; - err = iDataSave->LogCodeSegments((DProcess*)object, dumped); - if(KErrNone != err) - { - CLTRACE1("Failed to log code segments: [%d]", err); - return err; - } - aSizeDumped += dumped; - } - - if(aDataToDump.iStk != SCMDataSave::EStackTypeNone) - { - TUint dumped = 0; - err = HelpDumpStacks(object, aObjectType, dumped, aDataToDump.iStk); - if(KErrNone != err) - { - CLTRACE1("Failed to log stacks: [%d]", err); - return err; - } - aSizeDumped += dumped; - } - - if(aDataToDump.iReg != SCMDataSave::ERegSetNone) - { - if(aObjectType != EThread) - { - return KErrArgument; - } - TUint dumped = 0; - err = iDataSave->LogRegisters((DThread*)object, aDataToDump.iReg, dumped); - if(KErrNone != err && KErrNotSupported !=err) //we expect to send down a KErrNotSupported when we ask for Full CPU set for the non crashed thread - thats fine - { - CLTRACE1("Failed to log registers: [%d]", err); - return err; - } - aSizeDumped += dumped; - } - } - - return KErrNone; - } - -/** - * Helper method for dumping stacks. Looks to see what type of stack we want and then calls - * appropriate method - * @param aObject The DThread object whose stack we want - * @param aObjectType The object type of this aObject. Anything other than EThread will give KErrArgument - * @param aSizeDumped Holds the size of the stack dumped after processing - * @param aStkType The type of stack to be dumped - * @see TObjectType - * @see SCMDataSave::TStackType - * @return One of the system wide codes - */ -TInt SCMonitor::HelpDumpStacks(DObject* aObject, TObjectType aObjectType, TUint& aSizeDumped, SCMDataSave::TStackType aStkType) const - { - //verify args - if(aObjectType != EThread) - { - return KErrArgument; - } - - switch(aStkType) - { - case SCMDataSave::EUsrStack: - { - return iDataSave->LogThreadUserStack((DThread*)aObject, ETrue, aSizeDumped); - } - case SCMDataSave::ESvrStack: - { - return iDataSave->LogThreadSupervisorStack((DThread*)aObject, ETrue, aSizeDumped); - } - default: return KErrArgument; - } - } - -/** - * Helper method to dump meta data about a DThread or a DProcess object - * @param aObject DObject to use - * @param aObjectType Type of DObject. Must be EThread or EProcess - * @param aSizeDumped Holds the size of the stack dumped after processing - * @return - */ -TInt SCMonitor::HelpDumpMetaData(DObject* aObject, TObjectType aObjectType, TUint& aSizeDumped) const - { - aSizeDumped = 0; - - switch(aObjectType) - { - case EThread: - { - return iDataSave->LogThreadData((DThread*)aObject, aSizeDumped); - } - case EProcess: - { - return iDataSave->LogProcessData((DProcess*)aObject, aSizeDumped); - } - default: return KErrArgument; - } - } - -/** - * Wrapper method around the flash erase block fundtion to determine if the erase was succesful. - * If the erase was not succesful we can't continue as we cannot write. - * @param aBlockOffset Block to erase - * @return One of the OS wide codes - */ -TInt SCMonitor::EraseFlashBlock(const SCMCrashBlockEntry& aBlock) - { - iFlash->StartTransaction(); - - TInt numAttempts = 0; - while(numAttempts < KFlashEraseAttempts) - { - iFlash->SetWritePos(aBlock.iBlockOffset); - iFlash->EraseFlashBlock(aBlock.iBlockOffset); - - //we will read the flash to make sure that it set the block to all 1's (well not all, just the start) - TBuf8 buf; - buf.SetLength(sizeof(TUint32)); - - iFlash->SetReadPos(aBlock.iBlockOffset); - iFlash->Read(buf); - - volatile TUint32* result = (TUint32*)buf.Ptr(); - if(*result == 0xFFFFFFFF) - { - __KTRACE_OPT(KALWAYS, Kern::Printf("Erase of block [0x%X] succesful after [%d] attempts", aBlock.iBlockOffset, numAttempts+1)) - iFlash->EndTransaction(); - return KErrNone; - } - - numAttempts++; - - //Sometimes a write to the block helps the next erase - TUint32 bytesWritten = 0; - while(bytesWritten < aBlock.iBlockSize) - { - TBuf8 num; - num.Append(0x0); - iFlash->Write(num); - bytesWritten++; - } - } - - __KTRACE_OPT(KALWAYS, Kern::Printf("After %d attempts, we were unable to erase the flash block at [0x%X]. This could be because " - "the driver is defective or because the flash has gone past its lifetime. Whatever it is though, " - "we cannot continue.", KFlashEraseAttempts, aBlock.iBlockOffset)); - - iFlash->EndTransaction(); - return KErrAbort; - } - -/** - * This erases each block in the flash partition - * @return One of the system wide codes - */ -TInt SCMonitor::EraseEntireFlashPartition() - { - if(iMultiCrashInfo) - { - iMultiCrashInfo->Reset(); - - SCMCrashBlockEntry* block = iMultiCrashInfo->GetNextBlock(); - while(block) - { - TInt err = EraseFlashBlock(*block); - if(KErrNone != err) - { - return err; - } - - block = iMultiCrashInfo->GetNextBlock(); - } - - return KErrNone; - } - - CLTRACE("SCMonitor::EraseEntireFlashPartition() -- No Flash MAP available, trying to use the raw driver to delete."); - TheSCMonitor.iFlash->EraseLogArea(); - - return KErrNone; - } - -//eof scmonitor.cpp - diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmprocessdata.cpp --- a/kernel/eka/debug/crashMonitor/src/scmprocessdata.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmprocessdata.cpp -// Core dump server - Process Data for System Crash -// -// - -/** - @file - @internalTechnology -*/ - -#include - -namespace Debug - { - /** - * TProcessData implementation - * @internal technology - */ - - /** - * TProcessData constructor - */ - TProcessData::TProcessData() - :iId(ESCMProcessData) - ,iVersion(EProcData1) - ,iPid(0) - ,iNamesize(0) - ,iPriority(0) - ,iSpare1(0) - ,iSpare2(0) - ,iSpare3(0) - { - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return One of the OS wide codes - */ - TInt TProcessData::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - // ID saved first - aWriter.WriteInt(iId); // 4 - - if(iId != ESCMProcessData) - { - CLTRACE("TProcessData::Serialize Corrupt ID"); - return KErrCorrupt; - } - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == EProcData1) - { - // write data v1 format - aWriter.WriteInt(iPriority); // 4 - aWriter.WriteInt64(iPid); // 8 - if(iName.Ptr()) - { - aWriter.WriteInt(iName.Length()); // 4 - for(TInt cnt = 0; cnt < iName.Length(); cnt++) - { - aWriter.WriteByte(iName[cnt]); - } - } - else - { - aWriter.WriteInt(0); - } - - - } - else - { - CLTRACE("TProcessData::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE2("TProcessData::Serialize serialization size error. Wrote [%d] but expected [%d]", endPos - startPos, GetSize()); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return One of the OS wide codes - */ - TInt TProcessData::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMProcessData) - { - CLTRACE("TProcessData::Deserialize failed - Read corrupt ID"); - return KErrCorrupt; - } - - iVersion = (TProcessDataVersion)aReader.ReadShort(); // 2 - - if(iVersion == EProcData1) - { - // read data v1 format - iPriority = aReader.ReadInt(); // 4 - iPid = aReader.ReadInt64(); // 8 - - iNamesize = aReader.ReadInt(); // 4 - - if(iName.Ptr() && iName.MaxLength() >= (TInt)iNamesize) - { - iName.SetLength(0); - - for(TUint cnt = 0; cnt < iNamesize; cnt++) - { - iName.Append(aReader.ReadByte()); //iCategorySize bytes - } - } - - - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TProcessData::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TProcessData::Deserialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TProcessData::GetSize() const - { - if(iVersion == EProcData1) - { - return 22 + iName.Length(); - } - else - { - CLTRACE("TProcessData::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - } diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmromdata.cpp --- a/kernel/eka/debug/crashMonitor/src/scmromdata.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmromdata.cpp -// Core dump server - ROM Data for System Crash -// -// - -/** - @file - @internalTechnology -*/ - -#include - -namespace Debug - { - /** - * TRomHeaderData implementation - * @internal technology - */ - - /** - * TRomHeaderData constructor - */ - TRomHeaderData::TRomHeaderData(): - iId(ESCMRomHeader), - iVersion(ERomHeaderDataVersion1), - iMajorVersion(0), - iMinorVersion(0), - iBuildNumber(0), - iTime(0) - { - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return void - */ - TInt TRomHeaderData::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - if(iId != ESCMRomHeader) - { - CLTRACE("TRomHeaderData::Serialize Corrupt ID"); - return KErrCorrupt; - } - - // ID saved first - aWriter.WriteInt(iId); // 4 - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == ERomHeaderDataVersion1) - { - //ROM time - aWriter.WriteInt64(iTime); // 8 - - //Now the ROM version - aWriter.WriteByte(iMajorVersion); // 1 - aWriter.WriteByte(iMinorVersion); // 1 - aWriter.WriteShort(iBuildNumber); // 2 - } - else - { - CLTRACE("TRomHeaderData::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt pos1 = aWriter.CurrentPosition(); - if( pos1 - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TRomHeaderData::Serialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return void - */ - TInt TRomHeaderData::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMRomHeader) - { - CLTRACE("TRomHeaderData::Deserialize Corrupt ID read"); - return KErrCorrupt; - } - - iVersion = (TRomHeaderDataVersion)aReader.ReadShort(); // 2 - - if(iVersion == ERomHeaderDataVersion1) - { - //ROM time - iTime = aReader.ReadInt64(); // 8 - - //Now the ROM version - iMajorVersion = aReader.ReadByte(); // 1 - iMinorVersion = aReader.ReadByte(); // 1 - iBuildNumber = aReader.ReadShort(); // 2 - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TRomHeaderData::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt pos1 = aReader.CurrentPosition(); - if( pos1 - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TRomHeaderData::Deserialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TRomHeaderData::GetSize() const - { - if(iVersion == ERomHeaderDataVersion1) - { - return 18; - } - else - { - CLTRACE("ERomHeaderDataVersion1::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - } diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmthreaddata.cpp --- a/kernel/eka/debug/crashMonitor/src/scmthreaddata.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\debug\crashMonitor\src\scmthreaddata.cpp -// Core dump server - Thread Data for System Crash -// -// - -/** - @file - @internalTechnology -*/ - -#include - -namespace Debug - { - /** - * TThreadData implementation - * @internal technology - */ - - /** - * TThreadData constructor - */ - TThreadData::TThreadData() - : iId(ESCMThreadData) - ,iVersion(EThreadData1) - ,iPriority(0) - ,iTid(0) - ,iOwnerId(0) - ,iSvcSP(0) - ,iSvcStack(0) - ,iSvcStacksize(0) - ,iUsrSP(0) - ,iUsrStack(0) - ,iUsrStacksize(0) - ,iNamesize(0) - ,iLastCpu(0) - ,iSvcHeap(0) - ,iSvcHeapSize(0) - { - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return void - */ - TInt TThreadData::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - if(iId != ESCMThreadData) - { - CLTRACE("TThreadData::Serialize Corrupt ID"); - return KErrCorrupt; - } - - // ID saved first - aWriter.WriteInt(iId); // 4 - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == EThreadData1) - { - // write data v1 format - aWriter.WriteInt(iPriority); // 4 - aWriter.WriteInt64(iTid); // 8 - aWriter.WriteInt64(iOwnerId); // 8 - aWriter.WriteInt(iSvcSP); // 4 - aWriter.WriteInt(iSvcStack); // 4 - aWriter.WriteInt(iSvcStacksize); // 4 - aWriter.WriteInt(iUsrSP); // 4 - aWriter.WriteInt(iUsrStack); // 4 - aWriter.WriteInt(iUsrStacksize); // 4 - aWriter.WriteInt(iLastCpu); // 4 - aWriter.WriteInt(iSvcHeap); // 4 - aWriter.WriteInt(iSvcHeapSize); // 4 - if(iName.Ptr()) - { - aWriter.WriteInt(iName.Length()); // 4 - for(TInt cnt = 0; cnt < iName.Length(); cnt++) - { - aWriter.WriteByte(iName[cnt]); - } - } - else - { - aWriter.WriteInt(0); - } - } - else - { - CLTRACE("TThreadData::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TThreadData::Serialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return void - */ - TInt TThreadData::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMThreadData) - { - CLTRACE("TThreadData::Deserialize Corrupt ID read"); - return KErrCorrupt; - } - - iVersion = (TThreadDataVersion)aReader.ReadShort(); // 2 - - if(iVersion == EThreadData1) - { - // read data v1 format - iPriority = aReader.ReadInt(); // 4 - iTid = aReader.ReadInt64(); // 8 - iOwnerId = aReader.ReadInt64(); // 8 - iSvcSP = aReader.ReadInt(); // 4 - iSvcStack = aReader.ReadInt(); // 4 - iSvcStacksize = aReader.ReadInt(); // 4 - iUsrSP = aReader.ReadInt(); // 4 - iUsrStack = aReader.ReadInt(); // 4 - iUsrStacksize = aReader.ReadInt(); // 4 - iLastCpu = aReader.ReadInt(); // 4 - iSvcHeap = aReader.ReadInt(); // 4 - iSvcHeapSize = aReader.ReadInt(); // 4 - - iNamesize = aReader.ReadInt(); // 4 - - if(iName.Ptr() && iName.MaxLength() >= (TInt)iNamesize) - { - iName.SetLength(0); - - for(TUint cnt = 0; cnt < iNamesize; cnt++) - { - iName.Append(aReader.ReadByte()); //iNamesize bytes - } - } - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TThreadData::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TThreadData::Deserialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TThreadData::GetSize() const - { - if(iVersion == EThreadData1) - { - return 66 + iName.Length(); - } - else - { - CLTRACE("TThreadData::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - } diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/debug/crashMonitor/src/scmvariantdata.cpp --- a/kernel/eka/debug/crashMonitor/src/scmvariantdata.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,139 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\kernel\scmvariantdata.cpp -// Core dump server - Variant Data for System Crash -// -// - -#include - -namespace Debug - { - /** - * TVariantSpecificData implementation - * @internal technology - */ - - /** - * TVariantSpecificData constructor - */ - TVariantSpecificData::TVariantSpecificData() : - iId(ESCMVariantData) - ,iVersion(EVariantSpecificDataVersion1) - ,iSize(0) - { - } - - /** - * Writes this classes data to the specified byte stream - * @param aWriter byte stream to use - * @return void - */ - TInt TVariantSpecificData::Serialize(TByteStreamWriter& aWriter) - { - TInt startPos = aWriter.CurrentPosition(); - - if(iId != ESCMVariantData) - { - CLTRACE("TVariantSpecificData::Serialize Corrupt ID"); - return KErrCorrupt; - } - - // ID saved first - aWriter.WriteInt(iId); // 4 - - aWriter.WriteShort((TUint16) iVersion); // 2 - - if(iVersion == EVariantSpecificDataVersion1) - { - // write data v1 format - aWriter.WriteInt(iSize); // 4 - } - else - { - CLTRACE("TVariantSpecificData::Serialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aWriter.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - // error between actual size & real size in data - CLTRACE("TVariantSpecificData::Serialize serialization size error"); - return KErrCorrupt; - } - - return KErrNone; - } - - /** - * Reads the classes data from the specified byte stream - * @param aReader Byte stream to use - * @return void - */ - TInt TVariantSpecificData::Deserialize(TByteStreamReader& aReader) - { - TInt startPos = aReader.CurrentPosition(); - - iId = (SCMStructId)aReader.ReadInt(); // 4 - if(iId != ESCMVariantData) - { - CLTRACE("TVariantSpecificData::Deserialize Corrupt ID read"); - return KErrCorrupt; - } - - iVersion = (TVariantSpecificDataVersion)aReader.ReadShort(); // 2 - - if(iVersion == EVariantSpecificDataVersion1) - { - // read data v1 format - iSize = aReader.ReadInt(); // 4 - } - else - { - iId = ESCMLast; //unrecognised header - CLTRACE("TVariantSpecificData::Deserialize Unsupported version"); - return KErrCorrupt; - } - - TInt endPos = aReader.CurrentPosition(); - if( endPos - startPos != GetSize()) - { - iId = ESCMLast; //unrecognised header - - // error between actual size & real size in data - CLTRACE("TVariantSpecificData::Deserialize serialization size error"); - return KErrCorrupt; - } - return KErrNone; - } - - /** - * Returns the externalised size of this class - * @return TInt size - */ - TInt TVariantSpecificData::GetSize() const - { - if(iVersion == EVariantSpecificDataVersion1) - { - return 10; - } - else - { - CLTRACE("TThreadData::GetSize Unsupported version"); - return KErrNotSupported; - } - } - - } diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/drivers/crashflash/crashflashnor.cpp --- a/kernel/eka/drivers/crashflash/crashflashnor.cpp Wed Oct 20 13:58:28 2010 +0100 +++ b/kernel/eka/drivers/crashflash/crashflashnor.cpp Tue Oct 26 11:12:58 2010 +0100 @@ -64,13 +64,8 @@ return ret; } // start writing after the crash log header - -#ifdef CDS_CRASH_LOGGER - iWritePos = 0; -#else iWritePos = KCrashLogHeaderSize; -#endif //CDS_CRASH_LOGGER - + SetReadPos(0); iWriteTotal = 0; diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/drivers/debug/group/base_e32_drivers_debug.mrp --- a/kernel/eka/drivers/debug/group/base_e32_drivers_debug.mrp Wed Oct 20 13:58:28 2010 +0100 +++ b/kernel/eka/drivers/debug/group/base_e32_drivers_debug.mrp Tue Oct 26 11:12:58 2010 +0100 @@ -3,7 +3,6 @@ component base_e32_drivers_debug source \sf\os\kernelhwsrv\kernel\eka\debug -source \sf\os\kernelhwsrv\kernel\eka\debug\crashMonitor source \sf\os\kernelhwsrv\kernel\eka\drivers\debug binary \sf\os\kernelhwsrv\kernel\eka\drivers\debug\group all diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/drivers/debug/group/bld.inf --- a/kernel/eka/drivers/debug/group/bld.inf Wed Oct 20 13:58:28 2010 +0100 +++ b/kernel/eka/drivers/debug/group/bld.inf Tue Oct 26 11:12:58 2010 +0100 @@ -25,18 +25,6 @@ BASEDEFAULT -PRJ_EXPORTS - -../../../debug/crashMonitor/inc/scmonitor.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(scmonitor.h) -../../../debug/crashMonitor/inc/scmdatatypes.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(scmdatatypes.h) -../../../debug/crashMonitor/inc/scmbytestreamutil.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(scmbytestreamutil.h) -../../../debug/crashMonitor/inc/scmbytestreamutil.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(scmbytestreamutil.inl) -../../../debug/crashMonitor/inc/crashlogwalker.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(crashlogwalker.h) -../../../debug/crashMonitor/inc/scmconfig.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(scmconfig.h) -../../../debug/crashMonitor/inc/scmconfigitem.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(scmconfigitem.h) -../../../debug/crashMonitor/inc/scmdatasave.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(scmdatasave.h) -../../../debug/crashMonitor/inc/scmtrace.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(scmtrace.h) - PRJ_MMPFILES ../../../debug/trkdummyapp/group/trkdummyapp @@ -53,11 +41,6 @@ sm_debug_kerneldriver -#if defined(GENERIC_MARM) -../../../debug/crashMonitor/group/scmusr_lib -../../../debug/crashMonitor/group/scmkern_lib -#endif - #endif #endif diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/include/e32ver.h --- a/kernel/eka/include/e32ver.h Wed Oct 20 13:58:28 2010 +0100 +++ b/kernel/eka/include/e32ver.h Tue Oct 26 11:12:58 2010 +0100 @@ -28,7 +28,7 @@ const TInt KE32MajorVersionNumber=2; const TInt KE32MinorVersionNumber=0; -const TInt KE32BuildVersionNumber=4012; +const TInt KE32BuildVersionNumber=4013; const TInt KMachineConfigurationMajorVersionNumber=1; const TInt KMachineConfigurationMinorVersionNumber=0; diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/include/kernel/kern_priv.h --- a/kernel/eka/include/kernel/kern_priv.h Wed Oct 20 13:58:28 2010 +0100 +++ b/kernel/eka/include/kernel/kern_priv.h Tue Oct 26 11:12:58 2010 +0100 @@ -471,6 +471,8 @@ public: friend class Monitor; friend class Debugger; + // Although SCMonitor is outside of the kernel sources, this friend declaration is still required + // so that SCMonitor can collect kernel data at crash time friend class SCMonitor; friend class Debug::StopModeDebug; }; diff -r 0659d0e1a03c -r 94f2adf59133 kernel/eka/release.txt --- a/kernel/eka/release.txt Wed Oct 20 13:58:28 2010 +0100 +++ b/kernel/eka/release.txt Tue Oct 26 11:12:58 2010 +0100 @@ -1,3 +1,15 @@ +Version 2.00.4013 +================= +(Made by fadhliM 20/10/2010) + +1. lanerobe + 1. ou1cimx1#605369 ENV Reduce T_MSTIM output under SMP + 2. ou1cimx1#603584 ENV Fix T_TLS heap handling + +2. ferporta + 1. ou1cimx1#605542 MCL REQ 428-444, SUB417-65117 SCM outputs RnD system crash Data (MCv1 Data Set) via Kern:Printf on HW110 + + Version 2.00.4012 ================= (Made by fadhliM 19/10/2010) diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_64bit_File_Server_Client_Porting_Guide.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_64bit_File_Server_Client_Porting_Guide.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_64bit_File_Server_File_System_Plugin_Porting_Guide.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_64bit_File_Server_File_System_Plugin_Porting_Guide.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_ARMv7_Cache_And_Access_Remapping_-_Design.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_ARMv7_Cache_And_Access_Remapping_-_Design.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Align_Partitions_To_Media_Block_Boundaries_For_Optimised_Performance.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Align_Partitions_To_Media_Block_Boundaries_For_Optimised_Performance.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_BTrace.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_BTrace.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Configure_Domain_Manager_Policy_DLLs.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Configure_Domain_Manager_Policy_DLLs.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Configure_Platform_Security_Settings.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Configure_Platform_Security_Settings.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Crash_Logging.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Crash_Logging.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Debug_NONXIP_Problems.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Debug_NONXIP_Problems.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Estart.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Estart.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_File_Caching.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_File_Caching.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Handle_Sharing.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Handle_Sharing.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_IPC.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_IPC.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Impacts_Of_Demand_Paging_On_Kernel-Side_Code.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Impacts_Of_Demand_Paging_On_Kernel-Side_Code.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_MMC_Direct_Physical_Addressing.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_MMC_Direct_Physical_Addressing.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_MMC_Double_Buffering.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_MMC_Double_Buffering.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Message_Queues.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Message_Queues.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Migrate_Device_Drivers_to_Paging_Environment.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Migrate_Device_Drivers_to_Paging_Environment.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Migrate_Media_Drivers_To_Support_Demand_Paging.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Migrate_Media_Drivers_To_Support_Demand_Paging.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Migrate_To_Client-Server_V2_APIs.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Migrate_To_Client-Server_V2_APIs.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Persisting_a_Custom_Restart_Reason.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Persisting_a_Custom_Restart_Reason.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Port_SDIO_Controller_Supplement.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Port_SDIO_Controller_Supplement.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Publish_And_Subscribe.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Publish_And_Subscribe.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Share_File_Handles.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Share_File_Handles.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_USB_Client_Porting_and_Test.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_USB_Client_Porting_and_Test.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_USB_Mass_Storage_App.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_USB_Mass_Storage_App.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_USB_Mass_Storage_Double_Buffering.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_USB_Mass_Storage_Double_Buffering.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Use_CFileMan_Test_Framework.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Use_CFileMan_Test_Framework.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_Use_DMA_For_SDIO_Data_Transfers.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_Use_DMA_For_SDIO_Data_Transfers.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_To_VFP_Support.doc Binary file kernelhwsrv_info/doc_pub/Base_How_To_VFP_Support.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_How_to_Port_eMMC_Controller.doc Binary file kernelhwsrv_info/doc_pub/Base_How_to_Port_eMMC_Controller.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_Migrating_Media_drivers_DMA.doc Binary file kernelhwsrv_info/doc_pub/Base_Migrating_Media_drivers_DMA.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kernelhwsrv_info/doc_pub/Base_SMP_Driver_Migration_Guide.doc Binary file kernelhwsrv_info/doc_pub/Base_SMP_Driver_Migration_Guide.doc has changed diff -r 0659d0e1a03c -r 94f2adf59133 kerneltest/e32test/dll/t_tls.cpp --- a/kerneltest/e32test/dll/t_tls.cpp Wed Oct 20 13:58:28 2010 +0100 +++ b/kerneltest/e32test/dll/t_tls.cpp Tue Oct 26 11:12:58 2010 +0100 @@ -313,7 +313,6 @@ return __LINE__; TInt newInitSize = HeapSize(newHeap); User::SwitchHeap(newHeap); - tlsHeap->Close(); // Allocate more TLS data for(TInt i = 0 ; i < 100 ; ++i) diff -r 0659d0e1a03c -r 94f2adf59133 kerneltest/e32test/group/bld.inf --- a/kerneltest/e32test/group/bld.inf Wed Oct 20 13:58:28 2010 +0100 +++ b/kerneltest/e32test/group/bld.inf Tue Oct 26 11:12:58 2010 +0100 @@ -1038,10 +1038,6 @@ ../rm_debug/group/t_trkdummyapp #endif -#if defined(MARM_ARMV5) -../rm_debug/group/t_crashmonitor_lib -#endif - t_stacksize #if !defined(WINS) && !defined(X86) diff -r 0659d0e1a03c -r 94f2adf59133 kerneltest/e32test/rm_debug/crashmonitor/t_crashmonitor.cpp --- a/kerneltest/e32test/rm_debug/crashmonitor/t_crashmonitor.cpp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1066 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// Tests the functionality of the SCM Libraries -// -// - -#include "t_crashmonitor.h" - -#include - -using namespace Debug; - -/** - * Test suite version - */ -const TVersion testVersion(1,1,0); - - -/** - * Constructor - */ -CSCMLibraryClient::CSCMLibraryClient(): - iNonCachedWriter(iBuffer, EFalse), - iCachedWriter(iBuffer, EFalse), - iWriter(NULL), - iReader(iBuffer) - { - } - -/** - * First phase constructor - */ -CSCMLibraryClient* CSCMLibraryClient::NewL() - { - CSCMLibraryClient* self = new(ELeave) CSCMLibraryClient(); - self->ConstructL(); - return self; - } - -/** - * Destructor - */ -CSCMLibraryClient::~CSCMLibraryClient() - { - } - -/** - * ConstructL - */ -void CSCMLibraryClient::ConstructL() - {} - - - -/** - * Prints usage of this test suite - */ -void CSCMLibraryClient::PrintUsage() - { - test.Printf(_L("Invoke with arguments:\n")); - test.Printf(_L("-r: run specified tests in reverse order\n")); - test.Printf(_L("-h: display usage information\n")); - test.Printf(_L("-v: display version\n")); - test.Printf(_L(": test number to run, can specify more than one from the following list:\n")); - test.Printf(_L("Press any key for list...\n")); - test.Getch(); - // if there are too many of these they won't fit on the screen! Stick another Getch() in if there get too many - for(TInt i=0; i& aTests) - { - // get the length of the command line arguments - TInt argc = User::CommandLineLength(); - - // allocate a buffer for the command line arguments and extract the data to it - HBufC* commandLine = HBufC::NewLC(argc); - TPtr commandLineBuffer = commandLine->Des(); - User::CommandLine(commandLineBuffer); - - // reset mode - aMode = (TTestMode)0; - - // create a lexer and read through the command line - TLex lex(*commandLine); - while (!lex.Eos()) - { - // expecting the first character to be a '-' - if (lex.Get() == '-') - { - TChar arg = lex.Get(); - switch (arg) - { - case 'v': - //print out the help - aMode |= EModeVersion; - break; - case 'h': - //print out the help - aMode |= EModeHelp; - break; - case 'r': - //store the fact that we want to run in reverse - aMode |= EModeReverse; - break; - default: - // unknown argument so leave - User::Leave(KErrArgument); - } - } - else - { - lex.UnGet(); - TInt testNumber; - User::LeaveIfError(lex.Val(testNumber)); - if( (testNumber<0) || (testNumber>=KMaxTests) ) - { - User::Leave(KErrArgument); - } - aTests.AppendL(testNumber); - } - lex.SkipSpace(); - } - // if no tests specified then run them all - if(aTests.Count() == 0) - { - aMode |= EModeAll; - } - - // do clean up - CleanupStack::PopAndDestroy(commandLine); - } - -/** - * This will run all tests in the suite - */ -void CSCMLibraryClient::ClientAppL() - { - - FillArray(); - - test.Start(_L("ClientAppL")); - - RArray testsToRun; - TUint32 testMode = 0; - ParseCommandLineL(testMode, testsToRun); - - //if help or version mode specified then just print out the relevant stuff and quit - if((testMode & EModeHelp) || (testMode & EModeVersion)) - { - if(testMode & EModeHelp) - { - PrintUsage(); - } - if(testMode & EModeVersion) - { - PrintVersion(); - } - test.End(); - return; - } - - if(testMode & EModeAll) - { - for(TInt i=0; i>1); i++) - { - TInt temp = testsToRun[i]; - testsToRun[i] = testsToRun[numberOfTests - (i+1)]; - testsToRun[numberOfTests - (i+1)] = temp; - } - } - - HelpStartTestTimer(); - - // first run al tests with non cached writer - iWriter = &iNonCachedWriter; - for(TInt i=0; iClientAppL()); - __UHEAP_MARKEND; - - delete tester; - } - - delete trap; - return ret; - } - -/** - * Runs a given test identified by argument - * @param aTestNumber Test to run - */ -void CSCMLibraryClient::RunTest(TInt aTestNumber) - { - if( (aTestNumber<0) || (aTestNumber>=KMaxTests) ) - { - User::Panic(_L("Test number out of range"), aTestNumber); - } - __UHEAP_MARK; - - if(iTestArray[aTestNumber].iFunctionPtr) - { - test.Printf(_L("pre-run test %d"), aTestNumber); - (this->*(iTestArray[aTestNumber].iFunctionPtr))(); - test.Printf(_L("post-run test %d"), aTestNumber); - } - - __UHEAP_MARKEND; - } - -/** - * Prints the version of this test suite - */ -void CSCMLibraryClient::PrintVersion() - { - test.Printf(_L("\nt_crashmonitor_lib.exe\nVersion: %S\n"), &(testVersion.Name())); - test.Printf(_L("Press any key...\n")); - test.Getch(); - } -/** - * Reports performance metrics from all the tests - */ -void CSCMLibraryClient::ReportPerformance(void) - { - test.Printf(_L("\nPerformance\n")); - test.Printf(_L("========================\n")); - - - // Runtime - TInt ticks = HelpGetTestTicks(); -#ifndef __WINS__ - test (ticks != 0); -#endif - TInt nkTicksPerSecond = HelpTicksPerSecond(); - -#ifndef __WINS__ - test (nkTicksPerSecond != 0); -#endif - - test.Printf(_L("Total test runtime: %d seconds\n"),ticks/nkTicksPerSecond); - - test.Printf(_L("\n")); - } - -/** - * Returns the number of nanokernel ticks in one second - * @return Number of nanokernel ticks. 0 if unsuccesful - */ -TInt CSCMLibraryClient::HelpTicksPerSecond(void) - { - TInt nanokernel_tick_period; - HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period); - - ASSERT(nanokernel_tick_period != 0); - - static const TInt KOneMillion = 1000000; - - return KOneMillion/nanokernel_tick_period; - } - -void CSCMLibraryClient::DoWrite(MByteStreamSerializable& aObjectToWrite, TInt aPosition) - { - if(iWriter == &iCachedWriter) - { - iCachedWriter.SetPosition(aPosition); - test(aObjectToWrite.Serialize(iCachedWriter) == KErrNone); - iCachedWriter.FlushCache(); - } - else if(iWriter == &iNonCachedWriter) - { - iNonCachedWriter.SetPosition(aPosition); - test(aObjectToWrite.Serialize(iNonCachedWriter) == KErrNone); - } - else - { - // no writer - test(EFalse); - } - } - -// BASE granted test id's 2364 to 2394 - -//--------------------------------------------- -// !@SYMTestCaseID KBASE-T_SCMLIB-2364 -//! @SYMTestType -//! @SYMPREQ PREQ1700 -//! @SYMTestCaseDesc Ensures we can serialise and deserialise the TScmChecksum structure -//! @SYMTestActions TScmChecksum serialized & then deserialized -//! @SYMTestExpectedResults TScmChecksum structure serialized / deserialized ok -//! @SYMTestPriority High -//! @SYMTestStatus Implemented -//--------------------------------------------- -void CSCMLibraryClient::TestCheckSum() - { - test.Next(_L("TestCheckSum\n")); - - TScmChecksum chksm1; - chksm1.Reset(); - - TInt blocksize1 = 123; - TInt blocksize2 = 166; - - TScmChecksum chksm2; - chksm2.Reset(); - - test(ChecksumHelper(chksm1, blocksize1, iBuffer, KBufLen)); - test(ChecksumHelper(chksm2, blocksize2, iBuffer, KBufLen)); - - test(chksm1 == chksm2); - - } - -TBool CSCMLibraryClient::ChecksumHelper(TScmChecksum& aChecksum, TUint aBlocksize, TUint8* aBuffer, TUint aBufferLen) - { - if( aBlocksize == 0 || aBufferLen == 0 ) - { - return EFalse; - } - - TInt remaining = aBufferLen; - TInt pos = 0; - - while(remaining > aBlocksize) - { - aChecksum.ChecksumBlock(aBuffer + pos, aBlocksize); - pos += aBlocksize; - remaining -= aBlocksize; - } - - aChecksum.ChecksumBlock(aBuffer + pos, remaining); - pos += remaining; - - return (pos == aBufferLen); - } - -//--------------------------------------------- -//! @SYMTestCaseID KBASE-T_SCMLIB-2365 -//! @SYMTestType -//! @SYMPREQ PREQ1700 -//! @SYMTestCaseDesc Ensures we can serialise and deserialise the TSCMLockData structure -//! @SYMTestActions TSCMLockData serialized & then deserialized -//! @SYMTestExpectedResults TSCMLockData structure serialized / deserialized ok -//! @SYMTestPriority High -//! @SYMTestStatus Implemented -//--------------------------------------------- -void CSCMLibraryClient::TestLockDataSerialization() - { - test.Next(_L("TestLockDataSerialization\n")); - - TSCMLockData lockData1; - - //Arbitrary values - lockData1.SetLockCount(10); - lockData1.SetMutexHoldCount(17); - lockData1.SetMutexThreadWaitCount(36); - - DoWrite(lockData1); - - iReader.SetPosition(0); - //Test deserialisation works - TSCMLockData lockData2; - test(lockData2.Deserialize(iReader) == KErrNone); - - //Test we got back the correct object - test(lockData1 == lockData2); - } - -//--------------------------------------------- -//! //! @SYMTestCaseID KBASE-T_SCMLIB-2366 -//! @SYMTestType -//! @SYMPREQ PREQ1700 -//! @SYMTestCaseDesc Ensures we can serialise and deserialise the TCrashOffsetsHeader structure -//! @SYMTestActions TCrashOffsetsHeader serialized & then deserialized -//! @SYMTestExpectedResults TCrashOffsetsHeader structure serialized / deserialized ok -//! @SYMTestPriority High -//! @SYMTestStatus Implemented -//--------------------------------------------- -void CSCMLibraryClient::TestOffsetsHeaderSerialization() - { - test.Next(_L("TestOffsetsHeaderSer ialization\n")); - - TCrashOffsetsHeader header1; - header1.iCTFullRegOffset = 123; - header1.iCTUsrStkOffset = 456; - header1.iCTSvrStkOffset = 789; - header1.iCPMetaOffset = 1001; - header1.iCTMetaOffset = 99; - header1.iCPCodeSegOffset = 1234; - header1.iSysUsrStkOffset = 3456; - header1.iSysSvrStkOffset = 255; - header1.iSysUsrRegOffset = 999; - header1.iSysSvrRegOffset = 2002; - header1.iTLstOffset = 3003; - header1.iPLstOffset = 4004; - header1.iSysCodeSegOffset = 5005; - header1.iExcStkOffset = 6006; - header1.iTraceOffset = 1233; - header1.iScmLocksOffset = 3421; - header1.iKernelHeapOffset = 89; - header1.iVarSpecInfOffset = 0; - header1.iRomInfoOffset = 123; - - DoWrite(header1); - - iReader.SetPosition(0); - TCrashOffsetsHeader header2; - - test(header2.Deserialize(iReader) == KErrNone); - - test(header2 == header1); - - } - -//--------------------------------------------- -//! @SYMTestCaseID KBASE-T_SCMLIB-2367 -//! @SYMTestType -//! @SYMPREQ PREQ1700 -//! @SYMTestCaseDesc Ensures we can serialise and deserialise the TCrashInfoHeader structure -//! @SYMTestActions TCrashInfoHeader serialized & then deserialized -//! @SYMTestExpectedResults TCrashInfoHeader structure serialized / deserialized ok -//! @SYMTestPriority High -//! @SYMTestStatus Implemented -//--------------------------------------------- -void CSCMLibraryClient::TestInfoHeaderSerialization() - { - test.Next(_L("TestInfoHeaderSerialization\n")); - - TCrashInfoHeader infoHeader1; - infoHeader1.iLogSize = 5000; - infoHeader1.iFlashAlign = 4; - infoHeader1.iCachedWriterSize = 16; - infoHeader1.iPid = 1001; - infoHeader1.iTid = 2002; - infoHeader1.iExitType = 90; - infoHeader1.iExitReason = 23; - infoHeader1.iExcCode = 8899; - infoHeader1.iCrashTime = 12345; - infoHeader1.iCrashId = 23; - infoHeader1.iFlashBlockSize = 256 * 1024; - infoHeader1.iFlashPartitionSize = 1024 * 1024; - - TVersion ver(21,43,54); - - infoHeader1.iSCMDataTypesVersion = ver; - - DoWrite(infoHeader1); - - iReader.SetPosition(0); - TCrashInfoHeader infoHeader2; - - test(infoHeader2.Deserialize(iReader) == KErrNone); - - test(infoHeader2 == infoHeader1); - - } - -//--------------------------------------------- -//! @SYMTestCaseID KBASE-T_SCMLIB-2368 -//! @SYMTestType -//! @SYMPREQ PREQ1700 -//! @SYMTestCaseDesc Ensures we can serialise and deserialise the TRawData structure -//! @SYMTestActions TRawData serialized & then deserialized -//! @SYMTestExpectedResults TRawData structure serialized / deserialized ok -//! @SYMTestPriority High -//! @SYMTestStatus Implemented -//--------------------------------------------- -void CSCMLibraryClient::TestRawData() - { - test.Next(_L("TestRawData\n")); - - const TInt KLen = 256; - - TUint8 data[KLen]; - - for(TInt i=0;i(data), KLen, KLen);; - - DoWrite(rawData1); - - TPtr8 p(iBuffer, KBufLen, KBufLen); - TCrashLogWalker walker(p); - TInt pos = 0; - TInt len = 0; - TRawData* rawData2 = walker.GetRawDataTypeL(pos, len, p, 0); - - CleanupStack::PushL(rawData2); - - test(rawData1.iLength == rawData2->iLength); - test(rawData1.iData.Compare(rawData2->iData) == 0); - - CleanupStack::PopAndDestroy(rawData2); - } - -//--------------------------------------------- -//! @SYMTestCaseID KBASE-T_SCMLIB-2369 -//! @SYMTestType -//! @SYMPREQ PREQ1700 -//! @SYMTestCaseDesc Ensures we can serialise and deserialise the TProcessData structure -//! @SYMTestActions TProcessData serialized & then deserialized -//! @SYMTestExpectedResults TProcessData structure serialized / deserialized ok -//! @SYMTestPriority High -//! @SYMTestStatus Implemented -//--------------------------------------------- -void CSCMLibraryClient::TestProcessData() - { - test.Next(_L("TestProcessData\n")); - - TProcessData procData1; - - procData1.iPriority = 99; - procData1.iPid = MAKE_TINT64(34567,12345); - - - procData1.iName.Zero(); - for(TInt i=0;i structure serialized / deserialized ok -//! @SYMTestPriority High -//! @SYMTestStatus Implemented -//--------------------------------------------- -void CSCMLibraryClient::TestSCMLockData() - { - - test.Next(_L("TestSCMLockData\n")); - - TSCMLockData ld1; - ld1.SetMutexHoldCount(3); - ld1.SetLockCount(4); - ld1.SetMutexThreadWaitCount(5); - - DoWrite(ld1); - - iReader.SetPosition(0); - TSCMLockData ld2; - test(ld2.Deserialize(iReader) == KErrNone); - - test(ld1.MutexHoldCount() == ld2.MutexHoldCount()); - test(ld1.MutexThreadWaitCount() == ld2.MutexThreadWaitCount()); - test(ld1.LockCount() == ld2.LockCount()); - test(ld1 == ld2); - test(!(ld1 != ld2)); - } - -//eof - diff -r 0659d0e1a03c -r 94f2adf59133 kerneltest/e32test/rm_debug/crashmonitor/t_crashmonitor.h --- a/kerneltest/e32test/rm_debug/crashmonitor/t_crashmonitor.h Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,146 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// System Crash Monitor Shared Library tests -// -// - -/** - @file - @internalTechnology - @released -*/ - -#ifndef CRASH_MONITOR -#define CRASH_MONITOR - -#include -#include -#include -#include -#include -#include -#include - -using namespace Debug; - -LOCAL_D RTest test(_L("T_CRASHMONITOR_LIB")); - -//number of test functions that we have -const TInt KMaxTests = 25; -const TUint KBufLen = 52224; // 0.5 meg buffer - -class CSCMLibraryClient; - -// Create a pointer to function type -typedef void (CSCMLibraryClient::*testFunction)(); - -class TFunctionData - { - -public: - TFunctionData() - : iFunctionPtr(NULL) - { - } - - testFunction iFunctionPtr; - TBuf<40> iFunctionName; - }; - -// -// class CSCMLibraryClient -// -// The basic SCM Library Client -// -class CSCMLibraryClient : public CBase - { -public: - static CSCMLibraryClient* NewL(); - ~CSCMLibraryClient(); - void ClientAppL(); - -private: - CSCMLibraryClient(); - void ConstructL(); - - TInt TestStartup(); - TInt TestShutdown(); - - void FillArray(); - void PrintUsage(); - void PrintVersion(); - - enum TTestMode - { - //run all the tests - EModeAll = 1<<0, - //run the specified tests in reverse order - EModeReverse = 1<<1, - //print out help - EModeHelp = 1<<2, - //print out help - EModeVersion = 1<<3 - }; - - //Tests - void TestCheckSum(); - - void TestLockDataSerialization(); - void TestOffsetsHeaderSerialization(); - void TestInfoHeaderSerialization(); - void TestRawData(); - void TestProcessData(); - void TestThreadData(); - void TestThreadStack(); - void TestRegisterValue(); - void TestRegisterSet(); - - void TestMemoryDump(); - void TestCodeSegmentSet(); - void TestCodeSegment(); - void TestTraceDump(); - void TestVariantSpecificData(); - void TestRomHeaderData(); - void TestSCMLockData(); - - void RunTest(TInt aTestNumber); - void ParseCommandLineL(TUint32& aMode, RArray& aTests); - void HelpStartTestTimer(void) { iStartTick = User::NTickCount(); iStopTick = 0; }; - void HelpStopTestTimer(void) { iStopTick = User::NTickCount(); }; - TInt HelpGetTestTicks(void) { return (iStopTick - iStartTick); }; - TInt HelpTicksPerSecond(); - void ReportPerformance(); - -private: - TBool ChecksumHelper(TScmChecksum& aChecksum, TUint aBlocksize, TUint8* aBuffer, TUint aBufferLen); - void DoWrite(MByteStreamSerializable& aObjectToWrite, TInt aPositon = 0); - - -private: - TFunctionData iTestArray[KMaxTests]; - - // Timing information - TInt iStartTick; - TInt iStopTick; - - TUint8 iBuffer[KBufLen]; - - TByteStreamWriter iNonCachedWriter; - TCachedByteStreamWriter iCachedWriter; - - TByteStreamWriter* iWriter; - TByteStreamReader iReader; - }; - -#endif // CRASH_MONITOR diff -r 0659d0e1a03c -r 94f2adf59133 kerneltest/e32test/rm_debug/group/t_crashmonitor_lib.mmp --- a/kerneltest/e32test/rm_debug/group/t_crashmonitor_lib.mmp Wed Oct 20 13:58:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// Tests the functionality of the System Crash Monitor libraries -// - -ALWAYS_BUILD_AS_ARM - -targettype exe - -SYMBIAN_BASE_SYSTEMINCLUDE(nkern) -OS_LAYER_SYSTEMINCLUDE_SYMBIAN - -userinclude ../../../../kernel/eka/debug/crashMonitor/inc -sourcepath ../crashmonitor - -source t_crashmonitor.cpp - -library euser.lib -library hal.lib -staticlibrary scmusr_lib.lib - -target t_crashmonitor_lib.exe - -UID 0x0 0x4321bbbc -SECUREID 0x2000B26F - -capability none - -VENDORID 0x70000001 - -DEBUGGABLE - -SMPSAFE diff -r 0659d0e1a03c -r 94f2adf59133 kerneltest/e32test/system/t_mstim.cpp --- a/kerneltest/e32test/system/t_mstim.cpp Wed Oct 20 13:58:28 2010 +0100 +++ b/kerneltest/e32test/system/t_mstim.cpp Tue Oct 26 11:12:58 2010 +0100 @@ -43,6 +43,8 @@ #include #include +#include +#include #include "d_mstim.h" RTest test(_L("T_MSTIM")); @@ -92,9 +94,15 @@ // Test millisecond timers // { + // RTest::Printf and Next are very high latency under SMP, so suppress them + const TBool unicore = (UserSvr::HalFunction(EHalGroupKernel, EKernelHalSmpSupported, 0, 0) == KErrNotSupported); + // test.SetLogged(EFalse); test.Title(); + if (!unicore) + test.Printf(_L("Running on a SMP system - output reduced\n")); + test.Start(_L("Load test LDD")); TInt r=User::LoadLogicalDevice(KLddFileName); TEST(r==KErrNone || r==KErrAlreadyExists); @@ -117,56 +125,67 @@ r=mstim.StartPeriodicDfc(7,71); CHECK(r); - test.Next(_L("Start while started")); + if (unicore) + test.Next(_L("Start while started")); TRequestStatus s; mstim.StartOneShotInt(s,0,100); User::WaitForRequest(s); TEST(s==KErrInUse); - test.Next(_L("One shot interrupt")); + if (unicore) + test.Next(_L("One shot interrupt")); mstim.StartOneShotInt(s,2,100); User::WaitForRequest(s); TUint fc1=User::NTickCount(); TEST(s==KErrNone); TInt time=GetOneShotTime(2); - test.Printf(_L("Took %dms\n"),time); + if (unicore) + test.Printf(_L("Took %dms\n"),time); TESTTIME(time,100,102); - test.Next(_L("One shot DFC")); + if (unicore) + test.Next(_L("One shot DFC")); mstim.StartOneShotDfc(s,3,200); User::WaitForRequest(s); TUint fc3=User::NTickCount(); TEST(s==KErrNone); time=GetOneShotTime(3); - test.Printf(_L("Took %dms\n"),time); + if (unicore) + test.Printf(_L("Took %dms\n"),time); TESTTIME(time,200,202); - test.Next(_L("One shot interrupt again")); + if (unicore) + test.Next(_L("One shot interrupt again")); TUint fc2=User::NTickCount(); mstim.StartOneShotIntAgain(s,2,300); User::WaitForRequest(s); TEST(s==KErrNone); TInt time2=GetOneShotTime(2); - test.Printf(_L("Took %dms, delay %dms\n"),time2,fc2-fc1); + if (unicore) + test.Printf(_L("Took %dms, delay %dms\n"),time2,fc2-fc1); time2+=TInt(fc2-fc1); TESTTIME(time2,295,306); - test.Next(_L("One shot interrupt again too late")); + if (unicore) + test.Next(_L("One shot interrupt again too late")); mstim.StartOneShotIntAgain(s,3,10); User::WaitForRequest(s); TEST(s==KErrArgument); - test.Next(_L("One shot interrupt again")); + if (unicore) + test.Next(_L("One shot interrupt again")); fc2=User::NTickCount(); mstim.StartOneShotIntAgain(s,3,300); User::WaitForRequest(s); TEST(s==KErrNone); time=GetOneShotTime(3); - test.Printf(_L("Took %dms, delay %dms\n"),time,fc2-fc3); + if (unicore) + test.Printf(_L("Took %dms, delay %dms\n"),time,fc2-fc3); time+=TInt(fc2-fc3); TESTTIME(time,295,306); - test.Printf(_L("Please wait...\n")); + if (unicore) + test.Printf(_L("Please wait...\n")); User::After(10000000); SMsTimerInfo info[8]; @@ -179,7 +198,8 @@ TUint final_count=User::NTickCount(); TInt elapsed=TInt(final_count-init_count); - test.Printf(_L("Elapsed time %dms\n"),elapsed); + if (unicore) + test.Printf(_L("Elapsed time %dms\n"),elapsed); const TInt period[8]={31,32,0,0,7,43,19,71}; for (i=0; i<8; i++) @@ -188,7 +208,8 @@ if (p==0) continue; SMsTimerInfo& z=info[i]; - test.Printf(_L("%1d: min=%-6d max=%-6d avg=%-6d count=%d\n"),i,z.iMin,z.iMax,z.iAvg,z.iCount); + if (unicore) + test.Printf(_L("%1d: min=%-6d max=%-6d avg=%-6d count=%d\n"),i,z.iMin,z.iMax,z.iAvg,z.iCount); TInt count=elapsed/p; TInt cdiff=count-z.iCount; TEST(cdiff>=0 && cdiff<=2); @@ -199,7 +220,8 @@ TEST(Abs(z.iAvg-1000*p)<1000); } - test.Next(_L("Cancel periodic")); + if (unicore) + test.Next(_L("Cancel periodic")); r=mstim.StopPeriodic(7); CHECK(r); r=mstim.GetInfo(7,info[7]); @@ -209,16 +231,19 @@ CHECK(r); TEST(info[6].iCount==info[7].iCount); - test.Next(_L("Reuse cancelled")); + if (unicore) + test.Next(_L("Reuse cancelled")); mstim.StartOneShotInt(s,7,128); User::WaitForRequest(s); TEST(s==KErrNone); time=GetOneShotTime(7); - test.Printf(_L("Took %dms\n"),time); + if (unicore) + test.Printf(_L("Took %dms\n"),time); TESTTIME(time,128,130); TRequestStatus s2; - test.Next(_L("Timed Cancel")); + if (unicore) + test.Next(_L("Timed Cancel")); mstim.StartOneShotInt(s,2,128); mstim.IntCancel(s2,2,130); User::WaitForRequest(s); @@ -226,10 +251,12 @@ User::WaitForRequest(s2); TEST(s2==KErrNone); time=GetOneShotTime(2); - test.Printf(_L("Took %dms\n"),time); + if (unicore) + test.Printf(_L("Took %dms\n"),time); TESTTIME(time,128,130); time=GetOneShotTime(7); - test.Printf(_L("Cancel Took %dms\n"),time); + if (unicore) + test.Printf(_L("Cancel Took %dms\n"),time); TESTTIME(time,130,132); mstim.StartOneShotInt(s,2,128); @@ -239,38 +266,46 @@ User::WaitForRequest(s2); TEST(s2==KErrNone); time=GetOneShotTime(7); - test.Printf(_L("Cancel Took %dms\n"),time); + if (unicore) + test.Printf(_L("Cancel Took %dms\n"),time); TESTTIME(time,126,128); - test.Next(_L("Reuse cancelled")); + if (unicore) + test.Next(_L("Reuse cancelled")); mstim.StartOneShotInt(s,2,64); User::WaitForRequest(s); TEST(s==KErrNone); time=GetOneShotTime(2); - test.Printf(_L("Took %dms\n"),time); + if (unicore) + test.Printf(_L("Took %dms\n"),time); TESTTIME(time,64,66); #ifdef _DEBUG - test.Next(_L("Random test")); + if (unicore) + test.Next(_L("Random test")); r=mstim.BeginRandomTest(); CHECK(r); #endif - test.Printf(_L("Please wait...\n")); + if (unicore) + test.Printf(_L("Please wait...\n")); User::After(10000000); #ifdef _DEBUG r=mstim.EndRandomTest(); CHECK(r); - SRandomTestInfo rInfo; - r=mstim.GetRandomTestInfo(rInfo); - test.Printf(_L("min error = %d\n"),rInfo.iMin); - test.Printf(_L("max error = %d\n"),rInfo.iMax); - test.Printf(_L("xfer cancel = %d\n"),rInfo.iXferC); - test.Printf(_L("crit cancel = %d\n"),rInfo.iCritC); - test.Printf(_L("start fails = %d\n"),rInfo.iStartFail); - test.Printf(_L("debug calls = %d\n"),rInfo.iCallBacks); - test.Printf(_L("completions = %d\n"),rInfo.iCompletions); + if (unicore) + { + SRandomTestInfo rInfo; + r=mstim.GetRandomTestInfo(rInfo); + test.Printf(_L("min error = %d\n"),rInfo.iMin); + test.Printf(_L("max error = %d\n"),rInfo.iMax); + test.Printf(_L("xfer cancel = %d\n"),rInfo.iXferC); + test.Printf(_L("crit cancel = %d\n"),rInfo.iCritC); + test.Printf(_L("start fails = %d\n"),rInfo.iStartFail); + test.Printf(_L("debug calls = %d\n"),rInfo.iCallBacks); + test.Printf(_L("completions = %d\n"),rInfo.iCompletions); + } #endif for (i=0; i<8; i++) @@ -281,7 +316,8 @@ final_count=User::NTickCount(); elapsed=TInt(final_count-init_count); - test.Printf(_L("Elapsed time %dms\n"),elapsed); + if (unicore) + test.Printf(_L("Elapsed time %dms\n"),elapsed); const TInt period2[8]={31,32,0,0,7,43,19,0}; for (i=0; i<8; i++) @@ -292,7 +328,8 @@ r=mstim.StopPeriodic(i); CHECK(r); SMsTimerInfo& z=info[i]; - test.Printf(_L("%1d: min=%-6d max=%-6d avg=%-6d count=%d\n"),i,z.iMin,z.iMax,z.iAvg,z.iCount); + if (unicore) + test.Printf(_L("%1d: min=%-6d max=%-6d avg=%-6d count=%d\n"),i,z.iMin,z.iMax,z.iAvg,z.iCount); TInt count=elapsed/p; TInt cdiff=count-z.iCount; TEST(cdiff>=0 && cdiff<=2); diff -r 0659d0e1a03c -r 94f2adf59133 userlibandfileserver/fileserver/automounter/misc/FS_Automounter_HowTo.doc Binary file userlibandfileserver/fileserver/automounter/misc/FS_Automounter_HowTo.doc has changed