~ubuntu-branches/ubuntu/vivid/basilisk2/vivid

« back to all changes in this revision

Viewing changes to src/Unix/sigsegv.h

  • Committer: Package Import Robot
  • Author(s): Jonas Smedegaard, Jonas Smedegaard, Jérémy Lal, Giulio Paci
  • Date: 2012-05-19 02:08:30 UTC
  • mfrom: (1.1.4)
  • Revision ID: package-import@ubuntu.com-20120519020830-o59ui1wsfftg55m6
Tags: 0.9.20120331-1
* Upstream update

[ Jonas Smedegaard ]
* Drop local CDBS snippets: All included in main cdbs now.
* Use source format 3.0 (quilt), and stop including patchsys-quilt.mk.
  Stop build-depending on quilt, patchutils.
* Add full licensing header to debian/rules, and update copyright
  years.
* Add README.source (and drop outdated README.cdbs-tweaks).
* Refresh patches with shortening quilt options --no-index
  --no-timestamps -pab, and fix their path prefix.
* Rewrite copyright file using draft DEP-5 format.
* Update control file Vcs-* fields: Packaging moved to Git.
* Ease building with git-buildpackage:
  + Add gbp.conf, enabling pristine-tar and tag signing.
  + Git-ignore quilt .pc dir.
* Bump debhelper compat level to 7.
* Update Vcs-Browser field to use anonscm.debian.org.
* Add Giulio Paci and Jérémy Lal as uploaders, and permit Debian
  Maintainers to upload.

[ Jérémy Lal ]
* Drop patch 1002 to fix capitalized flag: corrected upstream.

[ Giulio Paci ]
* Restart package development.
  Closes: #662175.
* Add patches to fix compilation and documentation.
* Provide JIT flavor on supported architectures (i386 and amd64).
* Bump standards-version to 3.9.3.
* Update copyright file:
  + Adjust licenses now clarified/improved upstream.
* Update ChangeLog.cvs.
* Enable CDBS autogeneration of autotools files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
 *  Derived from Bruno Haible's work on his SIGSEGV library for clisp
5
5
 *  <http://clisp.sourceforge.net/>
6
6
 *
7
 
 *  Basilisk II (C) 1997-2005 Christian Bauer
 
7
 *  Basilisk II (C) 1997-2008 Christian Bauer
8
8
 *
9
9
 *  This program is free software; you can redistribute it and/or modify
10
10
 *  it under the terms of the GNU General Public License as published by
24
24
#ifndef SIGSEGV_H
25
25
#define SIGSEGV_H
26
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
 
27
36
// Address type
28
 
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
 
29
134
 
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
35
140
};
36
141
 
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);
39
144
 
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);
42
147
 
43
148
// Install a SIGSEGV handler. Returns boolean expressing success
44
149
extern bool sigsegv_install_handler(sigsegv_fault_handler_t handler);
49
154
// Set callback function when we cannot handle the fault
50
155
extern void sigsegv_set_dump_state(sigsegv_state_dumper_t handler);
51
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
 
52
164
// Define an address that is bound to be invalid for a program counter
53
 
const sigsegv_address_t SIGSEGV_INVALID_PC = (sigsegv_address_t)(-1);
 
165
const sigsegv_address_t SIGSEGV_INVALID_ADDRESS = (sigsegv_address_t)(-1UL);
54
166
 
55
167
#endif /* SIGSEGV_H */