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

Last change on this file since 14347 was 14169, checked in by gb, 9 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.