1/* Copyright (c) 2006, Google Inc.
2 * All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
29
30/* minidump_format.h: A cross-platform reimplementation of minidump-related
31 * portions of DbgHelp.h from the Windows Platform SDK.
32 *
33 * (This is C99 source, please don't corrupt it with C++.)
34 *
35 * Structures that are defined by Microsoft to contain a zero-length array
36 * are instead defined here to contain an array with one element, as
37 * zero-length arrays are forbidden by standard C and C++. In these cases,
38 * *_minsize constants are provided to be used in place of sizeof. For a
39 * cleaner interface to these sizes when using C++, see minidump_size.h.
40 *
41 * These structures are also sufficient to populate minidump files.
42 *
43 * These definitions may be extended to support handling minidump files
44 * for other CPUs and other operating systems.
45 *
46 * Because precise data type sizes are crucial for this implementation to
47 * function properly and portably in terms of interoperability with minidumps
48 * produced by DbgHelp on Windows, a set of primitive types with known sizes
49 * are used as the basis of each structure defined by this file. DbgHelp
50 * on Windows is assumed to be the reference implementation; this file
51 * seeks to provide a cross-platform compatible implementation. To avoid
52 * collisions with the types and values defined and used by DbgHelp in the
53 * event that this implementation is used on Windows, each type and value
54 * defined here is given a new name, beginning with "MD". Names of the
55 * equivalent types and values in the Windows Platform SDK are given in
56 * comments.
57 *
58 * Author: Mark Mentovai */
59
60
61#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__
62#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__
63
64#include <stddef.h>
65
66#include "google_breakpad/common/breakpad_types.h"
67
68
69#if defined(_MSC_VER)
70/* Disable "zero-sized array in struct/union" warnings when compiling in
71 * MSVC. DbgHelp.h does this too. */
72#pragma warning(push)
73#pragma warning(disable:4200)
74#endif /* _MSC_VER */
75
76
77/*
78 * guiddef.h
79 */
80
81typedef struct {
82 uint32_t data1;
83 uint16_t data2;
84 uint16_t data3;
85 uint8_t data4[8];
86} MDGUID; /* GUID */
87
88
89/*
90 * WinNT.h
91 */
92
93/* Non-x86 CPU identifiers found in the high 24 bits of
94 * (MDRawContext*).context_flags. These aren't used by Breakpad, but are
95 * defined here for reference, to avoid assigning values that conflict
96 * (although some values already conflict). */
97#define MD_CONTEXT_IA64 0x00080000 /* CONTEXT_IA64 */
98/* Additional values from winnt.h in the Windows CE 5.0 SDK: */
99#define MD_CONTEXT_SHX 0x000000c0 /* CONTEXT_SH4 (Super-H, includes SH3) */
100#define MD_CONTEXT_ALPHA 0x00020000 /* CONTEXT_ALPHA */
101
102/* As of Windows 7 SP1, the number of flag bits has increased to
103 * include 0x40 (CONTEXT_XSTATE):
104 * http://msdn.microsoft.com/en-us/library/hh134238%28v=vs.85%29.aspx */
105#define MD_CONTEXT_CPU_MASK 0xffffff00
106
107
108/* This is a base type for MDRawContextX86 and MDRawContextPPC. This
109 * structure should never be allocated directly. The actual structure type
110 * can be determined by examining the context_flags field. */
111typedef struct {
112 uint32_t context_flags;
113} MDRawContextBase;
114
115#include "minidump_cpu_amd64.h"
116#include "minidump_cpu_arm.h"
117#include "minidump_cpu_arm64.h"
118#include "minidump_cpu_mips.h"
119#include "minidump_cpu_ppc.h"
120#include "minidump_cpu_ppc64.h"
121#include "minidump_cpu_sparc.h"
122#include "minidump_cpu_x86.h"
123
124/*
125 * WinVer.h
126 */
127
128
129typedef struct {
130 uint32_t signature;
131 uint32_t struct_version;
132 uint32_t file_version_hi;
133 uint32_t file_version_lo;
134 uint32_t product_version_hi;
135 uint32_t product_version_lo;
136 uint32_t file_flags_mask; /* Identifies valid bits in fileFlags */
137 uint32_t file_flags;
138 uint32_t file_os;
139 uint32_t file_type;
140 uint32_t file_subtype;
141 uint32_t file_date_hi;
142 uint32_t file_date_lo;
143} MDVSFixedFileInfo; /* VS_FIXEDFILEINFO */
144
145/* For (MDVSFixedFileInfo).signature */
146#define MD_VSFIXEDFILEINFO_SIGNATURE 0xfeef04bd
147 /* VS_FFI_SIGNATURE */
148
149/* For (MDVSFixedFileInfo).version */
150#define MD_VSFIXEDFILEINFO_VERSION 0x00010000
151 /* VS_FFI_STRUCVERSION */
152
153/* For (MDVSFixedFileInfo).file_flags_mask and
154 * (MDVSFixedFileInfo).file_flags */
155#define MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG 0x00000001
156 /* VS_FF_DEBUG */
157#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRERELEASE 0x00000002
158 /* VS_FF_PRERELEASE */
159#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PATCHED 0x00000004
160 /* VS_FF_PATCHED */
161#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRIVATEBUILD 0x00000008
162 /* VS_FF_PRIVATEBUILD */
163#define MD_VSFIXEDFILEINFO_FILE_FLAGS_INFOINFERRED 0x00000010
164 /* VS_FF_INFOINFERRED */
165#define MD_VSFIXEDFILEINFO_FILE_FLAGS_SPECIALBUILD 0x00000020
166 /* VS_FF_SPECIALBUILD */
167
168/* For (MDVSFixedFileInfo).file_os: high 16 bits */
169#define MD_VSFIXEDFILEINFO_FILE_OS_UNKNOWN 0 /* VOS_UNKNOWN */
170#define MD_VSFIXEDFILEINFO_FILE_OS_DOS (1 << 16) /* VOS_DOS */
171#define MD_VSFIXEDFILEINFO_FILE_OS_OS216 (2 << 16) /* VOS_OS216 */
172#define MD_VSFIXEDFILEINFO_FILE_OS_OS232 (3 << 16) /* VOS_OS232 */
173#define MD_VSFIXEDFILEINFO_FILE_OS_NT (4 << 16) /* VOS_NT */
174#define MD_VSFIXEDFILEINFO_FILE_OS_WINCE (5 << 16) /* VOS_WINCE */
175/* Low 16 bits */
176#define MD_VSFIXEDFILEINFO_FILE_OS__BASE 0 /* VOS__BASE */
177#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS16 1 /* VOS__WINDOWS16 */
178#define MD_VSFIXEDFILEINFO_FILE_OS__PM16 2 /* VOS__PM16 */
179#define MD_VSFIXEDFILEINFO_FILE_OS__PM32 3 /* VOS__PM32 */
180#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32 4 /* VOS__WINDOWS32 */
181
182/* For (MDVSFixedFileInfo).file_type */
183#define MD_VSFIXEDFILEINFO_FILE_TYPE_UNKNOWN 0 /* VFT_UNKNOWN */
184#define MD_VSFIXEDFILEINFO_FILE_TYPE_APP 1 /* VFT_APP */
185#define MD_VSFIXEDFILEINFO_FILE_TYPE_DLL 2 /* VFT_DLL */
186#define MD_VSFIXEDFILEINFO_FILE_TYPE_DRV 3 /* VFT_DLL */
187#define MD_VSFIXEDFILEINFO_FILE_TYPE_FONT 4 /* VFT_FONT */
188#define MD_VSFIXEDFILEINFO_FILE_TYPE_VXD 5 /* VFT_VXD */
189#define MD_VSFIXEDFILEINFO_FILE_TYPE_STATIC_LIB 7 /* VFT_STATIC_LIB */
190
191/* For (MDVSFixedFileInfo).file_subtype */
192#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN 0
193 /* VFT2_UNKNOWN */
194/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_DRV */
195#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_PRINTER 1
196 /* VFT2_DRV_PRINTER */
197#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_KEYBOARD 2
198 /* VFT2_DRV_KEYBOARD */
199#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_LANGUAGE 3
200 /* VFT2_DRV_LANGUAGE */
201#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_DISPLAY 4
202 /* VFT2_DRV_DISPLAY */
203#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_MOUSE 5
204 /* VFT2_DRV_MOUSE */
205#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_NETWORK 6
206 /* VFT2_DRV_NETWORK */
207#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SYSTEM 7
208 /* VFT2_DRV_SYSTEM */
209#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INSTALLABLE 8
210 /* VFT2_DRV_INSTALLABLE */
211#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SOUND 9
212 /* VFT2_DRV_SOUND */
213#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_COMM 10
214 /* VFT2_DRV_COMM */
215#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INPUTMETHOD 11
216 /* VFT2_DRV_INPUTMETHOD */
217#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_VERSIONED_PRINTER 12
218 /* VFT2_DRV_VERSIONED_PRINTER */
219/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_FONT */
220#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_RASTER 1
221 /* VFT2_FONT_RASTER */
222#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_VECTOR 2
223 /* VFT2_FONT_VECTOR */
224#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_TRUETYPE 3
225 /* VFT2_FONT_TRUETYPE */
226
227
228/*
229 * DbgHelp.h
230 */
231
232
233/* An MDRVA is an offset into the minidump file. The beginning of the
234 * MDRawHeader is at offset 0. */
235typedef uint32_t MDRVA; /* RVA */
236
237typedef struct {
238 uint32_t data_size;
239 MDRVA rva;
240} MDLocationDescriptor; /* MINIDUMP_LOCATION_DESCRIPTOR */
241
242
243typedef struct {
244 /* The base address of the memory range on the host that produced the
245 * minidump. */
246 uint64_t start_of_memory_range;
247
248 MDLocationDescriptor memory;
249} MDMemoryDescriptor; /* MINIDUMP_MEMORY_DESCRIPTOR */
250
251
252typedef struct {
253 uint32_t signature;
254 uint32_t version;
255 uint32_t stream_count;
256 MDRVA stream_directory_rva; /* A |stream_count|-sized array of
257 * MDRawDirectory structures. */
258 uint32_t checksum; /* Can be 0. In fact, that's all that's
259 * been found in minidump files. */
260 uint32_t time_date_stamp; /* time_t */
261 uint64_t flags;
262} MDRawHeader; /* MINIDUMP_HEADER */
263
264/* For (MDRawHeader).signature and (MDRawHeader).version. Note that only the
265 * low 16 bits of (MDRawHeader).version are MD_HEADER_VERSION. Per the
266 * documentation, the high 16 bits are implementation-specific. */
267#define MD_HEADER_SIGNATURE 0x504d444d /* 'PMDM' */
268 /* MINIDUMP_SIGNATURE */
269#define MD_HEADER_VERSION 0x0000a793 /* 42899 */
270 /* MINIDUMP_VERSION */
271
272/* For (MDRawHeader).flags: */
273typedef enum {
274 /* MD_NORMAL is the standard type of minidump. It includes full
275 * streams for the thread list, module list, exception, system info,
276 * and miscellaneous info. A memory list stream is also present,
277 * pointing to the same stack memory contained in the thread list,
278 * as well as a 256-byte region around the instruction address that
279 * was executing when the exception occurred. Stack memory is from
280 * 4 bytes below a thread's stack pointer up to the top of the
281 * memory region encompassing the stack. */
282 MD_NORMAL = 0x00000000,
283 MD_WITH_DATA_SEGS = 0x00000001,
284 MD_WITH_FULL_MEMORY = 0x00000002,
285 MD_WITH_HANDLE_DATA = 0x00000004,
286 MD_FILTER_MEMORY = 0x00000008,
287 MD_SCAN_MEMORY = 0x00000010,
288 MD_WITH_UNLOADED_MODULES = 0x00000020,
289 MD_WITH_INDIRECTLY_REFERENCED_MEMORY = 0x00000040,
290 MD_FILTER_MODULE_PATHS = 0x00000080,
291 MD_WITH_PROCESS_THREAD_DATA = 0x00000100,
292 MD_WITH_PRIVATE_READ_WRITE_MEMORY = 0x00000200,
293 MD_WITHOUT_OPTIONAL_DATA = 0x00000400,
294 MD_WITH_FULL_MEMORY_INFO = 0x00000800,
295 MD_WITH_THREAD_INFO = 0x00001000,
296 MD_WITH_CODE_SEGS = 0x00002000,
297 MD_WITHOUT_AUXILLIARY_SEGS = 0x00004000,
298 MD_WITH_FULL_AUXILLIARY_STATE = 0x00008000,
299 MD_WITH_PRIVATE_WRITE_COPY_MEMORY = 0x00010000,
300 MD_IGNORE_INACCESSIBLE_MEMORY = 0x00020000,
301 MD_WITH_TOKEN_INFORMATION = 0x00040000
302} MDType; /* MINIDUMP_TYPE */
303
304
305typedef struct {
306 uint32_t stream_type;
307 MDLocationDescriptor location;
308} MDRawDirectory; /* MINIDUMP_DIRECTORY */
309
310/* For (MDRawDirectory).stream_type */
311typedef enum {
312 MD_UNUSED_STREAM = 0,
313 MD_RESERVED_STREAM_0 = 1,
314 MD_RESERVED_STREAM_1 = 2,
315 MD_THREAD_LIST_STREAM = 3, /* MDRawThreadList */
316 MD_MODULE_LIST_STREAM = 4, /* MDRawModuleList */
317 MD_MEMORY_LIST_STREAM = 5, /* MDRawMemoryList */
318 MD_EXCEPTION_STREAM = 6, /* MDRawExceptionStream */
319 MD_SYSTEM_INFO_STREAM = 7, /* MDRawSystemInfo */
320 MD_THREAD_EX_LIST_STREAM = 8,
321 MD_MEMORY_64_LIST_STREAM = 9,
322 MD_COMMENT_STREAM_A = 10,
323 MD_COMMENT_STREAM_W = 11,
324 MD_HANDLE_DATA_STREAM = 12,
325 MD_FUNCTION_TABLE_STREAM = 13,
326 MD_UNLOADED_MODULE_LIST_STREAM = 14,
327 MD_MISC_INFO_STREAM = 15, /* MDRawMiscInfo */
328 MD_MEMORY_INFO_LIST_STREAM = 16, /* MDRawMemoryInfoList */
329 MD_THREAD_INFO_LIST_STREAM = 17,
330 MD_HANDLE_OPERATION_LIST_STREAM = 18,
331 MD_TOKEN_STREAM = 19,
332 MD_JAVASCRIPT_DATA_STREAM = 20,
333 MD_SYSTEM_MEMORY_INFO_STREAM = 21,
334 MD_PROCESS_VM_COUNTERS_STREAM = 22,
335 MD_LAST_RESERVED_STREAM = 0x0000ffff,
336
337 /* Breakpad extension types. 0x4767 = "Gg" */
338 MD_BREAKPAD_INFO_STREAM = 0x47670001, /* MDRawBreakpadInfo */
339 MD_ASSERTION_INFO_STREAM = 0x47670002, /* MDRawAssertionInfo */
340 /* These are additional minidump stream values which are specific to
341 * the linux breakpad implementation. */
342 MD_LINUX_CPU_INFO = 0x47670003, /* /proc/cpuinfo */
343 MD_LINUX_PROC_STATUS = 0x47670004, /* /proc/$x/status */
344 MD_LINUX_LSB_RELEASE = 0x47670005, /* /etc/lsb-release */
345 MD_LINUX_CMD_LINE = 0x47670006, /* /proc/$x/cmdline */
346 MD_LINUX_ENVIRON = 0x47670007, /* /proc/$x/environ */
347 MD_LINUX_AUXV = 0x47670008, /* /proc/$x/auxv */
348 MD_LINUX_MAPS = 0x47670009, /* /proc/$x/maps */
349 MD_LINUX_DSO_DEBUG = 0x4767000A, /* MDRawDebug{32,64} */
350
351 /* Crashpad extension types. 0x4350 = "CP"
352 * See Crashpad's minidump/minidump_extensions.h. */
353 MD_CRASHPAD_INFO_STREAM = 0x43500001, /* MDRawCrashpadInfo */
354} MDStreamType; /* MINIDUMP_STREAM_TYPE */
355
356
357typedef struct {
358 uint32_t length; /* Length of buffer in bytes (not characters),
359 * excluding 0-terminator */
360 uint16_t buffer[1]; /* UTF-16-encoded, 0-terminated */
361} MDString; /* MINIDUMP_STRING */
362
363static const size_t MDString_minsize = offsetof(MDString, buffer[0]);
364
365
366typedef struct {
367 uint32_t thread_id;
368 uint32_t suspend_count;
369 uint32_t priority_class;
370 uint32_t priority;
371 uint64_t teb; /* Thread environment block */
372 MDMemoryDescriptor stack;
373 MDLocationDescriptor thread_context; /* MDRawContext[CPU] */
374} MDRawThread; /* MINIDUMP_THREAD */
375
376
377typedef struct {
378 uint32_t number_of_threads;
379 MDRawThread threads[1];
380} MDRawThreadList; /* MINIDUMP_THREAD_LIST */
381
382static const size_t MDRawThreadList_minsize = offsetof(MDRawThreadList,
383 threads[0]);
384
385
386typedef struct {
387 uint64_t base_of_image;
388 uint32_t size_of_image;
389 uint32_t checksum; /* 0 if unknown */
390 uint32_t time_date_stamp; /* time_t */
391 MDRVA module_name_rva; /* MDString, pathname or filename */
392 MDVSFixedFileInfo version_info;
393
394 /* The next field stores a CodeView record and is populated when a module's
395 * debug information resides in a PDB file. It identifies the PDB file. */
396 MDLocationDescriptor cv_record;
397
398 /* The next field is populated when a module's debug information resides
399 * in a DBG file. It identifies the DBG file. This field is effectively
400 * obsolete with modules built by recent toolchains. */
401 MDLocationDescriptor misc_record;
402
403 /* Alignment problem: reserved0 and reserved1 are defined by the platform
404 * SDK as 64-bit quantities. However, that results in a structure whose
405 * alignment is unpredictable on different CPUs and ABIs. If the ABI
406 * specifies full alignment of 64-bit quantities in structures (as ppc
407 * does), there will be padding between miscRecord and reserved0. If
408 * 64-bit quantities can be aligned on 32-bit boundaries (as on x86),
409 * this padding will not exist. (Note that the structure up to this point
410 * contains 1 64-bit member followed by 21 32-bit members.)
411 * As a workaround, reserved0 and reserved1 are instead defined here as
412 * four 32-bit quantities. This should be harmless, as there are
413 * currently no known uses for these fields. */
414 uint32_t reserved0[2];
415 uint32_t reserved1[2];
416} MDRawModule; /* MINIDUMP_MODULE */
417
418/* The inclusion of a 64-bit type in MINIDUMP_MODULE forces the struct to
419 * be tail-padded out to a multiple of 64 bits under some ABIs (such as PPC).
420 * This doesn't occur on systems that don't tail-pad in this manner. Define
421 * this macro to be the usable size of the MDRawModule struct, and use it in
422 * place of sizeof(MDRawModule). */
423#define MD_MODULE_SIZE 108
424
425
426/* (MDRawModule).cv_record can reference MDCVInfoPDB20 or MDCVInfoPDB70.
427 * Ref.: http://www.debuginfo.com/articles/debuginfomatch.html
428 * MDCVInfoPDB70 is the expected structure type with recent toolchains. */
429
430typedef struct {
431 uint32_t signature;
432 uint32_t offset; /* Offset to debug data (expect 0 in minidump) */
433} MDCVHeader;
434
435typedef struct {
436 MDCVHeader cv_header;
437 uint32_t signature; /* time_t debug information created */
438 uint32_t age; /* revision of PDB file */
439 uint8_t pdb_file_name[1]; /* Pathname or filename of PDB file */
440} MDCVInfoPDB20;
441
442static const size_t MDCVInfoPDB20_minsize = offsetof(MDCVInfoPDB20,
443 pdb_file_name[0]);
444
445#define MD_CVINFOPDB20_SIGNATURE 0x3031424e /* cvHeader.signature = '01BN' */
446
447typedef struct {
448 uint32_t cv_signature;
449 MDGUID signature; /* GUID, identifies PDB file */
450 uint32_t age; /* Identifies incremental changes to PDB file */
451 uint8_t pdb_file_name[1]; /* Pathname or filename of PDB file,
452 * 0-terminated 8-bit character data (UTF-8?) */
453} MDCVInfoPDB70;
454
455static const size_t MDCVInfoPDB70_minsize = offsetof(MDCVInfoPDB70,
456 pdb_file_name[0]);
457
458#define MD_CVINFOPDB70_SIGNATURE 0x53445352 /* cvSignature = 'SDSR' */
459
460/*
461 * Modern ELF toolchains insert a "build id" into the ELF headers that
462 * usually contains a hash of some ELF headers + sections to uniquely
463 * identify a binary.
464 *
465 * https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Developer_Guide/compiling-build-id.html
466 * https://sourceware.org/binutils/docs-2.26/ld/Options.html#index-g_t_002d_002dbuild_002did-292
467 */
468typedef struct {
469 uint32_t cv_signature;
470 uint8_t build_id[1]; /* Bytes of build id from GNU_BUILD_ID ELF note.
471 * This is variable-length, but usually 20 bytes
472 * as the binutils ld default is a SHA-1 hash. */
473} MDCVInfoELF;
474
475static const size_t MDCVInfoELF_minsize = offsetof(MDCVInfoELF,
476 build_id[0]);
477
478#define MD_CVINFOELF_SIGNATURE 0x4270454c /* cvSignature = 'BpEL' */
479
480/* In addition to the two CodeView record formats above, used for linking
481 * to external pdb files, it is possible for debugging data to be carried
482 * directly in the CodeView record itself. These signature values will
483 * be found in the first 4 bytes of the CodeView record. Additional values
484 * not commonly experienced in the wild are given by "Microsoft Symbol and
485 * Type Information", http://www.x86.org/ftp/manuals/tools/sym.pdf, section
486 * 7.2. An in-depth description of the CodeView 4.1 format is given by
487 * "Undocumented Windows 2000 Secrets", Windows 2000 Debugging Support/
488 * Microsoft Symbol File Internals/CodeView Subsections,
489 * http://www.rawol.com/features/undocumented/sbs-w2k-1-windows-2000-debugging-support.pdf
490 */
491#define MD_CVINFOCV41_SIGNATURE 0x3930424e /* '90BN', CodeView 4.10. */
492#define MD_CVINFOCV50_SIGNATURE 0x3131424e /* '11BN', CodeView 5.0,
493 * MS C7-format (/Z7). */
494
495#define MD_CVINFOUNKNOWN_SIGNATURE 0xffffffff /* An unlikely value. */
496
497/* (MDRawModule).miscRecord can reference MDImageDebugMisc. The Windows
498 * structure is actually defined in WinNT.h. This structure is effectively
499 * obsolete with modules built by recent toolchains. */
500
501typedef struct {
502 uint32_t data_type; /* IMAGE_DEBUG_TYPE_*, not defined here because
503 * this debug record type is mostly obsolete. */
504 uint32_t length; /* Length of entire MDImageDebugMisc structure */
505 uint8_t unicode; /* True if data is multibyte */
506 uint8_t reserved[3];
507 uint8_t data[1];
508} MDImageDebugMisc; /* IMAGE_DEBUG_MISC */
509
510static const size_t MDImageDebugMisc_minsize = offsetof(MDImageDebugMisc,
511 data[0]);
512
513
514typedef struct {
515 uint32_t number_of_modules;
516 MDRawModule modules[1];
517} MDRawModuleList; /* MINIDUMP_MODULE_LIST */
518
519static const size_t MDRawModuleList_minsize = offsetof(MDRawModuleList,
520 modules[0]);
521
522
523typedef struct {
524 uint32_t number_of_memory_ranges;
525 MDMemoryDescriptor memory_ranges[1];
526} MDRawMemoryList; /* MINIDUMP_MEMORY_LIST */
527
528static const size_t MDRawMemoryList_minsize = offsetof(MDRawMemoryList,
529 memory_ranges[0]);
530
531
532#define MD_EXCEPTION_MAXIMUM_PARAMETERS 15u
533
534typedef struct {
535 uint32_t exception_code; /* Windows: MDExceptionCodeWin,
536 * Mac OS X: MDExceptionMac,
537 * Linux: MDExceptionCodeLinux. */
538 uint32_t exception_flags; /* Windows: 1 if noncontinuable,
539 Mac OS X: MDExceptionCodeMac. */
540 uint64_t exception_record; /* Address (in the minidump-producing host's
541 * memory) of another MDException, for
542 * nested exceptions. */
543 uint64_t exception_address; /* The address that caused the exception.
544 * Mac OS X: exception subcode (which is
545 * typically the address). */
546 uint32_t number_parameters; /* Number of valid elements in
547 * exception_information. */
548 uint32_t __align;
549 uint64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS];
550} MDException; /* MINIDUMP_EXCEPTION */
551
552#include "minidump_exception_fuchsia.h"
553#include "minidump_exception_linux.h"
554#include "minidump_exception_mac.h"
555#include "minidump_exception_ps3.h"
556#include "minidump_exception_solaris.h"
557#include "minidump_exception_win32.h"
558
559typedef struct {
560 uint32_t thread_id; /* Thread in which the exception
561 * occurred. Corresponds to
562 * (MDRawThread).thread_id. */
563 uint32_t __align;
564 MDException exception_record;
565 MDLocationDescriptor thread_context; /* MDRawContext[CPU] */
566} MDRawExceptionStream; /* MINIDUMP_EXCEPTION_STREAM */
567
568
569typedef union {
570 struct {
571 uint32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */
572 uint32_t version_information; /* cpuid 1: eax */
573 uint32_t feature_information; /* cpuid 1: edx */
574 uint32_t amd_extended_cpu_features; /* cpuid 0x80000001, ebx */
575 } x86_cpu_info;
576 struct {
577 uint32_t cpuid;
578 uint32_t elf_hwcaps; /* linux specific, 0 otherwise */
579 } arm_cpu_info;
580 struct {
581 uint64_t processor_features[2];
582 } other_cpu_info;
583} MDCPUInformation; /* CPU_INFORMATION */
584
585/* For (MDCPUInformation).arm_cpu_info.elf_hwcaps.
586 * This matches the Linux kernel definitions from <asm/hwcaps.h> */
587typedef enum {
588 MD_CPU_ARM_ELF_HWCAP_SWP = (1 << 0),
589 MD_CPU_ARM_ELF_HWCAP_HALF = (1 << 1),
590 MD_CPU_ARM_ELF_HWCAP_THUMB = (1 << 2),
591 MD_CPU_ARM_ELF_HWCAP_26BIT = (1 << 3),
592 MD_CPU_ARM_ELF_HWCAP_FAST_MULT = (1 << 4),
593 MD_CPU_ARM_ELF_HWCAP_FPA = (1 << 5),
594 MD_CPU_ARM_ELF_HWCAP_VFP = (1 << 6),
595 MD_CPU_ARM_ELF_HWCAP_EDSP = (1 << 7),
596 MD_CPU_ARM_ELF_HWCAP_JAVA = (1 << 8),
597 MD_CPU_ARM_ELF_HWCAP_IWMMXT = (1 << 9),
598 MD_CPU_ARM_ELF_HWCAP_CRUNCH = (1 << 10),
599 MD_CPU_ARM_ELF_HWCAP_THUMBEE = (1 << 11),
600 MD_CPU_ARM_ELF_HWCAP_NEON = (1 << 12),
601 MD_CPU_ARM_ELF_HWCAP_VFPv3 = (1 << 13),
602 MD_CPU_ARM_ELF_HWCAP_VFPv3D16 = (1 << 14),
603 MD_CPU_ARM_ELF_HWCAP_TLS = (1 << 15),
604 MD_CPU_ARM_ELF_HWCAP_VFPv4 = (1 << 16),
605 MD_CPU_ARM_ELF_HWCAP_IDIVA = (1 << 17),
606 MD_CPU_ARM_ELF_HWCAP_IDIVT = (1 << 18),
607} MDCPUInformationARMElfHwCaps;
608
609typedef struct {
610 /* The next 3 fields and numberOfProcessors are from the SYSTEM_INFO
611 * structure as returned by GetSystemInfo */
612 uint16_t processor_architecture;
613 uint16_t processor_level; /* x86: 5 = 586, 6 = 686, ... */
614 /* ARM: 6 = ARMv6, 7 = ARMv7 ... */
615 uint16_t processor_revision; /* x86: 0xMMSS, where MM=model,
616 * SS=stepping */
617 /* ARM: 0 */
618
619 uint8_t number_of_processors;
620 uint8_t product_type; /* Windows: VER_NT_* from WinNT.h */
621
622 /* The next 5 fields are from the OSVERSIONINFO structure as returned
623 * by GetVersionEx */
624 uint32_t major_version;
625 uint32_t minor_version;
626 uint32_t build_number;
627 uint32_t platform_id;
628 MDRVA csd_version_rva; /* MDString further identifying the
629 * host OS.
630 * Windows: name of the installed OS
631 * service pack.
632 * Mac OS X: the Apple OS build number
633 * (sw_vers -buildVersion).
634 * Linux: uname -srvmo */
635
636 uint16_t suite_mask; /* Windows: VER_SUITE_* from WinNT.h */
637 uint16_t reserved2;
638
639 MDCPUInformation cpu;
640} MDRawSystemInfo; /* MINIDUMP_SYSTEM_INFO */
641
642/* For (MDRawSystemInfo).processor_architecture: */
643typedef enum {
644 MD_CPU_ARCHITECTURE_X86 = 0, /* PROCESSOR_ARCHITECTURE_INTEL */
645 MD_CPU_ARCHITECTURE_MIPS = 1, /* PROCESSOR_ARCHITECTURE_MIPS */
646 MD_CPU_ARCHITECTURE_ALPHA = 2, /* PROCESSOR_ARCHITECTURE_ALPHA */
647 MD_CPU_ARCHITECTURE_PPC = 3, /* PROCESSOR_ARCHITECTURE_PPC */
648 MD_CPU_ARCHITECTURE_SHX = 4, /* PROCESSOR_ARCHITECTURE_SHX
649 * (Super-H) */
650 MD_CPU_ARCHITECTURE_ARM = 5, /* PROCESSOR_ARCHITECTURE_ARM */
651 MD_CPU_ARCHITECTURE_IA64 = 6, /* PROCESSOR_ARCHITECTURE_IA64 */
652 MD_CPU_ARCHITECTURE_ALPHA64 = 7, /* PROCESSOR_ARCHITECTURE_ALPHA64 */
653 MD_CPU_ARCHITECTURE_MSIL = 8, /* PROCESSOR_ARCHITECTURE_MSIL
654 * (Microsoft Intermediate Language) */
655 MD_CPU_ARCHITECTURE_AMD64 = 9, /* PROCESSOR_ARCHITECTURE_AMD64 */
656 MD_CPU_ARCHITECTURE_X86_WIN64 = 10,
657 /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */
658 MD_CPU_ARCHITECTURE_ARM64 = 12, /* PROCESSOR_ARCHITECTURE_ARM64 */
659 MD_CPU_ARCHITECTURE_SPARC = 0x8001, /* Breakpad-defined value for SPARC */
660 MD_CPU_ARCHITECTURE_PPC64 = 0x8002, /* Breakpad-defined value for PPC64 */
661 MD_CPU_ARCHITECTURE_ARM64_OLD = 0x8003, /* Breakpad-defined value for ARM64 */
662 MD_CPU_ARCHITECTURE_MIPS64 = 0x8004, /* Breakpad-defined value for MIPS64 */
663 MD_CPU_ARCHITECTURE_UNKNOWN = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */
664} MDCPUArchitecture;
665
666/* For (MDRawSystemInfo).platform_id: */
667typedef enum {
668 MD_OS_WIN32S = 0, /* VER_PLATFORM_WIN32s (Windows 3.1) */
669 MD_OS_WIN32_WINDOWS = 1, /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */
670 MD_OS_WIN32_NT = 2, /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */
671 MD_OS_WIN32_CE = 3, /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH
672 * (Windows CE, Windows Mobile, "Handheld") */
673
674 /* The following values are Breakpad-defined. */
675 MD_OS_UNIX = 0x8000, /* Generic Unix-ish */
676 MD_OS_MAC_OS_X = 0x8101, /* Mac OS X/Darwin */
677 MD_OS_IOS = 0x8102, /* iOS */
678 MD_OS_LINUX = 0x8201, /* Linux */
679 MD_OS_SOLARIS = 0x8202, /* Solaris */
680 MD_OS_ANDROID = 0x8203, /* Android */
681 MD_OS_PS3 = 0x8204, /* PS3 */
682 MD_OS_NACL = 0x8205, /* Native Client (NaCl) */
683 MD_OS_FUCHSIA = 0x8206 /* Fuchsia */
684} MDOSPlatform;
685
686typedef struct {
687 uint64_t base_of_image;
688 uint32_t size_of_image;
689 uint32_t checksum;
690 uint32_t time_date_stamp;
691 MDRVA module_name_rva;
692} MDRawUnloadedModule;
693
694typedef struct {
695 uint32_t size_of_header;
696 uint32_t size_of_entry;
697 uint32_t number_of_entries;
698} MDRawUnloadedModuleList; /* MINIDUMP_UNLOADED_MODULE_LIST */
699
700typedef struct {
701 uint16_t year;
702 uint16_t month;
703 uint16_t day_of_week;
704 uint16_t day;
705 uint16_t hour;
706 uint16_t minute;
707 uint16_t second;
708 uint16_t milliseconds;
709} MDSystemTime; /* SYSTEMTIME */
710
711typedef struct {
712 /* Required field. The bias is the difference, in minutes, between
713 * Coordinated Universal Time (UTC) and local time.
714 * Formula: UTC = local time + bias */
715 int32_t bias;
716 /* A description for standard time. For example, "EST" could indicate Eastern
717 * Standard Time. In practice this contains the full time zone names. This
718 * string can be empty. */
719 uint16_t standard_name[32]; /* UTF-16-encoded, 0-terminated */
720 /* A MDSystemTime structure that contains a date and local time when the
721 * transition from daylight saving time to standard time occurs on this
722 * operating system. If the time zone does not support daylight saving time,
723 * the month member in the MDSystemTime structure is zero. */
724 MDSystemTime standard_date;
725 /* The bias value to be used during local time translations that occur during
726 * standard time. */
727 int32_t standard_bias;
728 /* A description for daylight saving time. For example, "PDT" could indicate
729 * Pacific Daylight Time. In practice this contains the full time zone names.
730 * This string can be empty. */
731 uint16_t daylight_name[32]; /* UTF-16-encoded, 0-terminated */
732 /* A MDSystemTime structure that contains a date and local time when the
733 * transition from standard time to daylight saving time occurs on this
734 * operating system. If the time zone does not support daylight saving time,
735 * the month member in the MDSystemTime structure is zero.*/
736 MDSystemTime daylight_date;
737 /* The bias value to be used during local time translations that occur during
738 * daylight saving time. */
739 int32_t daylight_bias;
740} MDTimeZoneInformation; /* TIME_ZONE_INFORMATION */
741
742/* MAX_PATH from windef.h */
743#define MD_MAX_PATH 260
744
745/* For MDXStateConfigFeatureMscInfo.features */
746typedef struct {
747 uint32_t offset;
748 uint32_t size;
749} MDXStateFeature;
750
751/* For MDXStateConfigFeatureMscInfo.enabled_features from winnt.h */
752typedef enum {
753 MD_XSTATE_LEGACY_FLOATING_POINT = 0, /* XSTATE_LEGACY_FLOATING_POINT */
754 MD_XSTATE_LEGACY_SSE = 1, /* XSTATE_LEGACY_SSE */
755 MD_XSTATE_GSSE = 2, /* XSTATE_GSSE */
756 MD_XSTATE_AVX = MD_XSTATE_GSSE, /* XSTATE_AVX */
757 MD_XSTATE_MPX_BNDREGS = 3, /* XSTATE_MPX_BNDREGS */
758 MD_XSTATE_MPX_BNDCSR = 4, /* XSTATE_MPX_BNDCSR */
759 MD_XSTATE_AVX512_KMASK = 5, /* XSTATE_AVX512_KMASK */
760 MD_XSTATE_AVX512_ZMM_H = 6, /* XSTATE_AVX512_ZMM_H */
761 MD_XSTATE_AVX512_ZMM = 7, /* XSTATE_AVX512_ZMM */
762 MD_XSTATE_IPT = 8, /* XSTATE_IPT */
763 MD_XSTATE_LWP = 62 /* XSTATE_LWP */
764} MDXStateFeatureFlag;
765
766/* MAXIMUM_XSTATE_FEATURES from winnt.h */
767#define MD_MAXIMUM_XSTATE_FEATURES 64
768
769/* For MDRawMiscInfo.xstate_data */
770typedef struct {
771 uint32_t size_of_info;
772 uint32_t context_size;
773 /* An entry in the features array is valid only if the corresponding bit in
774 * the enabled_features flag is set. */
775 uint64_t enabled_features;
776 MDXStateFeature features[MD_MAXIMUM_XSTATE_FEATURES];
777} MDXStateConfigFeatureMscInfo;
778
779
780/* The miscellaneous information stream contains a variety
781 * of small pieces of information. A member is valid if
782 * it's within the available size and its corresponding
783 * bit is set. */
784typedef struct {
785 uint32_t size_of_info; /* Length of entire MDRawMiscInfo structure. */
786 uint32_t flags1;
787
788 /* The next field is only valid if flags1 contains
789 * MD_MISCINFO_FLAGS1_PROCESS_ID. */
790 uint32_t process_id;
791
792 /* The next 3 fields are only valid if flags1 contains
793 * MD_MISCINFO_FLAGS1_PROCESS_TIMES. */
794 uint32_t process_create_time; /* time_t process started */
795 uint32_t process_user_time; /* seconds of user CPU time */
796 uint32_t process_kernel_time; /* seconds of kernel CPU time */
797
798 /* The following fields are not present in MINIDUMP_MISC_INFO but are
799 * in MINIDUMP_MISC_INFO_2. When this struct is populated, these values
800 * may not be set. Use flags1 and size_of_info to determine whether these
801 * values are present. These are only valid when flags1 contains
802 * MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO. */
803 uint32_t processor_max_mhz;
804 uint32_t processor_current_mhz;
805 uint32_t processor_mhz_limit;
806 uint32_t processor_max_idle_state;
807 uint32_t processor_current_idle_state;
808
809 /* The following fields are not present in MINIDUMP_MISC_INFO_2 but are
810 * in MINIDUMP_MISC_INFO_3. When this struct is populated, these values
811 * may not be set. Use flags1 and size_of_info to determine whether these
812 * values are present. */
813
814 /* The following field is only valid if flags1 contains
815 * MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY. */
816 uint32_t process_integrity_level;
817
818 /* The following field is only valid if flags1 contains
819 * MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS. */
820 uint32_t process_execute_flags;
821
822 /* The following field is only valid if flags1 contains
823 * MD_MISCINFO_FLAGS1_PROTECTED_PROCESS. */
824 uint32_t protected_process;
825
826 /* The following 2 fields are only valid if flags1 contains
827 * MD_MISCINFO_FLAGS1_TIMEZONE. */
828 uint32_t time_zone_id;
829 MDTimeZoneInformation time_zone;
830
831 /* The following fields are not present in MINIDUMP_MISC_INFO_3 but are
832 * in MINIDUMP_MISC_INFO_4. When this struct is populated, these values
833 * may not be set. Use flags1 and size_of_info to determine whether these
834 * values are present. */
835
836 /* The following 2 fields are only valid if flags1 contains
837 * MD_MISCINFO_FLAGS1_BUILDSTRING. */
838 uint16_t build_string[MD_MAX_PATH]; /* UTF-16-encoded, 0-terminated */
839 uint16_t dbg_bld_str[40]; /* UTF-16-encoded, 0-terminated */
840
841 /* The following fields are not present in MINIDUMP_MISC_INFO_4 but are
842 * in MINIDUMP_MISC_INFO_5. When this struct is populated, these values
843 * may not be set. Use flags1 and size_of_info to determine whether these
844 * values are present. */
845
846 /* The following field has its own flags for establishing the validity of
847 * the structure's contents.*/
848 MDXStateConfigFeatureMscInfo xstate_data;
849
850 /* The following field is only valid if flags1 contains
851 * MD_MISCINFO_FLAGS1_PROCESS_COOKIE. */
852 uint32_t process_cookie;
853} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2,
854 * MINIDUMP_MISC_INFO_3, MINIDUMP_MISC_INFO_4,
855 * MINIDUMP_MISC_INFO_5, MINIDUMP_MISC_INFO_N */
856
857static const size_t MD_MISCINFO_SIZE =
858 offsetof(MDRawMiscInfo, processor_max_mhz);
859static const size_t MD_MISCINFO2_SIZE =
860 offsetof(MDRawMiscInfo, process_integrity_level);
861static const size_t MD_MISCINFO3_SIZE =
862 offsetof(MDRawMiscInfo, build_string[0]);
863static const size_t MD_MISCINFO4_SIZE =
864 offsetof(MDRawMiscInfo, xstate_data);
865/* Version 5 of the MDRawMiscInfo structure is not a multiple of 8 in size and
866 * yet it contains some 8-bytes sized fields. This causes many compilers to
867 * round the structure size up to a multiple of 8 by adding padding at the end.
868 * The following hack is thus required for matching the proper on-disk size. */
869static const size_t MD_MISCINFO5_SIZE =
870 offsetof(MDRawMiscInfo, process_cookie) + sizeof(uint32_t);
871
872/* For (MDRawMiscInfo).flags1. These values indicate which fields in the
873 * MDRawMiscInfoStructure are valid. */
874typedef enum {
875 MD_MISCINFO_FLAGS1_PROCESS_ID = 0x00000001,
876 /* MINIDUMP_MISC1_PROCESS_ID */
877 MD_MISCINFO_FLAGS1_PROCESS_TIMES = 0x00000002,
878 /* MINIDUMP_MISC1_PROCESS_TIMES */
879 MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO = 0x00000004,
880 /* MINIDUMP_MISC1_PROCESSOR_POWER_INFO */
881 MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY = 0x00000010,
882 /* MINIDUMP_MISC3_PROCESS_INTEGRITY */
883 MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS = 0x00000020,
884 /* MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS */
885 MD_MISCINFO_FLAGS1_TIMEZONE = 0x00000040,
886 /* MINIDUMP_MISC3_TIMEZONE */
887 MD_MISCINFO_FLAGS1_PROTECTED_PROCESS = 0x00000080,
888 /* MINIDUMP_MISC3_PROTECTED_PROCESS */
889 MD_MISCINFO_FLAGS1_BUILDSTRING = 0x00000100,
890 /* MINIDUMP_MISC4_BUILDSTRING */
891 MD_MISCINFO_FLAGS1_PROCESS_COOKIE = 0x00000200,
892 /* MINIDUMP_MISC5_PROCESS_COOKIE */
893} MDMiscInfoFlags1;
894
895/*
896 * Around DbgHelp version 6.0, the style of new LIST structures changed
897 * from including an array of length 1 at the end of the struct to
898 * represent the variable-length data to including explicit
899 * "size of header", "size of entry" and "number of entries" fields
900 * in the header, presumably to allow backwards-compatibly-extending
901 * the structures in the future. The actual list entries follow the
902 * header data directly in this case.
903 */
904
905typedef struct {
906 uint32_t size_of_header; /* sizeof(MDRawMemoryInfoList) */
907 uint32_t size_of_entry; /* sizeof(MDRawMemoryInfo) */
908 uint64_t number_of_entries;
909} MDRawMemoryInfoList; /* MINIDUMP_MEMORY_INFO_LIST */
910
911typedef struct {
912 uint64_t base_address; /* Base address of a region of pages */
913 uint64_t allocation_base; /* Base address of a range of pages
914 * within this region. */
915 uint32_t allocation_protection; /* Memory protection when this region
916 * was originally allocated:
917 * MDMemoryProtection */
918 uint32_t __alignment1;
919 uint64_t region_size;
920 uint32_t state; /* MDMemoryState */
921 uint32_t protection; /* MDMemoryProtection */
922 uint32_t type; /* MDMemoryType */
923 uint32_t __alignment2;
924} MDRawMemoryInfo; /* MINIDUMP_MEMORY_INFO */
925
926/* For (MDRawMemoryInfo).state */
927typedef enum {
928 MD_MEMORY_STATE_COMMIT = 0x1000, /* physical storage has been allocated */
929 MD_MEMORY_STATE_RESERVE = 0x2000, /* reserved, but no physical storage */
930 MD_MEMORY_STATE_FREE = 0x10000 /* available to be allocated */
931} MDMemoryState;
932
933/* For (MDRawMemoryInfo).allocation_protection and .protection */
934typedef enum {
935 MD_MEMORY_PROTECT_NOACCESS = 0x01, /* PAGE_NOACCESS */
936 MD_MEMORY_PROTECT_READONLY = 0x02, /* PAGE_READONLY */
937 MD_MEMORY_PROTECT_READWRITE = 0x04, /* PAGE_READWRITE */
938 MD_MEMORY_PROTECT_WRITECOPY = 0x08, /* PAGE_WRITECOPY */
939 MD_MEMORY_PROTECT_EXECUTE = 0x10, /* PAGE_EXECUTE */
940 MD_MEMORY_PROTECT_EXECUTE_READ = 0x20, /* PAGE_EXECUTE_READ */
941 MD_MEMORY_PROTECT_EXECUTE_READWRITE = 0x40, /* PAGE_EXECUTE_READWRITE */
942 MD_MEMORY_PROTECT_EXECUTE_WRITECOPY = 0x80, /* PAGE_EXECUTE_WRITECOPY */
943 /* These options can be combined with the previous flags. */
944 MD_MEMORY_PROTECT_GUARD = 0x100, /* PAGE_GUARD */
945 MD_MEMORY_PROTECT_NOCACHE = 0x200, /* PAGE_NOCACHE */
946 MD_MEMORY_PROTECT_WRITECOMBINE = 0x400, /* PAGE_WRITECOMBINE */
947} MDMemoryProtection;
948
949/* Used to mask the mutually exclusive options from the combinable flags. */
950const uint32_t MD_MEMORY_PROTECTION_ACCESS_MASK = 0xFF;
951
952/* For (MDRawMemoryInfo).type */
953typedef enum {
954 MD_MEMORY_TYPE_PRIVATE = 0x20000, /* not shared by other processes */
955 MD_MEMORY_TYPE_MAPPED = 0x40000, /* mapped into the view of a section */
956 MD_MEMORY_TYPE_IMAGE = 0x1000000 /* mapped into the view of an image */
957} MDMemoryType;
958
959/*
960 * Breakpad extension types
961 */
962
963
964typedef struct {
965 /* validity is a bitmask with values from MDBreakpadInfoValidity, indicating
966 * which of the other fields in the structure are valid. */
967 uint32_t validity;
968
969 /* Thread ID of the handler thread. dump_thread_id should correspond to
970 * the thread_id of an MDRawThread in the minidump's MDRawThreadList if
971 * a dedicated thread in that list was used to produce the minidump. If
972 * the MDRawThreadList does not contain a dedicated thread used to produce
973 * the minidump, this field should be set to 0 and the validity field
974 * must not contain MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID. */
975 uint32_t dump_thread_id;
976
977 /* Thread ID of the thread that requested the minidump be produced. As
978 * with dump_thread_id, requesting_thread_id should correspond to the
979 * thread_id of an MDRawThread in the minidump's MDRawThreadList. For
980 * minidumps produced as a result of an exception, requesting_thread_id
981 * will be the same as the MDRawExceptionStream's thread_id field. For
982 * minidumps produced "manually" at the program's request,
983 * requesting_thread_id will indicate which thread caused the dump to be
984 * written. If the minidump was produced at the request of something
985 * other than a thread in the MDRawThreadList, this field should be set
986 * to 0 and the validity field must not contain
987 * MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID. */
988 uint32_t requesting_thread_id;
989} MDRawBreakpadInfo;
990
991/* For (MDRawBreakpadInfo).validity: */
992typedef enum {
993 /* When set, the dump_thread_id field is valid. */
994 MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID = 1 << 0,
995
996 /* When set, the requesting_thread_id field is valid. */
997 MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID = 1 << 1
998} MDBreakpadInfoValidity;
999
1000typedef struct {
1001 /* expression, function, and file are 0-terminated UTF-16 strings. They
1002 * may be truncated if necessary, but should always be 0-terminated when
1003 * written to a file.
1004 * Fixed-length strings are used because MiniDumpWriteDump doesn't offer
1005 * a way for user streams to point to arbitrary RVAs for strings. */
1006 uint16_t expression[128]; /* Assertion that failed... */
1007 uint16_t function[128]; /* ...within this function... */
1008 uint16_t file[128]; /* ...in this file... */
1009 uint32_t line; /* ...at this line. */
1010 uint32_t type;
1011} MDRawAssertionInfo;
1012
1013/* For (MDRawAssertionInfo).type: */
1014typedef enum {
1015 MD_ASSERTION_INFO_TYPE_UNKNOWN = 0,
1016
1017 /* Used for assertions that would be raised by the MSVC CRT but are
1018 * directed to an invalid parameter handler instead. */
1019 MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER,
1020
1021 /* Used for assertions that would be raised by the MSVC CRT but are
1022 * directed to a pure virtual call handler instead. */
1023 MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL
1024} MDAssertionInfoData;
1025
1026/* These structs are used to store the DSO debug data in Linux minidumps,
1027 * which is necessary for converting minidumps to usable coredumps.
1028 * Because of a historical accident, several fields are variably encoded
1029 * according to client word size, so tools potentially need to support both. */
1030
1031typedef struct {
1032 uint32_t addr;
1033 MDRVA name;
1034 uint32_t ld;
1035} MDRawLinkMap32;
1036
1037typedef struct {
1038 uint32_t version;
1039 MDRVA map; /* array of MDRawLinkMap32 */
1040 uint32_t dso_count;
1041 uint32_t brk;
1042 uint32_t ldbase;
1043 uint32_t dynamic;
1044} MDRawDebug32;
1045
1046typedef struct {
1047 uint64_t addr;
1048 MDRVA name;
1049 uint64_t ld;
1050} MDRawLinkMap64;
1051
1052typedef struct {
1053 uint32_t version;
1054 MDRVA map; /* array of MDRawLinkMap64 */
1055 uint32_t dso_count;
1056 uint64_t brk;
1057 uint64_t ldbase;
1058 uint64_t dynamic;
1059} MDRawDebug64;
1060
1061/* Crashpad extension types. See Crashpad's minidump/minidump_extensions.h. */
1062
1063typedef struct {
1064 MDRVA key;
1065 MDRVA value;
1066} MDRawSimpleStringDictionaryEntry;
1067
1068typedef struct {
1069 uint32_t count;
1070 MDRawSimpleStringDictionaryEntry entries[0];
1071} MDRawSimpleStringDictionary;
1072
1073typedef struct {
1074 uint32_t version;
1075 MDLocationDescriptor list_annotations;
1076 MDLocationDescriptor simple_annotations; /* MDRawSimpleStringDictionary */
1077} MDRawModuleCrashpadInfo;
1078
1079typedef struct {
1080 uint32_t minidump_module_list_index;
1081 MDLocationDescriptor location; /* MDRawModuleCrashpadInfo */
1082} MDRawModuleCrashpadInfoLink;
1083
1084typedef struct {
1085 uint32_t count;
1086 MDLocationDescriptor modules[0]; /* MDRawModuleCrashpadInfoLink */
1087} MDRawModuleCrashpadInfoList;
1088
1089typedef struct {
1090 uint32_t version;
1091 MDGUID report_id;
1092 MDGUID client_id;
1093 MDLocationDescriptor simple_annotations; /* MDRawSimpleStringDictionary */
1094 MDLocationDescriptor module_list; /* MDRawModuleCrashpadInfoList */
1095} MDRawCrashpadInfo;
1096
1097#if defined(_MSC_VER)
1098#pragma warning(pop)
1099#endif /* _MSC_VER */
1100
1101
1102#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ */
1103