2 * sgen-archdep.h: Architecture dependent parts of SGen.
4 * Copyright 2001-2003 Ximian, Inc
5 * Copyright 2003-2010 Novell, Inc.
6 * Copyright (C) 2012 Xamarin Inc
8 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
10 #ifndef __MONO_SGENARCHDEP_H__
11 #define __MONO_SGENARCHDEP_H__
13 #include <mono/utils/mono-context.h>
16 * Define either USE_MONO_CTX, or
17 * ARCH_SIGCTX_SP/ARCH_SIGCTX_IP/ARCH_STORE_REGS/ARCH_COPY_SIGCTX_REGS.
18 * Define ARCH_NUM_REGS to be the number of general registers in MonoContext, or the
19 * number of registers stored by ARCH_STORE_REGS.
22 #if defined(MONO_CROSS_COMPILE)
24 #define REDZONE_SIZE 0
26 #define ARCH_NUM_REGS 0
27 #define ARCH_STORE_REGS(ptr)
28 #define ARCH_SIGCTX_SP(ctx) NULL
29 #define ARCH_SIGCTX_IP(ctx) NULL
30 #define ARCH_COPY_SIGCTX_REGS(a,ctx)
32 #elif defined(TARGET_X86)
34 #define REDZONE_SIZE 0
36 #define ARCH_NUM_REGS 8
38 #ifndef MONO_ARCH_HAS_MONO_CONTEXT
44 #elif defined(TARGET_AMD64)
46 #define REDZONE_SIZE 128
48 #define ARCH_NUM_REGS 16
51 #elif defined(TARGET_POWERPC)
53 #define REDZONE_SIZE 224
55 #define ARCH_NUM_REGS 32
58 /* MS_BLOCK_SIZE must be a multiple of the system pagesize, which for some
59 architectures is 64k. */
60 #if defined(TARGET_POWERPC) || defined(TARGET_POWERPC64)
61 #define ARCH_MIN_MS_BLOCK_SIZE (64*1024)
62 #define ARCH_MIN_MS_BLOCK_SIZE_SHIFT 16
65 #elif defined(TARGET_ARM)
67 #define REDZONE_SIZE 0
70 /* We dont store ip, sp */
71 #define ARCH_NUM_REGS 14
73 #elif defined(TARGET_ARM64)
76 #define REDZONE_SIZE 0
77 #elif defined(__APPLE__)
78 #define REDZONE_SIZE 128
80 #error "Not implemented."
83 #define ARCH_NUM_REGS 31
85 #elif defined(__mips__)
87 #define REDZONE_SIZE 0
90 #define ARCH_NUM_REGS 32
92 #elif defined(__s390x__)
94 #define REDZONE_SIZE 0
97 #define ARCH_NUM_REGS 16
99 #elif defined(__sparc__)
101 #define REDZONE_SIZE 0
103 /* Don't bother with %g0 (%r0), it's always hard-coded to zero */
104 #define ARCH_NUM_REGS 15
106 #define ARCH_STORE_REGS(ptr) \
107 __asm__ __volatile__( \
109 "st %%g2,[%0+0x08]\n\t" \
110 "st %%g3,[%0+0x10]\n\t" \
111 "st %%g4,[%0+0x18]\n\t" \
112 "st %%g5,[%0+0x20]\n\t" \
113 "st %%g6,[%0+0x28]\n\t" \
114 "st %%g7,[%0+0x30]\n\t" \
115 "st %%o0,[%0+0x38]\n\t" \
116 "st %%o1,[%0+0x40]\n\t" \
117 "st %%o2,[%0+0x48]\n\t" \
118 "st %%o3,[%0+0x50]\n\t" \
119 "st %%o4,[%0+0x58]\n\t" \
120 "st %%o5,[%0+0x60]\n\t" \
121 "st %%o6,[%0+0x68]\n\t" \
122 "st %%o7,[%0+0x70]\n\t" \
128 #define ARCH_STORE_REGS(ptr) \
129 __asm__ __volatile__( \
131 "st %%g2,[%0+0x04]\n\t" \
132 "st %%g3,[%0+0x08]\n\t" \
133 "st %%g4,[%0+0x0c]\n\t" \
134 "st %%g5,[%0+0x10]\n\t" \
135 "st %%g6,[%0+0x14]\n\t" \
136 "st %%g7,[%0+0x18]\n\t" \
137 "st %%o0,[%0+0x1c]\n\t" \
138 "st %%o1,[%0+0x20]\n\t" \
139 "st %%o2,[%0+0x24]\n\t" \
140 "st %%o3,[%0+0x28]\n\t" \
141 "st %%o4,[%0+0x2c]\n\t" \
142 "st %%o5,[%0+0x30]\n\t" \
143 "st %%o6,[%0+0x34]\n\t" \
144 "st %%o7,[%0+0x38]\n\t" \
152 #define REG_SP REG_O6
155 #define ARCH_SIGCTX_SP(ctx) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_SP])
156 #define ARCH_SIGCTX_IP(ctx) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_PC])
157 #define ARCH_COPY_SIGCTX_REGS(a,ctx) do { \
158 (a)[0] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G1]); \
159 (a)[1] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G2]); \
160 (a)[2] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G3]); \
161 (a)[3] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G4]); \
162 (a)[4] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G5]); \
163 (a)[5] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G6]); \
164 (a)[6] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G7]); \
165 (a)[7] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O0]); \
166 (a)[8] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O1]); \
167 (a)[9] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O2]); \
168 (a)[10] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O3]); \
169 (a)[11] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O4]); \
170 (a)[12] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O5]); \
171 (a)[13] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O6]); \
172 (a)[14] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O7]); \
177 #endif /* __MONO_SGENARCHDEP_H__ */