1a0b07a82ec4e41ebd703858f541e294435c970a
[mono.git] / mono / metadata / sgen-archdep.h
1 #ifndef __MONO_SGENARCHDEP_H__
2 #define __MONO_SGENARCHDEP_H__
3
4 #include <mono/utils/mono-sigcontext.h>
5
6 #ifdef __i386__
7
8 #define REDZONE_SIZE    0
9
10 #define ARCH_NUM_REGS 7         /* we're never storing ESP */
11 #define ARCH_STORE_REGS(ptr)    \
12         __asm__ __volatile__(   \
13                 "mov %%ecx, 0x00(%0)\n" \
14                 "mov %%edx, 0x04(%0)\n" \
15                 "mov %%ebx, 0x08(%0)\n" \
16                 "mov %%edi, 0x0c(%0)\n" \
17                 "mov %%esi, 0x10(%0)\n" \
18                 "mov %%ebp, 0x14(%0)\n" \
19                 : "=&a" (ptr)   \
20                 : "0" (cur_thread_regs) \
21                 : "memory"      \
22         )
23 #define ARCH_SIGCTX_SP(ctx)     (UCONTEXT_REG_ESP ((ctx)))
24 #define ARCH_SIGCTX_IP(ctx)     (UCONTEXT_REG_EIP ((ctx)))
25 #define ARCH_COPY_SIGCTX_REGS(a,ctx) do {                       \
26         (a)[0] = (gpointer) UCONTEXT_REG_EAX ((ctx));           \
27         (a)[1] = (gpointer) UCONTEXT_REG_EBX ((ctx));           \
28         (a)[2] = (gpointer) UCONTEXT_REG_ECX ((ctx));           \
29         (a)[3] = (gpointer) UCONTEXT_REG_EDX ((ctx));           \
30         (a)[4] = (gpointer) UCONTEXT_REG_ESI ((ctx));           \
31         (a)[5] = (gpointer) UCONTEXT_REG_EDI ((ctx));           \
32         (a)[6] = (gpointer) UCONTEXT_REG_EBP ((ctx));           \
33         } while (0)
34
35 #elif defined(__x86_64__)
36
37 #define REDZONE_SIZE    128
38
39 #define ARCH_NUM_REGS 15        /* we're never storing RSP */
40 #define ARCH_STORE_REGS(ptr)    \
41         __asm__ __volatile__(   \
42                 "movq %%rcx, 0x00(%0)\n"        \
43                 "movq %%rdx, 0x08(%0)\n"        \
44                 "movq %%rbx, 0x10(%0)\n"        \
45                 "movq %%rdi, 0x18(%0)\n"        \
46                 "movq %%rsi, 0x20(%0)\n"        \
47                 "movq %%rbp, 0x28(%0)\n"        \
48                 "movq %%r8, 0x30(%0)\n" \
49                 "movq %%r9, 0x38(%0)\n" \
50                 "movq %%r10, 0x40(%0)\n"        \
51                 "movq %%r11, 0x48(%0)\n"        \
52                 "movq %%r12, 0x50(%0)\n"        \
53                 "movq %%r13, 0x58(%0)\n"        \
54                 "movq %%r14, 0x60(%0)\n"        \
55                 "movq %%r15, 0x68(%0)\n"        \
56                 : "=&a" (ptr)   \
57                 : "0" (cur_thread_regs) \
58                 : "memory"      \
59         )
60 #define ARCH_SIGCTX_SP(ctx)     ((*UCONTEXT_GREGS((ctx))) [REG_RSP])
61 #define ARCH_SIGCTX_IP(ctx)     ((*UCONTEXT_GREGS((ctx))) [REG_RIP])
62 #define ARCH_COPY_SIGCTX_REGS(a,ctx) do {               \
63         ((a)[0] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_RAX]);       \
64         ((a)[1] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_RBX]);       \
65         ((a)[2] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_RCX]);       \
66         ((a)[3] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_RDX]);       \
67         ((a)[4] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_RSI]);       \
68         ((a)[5] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_RDI]);       \
69         ((a)[6] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_RBP]);       \
70         ((a)[7] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_R8]);        \
71         ((a)[8] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_R9]);        \
72         ((a)[9] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_R10]);       \
73         ((a)[10] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_R11]);      \
74         ((a)[11] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_R12]);      \
75         ((a)[12] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_R13]);      \
76         ((a)[13] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_R14]);      \
77         ((a)[14] = (gpointer) (*UCONTEXT_GREGS((ctx))) [REG_R15]);      \
78         } while (0)
79
80 #elif defined(__ppc__)
81
82 #define REDZONE_SIZE    224
83
84 #define ARCH_NUM_REGS 32
85 #define ARCH_STORE_REGS(ptr)    \
86         __asm__ __volatile__(   \
87                 "stmw r0, 0(%0)\n"      \
88                 :                       \
89                 : "b" (ptr)             \
90         )
91 #define ARCH_SIGCTX_SP(ctx)     (UCONTEXT_REG_Rn((ctx), 1))
92 #define ARCH_SIGCTX_IP(ctx)     (UCONTEXT_REG_NIP((ctx)))
93 #define ARCH_COPY_SIGCTX_REGS(a,ctx) do {       \
94         int __i;        \
95         for (__i = 0; __i < 32; ++__i)  \
96                 ((a)[__i]) = UCONTEXT_REG_Rn((ctx), __i);       \
97         } while (0)
98
99 #endif
100
101 #endif /* __MONO_SGENARCHDEP_H__ */