ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Unix/sigsegv.h
Revision: 1.15
Committed: 2010-10-23T21:13:21Z (13 years, 7 months ago) by asvitkine
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.14: +4 -1 lines
Log Message:
Fix issue from my last change where it ended up not defining
SIGSEGV_FAULT_ADDRESS_FAST at all on PPC builds.

File Contents

# User Rev Content
1 gbeauche 1.1 /*
2     * sigsegv.h - SIGSEGV signals support
3     *
4     * Derived from Bruno Haible's work on his SIGSEGV library for clisp
5     * <http://clisp.sourceforge.net/>
6     *
7 gbeauche 1.11 * Basilisk II (C) 1997-2008 Christian Bauer
8 gbeauche 1.1 *
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
11     * the Free Software Foundation; either version 2 of the License, or
12     * (at your option) any later version.
13     *
14     * This program is distributed in the hope that it will be useful,
15     * but WITHOUT ANY WARRANTY; without even the implied warranty of
16     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17     * GNU General Public License for more details.
18     *
19     * You should have received a copy of the GNU General Public License
20     * along with this program; if not, write to the Free Software
21     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22     */
23    
24     #ifndef SIGSEGV_H
25     #define SIGSEGV_H
26    
27 gbeauche 1.10 #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 gbeauche 1.1 // Address type
37 gbeauche 1.10 typedef char *sigsegv_address_t;
38    
39     // SIGSEGV handler argument (forward declaration)
40 asvitkine 1.13
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 asvitkine 1.15 #endif
108     #ifdef __x86_64__
109 asvitkine 1.14 #define SIGSEGV_FAULT_ADDRESS_FAST (((uint64_t)code[1])|0x100000000)
110 asvitkine 1.15 #else
111     #define SIGSEGV_FAULT_ADDRESS_FAST code[1]
112 asvitkine 1.13 #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 gbeauche 1.1
135 gbeauche 1.6 // SIGSEGV handler return state
136     enum sigsegv_return_t {
137     SIGSEGV_RETURN_SUCCESS,
138     SIGSEGV_RETURN_FAILURE,
139 gbeauche 1.12 SIGSEGV_RETURN_SKIP_INSTRUCTION
140 gbeauche 1.6 };
141    
142 gbeauche 1.1 // Type of a SIGSEGV handler. Returns boolean expressing successful operation
143 gbeauche 1.10 typedef sigsegv_return_t (*sigsegv_fault_handler_t)(sigsegv_info_t *sip);
144 gbeauche 1.4
145     // Type of a SIGSEGV state dump function
146 gbeauche 1.10 typedef void (*sigsegv_state_dumper_t)(sigsegv_info_t *sip);
147 gbeauche 1.1
148     // Install a SIGSEGV handler. Returns boolean expressing success
149 gbeauche 1.4 extern bool sigsegv_install_handler(sigsegv_fault_handler_t handler);
150 gbeauche 1.1
151     // Remove the user SIGSEGV handler, revert to default behavior
152     extern void sigsegv_uninstall_handler(void);
153 gbeauche 1.3
154     // Set callback function when we cannot handle the fault
155 gbeauche 1.4 extern void sigsegv_set_dump_state(sigsegv_state_dumper_t handler);
156 gbeauche 1.3
157 gbeauche 1.10 // 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 gbeauche 1.1 // Define an address that is bound to be invalid for a program counter
165 gbeauche 1.10 const sigsegv_address_t SIGSEGV_INVALID_ADDRESS = (sigsegv_address_t)(-1UL);
166 gbeauche 1.1
167     #endif /* SIGSEGV_H */