ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Unix/sigsegv.h
(Generate patch)

Comparing BasiliskII/src/Unix/sigsegv.h (file contents):
Revision 1.9 by gbeauche, 2006-07-19T21:31:10Z vs.
Revision 1.15 by asvitkine, 2010-10-23T21:13:21Z

# Line 4 | Line 4
4   *  Derived from Bruno Haible's work on his SIGSEGV library for clisp
5   *  <http://clisp.sourceforge.net/>
6   *
7 < *  Basilisk II (C) 1997-2005 Christian Bauer
7 > *  Basilisk II (C) 1997-2008 Christian Bauer
8   *
9   *  This program is free software; you can redistribute it and/or modify
10   *  it under the terms of the GNU General Public License as published by
# Line 24 | Line 24
24   #ifndef SIGSEGV_H
25   #define SIGSEGV_H
26  
27 + #define SIGSEGV_MAJOR_VERSION 1
28 + #define SIGSEGV_MINOR_VERSION 0
29 + #define SIGSEGV_MICRO_VERSION 0
30 +
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)))
35 +
36   // Address type
37 < typedef char * sigsegv_address_t;
37 > typedef char *sigsegv_address_t;
38 >
39 > // SIGSEGV handler argument (forward declaration)
40 >
41 > #if HAVE_MACH_EXCEPTIONS
42 > #if defined(__APPLE__) && defined(__MACH__)
43 > extern "C" {
44 > #include <mach/mach.h>
45 > #include <mach/mach_error.h>
46 > }
47 >
48 > #ifdef __ppc__
49 > #if __DARWIN_UNIX03 && defined _STRUCT_PPC_THREAD_STATE
50 > #define MACH_FIELD_NAME(X)                              __CONCAT(__,X)
51 > #endif
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)
62 > #endif
63 > #ifdef __ppc64__
64 > #if __DARWIN_UNIX03 && defined _STRUCT_PPC_THREAD_STATE64
65 > #define MACH_FIELD_NAME(X)                              __CONCAT(__,X)
66 > #endif
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)
77 > #endif
78 > #ifdef __i386__
79 > #if __DARWIN_UNIX03 && defined _STRUCT_X86_THREAD_STATE32
80 > #define MACH_FIELD_NAME(X)                              __CONCAT(__,X)
81 > #endif
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 */
92 > #endif
93 > #ifdef __x86_64__
94 > #if __DARWIN_UNIX03 && defined _STRUCT_X86_THREAD_STATE64
95 > #define MACH_FIELD_NAME(X)                              __CONCAT(__,X)
96 > #endif
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 */
107 > #endif
108 > #ifdef __x86_64__
109 > #define SIGSEGV_FAULT_ADDRESS_FAST              (((uint64_t)code[1])|0x100000000)
110 > #else
111 > #define SIGSEGV_FAULT_ADDRESS_FAST              code[1]
112 > #endif
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
116 >
117 > #endif
118 > #endif
119 >
120 > struct sigsegv_info_t {
121 >        sigsegv_address_t addr;
122 >        sigsegv_address_t pc;
123 > #ifdef HAVE_MACH_EXCEPTIONS
124 >        mach_port_t thread;
125 >        bool has_exc_state;
126 >        SIGSEGV_EXCEPTION_STATE_TYPE exc_state;
127 >        mach_msg_type_number_t exc_state_count;
128 >        bool has_thr_state;
129 >        SIGSEGV_THREAD_STATE_TYPE thr_state;
130 >        mach_msg_type_number_t thr_state_count;
131 > #endif
132 > };
133 >
134  
135   // SIGSEGV handler return state
136   enum sigsegv_return_t {
137    SIGSEGV_RETURN_SUCCESS,
138    SIGSEGV_RETURN_FAILURE,
139 <  SIGSEGV_RETURN_SKIP_INSTRUCTION,
139 >  SIGSEGV_RETURN_SKIP_INSTRUCTION
140   };
141  
142   // Type of a SIGSEGV handler. Returns boolean expressing successful operation
143 < 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);
144  
145   // Type of a SIGSEGV state dump function
146 < 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);
147  
148   // Install a SIGSEGV handler. Returns boolean expressing success
149   extern bool sigsegv_install_handler(sigsegv_fault_handler_t handler);
# Line 49 | Line 154 | extern void sigsegv_uninstall_handler(vo
154   // Set callback function when we cannot handle the fault
155   extern void sigsegv_set_dump_state(sigsegv_state_dumper_t handler);
156  
157 + // Return the address of the invalid memory reference
158 + extern sigsegv_address_t sigsegv_get_fault_address(sigsegv_info_t *sip);
159 +
160 + // Return the address of the instruction that caused the fault, or
161 + // SIGSEGV_INVALID_ADDRESS if we could not retrieve this information
162 + extern sigsegv_address_t sigsegv_get_fault_instruction_address(sigsegv_info_t *sip);
163 +
164   // Define an address that is bound to be invalid for a program counter
165 < const sigsegv_address_t SIGSEGV_INVALID_PC = (sigsegv_address_t)(-1);
165 > const sigsegv_address_t SIGSEGV_INVALID_ADDRESS = (sigsegv_address_t)(-1UL);
166  
167   #endif /* SIGSEGV_H */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines