summaryrefslogtreecommitdiff
path: root/src/format.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/format.h')
-rw-r--r--src/format.h335
1 files changed, 335 insertions, 0 deletions
diff --git a/src/format.h b/src/format.h
new file mode 100644
index 0000000..394746d
--- /dev/null
+++ b/src/format.h
@@ -0,0 +1,335 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+#ifndef fooformathfoo
+#define fooformathfoo
+
+#include <inttypes.h>
+
+__attribute__((packed)) struct minidump_header {
+ uint32_t signature;
+ uint32_t version;
+ uint32_t number_of_streams;
+ uint32_t stream_directory_rva;
+ uint32_t checksum;
+ uint32_t time_date_stamp;
+ uint64_t flags;
+};
+
+enum {
+ MINIDUMP_NORMAL = 0x00000000,
+ MINIDUMP_WITH_DATA_SEGS = 0x00000001,
+ MINIDUMP_WITH_FULL_MEMORY = 0x00000002,
+ MINIDUMP_WITH_HANDLE_DATA = 0x00000004,
+ MINIDUMP_FILTER_MEMORY = 0x00000008,
+ MINIDUMP_SCAN_MEMORY = 0x00000010,
+ MINIDUMP_WITH_UNLOADED_MODULES = 0x00000020,
+ MINIDUMP_WITH_INDIRECTLY_REFERENCED_MEMORY = 0x00000040,
+ MINIDUMP_FILTER_MODULE_PATHS = 0x00000080,
+ MINIDUMP_WITH_PROCESS_THREAD_DATA = 0x00000100,
+ MINIDUMP_WITH_PRIVATE_READ_WRITE_MEMORY = 0x00000200,
+ MINIDUMP_WITHOUT_OPTIONAL_DATA = 0x00000400,
+ MINIDUMP_WITH_FULL_MEMORY_INFO = 0x00000800,
+ MINIDUMP_WITH_THREAD_INFO = 0x00001000,
+ MINIDUMP_WITH_CODE_SEGS = 0x00002000,
+ MINIDUMP_WITHOUT_AUXILIARY_STATE = 0x00004000,
+ MINIDUMP_WITH_FULL_AUXILIARY_STATE = 0x00008000,
+ MINIDUMP_WITH_PRIVATE_WRITE_COPY_MEMORY = 0x00010000,
+ MINIDUMP_IGNORE_INACCESSIBLE_MEMORY = 0x00020000,
+ MINIDUMP_WITH_TOKEN_INFORMATION = 0x00040000
+};
+
+__attribute__((packed)) struct minidump_location_descriptor {
+ uint32_t data_size;
+ uint32_t rva;
+};
+
+__attribute__((packed)) struct minidump_directory {
+ uint32_t stream_type;
+ struct minidump_location_descriptor location;
+};
+
+enum {
+ MINIDUMP_UNUSED_STREAM = 0,
+ MINIDUMP_RESERVED_STREAM_0 = 1,
+ MINIDUMP_RESERVED_STREAM_1 = 2,
+ MINIDUMP_THREAD_LIST_STREAM = 3, /* TODO XXXX */
+ MINIDUMP_MODULE_LIST_STREAM = 4, /* TODO XXXX */
+ MINIDUMP_MEMORY_LIST_STREAM = 5, /* TODO XXXX */
+ MINIDUMP_EXCEPTION_STREAM = 6, /* TODO XXXX */
+ MINIDUMP_SYSTEM_INFO_STREAM = 7, /* done */
+ MINIDUMP_THREAD_EX_LIST_STREAM = 8,
+ MINIDUMP_MEMORY_64_LIST_STREAM = 9,
+ MINIDUMP_COMMENT_STREAM_A = 10,
+ MINIDUMP_COMMENT_STREAM_W = 11,
+ MINIDUMP_HANDLE_DATA_STREAM = 12,
+ MINIDUMP_FUNCTION_TABLE_STREAM = 13,
+ MINIDUMP_UNLOADED_MODULE_LIST_STREAM = 14,
+ MINIDUMP_MISC_INFO_STREAM = 15,
+ MINIDUMP_MEMORY_INFO_LIST_STREAM = 16,
+ MINIDUMP_THREAD_INFO_LIST_STREAM = 17,
+ MINIDUMP_HANDLE_OPERATION_LIST_STREAM = 18,
+
+ MINIDUMP_LAST_RESERVED_STREAM = 0xffff,
+
+ /* Breakpad extensions -- 0x4767 = "Gg" */
+ MINIDUMP_BREAKPAD_INFO_STREAM = 0x47670001,
+ MINIDUMP_ASSERTION_INFO_STREAM = 0x47670002,
+
+ /* Breakpad/Linux extensions */
+ MINIDUMP_LINUX_CPU_INFO = 0x47670003, /* done */
+ MINIDUMP_LINUX_PROC_STATUS = 0x47670004, /* done */
+ MINIDUMP_LINUX_LSB_RELEASE = 0x47670005, /* done */
+ MINIDUMP_LINUX_CMD_LINE = 0x47670006, /* done */
+ MINIDUMP_LINUX_ENVIRON = 0x47670007, /* done */
+ MINIDUMP_LINUX_AUXV = 0x47670008, /* done */
+ MINIDUMP_LINUX_MAPS = 0x47670009, /* done */
+ MINIDUMP_LINUX_DSO_DEBUG = 0x4767000A, /* TODO XXXX */
+
+ /* libminidump extensions */
+ MINIDUMP_LINUX_OS_RELEASE = 0x4c500001,
+ MINIDUMP_LINUX_EXE = 0x4c500002, /* done */
+ MINIDUMP_LINUX_COMM = 0x4c500003, /* done */
+ MINIDUMP_LINUX_PRPSINFO = 0x4c500004, /* done */
+ MINIDUMP_LINUX_CORE_EHDR = 0x4c500005, /* done */
+ MINIDUMP_LINUX_ATTR_CURRENT = 0x4c500006, /* done */
+};
+
+__attribute__((packed)) struct minidump_system_info {
+ uint16_t processor_architecture;
+ uint16_t processor_level;
+ uint16_t processor_revision;
+ uint8_t number_of_processors;
+ uint8_t product_type;
+ uint32_t major_version;
+ uint32_t minor_version;
+ uint32_t build_number;
+ uint32_t platform_id;
+ uint32_t csd_version_rva;
+ uint16_t suite_mask;
+ uint16_t reserved2;
+ union {
+ struct {
+ uint32_t vendor_id[3];
+ uint32_t version_information;
+ uint32_t feature_information;
+ uint32_t amd_extended_cpu_features;
+ } x86_cpu_info;
+ struct {
+ uint64_t processor_features[2];
+ } other_cpu_info;
+ } cpu;
+};
+
+enum {
+ MINIDUMP_PROCESSOR_ARCHITECTURE_INTEL = 0,
+ MINIDUMP_PROCESSOR_ARCHITECTURE_MIPS = 1,
+ MINIDUMP_PROCESSOR_ARCHITECTURE_PPC = 3,
+ MINIDUMP_PROCESSOR_ARCHITECTURE_ARM = 5,
+ MINIDUMP_PROCESSOR_ARCHITECTURE_IA64 = 6,
+ MINIDUMP_PROCESSOR_ARCHITECTURE_AMD64 = 9,
+
+ /* Breakpad extension */
+ MINIDUMP_PROCESSOR_ARCHITECTURE_SPARC = 0x8001
+};
+
+enum {
+ MINIDUMP_PLATFORM_WIN32S = 0,
+ MINIDUMP_PLATFORM_WIN32_WINDOWS = 1,
+ MINIDUMP_PLATFORM_WIN32_NT = 2,
+ MINIDUMP_PLATFORM_WIN32_CE = 3,
+
+ /* Breakpad extensions */
+ MINIDUMP_PLATFORM_LINUX = 0x8201
+};
+
+__attribute__((packed)) struct minidump_vs_fixed_file_info {
+ uint32_t signature;
+ uint32_t struct_version;
+ uint32_t file_version_hi;
+ uint32_t file_version_lo;
+ uint32_t product_version_hi;
+ uint32_t product_version_lo;
+ uint32_t file_flags_mask; /* Identifies valid bits in fileFlags */
+ uint32_t file_flags;
+ uint32_t file_os;
+ uint32_t file_type;
+ uint32_t file_subtype;
+ uint32_t file_date_hi;
+ uint32_t file_date_lo;
+};
+
+__attribute__((packed)) struct minidump_module {
+ uint64_t base_of_image;
+ uint32_t size_of_image;
+ uint32_t check_sum;
+ uint32_t time_date_stamp;
+ uint32_t module_name_rva;
+ struct minidump_vs_fixed_file_info version_info;
+ struct minidump_location_descriptor cv_record;
+ struct minidump_location_descriptor misc_record;
+ uint64_t reserved0;
+ uint64_t reserved1;
+};
+
+__attribute__((packed)) struct minidump_module_list {
+ uint32_t number_of_modules;
+ struct minidump_module modules[1];
+};
+
+__attribute__((packed)) struct minidump_memory_descriptor{
+ uint64_t start_of_memory_range;
+ struct minidump_location_descriptor memory;
+};
+
+__attribute__((packed)) struct minidump_thread {
+ uint32_t thread_id;
+ uint32_t suspend_count;
+ uint32_t priority_class;
+ uint32_t priority;
+ uint64_t teb;
+ struct minidump_location_descriptor thread_context;
+ struct minidump_memory_descriptor stack;
+};
+
+__attribute__((packed)) struct minidump_thread_list {
+ uint32_t number_of_threads;
+ struct minidump_thread threads[1];
+};
+
+__attribute__((packed)) struct minidump_memory_list {
+ uint32_t number_of_memory_ranges;
+ struct minidump_memory_descriptor memory_ranges[1];
+};
+
+__attribute__((packed)) struct minidump_exception {
+ uint32_t exception_code;
+ uint32_t exception_flags;
+ uint64_t exception_record;
+ uint64_t exception_address;
+ uint32_t number_parameters;
+ uint32_t _alignment;
+ uint64_t exception_information[15];
+};
+
+__attribute__((packed)) struct minidump_exception_stream {
+ uint32_t thread_id;
+ uint32_t _alignment;
+ struct minidump_exception exception_record;
+ struct minidump_location_descriptor thread_context;
+};
+
+__attribute__((packed)) struct minidump_xmm_save_area32_amd64 {
+ uint16_t control_word;
+ uint16_t status_word;
+ uint8_t tag_word;
+ uint8_t reserved1;
+ uint16_t error_opcode;
+ uint32_t error_offset;
+ uint16_t error_selector;
+ uint16_t reserved2;
+ uint32_t data_offset;
+ uint16_t data_selector;
+ uint16_t reserved3;
+ uint32_t mx_csr;
+ uint32_t mx_csr_mask;
+ __uint128_t float_registers[8];
+ __uint128_t xmm_registers[16];
+ uint8_t reserved4[96];
+};
+
+__attribute__((packed)) struct minidump_context_amd64 {
+ uint64_t p1_home;
+ uint64_t p2_home;
+ uint64_t p3_home;
+ uint64_t p4_home;
+ uint64_t p5_home;
+ uint64_t p6_home;
+ uint32_t context_flags;
+ uint32_t mx_csr;
+
+ uint16_t cs;
+ uint16_t ds;
+ uint16_t es;
+ uint16_t fs;
+ uint16_t gs;
+ uint16_t ss;
+ uint32_t eflags;
+ uint64_t dr0;
+ uint64_t dr1;
+ uint64_t dr2;
+ uint64_t dr3;
+ uint64_t dr6;
+ uint64_t dr7;
+ uint64_t rax;
+ uint64_t rcx;
+ uint64_t rdx;
+ uint64_t rbx;
+ uint64_t rsp;
+ uint64_t rbp;
+ uint64_t rsi;
+ uint64_t rdi;
+ uint64_t r8;
+ uint64_t r9;
+ uint64_t r10;
+ uint64_t r11;
+ uint64_t r12;
+ uint64_t r13;
+ uint64_t r14;
+ uint64_t r15;
+ uint64_t rip;
+
+ union {
+ struct minidump_xmm_save_area32_amd64 flt_save;
+ struct {
+ __uint128_t header[2];
+ __uint128_t legacy[8];
+ __uint128_t xmm0;
+ __uint128_t xmm1;
+ __uint128_t xmm2;
+ __uint128_t xmm3;
+ __uint128_t xmm4;
+ __uint128_t xmm5;
+ __uint128_t xmm6;
+ __uint128_t xmm7;
+ __uint128_t xmm8;
+ __uint128_t xmm9;
+ __uint128_t xmm10;
+ __uint128_t xmm11;
+ __uint128_t xmm12;
+ __uint128_t xmm13;
+ __uint128_t xmm14;
+ __uint128_t xmm15;
+ } sse_registers;
+ };
+
+ __uint128_t vector_register[26];
+ uint64_t vector_control;
+ uint64_t debug_control;
+ uint64_t last_branch_to_rip;
+ uint64_t last_branch_from_rip;
+ uint64_t last_exception_to_rip;
+ uint64_t last_exception_from_rip;
+};
+
+enum {
+ MINIDUMP_CONTEXT_AMD64 = 0x00100000,
+ MINIDUMP_CONTEXT_AMD64_CONTROL = (MINIDUMP_CONTEXT_AMD64 | 0x00000001),
+ MINIDUMP_CONTEXT_AMD64_INTEGER = (MINIDUMP_CONTEXT_AMD64 | 0x00000002),
+ MINIDUMP_CONTEXT_AMD64_SEGMENTS = (MINIDUMP_CONTEXT_AMD64 | 0x00000004),
+ MINIDUMP_CONTEXT_AMD64_FLOATING_POINT = (MINIDUMP_CONTEXT_AMD64 | 0x00000008),
+ MINIDUMP_CONTEXT_AMD64_DEBUG_REGISTERS = (MINIDUMP_CONTEXT_AMD64 | 0x00000010),
+ MINIDUMP_CONTEXT_AMD64_XSTATE = (MINIDUMP_CONTEXT_AMD64 | 0x00000040),
+ MINIDUMP_CONTEXT_AMD64_FULL = (MINIDUMP_CONTEXT_AMD64_CONTROL |
+ MINIDUMP_CONTEXT_AMD64_INTEGER |
+ MINIDUMP_CONTEXT_AMD64_FLOATING_POINT),
+ MINIDUMP_CONTEXT_AMD64_ALL = (MINIDUMP_CONTEXT_AMD64_FULL |
+ MINIDUMP_CONTEXT_AMD64_SEGMENTS |
+ MINIDUMP_CONTEXT_AMD64_DEBUG_REGISTERS)
+};
+
+__attribute__((packed)) struct minidump_string {
+ uint32_t length;
+ uint16_t buffer[1];
+};
+
+#endif