minidump_common/errors/
macos.rs

1#![allow(non_camel_case_types)]
2#![allow(non_upper_case_globals)]
3
4use num_derive::FromPrimitive;
5
6/// Values for
7/// [`MINIDUMP_EXCEPTION::exception_code`](crate::format::MINIDUMP_EXCEPTION::exception_code)
8/// for crashes on macOS.
9///
10/// Based on Darwin/macOS' [osfmk/mach/exception_types.h][header]. This is what macOS calls an "exception",
11/// not a "code".
12///
13/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/exception_types.h#L64-L105
14#[repr(u32)]
15#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
16pub enum ExceptionCodeMac {
17    /// code can be a kern_return_t
18    EXC_BAD_ACCESS = 1,
19    /// code is CPU-specific
20    EXC_BAD_INSTRUCTION = 2,
21    /// code is CPU-specific
22    EXC_ARITHMETIC = 3,
23    /// code is CPU-specific
24    EXC_EMULATION = 4,
25    EXC_SOFTWARE = 5,
26    /// code is CPU-specific
27    EXC_BREAKPOINT = 6,
28    EXC_SYSCALL = 7,
29    EXC_MACH_SYSCALL = 8,
30    EXC_RPC_ALERT = 9,
31    EXC_RESOURCE = 11,
32    EXC_GUARD = 12,
33    /// Fake exception code used by Crashpad's SimulateCrash ('CPsx')
34    SIMULATED = 0x43507378,
35}
36
37/// Mac/iOS Kernel Bad Access Exceptions
38///
39/// These are the relevant kern_return_t values from [osfmk/mach/kern_return.h][header]
40///
41/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/kern_return.h#L70-L340
42#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
43pub enum ExceptionCodeMacBadAccessKernType {
44    KERN_INVALID_ADDRESS = 1,
45    KERN_PROTECTION_FAILURE = 2,
46    KERN_FAILURE = 5,
47    KERN_NO_ACCESS = 8,
48    KERN_MEMORY_FAILURE = 9,
49    KERN_MEMORY_ERROR = 10,
50    KERN_CODESIGN_ERROR = 50,
51}
52
53/// Mac/iOS ARM Userland Bad Accesses Exceptions
54///
55/// See the [osfmk/mach/arm/exception.h][header] header in Apple's kernel sources
56///
57/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/arm/exception.h#L66-L75
58#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
59pub enum ExceptionCodeMacBadAccessArmType {
60    EXC_ARM_DA_ALIGN = 0x0101,
61    EXC_ARM_DA_DEBUG = 0x0102,
62    EXC_ARM_SP_ALIGN = 0x0103,
63    EXC_ARM_SWP = 0x0104,
64    EXC_ARM_PAC_FAIL = 0x0105,
65}
66
67/// Mac/iOS PowerPC Userland Bad Access Exceptions
68///
69/// See the [osfmk/mach/ppc/exception.h][header] header in Apple's kernel sources
70///
71/// [header]: https://github.com/apple/darwin-xnu/blob/b472f0612b8556cd1c6eb1c285ec1953de759e35/osfmk/mach/ppc/exception.h#L71-L78
72#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
73pub enum ExceptionCodeMacBadAccessPpcType {
74    EXC_PPC_VM_PROT_READ = 0x0101,
75    EXC_PPC_BADSPACE = 0x0102,
76    EXC_PPC_UNALIGNED = 0x0103,
77}
78
79/// Mac/iOS x86 Userland Bad Access Exceptions
80///
81/// See the [osfmk/mach/i386/exception.h][header] header in Apple's kernel sources
82///
83/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/i386/exception.h#L122
84#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
85pub enum ExceptionCodeMacBadAccessX86Type {
86    EXC_I386_GPFLT = 13,
87}
88
89/// Mac/iOS ARM Bad Instruction Exceptions
90///
91/// See the [osfmk/mach/arm/exception.h][header] header in Apple's kernel sources
92///
93/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/arm/exception.h#L48-L52
94#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
95pub enum ExceptionCodeMacBadInstructionArmType {
96    EXC_ARM_UNDEFINED = 1,
97}
98
99/// Mac/iOS PowerPC Bad Instruction Exceptions
100///
101/// See the [osfmk/mach/ppc/exception.h][header] header in Apple's kernel sources
102///
103/// [header]: https://github.com/apple/darwin-xnu/blob/b472f0612b8556cd1c6eb1c285ec1953de759e35/osfmk/mach/ppc/exception.h#L60-L69
104#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
105pub enum ExceptionCodeMacBadInstructionPpcType {
106    EXC_PPC_INVALID_SYSCALL = 1,
107    EXC_PPC_UNIPL_INST = 2,
108    EXC_PPC_PRIVINST = 3,
109    EXC_PPC_PRIVREG = 4,
110    EXC_PPC_TRACE = 5,
111    EXC_PPC_PERFMON = 6,
112}
113
114/// Mac/iOS x86 Bad Instruction Exceptions
115///
116/// See the [osfmk/mach/i386/exception.h][header] header in Apple's kernel sources
117///
118/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/i386/exception.h#L74-L78
119#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
120pub enum ExceptionCodeMacBadInstructionX86Type {
121    /// Invalid Operation
122    EXC_I386_INVOP = 1,
123
124    // The rest of these are raw x86 interrupt codes.
125    /// Invalid Task State Segment
126    EXC_I386_INVTSSFLT = 10,
127    /// Segment Not Present
128    EXC_I386_SEGNPFLT = 11,
129    /// Stack Fault
130    EXC_I386_STKFLT = 12,
131    /// General Protection Fault
132    EXC_I386_GPFLT = 13,
133    /// Alignment Fault
134    EXC_I386_ALIGNFLT = 17,
135    // For sake of completeness, here's the interrupt codes that won't show up here (and why):
136
137    // EXC_I386_DIVERR    =  0: mapped to EXC_ARITHMETIC/EXC_I386_DIV
138    // EXC_I386_SGLSTP    =  1: mapped to EXC_BREAKPOINT/EXC_I386_SGL
139    // EXC_I386_NMIFLT    =  2: should not occur in user space
140    // EXC_I386_BPTFLT    =  3: mapped to EXC_BREAKPOINT/EXC_I386_BPT
141    // EXC_I386_INTOFLT   =  4: mapped to EXC_ARITHMETIC/EXC_I386_INTO
142    // EXC_I386_BOUNDFLT  =  5: mapped to EXC_ARITHMETIC/EXC_I386_BOUND
143    // EXC_I386_INVOPFLT  =  6: mapped to EXC_BAD_INSTRUCTION/EXC_I386_INVOP
144    // EXC_I386_NOEXTFLT  =  7: should be handled by the kernel
145    // EXC_I386_DBLFLT    =  8: should be handled (if possible) by the kernel
146    // EXC_I386_EXTOVRFLT =  9: mapped to EXC_BAD_ACCESS/(PROT_READ|PROT_EXEC)
147    // EXC_I386_PGFLT     = 14: should not occur in user space
148    // EXC_I386_EXTERRFLT = 16: mapped to EXC_ARITHMETIC/EXC_I386_EXTERR
149    // EXC_I386_ENOEXTFLT = 32: should be handled by the kernel
150    // EXC_I386_ENDPERR   = 33: should not occur
151}
152
153/// Mac/iOS ARM Arithmetic Exceptions
154///
155/// See the [osfmk/mach/arm/exception.h][header] header in Apple's kernel sources
156///
157/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/arm/exception.h#L54-L64
158#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
159pub enum ExceptionCodeMacArithmeticArmType {
160    EXC_ARM_FP_IO = 1,
161    EXC_ARM_FP_DZ = 2,
162    EXC_ARM_FP_OF = 3,
163    EXC_ARM_FP_UF = 4,
164    EXC_ARM_FP_IX = 5,
165    EXC_ARM_FP_ID = 6,
166}
167
168/// Mac/iOS PowerPC Arithmetic Exceptions
169///
170/// See the [osfmk/mach/ppc/exception.h][header] header in Apple's kernel sources
171///
172/// [header]: https://github.com/apple/darwin-xnu/blob/b472f0612b8556cd1c6eb1c285ec1953de759e35/osfmk/mach/ppc/exception.h#L80-L90
173#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
174pub enum ExceptionCodeMacArithmeticPpcType {
175    /// Integer ovrflow
176    EXC_PPC_OVERFLOW = 1,
177    /// Integer Divide-By-Zero
178    EXC_PPC_ZERO_DIVIDE = 2,
179    /// Float Inexact
180    EXC_FLT_INEXACT = 3,
181    /// Float Divide-By-Zero
182    EXC_PPC_FLT_ZERO_DIVIDE = 4,
183    /// Float Underflow
184    EXC_PPC_FLT_UNDERFLOW = 5,
185    /// Float Overflow
186    EXC_PPC_FLT_OVERFLOW = 6,
187    /// Float Not A Number
188    EXC_PPC_FLT_NOT_A_NUMBER = 7,
189
190    // NOTE: comments in breakpad suggest these two are actually supposed to be
191    // for ExceptionCodeMac::EXC_EMULATION, but for now let's duplicate breakpad.
192    EXC_PPC_NOEMULATION = 8,
193    EXC_PPC_ALTIVECASSIST = 9,
194}
195
196/// Mac/iOS x86 Arithmetic Exceptions
197///
198/// See the [osfmk/mach/i386/exception.h][header] header in Apple's kernel sources
199///
200/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/i386/exception.h#L80-L91
201#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
202pub enum ExceptionCodeMacArithmeticX86Type {
203    EXC_I386_DIV = 1,
204    EXC_I386_INTO = 2,
205    EXC_I386_NOEXT = 3,
206    EXC_I386_EXTOVR = 4,
207    EXC_I386_EXTERR = 5,
208    EXC_I386_EMERR = 6,
209    EXC_I386_BOUND = 7,
210    EXC_I386_SSEEXTERR = 8,
211}
212
213/// Mac/iOS "Software" Exceptions
214///
215/// See the [bsd/sys/ux_exception.h][header1] and [osfmk/mach/ppc/exception.h][header2]
216/// headers in Apple's kernel sources
217///
218/// [header1]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/sys/ux_exception.h#L48-L52
219/// [header2]: https://github.com/apple/darwin-xnu/blob/b472f0612b8556cd1c6eb1c285ec1953de759e35/osfmk/mach/ppc/exception.h#L100-L105
220#[repr(u32)]
221#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
222pub enum ExceptionCodeMacSoftwareType {
223    SIGABRT = 0x00010002u32,
224    UNCAUGHT_NS_EXCEPTION = 0xDEADC0DE,
225    EXC_PPC_TRAP = 0x00000001,
226    EXC_PPC_MIGRATE = 0x00010100,
227    // Breakpad also defines these doesn't use them for Software crashes
228    // SIGSYS  = 0x00010000,
229    // SIGPIPE = 0x00010001,
230}
231
232/// Mac/iOS ARM Breakpoint Exceptions
233///
234/// See the [osfmk/mach/arm/exception.h][header] header in Apple's kernel sources
235///
236/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/arm/exception.h#L77-L81
237#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
238pub enum ExceptionCodeMacBreakpointArmType {
239    EXC_ARM_BREAKPOINT = 1,
240}
241
242/// Mac/iOS PowerPC Breakpoint Exceptions
243///
244/// See the [osfmk/mach/ppc/exception.h][header] header in Apple's kernel sources
245///
246/// [header]: https://github.com/apple/darwin-xnu/blob/b472f0612b8556cd1c6eb1c285ec1953de759e35/osfmk/mach/ppc/exception.h#L108-L112
247#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
248pub enum ExceptionCodeMacBreakpointPpcType {
249    EXC_PPC_BREAKPOINT = 1,
250}
251
252/// Mac/iOS x86 Breakpoint Exceptions
253///
254/// See the [osfmk/mach/i386/exception.h][header] header in Apple's kernel sources
255///
256/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/i386/exception.h#L102-L107
257#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
258pub enum ExceptionCodeMacBreakpointX86Type {
259    EXC_I386_SGL = 1,
260    EXC_I386_BPT = 2,
261}
262
263/// Mac/iOS Resource exception types
264///
265/// See the [osfmk/kern/exc_resource.h][header] header in Apple's kernel sources
266///
267/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/kern/exc_resource.h#L60-L65
268#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
269pub enum ExceptionCodeMacResourceType {
270    RESOURCE_TYPE_CPU = 1,
271    RESOURCE_TYPE_WAKEUPS = 2,
272    RESOURCE_TYPE_MEMORY = 3,
273    RESOURCE_TYPE_IO = 4,
274    RESOURCE_TYPE_THREADS = 5,
275}
276
277/// Mac/iOS CPU resource exception flavors
278///
279/// See the [osfmk/kern/exc_resource.h][header] header in Apple's kernel sources
280///
281/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/kern/exc_resource.h#L67-L69
282#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
283pub enum ExceptionCodeMacResourceCpuFlavor {
284    FLAVOR_CPU_MONITOR = 1,
285    FLAVOR_CPU_MONITOR_FATAL = 2,
286}
287
288/// Mac/iOS wakeups resource exception flavors
289///
290/// See the [osfmk/kern/exc_resource.h][header] header in Apple's kernel sources
291///
292/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/kern/exc_resource.h#L67-L69
293#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
294pub enum ExceptionCodeMacResourceWakeupsFlavor {
295    FLAVOR_WAKEUPS_MONITOR = 1,
296}
297
298/// Mac/iOS memory resource exception flavors
299///
300/// See the [osfmk/kern/exc_resource.h][header] header in Apple's kernel sources
301///
302/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/kern/exc_resource.h#L102-L103
303#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
304pub enum ExceptionCodeMacResourceMemoryFlavor {
305    FLAVOR_HIGH_WATERMARK = 1,
306}
307
308/// Mac/iOS I/O resource exception flavors
309///
310/// See the [osfmk/kern/exc_resource.h][header] header in Apple's kernel sources
311///
312/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/kern/exc_resource.h#L164-L166
313#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
314pub enum ExceptionCodeMacResourceIOFlavor {
315    FLAVOR_IO_PHYSICAL_WRITES = 1,
316    FLAVOR_IO_LOGICAL_WRITES = 2,
317}
318
319/// Mac/iOS threads resource exception flavors
320///
321/// See the [osfmk/kern/exc_resource.h][header] header in Apple's kernel sources
322///
323/// [header]: https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/kern/exc_resource.h#L136-L137
324#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
325pub enum ExceptionCodeMacResourceThreadsFlavor {
326    FLAVOR_THREADS_HIGH_WATERMARK = 1,
327}
328
329/// Mac/iOS Guard exception types
330///
331/// See the [osfmk/kern/exc_guard.h][header] header in Apple's kernel sources
332///
333/// [header]: https://github.com/apple-oss-distributions/xnu/blob/main/osfmk/kern/exc_guard.h
334#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
335pub enum ExceptionCodeMacGuardType {
336    GUARD_TYPE_NONE = 0,
337    GUARD_TYPE_MACH_PORT = 1,
338    GUARD_TYPE_FD = 2,
339    GUARD_TYPE_USER = 3,
340    GUARD_TYPE_VN = 4,
341    GUARD_TYPE_VIRT_MEMORY = 5,
342    GUARD_TYPE_REJECTED_SC = 6,
343}
344
345/// Mac/iOS Mach port guard exception flavors
346///
347/// See the [osfmk/mach/port.h][header] header in Apple's kernel sources
348///
349/// [header]: https://github.com/apple-oss-distributions/xnu/blob/main/osfmk/mach/port.h
350#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
351pub enum ExceptionCodeMacGuardMachPortFlavor {
352    GUARD_EXC_DESTROY = 1,
353    GUARD_EXC_MOD_REFS = 2,
354    GUARD_EXC_INVALID_OPTIONS = 3,
355    GUARD_EXC_SET_CONTEXT = 4,
356    GUARD_EXC_THREAD_SET_STATE = 5,
357    GUARD_EXC_UNGUARDED = 0x00000008,
358    GUARD_EXC_INCORRECT_GUARD = 0x00000010,
359    GUARD_EXC_IMMOVABLE = 0x00000020,
360    GUARD_EXC_STRICT_REPLY = 0x00000040,
361    GUARD_EXC_MSG_FILTERED = 0x00000080,
362    GUARD_EXC_INVALID_RIGHT = 0x00000100,
363    GUARD_EXC_INVALID_NAME = 0x00000200,
364    GUARD_EXC_INVALID_VALUE = 0x00000400,
365    GUARD_EXC_INVALID_ARGUMENT = 0x00000800,
366    GUARD_EXC_RIGHT_EXISTS = 0x00001000,
367    GUARD_EXC_KERN_NO_SPACE = 0x00002000,
368    GUARD_EXC_KERN_FAILURE = 0x00004000,
369    GUARD_EXC_KERN_RESOURCE = 0x00008000,
370    GUARD_EXC_SEND_INVALID_REPLY = 0x00010000,
371    GUARD_EXC_SEND_INVALID_VOUCHER = 0x00020000,
372    GUARD_EXC_SEND_INVALID_RIGHT = 0x00040000,
373    GUARD_EXC_RCV_INVALID_NAME = 0x00080000,
374    GUARD_EXC_RCV_GUARDED_DESC = 0x00100000,
375    GUARD_EXC_MOD_REFS_NON_FATAL = 0x00200000,
376    GUARD_EXC_IMMOVABLE_NON_FATAL = 0x00400000,
377    GUARD_EXC_REQUIRE_REPLY_PORT_SEMANTICS = 0x00800000,
378    GUARD_EXC_EXCEPTION_BEHAVIOR_ENFORCE = 0x01000000,
379}
380
381/// Mac/iOS fd guard exception flavors
382///
383/// See the [bsd/sys/guarded.h][header] header in Apple's kernel sources
384///
385/// [header]: https://github.com/apple/darwin-xnu/blob/main/bsd/sys/guarded.h
386#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
387pub enum ExceptionCodeMacGuardFDFlavor {
388    GUARD_EXC_CLOSE = 0x00000001,
389    GUARD_EXC_DUP = 0x00000002,
390    GUARD_EXC_NOCLOEXEC = 0x00000004,
391    GUARD_EXC_SOCKET_IPC = 0x00000008,
392    GUARD_EXC_FILEPORT = 0x00000010,
393    GUARD_EXC_MISMATCH = 0x00000020,
394    GUARD_EXC_WRITE = 0x00000040,
395}
396
397/// Mac/iOS vnode guard exception flavors
398///
399/// See the [bsd/sys/guarded.h][header] header in Apple's kernel sources
400///
401/// [header]: https://github.com/apple/darwin-xnu/blob/main/bsd/sys/guarded.h
402#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
403pub enum ExceptionCodeMacGuardVNFlavor {
404    GUARD_EXC_RENAME_TO = 0x00000001,
405    GUARD_EXC_RENAME_FROM = 0x00000002,
406    GUARD_EXC_UNLINK = 0x00000004,
407    GUARD_EXC_WRITE_OTHER = 0x00000008,
408    GUARD_EXC_TRUNC_OTHER = 0x00000010,
409    GUARD_EXC_LINK = 0x00000020,
410    GUARD_EXC_EXCHDATA = 0x00000040,
411}
412
413/// Mac/iOS virtual memory guard exception flavors
414///
415/// See the [osfmk/mach/vm_statistics.h][header] header in Apple's kernel sources
416///
417/// [header]: https://github.com/apple/darwin-xnu/blob/main/osfmk/mach/vm_statistics.h
418#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
419pub enum ExceptionCodeMacGuardVirtMemoryFlavor {
420    GUARD_EXC_DEALLOC_GAP = 0x00000001,
421}
422
423/// Mac/iOS rejected syscall guard exception flavors
424///
425/// See the [osfmk/kern/exc_guard.h][header] header in Apple's kernel sources
426///
427/// [header]: https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/osfmk/kern/exc_guard.h#L149-L163
428#[derive(Copy, Clone, PartialEq, Eq, Debug, FromPrimitive)]
429pub enum ExceptionCodeMacGuardRejecteSysCallFlavor {
430    GUARD_EXC_MACH_TRAP = 0x00000000,
431}