Add few missing csproj files
[mono-project.git] / mono / utils / mono-context.c
blob15f3c0c15acfab3333829bbacfb90c6312d9731d
1 /*
2 * mono-context.c: plat independent machine state definitions
5 * Copyright (c) 2011 Novell, Inc (http://www.novell.com)
6 */
8 #include <mono/utils/mono-sigcontext.h>
10 #ifdef HAVE_UCONTEXT_H
11 #include <ucontext.h>
12 #endif
14 #if (defined(__i386__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_X86))
16 #include <mono/utils/mono-context.h>
18 #ifdef __sun
19 #define REG_EAX EAX
20 #define REG_EBX EBX
21 #define REG_ECX ECX
22 #define REG_EDX EDX
23 #define REG_EBP EBP
24 #define REG_ESP ESP
25 #define REG_ESI ESI
26 #define REG_EDI EDI
27 #define REG_EIP EIP
28 #endif
30 void
31 mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
33 #if defined (__native_client__)
34 printf("WARNING: mono_arch_sigctx_to_monoctx() called!\n");
35 mctx->eax = 0xDEADBEEF;
36 mctx->ebx = 0xDEADBEEF;
37 mctx->ecx = 0xDEADBEEF;
38 mctx->edx = 0xDEADBEEF;
39 mctx->ebp = 0xDEADBEEF;
40 mctx->esp = 0xDEADBEEF;
41 mctx->esi = 0xDEADBEEF;
42 mctx->edi = 0xDEADBEEF;
43 mctx->eip = 0xDEADBEEF;
44 #elif defined(MONO_SIGNAL_USE_SIGACTION)
45 ucontext_t *ctx = (ucontext_t*)sigctx;
47 mctx->eax = UCONTEXT_REG_EAX (ctx);
48 mctx->ebx = UCONTEXT_REG_EBX (ctx);
49 mctx->ecx = UCONTEXT_REG_ECX (ctx);
50 mctx->edx = UCONTEXT_REG_EDX (ctx);
51 mctx->ebp = UCONTEXT_REG_EBP (ctx);
52 mctx->esp = UCONTEXT_REG_ESP (ctx);
53 mctx->esi = UCONTEXT_REG_ESI (ctx);
54 mctx->edi = UCONTEXT_REG_EDI (ctx);
55 mctx->eip = UCONTEXT_REG_EIP (ctx);
56 #else
57 struct sigcontext *ctx = (struct sigcontext *)sigctx;
59 mctx->eax = ctx->SC_EAX;
60 mctx->ebx = ctx->SC_EBX;
61 mctx->ecx = ctx->SC_ECX;
62 mctx->edx = ctx->SC_EDX;
63 mctx->ebp = ctx->SC_EBP;
64 mctx->esp = ctx->SC_ESP;
65 mctx->esi = ctx->SC_ESI;
66 mctx->edi = ctx->SC_EDI;
67 mctx->eip = ctx->SC_EIP;
68 #endif /* if defined(__native_client__) */
71 void
72 mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
74 #if defined(__native_client__)
75 printf("WARNING: mono_arch_monoctx_to_sigctx() called!\n");
76 #elif defined(MONO_SIGNAL_USE_SIGACTION)
77 ucontext_t *ctx = (ucontext_t*)sigctx;
79 UCONTEXT_REG_EAX (ctx) = mctx->eax;
80 UCONTEXT_REG_EBX (ctx) = mctx->ebx;
81 UCONTEXT_REG_ECX (ctx) = mctx->ecx;
82 UCONTEXT_REG_EDX (ctx) = mctx->edx;
83 UCONTEXT_REG_EBP (ctx) = mctx->ebp;
84 UCONTEXT_REG_ESP (ctx) = mctx->esp;
85 UCONTEXT_REG_ESI (ctx) = mctx->esi;
86 UCONTEXT_REG_EDI (ctx) = mctx->edi;
87 UCONTEXT_REG_EIP (ctx) = mctx->eip;
88 #else
89 struct sigcontext *ctx = (struct sigcontext *)sigctx;
91 ctx->SC_EAX = mctx->eax;
92 ctx->SC_EBX = mctx->ebx;
93 ctx->SC_ECX = mctx->ecx;
94 ctx->SC_EDX = mctx->edx;
95 ctx->SC_EBP = mctx->ebp;
96 ctx->SC_ESP = mctx->esp;
97 ctx->SC_ESI = mctx->esi;
98 ctx->SC_EDI = mctx->edi;
99 ctx->SC_EIP = mctx->eip;
100 #endif /* __native_client__ */
103 #elif (defined(__x86_64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_AMD64)) /* defined(__i386__) */
105 #include <mono/utils/mono-context.h>
107 void
108 mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
110 #if defined(__native_client_codegen__) || defined(__native_client__)
111 printf("WARNING: mono_arch_sigctx_to_monoctx() called!\n");
112 #endif
114 #if defined(MONO_SIGNAL_USE_SIGACTION)
115 ucontext_t *ctx = (ucontext_t*)sigctx;
117 mctx->rax = UCONTEXT_REG_RAX (ctx);
118 mctx->rbx = UCONTEXT_REG_RBX (ctx);
119 mctx->rcx = UCONTEXT_REG_RCX (ctx);
120 mctx->rdx = UCONTEXT_REG_RDX (ctx);
121 mctx->rbp = UCONTEXT_REG_RBP (ctx);
122 mctx->rsp = UCONTEXT_REG_RSP (ctx);
123 mctx->rsi = UCONTEXT_REG_RSI (ctx);
124 mctx->rdi = UCONTEXT_REG_RDI (ctx);
125 mctx->r8 = UCONTEXT_REG_R8 (ctx);
126 mctx->r9 = UCONTEXT_REG_R9 (ctx);
127 mctx->r10 = UCONTEXT_REG_R10 (ctx);
128 mctx->r11 = UCONTEXT_REG_R11 (ctx);
129 mctx->r12 = UCONTEXT_REG_R12 (ctx);
130 mctx->r13 = UCONTEXT_REG_R13 (ctx);
131 mctx->r14 = UCONTEXT_REG_R14 (ctx);
132 mctx->r15 = UCONTEXT_REG_R15 (ctx);
133 mctx->rip = UCONTEXT_REG_RIP (ctx);
134 #else
135 MonoContext *ctx = (MonoContext *)sigctx;
137 mctx->rax = ctx->rax;
138 mctx->rbx = ctx->rbx;
139 mctx->rcx = ctx->rcx;
140 mctx->rdx = ctx->rdx;
141 mctx->rbp = ctx->rbp;
142 mctx->rsp = ctx->rsp;
143 mctx->rsi = ctx->rsi;
144 mctx->rdi = ctx->rdi;
145 mctx->r8 = ctx->r8;
146 mctx->r9 = ctx->r9;
147 mctx->r10 = ctx->r10;
148 mctx->r11 = ctx->r11;
149 mctx->r12 = ctx->r12;
150 mctx->r13 = ctx->r13;
151 mctx->r14 = ctx->r14;
152 mctx->r15 = ctx->r15;
153 mctx->rip = ctx->rip;
154 #endif
157 void
158 mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
160 #if defined(__native_client__) || defined(__native_client_codegen__)
161 printf("WARNING: mono_arch_monoctx_to_sigctx() called!\n");
162 #endif
164 #if defined(MONO_SIGNAL_USE_SIGACTION)
165 ucontext_t *ctx = (ucontext_t*)sigctx;
167 UCONTEXT_REG_RAX (ctx) = mctx->rax;
168 UCONTEXT_REG_RBX (ctx) = mctx->rbx;
169 UCONTEXT_REG_RCX (ctx) = mctx->rcx;
170 UCONTEXT_REG_RDX (ctx) = mctx->rdx;
171 UCONTEXT_REG_RBP (ctx) = mctx->rbp;
172 UCONTEXT_REG_RSP (ctx) = mctx->rsp;
173 UCONTEXT_REG_RSI (ctx) = mctx->rsi;
174 UCONTEXT_REG_RDI (ctx) = mctx->rdi;
175 UCONTEXT_REG_R8 (ctx) = mctx->r8;
176 UCONTEXT_REG_R9 (ctx) = mctx->r9;
177 UCONTEXT_REG_R10 (ctx) = mctx->r10;
178 UCONTEXT_REG_R11 (ctx) = mctx->r11;
179 UCONTEXT_REG_R12 (ctx) = mctx->r12;
180 UCONTEXT_REG_R13 (ctx) = mctx->r13;
181 UCONTEXT_REG_R14 (ctx) = mctx->r14;
182 UCONTEXT_REG_R15 (ctx) = mctx->r15;
183 UCONTEXT_REG_RIP (ctx) = mctx->rip;
184 #else
185 MonoContext *ctx = (MonoContext *)sigctx;
187 ctx->rax = mctx->rax;
188 ctx->rbx = mctx->rbx;
189 ctx->rcx = mctx->rcx;
190 ctx->rdx = mctx->rdx;
191 ctx->rbp = mctx->rbp;
192 ctx->rsp = mctx->rsp;
193 ctx->rsi = mctx->rsi;
194 ctx->rdi = mctx->rdi;
195 ctx->r8 = mctx->r8;
196 ctx->r9 = mctx->r9;
197 ctx->r10 = mctx->r10;
198 ctx->r11 = mctx->r11;
199 ctx->r12 = mctx->r12;
200 ctx->r13 = mctx->r13;
201 ctx->r14 = mctx->r14;
202 ctx->r15 = mctx->r15;
203 ctx->rip = mctx->rip;
204 #endif
207 #elif defined(__s390x__)
209 #include <mono/utils/mono-context.h>
211 /*------------------------------------------------------------------*/
212 /* */
213 /* Name - mono_arch_sigctx_to_monoctx. */
214 /* */
215 /* Function - Called from the signal handler to convert signal */
216 /* context to MonoContext. */
217 /* */
218 /*------------------------------------------------------------------*/
220 void
221 mono_sigctx_to_monoctx (void *ctx, MonoContext *mctx)
223 memcpy (mctx, ctx, sizeof(MonoContext));
226 /*========================= End of Function ========================*/
228 /*------------------------------------------------------------------*/
229 /* */
230 /* Name - mono_arch_monoctx_to_sigctx. */
231 /* */
232 /* Function - Convert MonoContext structure to signal context. */
233 /* */
234 /*------------------------------------------------------------------*/
236 void
237 mono_monoctx_to_sigctx (MonoContext *mctx, void *ctx)
239 memcpy (ctx, mctx, sizeof(MonoContext));
242 /*========================= End of Function ========================*/
244 #elif (defined(__arm__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_ARM))
246 #include <mono/utils/mono-context.h>
247 #include <mono/arch/arm/arm-codegen.h>
249 void
250 mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
252 #ifdef MONO_CROSS_COMPILE
253 g_assert_not_reached ();
254 #else
255 arm_ucontext *my_uc = sigctx;
257 mctx->pc = UCONTEXT_REG_PC (my_uc);
258 mctx->regs [ARMREG_SP] = UCONTEXT_REG_SP (my_uc);
259 mctx->cpsr = UCONTEXT_REG_CPSR (my_uc);
260 memcpy (&mctx->regs, &UCONTEXT_REG_R0 (my_uc), sizeof (mgreg_t) * 16);
261 #endif
264 void
265 mono_monoctx_to_sigctx (MonoContext *mctx, void *ctx)
267 #ifdef MONO_CROSS_COMPILE
268 g_assert_not_reached ();
269 #else
270 arm_ucontext *my_uc = ctx;
272 UCONTEXT_REG_PC (my_uc) = mctx->pc;
273 UCONTEXT_REG_SP (my_uc) = mctx->regs [ARMREG_SP];
274 UCONTEXT_REG_CPSR (my_uc) = mctx->cpsr;
275 /* The upper registers are not guaranteed to be valid */
276 memcpy (&UCONTEXT_REG_R0 (my_uc), &mctx->regs, sizeof (mgreg_t) * 12);
277 #endif
280 #elif (defined(__mips__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_MIPS))
282 #include <mono/utils/mono-context.h>
283 #include <mono/arch/mips/mips-codegen.h>
285 void
286 mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
288 int i;
290 mctx->sc_pc = UCONTEXT_REG_PC (sigctx);
291 for (i = 0; i < 32; ++i) {
292 mctx->sc_regs[i] = UCONTEXT_GREGS (sigctx) [i];
293 mctx->sc_fpregs[i] = UCONTEXT_FPREGS (sigctx) [i];
297 void
298 mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
300 int i;
302 UCONTEXT_REG_PC (sigctx) = mctx->sc_pc;
303 for (i = 0; i < 32; ++i) {
304 UCONTEXT_GREGS (sigctx) [i] = mctx->sc_regs[i];
305 UCONTEXT_FPREGS (sigctx) [i] = mctx->sc_fpregs[i];
309 #endif /* #if defined(__i386__) */