diff -r e1b950c65cb4 -r 837f303aceeb epoc32/include/tools/coredump/symbianelfdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/epoc32/include/tools/coredump/symbianelfdefs.h Wed Mar 31 12:33:34 2010 +0100 @@ -0,0 +1,366 @@ +// Copyright (c) 2007-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 "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __SYMBIANELFDEFS_H__ +#define __SYMBIANELFDEFS_H__ + +#include <elfdefs.h> + +/** +@file +@publishedPartner +@released + +Symbian Core Dump specific ELF definitions. + +The definitions in this file implement the interface described in document +SGL_TS0028_027_symbian_core_dump_file_format.doc. + +@see CSymbianElfFormatter +*/ + +/** Definition of 64 bit memory */ +typedef unsigned long long Elf64_Word; + +/** Definition of 8 bit memory */ +typedef unsigned char Elf32_Byte; + + + +/** +Value of the d_type field of the standard descriptor header. +*/ +typedef enum +{ + /** Value to identify Sym32_syminfod */ + ESYM_NOTE_SYM = 0x00000000, + + /** Value to identify Sym32_thrdinfod */ + ESYM_NOTE_THRD = 0x00000010, + + /** Value to identify Sym32_procinfod */ + ESYM_NOTE_PROC = 0x00000020, + + /** Value to identify Sym32_execinfod */ + ESYM_NOTE_EXEC = 0x00000040, + + /** Value to identify Sym32_reginfod */ + ESYM_NOTE_REG = 0x00000080, + + /** Value to identify string information */ + ESYM_NOTE_STR = 0x00000100 + +} ESYM_NOTE_TYPE; + + +/** +To uniquely identify executables associated with the crashed process an executable +identifier is required, this identifier is defined as follows +*/ +typedef struct +{ + /** ID of the executable to match symbolic debug information to executable binary + [Currently crash time iTimeLo (LSW) and iTimeHi (MSW)] */ + Elf64_Word exec_id; + + /** CCITT CRC-32 Checksum of up to the first 1Kbytes of code segment. */ + Elf32_Word exec_crc; + + /** @internalTechnology */ + Elf32_Word exec_spare; +} Sym32_execid; + +/** Size of Sym32_execid in bytes. @see Sym32_execid */ +#define SYM32_EXECID_SIZE 16 + +/** +The Symbian Info segment contains generic crash information. +It is defined as a program segment with type PT_NOTE which +references the segment descriptor Sym32_dhdr. +The d_name field of the standard descriptor header is "CORE.SYMBIAN". +The d_type field of the standard descriptor header is ESYM_NOTE_SYM. +*/ +typedef struct +{ + /** Date and time of the crash */ + Elf64_Word sd_date_time; + + /** The ID of the crashed process as defined by Sym32_execid */ + Sym32_execid sd_execid; + + /** The id of the thread causing the crash */ + Elf64_Word sd_thread_id; + + /** The crashing threads owning process */ + Elf64_Word sd_proc_id; + + /** Identifies whether the crash was caused by a Hardware Exception (set to 0) + or Thread Kill (set to 1) */ + Elf32_Word sd_exit_type; + + /** If sd_exit_type is Hardware Exception then set to e32const.h::TExcType + if is Thread Kill then set to e32const.h::TExitType */ + Elf32_Word sd_exit_reason; + + /** Only set if sd_exit_type is Thread Kill. Index into the CORE.SYMBIAN.STR + note segment identifying the reason for the crash or ESYM_STR_UNDEF */ + Elf32_Word sd_exit_cat; + + /** @internalTechnology */ + Elf32_Word sd_spare; +} Sym32_syminfod; + +/** Size of Sym32_syminfod in bytes. @see Sym32_syminfod */ +#define SYM32_SYMINFO_SIZE 56 + +/** + The descriptor contents immediately follow the header. + To obtain the nth segment: nth segment offset = + (Elf32_Phdr) element -> p_offset + sizeof(Sym32_dhdr) + n * d_descrsz + */ +typedef struct { + /** Index into the CORE.SYMBIAN.STR note segment defining the name of + the descriptor or ESYM_STR_UNDEF */ + Elf32_Word d_name; + + /** Size of a single descriptor element */ + Elf32_Word d_descrsz; + + /** Type of the descriptor defined */ + Elf32_Word d_type; + + /** Index into the CORE.SYMBIAN.STR note segment defining the version + of the following segment descriptor */ + Elf32_Word d_version; + + /** Number of descriptor elements */ + Elf32_Word d_elemnum; +} Sym32_dhdr; + +/** Size of Sym32_dhdr in bytes. @see Sym32_dhdr */ +#define SYM32_DESCHDR_SIZE 20 + +/** +The Thread Info segment contains thread related information for one or more +threads of the owning process. +It is defined as a program segment with type PT_NOTE referencing the segment +descriptor defined below. +The d_name field of the standard descriptor header is "CORE.SYMBIAN.THREAD". +The d_type field of the standard descriptor header is ESYM_NOTE_THRD. +*/ +typedef struct { + /** Id of the thread */ + Elf64_Word td_id; + + /** Id of the owning process */ + Elf64_Word td_owning_process; + + /** Index into the CORE.SYMBIAN.STR note segment defining the name of the + thread or ESYM_STR_UNDEF */ + Elf32_Word td_name; + + /** Priority of thread */ + Elf32_Word td_priority; + /** Supervisor stack pointer */ + Elf32_Word td_svc_sp; + + /** Address of the supervisor stack */ + Elf32_Word td_svc_stack; + + /** Size of the supervisor stack */ + Elf32_Word td_svc_stacksz; + + /** Address of the user stack */ + Elf32_Word td_usr_stack; + + /** Size of the user stack */ + Elf32_Word td_usr_stacksz; + + /** @internalTechnology */ + Elf32_Word td_spare; +} Sym32_thrdinfod; + +/** Size of Sym32_thrdinfod in bytes. @see Sym32_thrdinfod */ +#define SYM32_THRINFO_SIZE 48 + +/** +The Process Info segment contains process related information for the +crashed threads owning process. It is defined as a program segment with +type PT_NOTE referencing the segment descriptor defined below. +The d_name field of the standard descriptor header is "CORE.SYMBIAN.PROCESS". +The d_type field of the standard descriptor header is ESYM_NOTE_PROC. +*/ +typedef struct { + /** ID of the process */ + Elf64_Word pd_id; + + /** Index into the CORE.SYMBIAN.STR note segment defining the + name of the Process or ESYM_STR_UNDEF */ + Elf32_Word pd_name; + + /** Priority of the process */ + Elf32_Word pd_priority; + +} Sym32_procinfod; + +/** Size of Sym32_procinfod in bytes. @see Sym32_procinfod */ +#define SYM32_PROCINFO_SIZE 16 + + +/** +The Executable Info segment contains information defining the location of the given executables image segments in the processes address space; this includes statically and dynamically linked executables also. It is defined as a program segment with type PT_NOTE referencing the segment descriptor defined below. +The d_name field of the standard descriptor header is "CORE.SYMBIAN.EXECUTABLE". +The d_type field of the standard descriptor header is ESYM_NOTE_EXEC. +*/ +typedef struct { + /** The ID of the executable as defined by Sym32_execid */ + Sym32_execid ed_execid; + + /** Index into the CORE.SYMBIAN.STR note segment defining the name of + the executable or ESYM_STR_UNDEF */ + Elf32_Word ed_name; + + /** Execute in place TRUE (1) for XIP ROM code FALSE (0) otherwise */ + Elf32_Word ed_XIP; + + /** Size of the executables code segment */ + Elf32_Word ed_codesize; + + /** Execution address of the code segment */ + Elf32_Word ed_coderunaddr; + + /** Build address of the code section (Non XIP only) */ + Elf32_Word ed_codeloadaddr; + + /** Size of the executable rodata segment */ + Elf32_Word ed_rodatasize; + + /** Execution address of the rodata segment */ + Elf32_Word ed_rodatarunaddr; + + /** Build address of the rodata section (Non XIP only) */ + Elf32_Word ed_rodataloadaddr; + + /** Size of the executable data segment */ + Elf32_Word ed_datasize; + + /** Execution address of the data segment */ + Elf32_Word ed_datarunaddr; + + /** Build address of the data section (Non XIP only) */ + Elf32_Word ed_dataloadaddr; + + /** @internalTechnology */ + Elf32_Word ed_spare; +} Sym32_execinfod; + +/** Size of Sym32_execinfod in bytes. @see Sym32_execinfod */ +#define SYM32_EXECINFO_SIZE 64 + + +/** +The register descriptor member Sym32_reginfod::rid_class is defined by this enumeration. +@see Sym32_reginfod. +*/ +typedef enum +{ + /** Core processor register */ + ESYM_REG_CORE = 0, + /** Coprocessor register */ + ESYM_REG_COPRO = 1 +} ESYM_REGCLASS; + +/** +The register descriptor member Sym32_reginfod::rid_repre is defined by this enumeration. +@see Sym32_reginfod +*/ +typedef enum +{ + /** 8 Bit register contents */ + ESYM_REG_8 = 0, + /** 16 Bit register contents */ + ESYM_REG_16 = 1, + /** 32 Bit register contents */ + ESYM_REG_32 = 2, + /** 64 Bit register contents */ + ESYM_REG_64 = 3 +} ESYM_REGREP; + + +/** +The Register Info segment contains a register context for a given thread. The core dump file may include zero or more register contexts for one or more threads within the owning process. It is defined as a program segment with type PT_NOTE referencing the segment descriptor defined below. +The d_name field of the standard descriptor header is "CORE.SYMBIAN.REGISTER.<THREADID>". +The d_type field of the standard descriptor header is ESYM_NOTE_REG. +*/ +typedef struct { + /** Thread which context relates to */ + Elf64_Word rid_thread_id; + + /** Index into the CORE.SYMBIAN.STR note segment defining the version of + the Register Data Info descriptor */ + Elf32_Word rid_version; + + /** Number of registers this descriptor defines */ + Elf32_Half rid_num_registers; + + /** Register class defined by ESYM_REGCLASS */ + Elf32_Byte rid_class; + + /** Register representation defined by ESYM_REGREP */ + Elf32_Byte rid_repre; + +} Sym32_reginfod; + +/** Size of Sym32_reginfod in bytes. @see Sym32_reginfod */ +#define SYM32_REGINFO_SIZE 16 + + +/** +Immediately following the Register Info descriptor header is the information describing +the individual registers. See document for register identifiers. +The register identification scheme is the same as that used by the run mode debug interface. +*/ +typedef struct { + /** Register ID */ + Elf32_Half rd_id; + + /** Sub register ID */ + Elf32_Half rd_sub_id; + + /** Offset in bytes from the beginning of the file to the register data */ + Elf32_Word rd_data; +} Sym32_regdatad; + +/** Size of Sym32_regdatad in bytes. @see Sym32_regdatad */ +#define SYM32_REGDATA_SIZE 8 + + +/** Program header member p_flags indicating that the segment may be executed. */ +#define PF_X 1 + +/** Program header member p_flags indicating that the segment may be written to. */ +#define PF_W 2 + +/** Program header member p_flags indicating that the segment may be read from. */ +#define PF_R 4 + + +/** +Index to the NULL string, ie string is not defined. +*/ +#define ESYM_STR_UNDEF 0 + +#endif +