27
#define SIGSEGV_MAJOR_VERSION 1
28
#define SIGSEGV_MINOR_VERSION 0
29
#define SIGSEGV_MICRO_VERSION 0
31
#define SIGSEGV_CHECK_VERSION(MAJOR, MINOR, MICRO) \
32
(SIGSEGV_MAJOR_VERSION > (MAJOR) || \
33
(SIGSEGV_MAJOR_VERSION == (MAJOR) && SIGSEGV_MINOR_VERSION > (MINOR)) || \
34
(SIGSEGV_MAJOR_VERSION == (MAJOR) && SIGSEGV_MINOR_VERSION == (MINOR) && SIGSEGV_MICRO_VERSION >= (MICRO)))
28
typedef char * sigsegv_address_t;
37
typedef char *sigsegv_address_t;
39
// SIGSEGV handler argument (forward declaration)
41
#if HAVE_MACH_EXCEPTIONS
42
#if defined(__APPLE__) && defined(__MACH__)
44
#include <mach/mach.h>
45
#include <mach/mach_error.h>
49
#if __DARWIN_UNIX03 && defined _STRUCT_PPC_THREAD_STATE
50
#define MACH_FIELD_NAME(X) __CONCAT(__,X)
52
#define SIGSEGV_EXCEPTION_STATE_TYPE ppc_exception_state_t
53
#define SIGSEGV_EXCEPTION_STATE_FLAVOR PPC_EXCEPTION_STATE
54
#define SIGSEGV_EXCEPTION_STATE_COUNT PPC_EXCEPTION_STATE_COUNT
55
#define SIGSEGV_FAULT_ADDRESS SIP->exc_state.MACH_FIELD_NAME(dar)
56
#define SIGSEGV_THREAD_STATE_TYPE ppc_thread_state_t
57
#define SIGSEGV_THREAD_STATE_FLAVOR PPC_THREAD_STATE
58
#define SIGSEGV_THREAD_STATE_COUNT PPC_THREAD_STATE_COUNT
59
#define SIGSEGV_FAULT_INSTRUCTION SIP->thr_state.MACH_FIELD_NAME(srr0)
60
#define SIGSEGV_SKIP_INSTRUCTION powerpc_skip_instruction
61
#define SIGSEGV_REGISTER_FILE (unsigned long *)&SIP->thr_state.MACH_FIELD_NAME(srr0), (unsigned long *)&SIP->thr_state.MACH_FIELD_NAME(r0)
64
#if __DARWIN_UNIX03 && defined _STRUCT_PPC_THREAD_STATE64
65
#define MACH_FIELD_NAME(X) __CONCAT(__,X)
67
#define SIGSEGV_EXCEPTION_STATE_TYPE ppc_exception_state64_t
68
#define SIGSEGV_EXCEPTION_STATE_FLAVOR PPC_EXCEPTION_STATE64
69
#define SIGSEGV_EXCEPTION_STATE_COUNT PPC_EXCEPTION_STATE64_COUNT
70
#define SIGSEGV_FAULT_ADDRESS SIP->exc_state.MACH_FIELD_NAME(dar)
71
#define SIGSEGV_THREAD_STATE_TYPE ppc_thread_state64_t
72
#define SIGSEGV_THREAD_STATE_FLAVOR PPC_THREAD_STATE64
73
#define SIGSEGV_THREAD_STATE_COUNT PPC_THREAD_STATE64_COUNT
74
#define SIGSEGV_FAULT_INSTRUCTION SIP->thr_state.MACH_FIELD_NAME(srr0)
75
#define SIGSEGV_SKIP_INSTRUCTION powerpc_skip_instruction
76
#define SIGSEGV_REGISTER_FILE (unsigned long *)&SIP->thr_state.MACH_FIELD_NAME(srr0), (unsigned long *)&SIP->thr_state.MACH_FIELD_NAME(r0)
79
#if __DARWIN_UNIX03 && defined _STRUCT_X86_THREAD_STATE32
80
#define MACH_FIELD_NAME(X) __CONCAT(__,X)
82
#define SIGSEGV_EXCEPTION_STATE_TYPE i386_exception_state_t
83
#define SIGSEGV_EXCEPTION_STATE_FLAVOR i386_EXCEPTION_STATE
84
#define SIGSEGV_EXCEPTION_STATE_COUNT i386_EXCEPTION_STATE_COUNT
85
#define SIGSEGV_FAULT_ADDRESS SIP->exc_state.MACH_FIELD_NAME(faultvaddr)
86
#define SIGSEGV_THREAD_STATE_TYPE i386_thread_state_t
87
#define SIGSEGV_THREAD_STATE_FLAVOR i386_THREAD_STATE
88
#define SIGSEGV_THREAD_STATE_COUNT i386_THREAD_STATE_COUNT
89
#define SIGSEGV_FAULT_INSTRUCTION SIP->thr_state.MACH_FIELD_NAME(eip)
90
#define SIGSEGV_SKIP_INSTRUCTION ix86_skip_instruction
91
#define SIGSEGV_REGISTER_FILE ((SIGSEGV_REGISTER_TYPE *)&SIP->thr_state.MACH_FIELD_NAME(eax)) /* EAX is the first GPR we consider */
94
#if __DARWIN_UNIX03 && defined _STRUCT_X86_THREAD_STATE64
95
#define MACH_FIELD_NAME(X) __CONCAT(__,X)
97
#define SIGSEGV_EXCEPTION_STATE_TYPE x86_exception_state64_t
98
#define SIGSEGV_EXCEPTION_STATE_FLAVOR x86_EXCEPTION_STATE64
99
#define SIGSEGV_EXCEPTION_STATE_COUNT x86_EXCEPTION_STATE64_COUNT
100
#define SIGSEGV_FAULT_ADDRESS SIP->exc_state.MACH_FIELD_NAME(faultvaddr)
101
#define SIGSEGV_THREAD_STATE_TYPE x86_thread_state64_t
102
#define SIGSEGV_THREAD_STATE_FLAVOR x86_THREAD_STATE64
103
#define SIGSEGV_THREAD_STATE_COUNT x86_THREAD_STATE64_COUNT
104
#define SIGSEGV_FAULT_INSTRUCTION SIP->thr_state.MACH_FIELD_NAME(rip)
105
#define SIGSEGV_SKIP_INSTRUCTION ix86_skip_instruction
106
#define SIGSEGV_REGISTER_FILE ((SIGSEGV_REGISTER_TYPE *)&SIP->thr_state.MACH_FIELD_NAME(rax)) /* RAX is the first GPR we consider */
109
#define SIGSEGV_FAULT_ADDRESS_FAST (((uint64_t)code[1])|0x100000000)
111
#define SIGSEGV_FAULT_ADDRESS_FAST code[1]
113
#define SIGSEGV_FAULT_INSTRUCTION_FAST SIGSEGV_INVALID_ADDRESS
114
#define SIGSEGV_FAULT_HANDLER_ARGLIST mach_port_t thread, mach_exception_data_t code
115
#define SIGSEGV_FAULT_HANDLER_ARGS thread, code
120
struct sigsegv_info_t {
121
sigsegv_address_t addr;
122
sigsegv_address_t pc;
123
#ifdef HAVE_MACH_EXCEPTIONS
126
SIGSEGV_EXCEPTION_STATE_TYPE exc_state;
127
mach_msg_type_number_t exc_state_count;
129
SIGSEGV_THREAD_STATE_TYPE thr_state;
130
mach_msg_type_number_t thr_state_count;
30
135
// SIGSEGV handler return state
31
136
enum sigsegv_return_t {
32
137
SIGSEGV_RETURN_SUCCESS,
33
138
SIGSEGV_RETURN_FAILURE,
34
SIGSEGV_RETURN_SKIP_INSTRUCTION,
139
SIGSEGV_RETURN_SKIP_INSTRUCTION
37
142
// Type of a SIGSEGV handler. Returns boolean expressing successful operation
38
typedef sigsegv_return_t (*sigsegv_fault_handler_t)(sigsegv_address_t fault_address, sigsegv_address_t instruction_address);
143
typedef sigsegv_return_t (*sigsegv_fault_handler_t)(sigsegv_info_t *sip);
40
145
// Type of a SIGSEGV state dump function
41
typedef void (*sigsegv_state_dumper_t)(sigsegv_address_t fault_address, sigsegv_address_t instruction_address);
146
typedef void (*sigsegv_state_dumper_t)(sigsegv_info_t *sip);
43
148
// Install a SIGSEGV handler. Returns boolean expressing success
44
149
extern bool sigsegv_install_handler(sigsegv_fault_handler_t handler);