1 #ifndef __MONO_SGENARCHDEP_H__
2 #define __MONO_SGENARCHDEP_H__
4 #include <mono/utils/mono-sigcontext.h>
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" \
20 : "0" (cur_thread_regs) \
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)); \
35 #elif defined(__x86_64__)
37 #define REDZONE_SIZE 128
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" \
57 : "0" (cur_thread_regs) \
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]); \
80 #elif defined(__ppc__)
82 #define REDZONE_SIZE 224
84 #define ARCH_NUM_REGS 32
85 #define ARCH_STORE_REGS(ptr) \
86 __asm__ __volatile__( \
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 { \
95 for (__i = 0; __i < 32; ++__i) \
96 ((a)[__i]) = UCONTEXT_REG_Rn((ctx), __i); \
101 #endif /* __MONO_SGENARCHDEP_H__ */