Remove more disassembler bogosity
[sbcl.git] / src / runtime / x86-64-bsd-os.c
blobb3941182c7a624af95fc3eb516c4086b989abdf7
1 #include <signal.h>
2 #include "sbcl.h"
3 #include "runtime.h"
4 #include "thread.h"
5 #include "lispregs.h"
7 #if defined(LISP_FEATURE_FREEBSD)
8 #include <machine/fpu.h>
9 #endif
11 #if defined(LISP_FEATURE_OPENBSD)
12 #include <machine/fpu.h>
13 #endif
15 #if defined(LISP_FEATURE_DRAGONFLY)
16 #include <machine/npx.h>
17 #endif
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)
34 switch(offset) {
35 case reg_RAX:
36 return CONTEXT_ADDR_FROM_STEM(rax);
37 case reg_RCX:
38 return CONTEXT_ADDR_FROM_STEM(rcx);
39 case reg_RDX:
40 return CONTEXT_ADDR_FROM_STEM(rdx);
41 case reg_RBX:
42 return CONTEXT_ADDR_FROM_STEM(rbx);
43 case reg_RSP:
44 return CONTEXT_ADDR_FROM_STEM(rsp);
45 case reg_RBP:
46 return CONTEXT_ADDR_FROM_STEM(rbp);
47 case reg_RSI:
48 return CONTEXT_ADDR_FROM_STEM(rsi);
49 case reg_RDI:
50 return CONTEXT_ADDR_FROM_STEM(rdi);
51 case reg_R8:
52 return CONTEXT_ADDR_FROM_STEM(r8);
53 case reg_R9:
54 return CONTEXT_ADDR_FROM_STEM(r9);
55 case reg_R10:
56 return CONTEXT_ADDR_FROM_STEM(r10);
57 case reg_R11:
58 return CONTEXT_ADDR_FROM_STEM(r11);
59 case reg_R12:
60 return CONTEXT_ADDR_FROM_STEM(r12);
61 case reg_R13:
62 return CONTEXT_ADDR_FROM_STEM(r13);
63 case reg_R14:
64 return CONTEXT_ADDR_FROM_STEM(r14);
65 case reg_R15:
66 return CONTEXT_ADDR_FROM_STEM(r15);
67 default:
68 return 0;
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)
88 switch(offset) {
89 case reg_RAX:
90 return CONTEXT_ADDR_FROM_STEM(RAX);
91 case reg_RCX:
92 return CONTEXT_ADDR_FROM_STEM(RCX);
93 case reg_RDX:
94 return CONTEXT_ADDR_FROM_STEM(RDX);
95 case reg_RBX:
96 return CONTEXT_ADDR_FROM_STEM(RBX);
97 case reg_RSP:
98 return CONTEXT_ADDR_FROM_STEM(RSP);
99 case reg_RBP:
100 return CONTEXT_ADDR_FROM_STEM(RBP);
101 case reg_RSI:
102 return CONTEXT_ADDR_FROM_STEM(RSI);
103 case reg_RDI:
104 return CONTEXT_ADDR_FROM_STEM(RDI);
105 case reg_R8:
106 return CONTEXT_ADDR_FROM_STEM(R8);
107 case reg_R9:
108 return CONTEXT_ADDR_FROM_STEM(R9);
109 case reg_R10:
110 return CONTEXT_ADDR_FROM_STEM(R10);
111 case reg_R11:
112 return CONTEXT_ADDR_FROM_STEM(R11);
113 case reg_R12:
114 return CONTEXT_ADDR_FROM_STEM(R12);
115 case reg_R13:
116 return CONTEXT_ADDR_FROM_STEM(R13);
117 case reg_R14:
118 return CONTEXT_ADDR_FROM_STEM(R14);
119 case reg_R15:
120 return CONTEXT_ADDR_FROM_STEM(R15);
121 default:
122 return 0;
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);
138 #endif
140 void
141 os_flush_icache(os_vm_address_t address, os_vm_size_t length)
145 int arch_os_thread_init(struct thread *thread) {
146 stack_t sigstack;
147 #ifdef LISP_FEATURE_SB_THREAD
148 #ifdef LISP_FEATURE_GCC_TLS
149 current_thread = thread;
150 #else
151 pthread_setspecific(specials,thread);
152 #endif
153 #endif
155 #ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
156 mach_lisp_thread_init(thread);
157 #endif
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;
164 sigstack.ss_flags=0;
165 sigstack.ss_size = 32*SIGSTKSZ;
166 sigaltstack(&sigstack,0);
167 #endif
168 return 1; /* success */
171 int arch_os_thread_cleanup(struct thread *thread) {
172 return 1; /* success */
175 #if defined(LISP_FEATURE_DRAGONFLY)
176 void
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));
186 #endif
188 #if defined(LISP_FEATURE_FREEBSD)
189 void
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));
199 #endif
201 #if defined(LISP_FEATURE_OPENBSD)
202 void
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));
212 #endif