williamr@4: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@4: // All rights reserved. williamr@4: // This component and the accompanying materials are made available williamr@4: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@4: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@4: // williamr@4: // Initial Contributors: williamr@4: // Nokia Corporation - initial contribution. williamr@4: // williamr@4: // Contributors: williamr@4: // williamr@4: // Description: williamr@4: // Common Crash Data definitions used between the core dump server, williamr@4: // formatters and user interfaces williamr@4: // williamr@4: williamr@4: williamr@4: williamr@4: /** williamr@4: @file williamr@4: @publishedPartner williamr@4: @released williamr@4: @see CCrashDataSource williamr@4: @see RCoreDumpSession williamr@4: */ williamr@4: williamr@4: #ifndef CRASH_DATA_H williamr@4: #define CRASH_DATA_H williamr@4: williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: williamr@4: using namespace Debug; williamr@4: williamr@4: /** williamr@4: Crash event information. This is given to a formatter when a crash occurs. williamr@4: @see CCoreDumpFormatter::CrashEventL() williamr@4: */ williamr@4: struct TCrashInfo williamr@4: { williamr@4: williamr@4: /** williamr@4: Type of crash event williamr@4: */ williamr@4: enum TCrashType williamr@4: { williamr@4: /** ECrashException is raised when a hardware exception occurs */ williamr@4: ECrashException, williamr@4: williamr@4: /** ECrashKill is raised when a thread is killed or panicked */ williamr@4: ECrashKill, williamr@4: williamr@4: /** williamr@4: @internalTechnology williamr@4: Guard williamr@4: */ williamr@4: ECrashLast williamr@4: }; williamr@4: williamr@4: /** Type of crash williamr@4: @see TCrashType williamr@4: */ williamr@4: TCrashType iType; williamr@4: williamr@4: /** Exception type or exit type. williamr@4: If crash type iType is ECrashException, this is set to e32const.h::TExcType williamr@4: If crash type iType is ECrashKill, this is set to e32const.h::TExitType. williamr@4: */ williamr@4: TUint32 iExcNumber; williamr@4: williamr@4: /** This is only set when iType is ECrashKill. Kernel panic code. */ williamr@4: TInt iReason; williamr@4: williamr@4: /** Crash category description. Valid when crash type is ECrashKill */ williamr@4: TBuf iCategory; williamr@4: williamr@4: /** Crashed thread id */ williamr@4: TUint64 iTid; williamr@4: williamr@4: /** Crashed process id */ williamr@4: TUint64 iPid; williamr@4: williamr@4: /** Crash time */ williamr@4: TUint64 iTime; williamr@4: williamr@4: /** Register context at time of crash. williamr@4: @see TRmdArmExcInfo williamr@4: @see Debug::TRmdArmExcInfo williamr@4: */ williamr@4: TRmdArmExcInfo iContext; williamr@4: williamr@4: /** Reserved for future. williamr@4: @internalTechnology */ williamr@4: TUint32 iSpare1; williamr@4: /** @internalTechnology */ williamr@4: TUint32 iSpare2; williamr@4: /** @internalTechnology */ williamr@4: TUint32 iSpare3; williamr@4: }; williamr@4: williamr@4: /** williamr@4: Code segment information. williamr@4: @see CServerCrashDataSource::GetCodeSegmentsL() williamr@4: */ williamr@4: struct TCodeSegInfo williamr@4: { williamr@4: williamr@4: /** williamr@4: Name of code segment. williamr@4: */ williamr@4: TBufC iName; williamr@4: williamr@4: /** williamr@4: Set to trie to indicates that this executable is executing in place. williamr@4: */ williamr@4: TBool iXIP; williamr@4: williamr@4: williamr@4: /** williamr@4: Type of the code segment. williamr@4: @see Debug::TCodeSegType williamr@4: @see TCodeSegType williamr@4: */ williamr@4: TCodeSegType iType; williamr@4: williamr@4: /** Code size in bytes */ williamr@4: TUint32 iCodeSize; williamr@4: williamr@4: /** Code segment run address. If code segment is XIP then williamr@4: this is the same as iCodeLoadAddr */ williamr@4: TLinAddr iCodeRunAddr; williamr@4: williamr@4: /** Address where code segement was loaded from */ williamr@4: TLinAddr iCodeLoadAddr; williamr@4: williamr@4: /** Size on bytes of the read only data */ williamr@4: TUint32 iRoDataSize; williamr@4: williamr@4: /** Address of read only data at run time. If code segment is XIP then williamr@4: this is the same as iRoDataLoadAddr */ williamr@4: TLinAddr iRoDataRunAddr; williamr@4: williamr@4: /** Address where read only data was loaded from */ williamr@4: TLinAddr iRoDataLoadAddr; williamr@4: williamr@4: /** Writable data size in bytes. Combined .bss and .data sections */ williamr@4: TUint32 iDataSize; williamr@4: williamr@4: /** Address of writable data at run time */ williamr@4: TLinAddr iDataRunAddr; williamr@4: williamr@4: /** Build time address of initialised writable data */ williamr@4: TLinAddr iDataLoadAddr; williamr@4: williamr@4: /** reserved for future williamr@4: @internalTechnology */ williamr@4: TUint32 iSpare1; williamr@4: /** @internalTechnology */ williamr@4: TUint32 iSpare2; williamr@4: /** @internalTechnology */ williamr@4: TUint32 iSpare3; williamr@4: }; williamr@4: williamr@4: /** williamr@4: Pointer array of TCodeSegInfo objects. williamr@4: @see TCodeSegInfo williamr@4: */ williamr@4: typedef RPointerArray RCodeSegPointerList; williamr@4: williamr@4: williamr@4: /** williamr@4: Detailed information about a register. williamr@4: The Symbian ELF format defines the register identification format. williamr@4: The Debug Security Server implements this format. williamr@4: @see CCrashDataSource::ReadRegistersL() williamr@4: */ williamr@4: class TRegisterData williamr@4: { williamr@4: williamr@4: public: williamr@4: williamr@4: IMPORT_C TUint16 GetId() const; williamr@4: IMPORT_C TUint16 GetSubId() const; williamr@4: IMPORT_C TUint8 GetSize() const; williamr@4: IMPORT_C TUint8 GetClass() const; williamr@4: IMPORT_C TBool SameRegister( const TRegisterData & other ) const; williamr@4: williamr@4: IMPORT_C TUint8 GetContent8() const; williamr@4: IMPORT_C TUint16 GetContent16() const; williamr@4: IMPORT_C TUint32 GetContent32() const; williamr@4: IMPORT_C TUint64 GetContent64() const; williamr@4: williamr@4: IMPORT_C void SetContent8( const TUint8 aVal ); williamr@4: IMPORT_C void SetContent16( const TUint16 aVal ); williamr@4: IMPORT_C void SetContent32( const TUint32 aVal ); williamr@4: IMPORT_C void SetContent64( const TUint64 aVal ); williamr@4: IMPORT_C void SetContent( const TUint aVal ); williamr@4: williamr@4: IMPORT_C void SetContent( const TRegisterData & other ); williamr@4: williamr@4: IMPORT_C TBool Available( ) const; williamr@4: IMPORT_C void SetAvailable( const TBool aAvailable ); williamr@4: williamr@4: williamr@4: /** williamr@4: This is the same as symbianelfdefs.h ESYM_REGREP. williamr@4: @see ESYM_REGREP williamr@4: */ williamr@4: typedef enum TRegisterRepresentation williamr@4: { williamr@4: /** 8 Bit register */ williamr@4: ERegRepr8 = 0, williamr@4: /** 16 Bit register */ williamr@4: ERegRepr16 = 1, williamr@4: /** 32 Bit register */ williamr@4: ERegRepr32 = 2, williamr@4: /** 64 Bit register */ williamr@4: ERegRepr64 = 3, williamr@4: /** williamr@4: @internalTechnology williamr@4: */ williamr@4: ERegReprLast williamr@4: }; williamr@4: williamr@4: /** williamr@4: This is the same as symbianelfdefs.h ESYM_REGCLASS. williamr@4: @see ESYM_REGCLASS williamr@4: */ williamr@4: typedef enum TRegisterClass williamr@4: { williamr@4: /** A Core register */ williamr@4: ERegClassCore = 0, williamr@4: /** A Co Processor register */ williamr@4: ERegClassCoPro = 1, williamr@4: /** williamr@4: @internalTechnology williamr@4: */ williamr@4: ERegClassLast williamr@4: }; williamr@4: williamr@4: williamr@4: /** williamr@4: Register identifier williamr@4: */ williamr@4: union williamr@4: { williamr@4: /** Used when calling the Debug Security Server */ williamr@4: TRegisterInfo regInfo; williamr@4: williamr@4: /** Same as Sym32_reginfod::rd_id williamr@4: if rid_class == ESYM_REG_CORE williamr@4: rd_id is one of rm_debug_api.h::TFunctionalityRegister williamr@4: else williamr@4: rd_id is CoProcessor number, eg 15 for ARM CP15 williamr@4: williamr@4: @see Sym32_reginfod::rd_id williamr@4: */ williamr@4: TUint16 iId; williamr@4: }; williamr@4: williamr@4: /** Same as Sym32_reginfod::rid_class williamr@4: Type of register ESYM_REG_CLASS :{ ESYM_REG_CORE = 0, ESYM_REG_COPRO = 1 } williamr@4: @see Sym32_reginfod::rid_class williamr@4: */ williamr@4: TUint8 iRegClass; williamr@4: williamr@4: /** Same as Sym32_reginfod::rd_sub_id williamr@4: Only used if rid_clas == ESYM_REG_COPRO williamr@4: williamr@4: Bitfield is made up of the following fields: williamr@4: bits 13 to 11 : OpCode2 williamr@4: bits 10 to 8 : OpCode1 williamr@4: bits 7 to 4 : CRn williamr@4: bits 3 to 0 : CRm williamr@4: williamr@4: @see Sym32_reginfod::rd_sub_id williamr@4: */ williamr@4: TUint16 iSubId; williamr@4: williamr@4: /** Same as Sym32_reginfod::rd_repre williamr@4: { ESYM_REG_8 == 0, ESYM_REG_16 == 1, ESYM_REG_32 == 2, ESYM_REG_64 == 3 } williamr@4: Determines which version of GetContent*() to use williamr@4: @see Sym32_reginfod::rd_repre williamr@4: */ williamr@4: TUint8 iSize; williamr@4: williamr@4: williamr@4: /** True if the content of this register was succesfully obtained from williamr@4: the target */ williamr@4: TBool iAvailable; williamr@4: williamr@4: /** Register value */ williamr@4: union williamr@4: { williamr@4: /** Value of an 8 bit register */ williamr@4: TUint8 iValue8; williamr@4: williamr@4: /** Value of a 16 bit register */ williamr@4: TUint16 iValue16; williamr@4: williamr@4: /** Value of a 32 bit register */ williamr@4: TUint32 iValue32; williamr@4: williamr@4: /** Value of a 64 bit register */ williamr@4: TUint64 iValue64; williamr@4: }; williamr@4: williamr@4: /** Reserved for future use williamr@4: @internalTechnology */ williamr@4: TUint32 iSpare1; williamr@4: williamr@4: /** @internalTechnology */ williamr@4: TUint32 iSpare2; williamr@4: williamr@4: /** @internalTechnology */ williamr@4: TUint32 iSpare3; williamr@4: }; williamr@4: williamr@4: williamr@4: /** williamr@4: @publishedPartner williamr@4: @released williamr@4: williamr@4: List of TRegisterData objects. williamr@4: @see TRegisterData williamr@4: @see RArray williamr@4: */ williamr@4: typedef RArray RRegisterList; williamr@4: williamr@4: williamr@4: #endif // CRASH_DATA_H williamr@4: williamr@4: