[sgen] Make PowerPC use MonoContext
[mono.git] / mono / sgen / sgen-archdep.h
1 /*
2  * sgen-archdep.h: Architecture dependent parts of SGen.
3  *
4  * Copyright 2001-2003 Ximian, Inc
5  * Copyright 2003-2010 Novell, Inc.
6  * Copyright (C) 2012 Xamarin Inc
7  *
8  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
9  */
10 #ifndef __MONO_SGENARCHDEP_H__
11 #define __MONO_SGENARCHDEP_H__
12
13 #include <mono/utils/mono-context.h>
14
15 /*
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.
20  */
21
22 #if defined(MONO_CROSS_COMPILE)
23
24 #define REDZONE_SIZE    0
25
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)
31
32 #elif defined(TARGET_X86)
33
34 #define REDZONE_SIZE    0
35
36 #define ARCH_NUM_REGS 8
37
38 #ifndef MONO_ARCH_HAS_MONO_CONTEXT
39 #error 0
40 #endif
41
42 #define USE_MONO_CTX
43
44 #elif defined(TARGET_AMD64)
45
46 #define REDZONE_SIZE    128
47
48 #define ARCH_NUM_REGS 16
49 #define USE_MONO_CTX
50
51 #elif defined(TARGET_POWERPC)
52
53 #define REDZONE_SIZE    224
54
55 #define ARCH_NUM_REGS 32
56 #define USE_MONO_CTX
57
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
63 #endif
64
65 #elif defined(TARGET_ARM)
66
67 #define REDZONE_SIZE    0
68 #define USE_MONO_CTX
69
70 /* We dont store ip, sp */
71 #define ARCH_NUM_REGS 14
72
73 #elif defined(TARGET_ARM64)
74
75 #ifdef __linux__
76 #define REDZONE_SIZE    0
77 #elif defined(__APPLE__)
78 #define REDZONE_SIZE    128
79 #else
80 #error "Not implemented."
81 #endif
82 #define USE_MONO_CTX
83 #define ARCH_NUM_REGS 31
84
85 #elif defined(__mips__)
86
87 #define REDZONE_SIZE    0
88
89 #define USE_MONO_CTX
90 #define ARCH_NUM_REGS 32
91
92 #elif defined(__s390x__)
93
94 #define REDZONE_SIZE    0
95
96 #define USE_MONO_CTX
97 #define ARCH_NUM_REGS 16        
98
99 #elif defined(__sparc__)
100
101 #define REDZONE_SIZE    0
102
103 /* Don't bother with %g0 (%r0), it's always hard-coded to zero */
104 #define ARCH_NUM_REGS 15        
105 #ifdef __sparcv9
106 #define ARCH_STORE_REGS(ptr)    \
107         __asm__ __volatile__(   \
108                 "st %%g1,[%0]\n\t"      \
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" \
123                 :                       \
124                 : "r" (ptr)             \
125                 : "memory"                      \
126         )
127 #else
128 #define ARCH_STORE_REGS(ptr)    \
129         __asm__ __volatile__(   \
130                 "st %%g1,[%0]\n\t"      \
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" \
145                 :                       \
146                 : "r" (ptr)             \
147                 : "memory"                      \
148         )
149 #endif
150
151 #ifndef REG_SP
152 #define REG_SP REG_O6
153 #endif
154
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]);       \
173         } while (0)
174
175 #endif
176
177 #endif /* __MONO_SGENARCHDEP_H__ */