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

Last change on this file since 14347 was 14169, checked in by gb, 10 years ago

Lots more changes, most of which have to do with Mach exception handling
on ARM.

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