]> gitweb.factorcode.org Git - factor.git/blob - vm/os-macosx-arm64.hpp
webapps.wiki: adding search bar
[factor.git] / vm / os-macosx-arm64.hpp
1 #include <sys/ucontext.h>
2
3 namespace factor {
4
5 // Fault handler information.  MacOSX version.
6 // Copyright (C) 1993-1999, 2002-2003  Bruno Haible <clisp.org at bruno>
7 // Copyright (C) 2003  Paolo Bonzini <gnu.org at bonzini>
8
9 // Used under BSD license with permission from Paolo Bonzini and Bruno Haible,
10 // 2005-03-10:
11
12 // http://sourceforge.net/mailarchive/message.php?msg_name=200503102200.32002.bruno%40clisp.org
13
14 // Modified for Factor by Slava Pestov and Daniel Ehrenberg
15 // Modified for arm64 by Doug Coleman
16
17 /*
18 #define MACH_EXC_STATE_TYPE x86_exception_state64_t
19 #define MACH_EXC_STATE_FLAVOR x86_EXCEPTION_STATE64
20 #define MACH_EXC_STATE_COUNT x86_EXCEPTION_STATE64_COUNT
21 */
22 #define MACH_EXC_INTEGER_DIV EXC_ARM_FP_DZ
23 /*
24 #define MACH_THREAD_STATE_TYPE x86_thread_state64_t
25 #define MACH_THREAD_STATE_FLAVOR x86_THREAD_STATE64
26 #define MACH_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT
27
28 #define MACH_FLOAT_STATE_TYPE x86_float_state64_t
29 #define MACH_FLOAT_STATE_FLAVOR x86_FLOAT_STATE64
30 #define MACH_FLOAT_STATE_COUNT x86_FLOAT_STATE64_COUNT
31
32 #if __DARWIN_UNIX03
33 #define MACH_EXC_STATE_FAULT(exc_state) (exc_state)->__faultvaddr
34 #define MACH_STACK_POINTER(thr_state) (thr_state)->__rsp
35 #define MACH_PROGRAM_COUNTER(thr_state) (thr_state)->__rip
36 #define UAP_SS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->__ss)
37 #define UAP_FS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->__fs)
38
39 #define MXCSR(float_state) (float_state)->__fpu_mxcsr
40 #define X87SW(float_state) (float_state)->__fpu_fsw
41 #else
42 #define MACH_EXC_STATE_FAULT(exc_state) (exc_state)->faultvaddr
43 #define MACH_STACK_POINTER(thr_state) (thr_state)->rsp
44 #define MACH_PROGRAM_COUNTER(thr_state) (thr_state)->rip
45 #define UAP_SS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->ss)
46 #define UAP_FS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->fs)
47
48 #define MXCSR(float_state) (float_state)->fpu_mxcsr
49 #define X87SW(float_state) (float_state)->fpu_fsw
50 #endif
51
52 #define UAP_PROGRAM_COUNTER(ucontext) MACH_PROGRAM_COUNTER(UAP_SS(ucontext))
53
54 inline static unsigned int mach_fpu_status(x86_float_state64_t* float_state) {
55   unsigned short x87sw;
56   memcpy(&x87sw, &X87SW(float_state), sizeof(x87sw));
57   return MXCSR(float_state) | x87sw;
58 }
59
60 inline static unsigned int uap_fpu_status(void* uap) {
61   return mach_fpu_status(UAP_FS(uap));
62 }
63
64 inline static void mach_clear_fpu_status(x86_float_state64_t* float_state) {
65   MXCSR(float_state) &= 0xffffffc0;
66   memset(&X87SW(float_state), 0, sizeof(X87SW(float_state)));
67 }
68
69 inline static void uap_clear_fpu_status(void* uap) {
70   mach_clear_fpu_status(UAP_FS(uap));
71 }
72
73 // Must match the stack-frame-size constant in
74 // basis/bootstrap/assembler/x86.64.unix.factor
75 static const unsigned JIT_FRAME_SIZE = 32;
76
77 */
78
79 #define MACH_EXC_STATE_TYPE _STRUCT_ARM_EXCEPTION_STATE64 // arm_exception_state64_t
80 #define MACH_EXC_STATE_FAULT(exc_state) (exc_state)->__far
81 #define MACH_EXC_STATE_COUNT ARM_EXCEPTION_STATE64_COUNT
82 #define MACH_EXC_STATE_FLAVOR ARM_EXCEPTION_STATE64
83
84 //#define MACH_EXC_INTEGER_DIV undefined on arm? https://opensource.apple.com/source/lldb/lldb-112/source/Plugins/Process/Utility/StopInfoMachException.cpp.auto.html
85
86 #define MACH_THREAD_STATE_TYPE _STRUCT_ARM_THREAD_STATE64
87 #define MACH_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT
88 #define MACH_THREAD_STATE_FLAVOR ARM_THREAD_STATE64
89
90 #define MACH_FLOAT_STATE_TYPE _STRUCT_ARM_NEON_STATE64
91 #define MACH_FLOAT_STATE_COUNT ARM_NEON_STATE64_COUNT
92 #define MACH_FLOAT_STATE_FLAVOR ARM_NEON_STATE64
93
94 #define MACH_STACK_POINTER(thr_state) (thr_state)->__sp
95
96
97 #define MACH_PROGRAM_COUNTER(thr_state) (thr_state)->__pc
98 #define UAP_PROGRAM_COUNTER(ucontext) MACH_PROGRAM_COUNTER(UAP_SS(ucontext))
99
100 #define UAP_SS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->__ss)
101 #define UAP_FS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->__ns)
102
103 // omg
104 inline static unsigned int mach_fpu_status(_STRUCT_ARM_NEON_STATE64* float_state) {
105   // unsigned short x87sw;
106   // memcpy(&x87sw, &X87SW(float_state), sizeof(x87sw));
107   // return MXCSR(float_state) | x87sw;
108   return float_state->__fpsr;
109 }
110
111 // omg
112 inline static unsigned int uap_fpu_status(void* uap) {
113   return mach_fpu_status(UAP_FS(uap));
114 }
115
116 // omg
117 inline static void uap_clear_fpu_status(void* uap) {
118   // mach_clear_fpu_status(UAP_FS(uap));
119 }
120
121
122 inline static void mach_clear_fpu_status(arm_neon_state64_t* float_state) {
123   // MXCSR(float_state) &= 0xffffffc0; // omg
124   // memset(&X87SW(float_state), 0, sizeof(X87SW(float_state))); // omg
125 }
126
127 // omg
128 inline static unsigned int fpu_status(unsigned int status) {
129   unsigned int r = 0;
130
131 /*
132   if (status & 0x01)
133     r |= FP_TRAP_INVALID_OPERATION;
134   if (status & 0x04)
135     r |= FP_TRAP_ZERO_DIVIDE;
136   if (status & 0x08)
137     r |= FP_TRAP_OVERFLOW;
138   if (status & 0x10)
139     r |= FP_TRAP_UNDERFLOW;
140   if (status & 0x20)
141     r |= FP_TRAP_INEXACT;
142 */
143   return r;
144 }
145
146
147 static const unsigned JIT_FRAME_SIZE = 32; // omg
148
149
150
151
152
153
154 }