]> gitweb.factorcode.org Git - factor.git/blob - vm/os-linux-x86.32.hpp
io.streams.256color: faster by caching styles
[factor.git] / vm / os-linux-x86.32.hpp
1 #include <ucontext.h>
2
3 namespace factor {
4
5 // glibc lies about the contents of the fpstate the kernel provides, hiding the
6 // FXSR
7 // environment
8 struct _fpstate {
9   // Regular FPU environment
10   unsigned long cw;
11   unsigned long sw;
12   unsigned long tag;
13   unsigned long ipoff;
14   unsigned long cssel;
15   unsigned long dataoff;
16   unsigned long datasel;
17   struct _fpreg _st[8];
18   unsigned short status;
19   unsigned short magic; // 0xffff = regular FPU data only
20
21   // FXSR FPU environment
22   unsigned long _fxsr_env[6]; // FXSR FPU env is ignored
23   unsigned long mxcsr;
24   unsigned long reserved;
25   struct _fpxreg _fxsr_st[8]; // FXSR FPU reg data is ignored
26   struct _xmmreg _xmm[8];
27   unsigned long padding[56];
28 };
29
30 #define X86_FXSR_MAGIC 0x0000
31
32 inline static unsigned int uap_fpu_status(void* uap) {
33   ucontext_t* ucontext = (ucontext_t*)uap;
34   struct _fpstate* fpregs = (struct _fpstate*)ucontext->uc_mcontext.fpregs;
35   if (fpregs->magic == X86_FXSR_MAGIC)
36     return fpregs->sw | fpregs->mxcsr;
37   else
38     return fpregs->sw;
39 }
40
41 inline static void uap_clear_fpu_status(void* uap) {
42   ucontext_t* ucontext = (ucontext_t*)uap;
43   struct _fpstate* fpregs = (struct _fpstate*)ucontext->uc_mcontext.fpregs;
44   fpregs->sw = 0;
45   if (fpregs->magic == X86_FXSR_MAGIC)
46     fpregs->mxcsr &= 0xffffffc0;
47 }
48
49 #define UAP_STACK_POINTER(ucontext) \
50   (((ucontext_t*)ucontext)->uc_mcontext.gregs[7])
51 #define UAP_PROGRAM_COUNTER(ucontext) \
52   (((ucontext_t*)ucontext)->uc_mcontext.gregs[14])
53
54 #define CODE_TO_FUNCTION_POINTER(code) (void)0
55 #define CODE_TO_FUNCTION_POINTER_CALLBACK(vm, code) (void)0
56 #define FUNCTION_CODE_POINTER(ptr) ptr
57 #define FUNCTION_TOC_POINTER(ptr) ptr
58
59 }