7 #if defined(LISP_FEATURE_FREEBSD)
8 #include <machine/fpu.h>
11 #if defined(LISP_FEATURE_OPENBSD)
12 #include <machine/fpu.h>
15 #if defined(LISP_FEATURE_DRAGONFLY)
16 #include <machine/npx.h>
19 /* KLUDGE: There is strong family resemblance in the signal context
20 * stuff in FreeBSD and OpenBSD, but in detail they're different in
21 * almost every line of code. It would be nice to find some way to
22 * factor out the commonality better; failing that, it might be best
23 * just to split this generic-BSD code into one variant for each BSD.
25 * KLUDGE II: this split has begun with the addition of the Darwin BSD
26 * flavour, with the cross-architecture complications that this
27 * entails; unfortunately, currently the situation is worse, not
28 * better, than in the above paragraph. */
30 #if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DARWIN) || defined(LISP_FEATURE_OPENBSD) || defined(LISP_FEATURE_DRAGONFLY)
31 os_context_register_t
*
32 os_context_register_addr(os_context_t
*context
, int offset
)
36 return CONTEXT_ADDR_FROM_STEM(rax
);
38 return CONTEXT_ADDR_FROM_STEM(rcx
);
40 return CONTEXT_ADDR_FROM_STEM(rdx
);
42 return CONTEXT_ADDR_FROM_STEM(rbx
);
44 return CONTEXT_ADDR_FROM_STEM(rsp
);
46 return CONTEXT_ADDR_FROM_STEM(rbp
);
48 return CONTEXT_ADDR_FROM_STEM(rsi
);
50 return CONTEXT_ADDR_FROM_STEM(rdi
);
52 return CONTEXT_ADDR_FROM_STEM(r8
);
54 return CONTEXT_ADDR_FROM_STEM(r9
);
56 return CONTEXT_ADDR_FROM_STEM(r10
);
58 return CONTEXT_ADDR_FROM_STEM(r11
);
60 return CONTEXT_ADDR_FROM_STEM(r12
);
62 return CONTEXT_ADDR_FROM_STEM(r13
);
64 return CONTEXT_ADDR_FROM_STEM(r14
);
66 return CONTEXT_ADDR_FROM_STEM(r15
);
72 os_context_register_t
*
73 os_context_sp_addr(os_context_t
*context
)
75 return CONTEXT_ADDR_FROM_STEM(rsp
);
78 os_context_register_t
*
79 os_context_pc_addr(os_context_t
*context
)
81 return CONTEXT_ADDR_FROM_STEM(rip
);
84 #elif defined(LISP_FEATURE_NETBSD)
85 os_context_register_t
*
86 os_context_register_addr(os_context_t
*context
, int offset
)
90 return CONTEXT_ADDR_FROM_STEM(RAX
);
92 return CONTEXT_ADDR_FROM_STEM(RCX
);
94 return CONTEXT_ADDR_FROM_STEM(RDX
);
96 return CONTEXT_ADDR_FROM_STEM(RBX
);
98 return CONTEXT_ADDR_FROM_STEM(RSP
);
100 return CONTEXT_ADDR_FROM_STEM(RBP
);
102 return CONTEXT_ADDR_FROM_STEM(RSI
);
104 return CONTEXT_ADDR_FROM_STEM(RDI
);
106 return CONTEXT_ADDR_FROM_STEM(R8
);
108 return CONTEXT_ADDR_FROM_STEM(R9
);
110 return CONTEXT_ADDR_FROM_STEM(R10
);
112 return CONTEXT_ADDR_FROM_STEM(R11
);
114 return CONTEXT_ADDR_FROM_STEM(R12
);
116 return CONTEXT_ADDR_FROM_STEM(R13
);
118 return CONTEXT_ADDR_FROM_STEM(R14
);
120 return CONTEXT_ADDR_FROM_STEM(R15
);
126 os_context_register_t
*
127 os_context_sp_addr(os_context_t
*context
)
129 return CONTEXT_ADDR_FROM_STEM(RSP
);
132 os_context_register_t
*
133 os_context_pc_addr(os_context_t
*context
)
135 return CONTEXT_ADDR_FROM_STEM(RIP
);
141 os_flush_icache(os_vm_address_t address
, os_vm_size_t length
)
145 int arch_os_thread_init(struct thread
*thread
) {
147 #ifdef LISP_FEATURE_SB_THREAD
148 #ifdef LISP_FEATURE_GCC_TLS
149 current_thread
= thread
;
151 pthread_setspecific(specials
,thread
);
155 #ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
156 mach_lisp_thread_init(thread
);
159 #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
160 /* Signal handlers are run on the control stack, so if it is exhausted
161 * we had better use an alternate stack for whatever signal tells us
162 * we've exhausted it */
163 sigstack
.ss_sp
=((void *) thread
)+dynamic_values_bytes
;
165 sigstack
.ss_size
= 32*SIGSTKSZ
;
166 sigaltstack(&sigstack
,0);
168 return 1; /* success */
171 int arch_os_thread_cleanup(struct thread
*thread
) {
172 return 1; /* success */
175 #if defined(LISP_FEATURE_DRAGONFLY)
177 os_restore_fp_control(os_context_t
*context
)
179 struct envxmm
*ex
= (struct envxmm
*)(&context
->uc_mcontext
.mc_fpregs
);
180 /* reset exception flags and restore control flags on SSE2 FPU */
181 unsigned int temp
= (ex
->en_mxcsr
) & ~0x3F;
182 asm ("ldmxcsr %0" : : "m" (temp
));
183 /* same for x87 FPU. */
184 asm ("fldcw %0" : : "m" (ex
->en_cw
));
188 #if defined(LISP_FEATURE_FREEBSD)
190 os_restore_fp_control(os_context_t
*context
)
192 struct envxmm
*ex
= (struct envxmm
*)(&context
->uc_mcontext
.mc_fpstate
);
193 /* reset exception flags and restore control flags on SSE2 FPU */
194 unsigned int temp
= (ex
->en_mxcsr
) & ~0x3F;
195 asm ("ldmxcsr %0" : : "m" (temp
));
196 /* same for x87 FPU. */
197 asm ("fldcw %0" : : "m" (ex
->en_cw
));
201 #if defined(LISP_FEATURE_OPENBSD)
203 os_restore_fp_control(os_context_t
*context
)
205 if (context
->sc_fpstate
!= NULL
) {
206 u_int32_t mxcsr
= context
->sc_fpstate
->fx_mxcsr
& ~0x3F;
207 u_int16_t cw
= context
->sc_fpstate
->fx_fcw
;
208 asm ("ldmxcsr %0" : : "m" (mxcsr
));
209 asm ("fldcw %0" : : "m" (cw
));