source: branches/arm/lisp-kernel/arm-exceptions.h @ 14066

Last change on this file since 14066 was 14066, checked in by gb, 9 years ago

Lots of changes to support stack-overflow detection on ARM Linux.
(Write protect the control stack, handle SIGSEGV on an alternate
signal stack ...) The sigaltstack mechanism doesn't work if the
specified signal stack is within the allocated control stack region
(we generally use the top few pages of the control stack on x86;
here, we map a few pages and need to remember to free them when the
thread dies.)
Also: need some recovery mechanism, so that after the thread unwinds
out of the "yellow zone" the yellow zone is re-protected.

File size: 5.1 KB
Line 
1/*
2   Copyright (C) 2010 Clozure Associates
3   This file is part of Clozure CL. 
4
5   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public
6   License , known as the LLGPL and distributed with Clozure CL as the
7   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,
8   which is distributed with Clozure CL as the file "LGPL".  Where these
9   conflict, the preamble takes precedence. 
10
11   Clozure CL is referenced in the preamble as the "LIBRARY."
12
13   The LLGPL is also available online at
14   http://opensource.franz.com/preamble.html
15*/
16#define UUO_MASK 0x0ff000f0
17
18#define IS_UUO(i) (((i) & UUO_MASK) == 0x07f000f0)
19/* If an instruction is a UUO its format is determined by the low 4 bits */
20#define UUO_FORMAT(i) ((i)&0xf)
21
22#define UUO_UNARY_field(uuo) (((uuo)>>12)&0xff)
23#define UUOA_field(uuo)      (((uuo)>>8) &0x0f)
24
25#define uuo_format_nullary          0 /* 12 bits of code */
26#define uuo_format_unary            1 /* 8 bits of info - NOT type info - 4-bit reg */
27#define uuo_format_error_lisptag    2 /* 2 bits of lisptag info, 4-bit reg */
28#define uuo_format_error_fulltag    3 /* 3 bits of fulltag info, 4 bit reg */
29
30#define uuo_format_error_xtype      4 /* 8 bits of extended type/subtag info, 4 bit reg */
31#define uuo_format_binary           7 /* 4 bits of code, r1, r0 */
32#define uuo_format_nullary_error    8 /* nullary, call out to lisp */
33#define uuo_format_unary_error      9 /* like unary, but call out to lisp */
34#define uuo_format_cerror_lisptag  10 /* continuable, lisptag, reg */
35#define uuo_format_cerror_fulltag  11 /* continuable, fulltag, reg */
36#define uuo_format_cerror_xtype    12 /* continuable, xtype, reg */ 
37#define uuo_format_kernel_service  13 /* 8 bits of info */     
38#define uuo_format_binary_error    15 /* binary format, call out to lisp */
39
40
41
42
43typedef u_int32_t opcode, *pc;
44
45Boolean
46handle_uuo(ExceptionInformation *, siginfo_t *, opcode);
47
48
49
50int
51callback_for_trap (LispObj, ExceptionInformation *, natural, natural, int*);
52
53natural
54register_codevector_contains_pc (natural, pc);
55
56int
57callback_to_lisp (LispObj, ExceptionInformation *, natural, natural, int*);
58
59OSStatus
60handle_trap(ExceptionInformation *, opcode, pc, siginfo_t *);
61
62
63/* */
64
65#define RN_field(i) (((i)>>16)&0xf)
66#define RD_field(i) (((i)>>12)&0xf)
67#define RM_field(i) ((i)&0xf)
68
69#define IS_SUB_RM_FROM_ALLOCPTR(i)   (((i)&0x0ffff000) == 0x004cc000)
70#define IS_SUB_FROM_ALLOCPTR(i)      (((i)&0x0ffff000) == 0x024cc000)
71#define IS_SUB_LO_FROM_ALLOCPTR(i)   (((i)&0x0fffff00) == 0x024cc000)
72#define IS_SUB_HI_FROM_ALLOCPTR(i)   (IS_SUB_FROM_ALLOCPTR(i) && \
73                                     !(IS_SUB_LOW_FROM_ALLOCPTR(i)))
74#define IS_LOAD_RD_FROM_ALLOCBASE(i) (((i)&0x0fff0fff) == \
75                                      ( 0x05930000 | offsetof(tcr,allocbase)))
76#define IS_COMPARE_ALLOCPTR_TO_RM(i) (((i)&0x0fffff0) == 0x0140c000)
77#define IS_ALLOC_TRAP(i) (((i)&0x0fffffff) == 0x07f000f0)
78#define IS_SET_ALLOCPTR_HEADER_RD(i) (((i)&0x0fff0fff) == \
79                                      (0x050c0000 | (- misc_header_offset)))
80/* The 1 here - and the 3 in the following definition - are based on
81   the tagged offsets of cars and cdrs.  Fix these definitions of that ever
82   changes ... */
83#define IS_SET_ALLOCPTR_CDR_RD(i)    (((i)&0x0fff0fff) == 0x050c0001)
84#define IS_SET_ALLOCPTR_CAR_RD(i)    (((i)&0x0fff0fff) == 0x058c0003)
85#define IS_SET_ALLOCPTR_RESULT_RD(i) (((i)&0x0fff0fff) == 0x01a0000c)
86#define IS_CLR_ALLOCPTR_TAG(i)       (((i)&0x0fffffff) == 0x03ccc007)
87
88
89#define IS_GC_TRAP(i)                (((i)&0x0fffffff) == 0x07f002f0)
90#define IS_DEBUG_TRAP(i)             (((i)&0x0fffffff) == 0x07f003f0)
91#define IS_DEFERRED_INTERRUPT(i)     (((i)&0x0fffffff) == 0x07f004f0)
92#define IS_DEFERRED_SUSPEND(i)       (((i)&0x0fffffff) == 0x07f005f0)
93
94
95OSStatus
96handle_error(ExceptionInformation *, unsigned, unsigned, int*);
97
98typedef char* vector_buf;
99
100void put_altivec_registers(vector_buf);
101void get_altivec_registers(vector_buf);
102
103
104int altivec_available;
105
106#ifdef DARWIN
107#include <mach/mach.h>
108#include <mach/mach_error.h>
109#include <mach/machine/thread_state.h>
110#include <mach/machine/thread_status.h>
111
112#endif
113
114
115
116#ifdef DARWIN
117#define SIGNAL_FOR_PROCESS_INTERRUPT SIGUSR1
118#endif
119#ifdef LINUX
120#define SIGNAL_FOR_PROCESS_INTERRUPT SIGPWR
121#endif
122
123
124
125Boolean
126extend_tcr_tlb(TCR *, ExceptionInformation *,  unsigned);
127
128void 
129pc_luser_xp(ExceptionInformation *, TCR *, signed_natural *);
130
131#define codevec_hdr_p(value) ((value) == 0)
132
133#ifdef __GNUC__
134static __inline__ natural
135ror(natural val, natural count) __attribute__((always_inline));
136
137static __inline__ natural
138ror(natural val,natural count)
139{
140  natural result;
141  __asm__ __volatile__("ror %[result],%[val],%[count]"
142                       :[result] "=r" (result)
143                       :[val] "r" (val),
144                        [count] "r" (count));
145  return result;
146}
147#else
148extern natural ror(natural, natural);
149#endif
150
151#ifdef DARWIN
152#undef USE_SIGALTSTACK
153#else
154#define USE_SIGALTSTACK 1
155#endif
156
157#ifdef USE_SIGALTSTACK
158void
159invoke_handler_on_main_stack(int, siginfo_t*, ExceptionInformation *, void *, void*);
160#endif
161
162#ifdef USE_SIGALTSTACK
163#define ALTSTACK(handler) altstack_ ## handler
164#else
165#define ALTSTACK(handler) handler
166#endif
Note: See TracBrowser for help on using the repository browser.