First set of licensing changes
[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 #ifdef __APPLE__
57 #define ARCH_STORE_REGS(ptr)    \
58         __asm__ __volatile__(   \
59                 "stmw r0, 0(%0)\n"      \
60                 :                       \
61                 : "b" (ptr)             \
62         )
63 #else
64 #define ARCH_STORE_REGS(ptr)    \
65         __asm__ __volatile__(   \
66                 "stmw 0, 0(%0)\n"       \
67                 :                       \
68                 : "b" (ptr)             \
69         )
70 #endif
71 #define ARCH_SIGCTX_SP(ctx)     (UCONTEXT_REG_Rn((ctx), 1))
72 #define ARCH_SIGCTX_IP(ctx)     (UCONTEXT_REG_NIP((ctx)))
73 #define ARCH_COPY_SIGCTX_REGS(a,ctx) do {       \
74         int __i;        \
75         for (__i = 0; __i < 32; ++__i)  \
76                 ((a)[__i]) = (gpointer) UCONTEXT_REG_Rn((ctx), __i);    \
77         } while (0)
78
79 /* MS_BLOCK_SIZE must be a multiple of the system pagesize, which for some
80    architectures is 64k.  */
81 #if defined(TARGET_POWERPC64)
82 #define ARCH_MIN_MS_BLOCK_SIZE  (64*1024)
83 #define ARCH_MIN_MS_BLOCK_SIZE_SHIFT    16
84 #endif
85
86 #elif defined(TARGET_ARM)
87
88 #define REDZONE_SIZE    0
89 #define USE_MONO_CTX
90
91 /* We dont store ip, sp */
92 #define ARCH_NUM_REGS 14
93
94 #elif defined(TARGET_ARM64)
95
96 #ifdef __linux__
97 #define REDZONE_SIZE    0
98 #elif defined(__APPLE__)
99 #define REDZONE_SIZE    128
100 #else
101 #error "Not implemented."
102 #endif
103 #define USE_MONO_CTX
104 #define ARCH_NUM_REGS 31
105
106 #elif defined(__mips__)
107
108 #define REDZONE_SIZE    0
109
110 #define USE_MONO_CTX
111 #define ARCH_NUM_REGS 32
112
113 #elif defined(__s390x__)
114
115 #define REDZONE_SIZE    0
116
117 #define USE_MONO_CTX
118 #define ARCH_NUM_REGS 16        
119
120 #elif defined(__sparc__)
121
122 #define REDZONE_SIZE    0
123
124 /* Don't bother with %g0 (%r0), it's always hard-coded to zero */
125 #define ARCH_NUM_REGS 15        
126 #ifdef __sparcv9
127 #define ARCH_STORE_REGS(ptr)    \
128         __asm__ __volatile__(   \
129                 "st %%g1,[%0]\n\t"      \
130                 "st %%g2,[%0+0x08]\n\t" \
131                 "st %%g3,[%0+0x10]\n\t" \
132                 "st %%g4,[%0+0x18]\n\t" \
133                 "st %%g5,[%0+0x20]\n\t" \
134                 "st %%g6,[%0+0x28]\n\t" \
135                 "st %%g7,[%0+0x30]\n\t" \
136                 "st %%o0,[%0+0x38]\n\t" \
137                 "st %%o1,[%0+0x40]\n\t" \
138                 "st %%o2,[%0+0x48]\n\t" \
139                 "st %%o3,[%0+0x50]\n\t" \
140                 "st %%o4,[%0+0x58]\n\t" \
141                 "st %%o5,[%0+0x60]\n\t" \
142                 "st %%o6,[%0+0x68]\n\t" \
143                 "st %%o7,[%0+0x70]\n\t" \
144                 :                       \
145                 : "r" (ptr)             \
146                 : "memory"                      \
147         )
148 #else
149 #define ARCH_STORE_REGS(ptr)    \
150         __asm__ __volatile__(   \
151                 "st %%g1,[%0]\n\t"      \
152                 "st %%g2,[%0+0x04]\n\t" \
153                 "st %%g3,[%0+0x08]\n\t" \
154                 "st %%g4,[%0+0x0c]\n\t" \
155                 "st %%g5,[%0+0x10]\n\t" \
156                 "st %%g6,[%0+0x14]\n\t" \
157                 "st %%g7,[%0+0x18]\n\t" \
158                 "st %%o0,[%0+0x1c]\n\t" \
159                 "st %%o1,[%0+0x20]\n\t" \
160                 "st %%o2,[%0+0x24]\n\t" \
161                 "st %%o3,[%0+0x28]\n\t" \
162                 "st %%o4,[%0+0x2c]\n\t" \
163                 "st %%o5,[%0+0x30]\n\t" \
164                 "st %%o6,[%0+0x34]\n\t" \
165                 "st %%o7,[%0+0x38]\n\t" \
166                 :                       \
167                 : "r" (ptr)             \
168                 : "memory"                      \
169         )
170 #endif
171
172 #ifndef REG_SP
173 #define REG_SP REG_O6
174 #endif
175
176 #define ARCH_SIGCTX_SP(ctx)     (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_SP])
177 #define ARCH_SIGCTX_IP(ctx)     (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_PC])
178 #define ARCH_COPY_SIGCTX_REGS(a,ctx) do {       \
179         (a)[0] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G1]);        \
180         (a)[1] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G2]);        \
181         (a)[2] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G3]);        \
182         (a)[3] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G4]);        \
183         (a)[4] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G5]);        \
184         (a)[5] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G6]);        \
185         (a)[6] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_G7]);        \
186         (a)[7] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O0]);        \
187         (a)[8] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O1]);        \
188         (a)[9] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O2]);        \
189         (a)[10] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O3]);       \
190         (a)[11] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O4]);       \
191         (a)[12] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O5]);       \
192         (a)[13] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O6]);       \
193         (a)[14] = (gpointer) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_O7]);       \
194         } while (0)
195
196 #endif
197
198 #endif /* __MONO_SGENARCHDEP_H__ */