| 
									
										
										
										
											2009-08-26 17:44:25 -04:00
										 |  |  | #include <sys/ucontext.h>
 | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | namespace factor { | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | /* Fault handler information.  MacOSX version.
 | 
					
						
							|  |  |  | Copyright (C) 1993-1999, 2002-2003  Bruno Haible <clisp.org at bruno> | 
					
						
							|  |  |  | Copyright (C) 2003  Paolo Bonzini <gnu.org at bonzini> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Used under BSD license with permission from Paolo Bonzini and Bruno Haible, | 
					
						
							|  |  |  | 2005-03-10: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | http://sourceforge.net/mailarchive/message.php?msg_name=200503102200.32002.bruno%40clisp.org
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Modified for Factor by Slava Pestov and Daniel Ehrenberg */ | 
					
						
							|  |  |  | #define MACH_EXC_STATE_TYPE x86_exception_state64_t
 | 
					
						
							|  |  |  | #define MACH_EXC_STATE_FLAVOR x86_EXCEPTION_STATE64
 | 
					
						
							|  |  |  | #define MACH_EXC_STATE_COUNT x86_EXCEPTION_STATE64_COUNT
 | 
					
						
							| 
									
										
										
										
											2009-09-14 00:37:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-06 09:44:25 -04:00
										 |  |  | #define MACH_EXC_INTEGER_DIV EXC_I386_DIV
 | 
					
						
							| 
									
										
										
										
											2009-09-14 00:37:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #define MACH_THREAD_STATE_TYPE x86_thread_state64_t
 | 
					
						
							|  |  |  | #define MACH_THREAD_STATE_FLAVOR x86_THREAD_STATE64
 | 
					
						
							|  |  |  | #define MACH_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-14 00:37:28 -04:00
										 |  |  | #define MACH_FLOAT_STATE_TYPE x86_float_state64_t
 | 
					
						
							|  |  |  | #define MACH_FLOAT_STATE_FLAVOR x86_FLOAT_STATE64
 | 
					
						
							|  |  |  | #define MACH_FLOAT_STATE_COUNT x86_FLOAT_STATE64_COUNT
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #if __DARWIN_UNIX03
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | #define MACH_EXC_STATE_FAULT(exc_state) (exc_state)->__faultvaddr
 | 
					
						
							|  |  |  | #define MACH_STACK_POINTER(thr_state) (thr_state)->__rsp
 | 
					
						
							|  |  |  | #define MACH_PROGRAM_COUNTER(thr_state) (thr_state)->__rip
 | 
					
						
							|  |  |  | #define UAP_SS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->__ss)
 | 
					
						
							|  |  |  | #define UAP_FS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->__fs)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MXCSR(float_state) (float_state)->__fpu_mxcsr
 | 
					
						
							|  |  |  | #define X87SW(float_state) (float_state)->__fpu_fsw
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | #define MACH_EXC_STATE_FAULT(exc_state) (exc_state)->faultvaddr
 | 
					
						
							|  |  |  | #define MACH_STACK_POINTER(thr_state) (thr_state)->rsp
 | 
					
						
							|  |  |  | #define MACH_PROGRAM_COUNTER(thr_state) (thr_state)->rip
 | 
					
						
							|  |  |  | #define UAP_SS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->ss)
 | 
					
						
							|  |  |  | #define UAP_FS(ucontext) &(((ucontext_t*)(ucontext))->uc_mcontext->fs)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MXCSR(float_state) (float_state)->fpu_mxcsr
 | 
					
						
							|  |  |  | #define X87SW(float_state) (float_state)->fpu_fsw
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | #define UAP_PROGRAM_COUNTER(ucontext) MACH_PROGRAM_COUNTER(UAP_SS(ucontext))
 | 
					
						
							| 
									
										
										
										
											2009-09-14 00:37:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | inline static unsigned int mach_fpu_status(x86_float_state64_t* float_state) { | 
					
						
							|  |  |  |   unsigned short x87sw; | 
					
						
							|  |  |  |   memcpy(&x87sw, &X87SW(float_state), sizeof(x87sw)); | 
					
						
							|  |  |  |   return MXCSR(float_state) | x87sw; | 
					
						
							| 
									
										
										
										
											2009-09-14 00:37:28 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | inline static unsigned int uap_fpu_status(void* uap) { | 
					
						
							|  |  |  |   return mach_fpu_status(UAP_FS(uap)); | 
					
						
							| 
									
										
										
										
											2009-09-14 00:37:28 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | inline static void mach_clear_fpu_status(x86_float_state64_t* float_state) { | 
					
						
							|  |  |  |   MXCSR(float_state) &= 0xffffffc0; | 
					
						
							|  |  |  |   memset(&X87SW(float_state), 0, sizeof(X87SW(float_state))); | 
					
						
							| 
									
										
										
										
											2009-09-14 00:37:28 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:24:31 -04:00
										 |  |  | inline static void uap_clear_fpu_status(void* uap) { | 
					
						
							|  |  |  |   mach_clear_fpu_status(UAP_FS(uap)); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-30 15:39:21 -05:00
										 |  |  | /* Must match the leaf-stack-frame-size, signal-handler-stack-frame-size,
 | 
					
						
							| 
									
										
										
										
											2015-05-17 04:11:48 -04:00
										 |  |  | and stack-frame-size constants in basis/bootstrap/assembler/x86.64.unix.factor */ | 
					
						
							| 
									
										
										
										
											2011-12-13 18:13:32 -05:00
										 |  |  | static const unsigned LEAF_FRAME_SIZE = 16; | 
					
						
							| 
									
										
										
										
											2011-12-13 22:31:59 -05:00
										 |  |  | static const unsigned SIGNAL_HANDLER_STACK_FRAME_SIZE = 160; | 
					
						
							| 
									
										
										
										
											2011-11-25 21:58:21 -05:00
										 |  |  | static const unsigned JIT_FRAME_SIZE = 32; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | } |