]> gitweb.factorcode.org Git - factor.git/blob - vm/os-linux-x86.32.hpp
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / vm / os-linux-x86.32.hpp
1 #include <ucontext.h>
2
3 namespace factor
4 {
5
6 // glibc lies about the contents of the fpstate the kernel provides, hiding the 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 void *ucontext_stack_pointer(void *uap)
33 {
34         ucontext_t *ucontext = (ucontext_t *)uap;
35         return (void *)ucontext->uc_mcontext.gregs[7];
36 }
37
38 inline static unsigned int uap_fpu_status(void *uap)
39 {
40         ucontext_t *ucontext = (ucontext_t *)uap;
41         struct _fpstate *fpregs = (struct _fpstate *)uap->uc_mcontext.fpregs;
42         if (fpregs->magic == X86_FXSR_MAGIC)
43             return fpregs->sw | fpregs->mxcsr;
44         else
45             return fpregs->sw;
46 }
47
48 inline static void uap_clear_fpu_status(void *uap)
49 {
50         ucontext_t *ucontext = (ucontext_t *)uap;
51         struct _fpstate *fpregs = (struct _fpstate *)uap->uc_mcontext.fpregs;
52         fpregs->sw = 0;
53         if (fpregs->magic == X86_FXSR_MAGIC)
54             fpregs->mxcsr &= 0xffffffc0;
55 }
56
57 #define UAP_PROGRAM_COUNTER(ucontext) \
58         (((ucontext_t *)(ucontext))->uc_mcontext.gregs[14])
59
60 }