source: trunk/source/lisp-kernel/arm-exceptions.h @ 15470

Last change on this file since 15470 was 15470, checked in by gb, 7 years ago

Try to minimize Mach dependencies on Darwin; in particular, use POSIX
signal handling to handle exceptions (as is done on other *nix platforms.)

Use sigaltstack() on Darwin; it still seems to have problems, but at least
doesn't (usually) try to force all threads to use the same alt stack. (That
just never gets old somehow ...)

Lots of stuff removed; lots of (mostly small, mostly obvious) changes to
support the above.

File size: 5.3 KB
RevLine 
[14119]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 */
[15158]31#define uuo_format_ternary2         5 /* r0,r1,r2 */
[14119]32#define uuo_format_binary           7 /* 4 bits of code, r1, r0 */
33#define uuo_format_nullary_error    8 /* nullary, call out to lisp */
34#define uuo_format_unary_error      9 /* like unary, but call out to lisp */
35#define uuo_format_cerror_lisptag  10 /* continuable, lisptag, reg */
36#define uuo_format_cerror_fulltag  11 /* continuable, fulltag, reg */
37#define uuo_format_cerror_xtype    12 /* continuable, xtype, reg */ 
38#define uuo_format_kernel_service  13 /* 8 bits of info */     
39#define uuo_format_ternary         14 /* slot-unbound only */
40#define uuo_format_binary_error    15 /* binary format, call out to lisp */
41
42
43
44
45typedef u_int32_t opcode, *pc;
46
47Boolean
48handle_uuo(ExceptionInformation *, siginfo_t *, opcode);
49
50
51
52int
53callback_for_trap (LispObj, ExceptionInformation *, natural, natural, int*);
54
55natural
56register_codevector_contains_pc (natural, pc);
57
58int
59callback_to_lisp (LispObj, ExceptionInformation *, natural, natural, int*);
60
61OSStatus
62handle_trap(ExceptionInformation *, opcode, pc, siginfo_t *);
63
64
65/* */
66
67#define RN_field(i) (((i)>>16)&0xf)
68#define RD_field(i) (((i)>>12)&0xf)
69#define RM_field(i) ((i)&0xf)
70
71#define IS_SUB_RM_FROM_ALLOCPTR(i)   (((i)&0x0ffff000) == 0x004cc000)
72#define IS_SUB_FROM_ALLOCPTR(i)      (((i)&0x0ffff000) == 0x024cc000)
73#define IS_SUB_LO_FROM_ALLOCPTR(i)   (((i)&0x0fffff00) == 0x024cc000)
74#define IS_SUB_HI_FROM_ALLOCPTR(i)   (IS_SUB_FROM_ALLOCPTR(i) && \
[14354]75                                     !(IS_SUB_LO_FROM_ALLOCPTR(i)))
[14119]76#define IS_LOAD_RD_FROM_ALLOCBASE(i) (((i)&0x0fff0fff) == \
[14354]77                                      ( 0x05930000 | offsetof(TCR,save_allocbase)))
78#define IS_COMPARE_ALLOCPTR_TO_RM(i) (((i)&0x0fff0ff0) == 0x015c0000)
[14119]79#define IS_ALLOC_TRAP(i) (((i)&0x0fffffff) == 0x07f000f0)
80#define IS_SET_ALLOCPTR_HEADER_RD(i) (((i)&0x0fff0fff) == \
81                                      (0x050c0000 | (- misc_header_offset)))
[14354]82/* The 5 here - and the 1 in the following definition - are based on
83   the tagged offsets of cars and cdrs.  Fix these definitions if that ever
[14119]84   changes ... */
[14354]85#define IS_SET_ALLOCPTR_CDR_RD(i)    (((i)&0x0fff0fff) == 0x050c0005)
86#define IS_SET_ALLOCPTR_CAR_RD(i)    (((i)&0x0fff0fff) == 0x050c0001)
[14119]87#define IS_SET_ALLOCPTR_RESULT_RD(i) (((i)&0x0fff0fff) == 0x01a0000c)
88#define IS_CLR_ALLOCPTR_TAG(i)       (((i)&0x0fffffff) == 0x03ccc007)
[14515]89#define IS_BRANCH_AROUND_ALLOC_TRAP(i) (((i)&0x0fffffff) == 0x0a000000)
[14119]90
91
92#define IS_GC_TRAP(i)                (((i)&0x0fffffff) == 0x07f002f0)
93#define IS_DEBUG_TRAP(i)             (((i)&0x0fffffff) == 0x07f003f0)
94#define IS_DEFERRED_INTERRUPT(i)     (((i)&0x0fffffff) == 0x07f004f0)
95#define IS_DEFERRED_SUSPEND(i)       (((i)&0x0fffffff) == 0x07f005f0)
96
[14169]97#define PSEUDO_SIGRETURN_UUO         (0xe7fffef1)
[14119]98
99OSStatus
100handle_error(ExceptionInformation *, unsigned, unsigned, int*);
101
102typedef char* vector_buf;
103
104void put_altivec_registers(vector_buf);
105void get_altivec_registers(vector_buf);
106
107
108int altivec_available;
109
110
111
112
113#ifdef DARWIN
114#define SIGNAL_FOR_PROCESS_INTERRUPT SIGUSR1
115#endif
116#ifdef LINUX
117#define SIGNAL_FOR_PROCESS_INTERRUPT SIGPWR
118#endif
119
120
121
122Boolean
123extend_tcr_tlb(TCR *, ExceptionInformation *,  unsigned);
124
125void 
126pc_luser_xp(ExceptionInformation *, TCR *, signed_natural *);
127
128#define codevec_hdr_p(value) ((value) == 0)
129
130#ifdef __GNUC__
131static __inline__ natural
132ror(natural val, natural count) __attribute__((always_inline));
133
134static __inline__ natural
135ror(natural val,natural count)
136{
137  natural result;
138  __asm__ __volatile__("ror %[result],%[val],%[count]"
139                       :[result] "=r" (result)
140                       :[val] "r" (val),
141                        [count] "r" (count));
142  return result;
143}
144#else
145extern natural ror(natural, natural);
146#endif
147
148#ifdef DARWIN
149#undef USE_SIGALTSTACK
150#else
151#define USE_SIGALTSTACK 1
152#endif
153
154#ifdef USE_SIGALTSTACK
155void
156invoke_handler_on_main_stack(int, siginfo_t*, ExceptionInformation *, void *, void*);
157#endif
158
159#ifdef USE_SIGALTSTACK
160#define ALTSTACK(handler) altstack_ ## handler
161#else
162#define ALTSTACK(handler) handler
163#endif
[14807]164
165void
166normalize_tcr(ExceptionInformation *,TCR *, Boolean);
Note: See TracBrowser for help on using the repository browser.