3 * plat independent machine state definitions
6 * Copyright (c) 2011 Novell, Inc (http://www.novell.com)
7 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
10 #include <mono/utils/mono-sigcontext.h>
12 #ifdef HAVE_UCONTEXT_H
16 #if (defined(__i386__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_X86))
18 #include <mono/utils/mono-context.h>
37 mono_sigctx_to_monoctx (void *sigctx
, MonoContext
*mctx
)
39 #if defined (HOST_WATCHOS)
40 printf("WARNING: mono_arch_sigctx_to_monoctx() called!\n");
41 mctx
->eax
= 0xDEADBEEF;
42 mctx
->ebx
= 0xDEADBEEF;
43 mctx
->ecx
= 0xDEADBEEF;
44 mctx
->edx
= 0xDEADBEEF;
45 mctx
->ebp
= 0xDEADBEEF;
46 mctx
->esp
= 0xDEADBEEF;
47 mctx
->esi
= 0xDEADBEEF;
48 mctx
->edi
= 0xDEADBEEF;
49 mctx
->eip
= 0xDEADBEEF;
50 #elif MONO_CROSS_COMPILE
51 g_assert_not_reached ();
52 #elif defined(MONO_SIGNAL_USE_UCONTEXT_T)
53 ucontext_t
*ctx
= (ucontext_t
*)sigctx
;
55 mctx
->eax
= UCONTEXT_REG_EAX (ctx
);
56 mctx
->ebx
= UCONTEXT_REG_EBX (ctx
);
57 mctx
->ecx
= UCONTEXT_REG_ECX (ctx
);
58 mctx
->edx
= UCONTEXT_REG_EDX (ctx
);
59 mctx
->ebp
= UCONTEXT_REG_EBP (ctx
);
60 mctx
->esp
= UCONTEXT_REG_ESP (ctx
);
61 mctx
->esi
= UCONTEXT_REG_ESI (ctx
);
62 mctx
->edi
= UCONTEXT_REG_EDI (ctx
);
63 mctx
->eip
= UCONTEXT_REG_EIP (ctx
);
64 #ifdef UCONTEXT_HAS_XMM
65 if (UCONTEXT_HAS_XMM (ctx
)) {
66 mctx
->fregs
[0] = UCONTEXT_REG_XMM0 (ctx
);
67 mctx
->fregs
[1] = UCONTEXT_REG_XMM1 (ctx
);
68 mctx
->fregs
[2] = UCONTEXT_REG_XMM2 (ctx
);
69 mctx
->fregs
[3] = UCONTEXT_REG_XMM3 (ctx
);
70 mctx
->fregs
[4] = UCONTEXT_REG_XMM4 (ctx
);
71 mctx
->fregs
[5] = UCONTEXT_REG_XMM5 (ctx
);
72 mctx
->fregs
[6] = UCONTEXT_REG_XMM6 (ctx
);
73 mctx
->fregs
[7] = UCONTEXT_REG_XMM7 (ctx
);
76 #elif defined(HOST_WIN32)
77 CONTEXT
*context
= (CONTEXT
*)sigctx
;
79 mctx
->eip
= context
->Eip
;
80 mctx
->edi
= context
->Edi
;
81 mctx
->esi
= context
->Esi
;
82 mctx
->ebx
= context
->Ebx
;
83 mctx
->edx
= context
->Edx
;
84 mctx
->ecx
= context
->Ecx
;
85 mctx
->eax
= context
->Eax
;
86 mctx
->ebp
= context
->Ebp
;
87 mctx
->esp
= context
->Esp
;
89 struct sigcontext
*ctx
= (struct sigcontext
*)sigctx
;
91 mctx
->eax
= ctx
->SC_EAX
;
92 mctx
->ebx
= ctx
->SC_EBX
;
93 mctx
->ecx
= ctx
->SC_ECX
;
94 mctx
->edx
= ctx
->SC_EDX
;
95 mctx
->ebp
= ctx
->SC_EBP
;
96 mctx
->esp
= ctx
->SC_ESP
;
97 mctx
->esi
= ctx
->SC_ESI
;
98 mctx
->edi
= ctx
->SC_EDI
;
99 mctx
->eip
= ctx
->SC_EIP
;
104 mono_monoctx_to_sigctx (MonoContext
*mctx
, void *sigctx
)
106 #if defined(HOST_WATCHOS)
107 printf("WARNING: mono_arch_monoctx_to_sigctx() called!\n");
108 #elif MONO_CROSS_COMPILE
109 g_assert_not_reached ();
110 #elif defined(MONO_SIGNAL_USE_UCONTEXT_T)
111 ucontext_t
*ctx
= (ucontext_t
*)sigctx
;
113 UCONTEXT_REG_EAX (ctx
) = mctx
->eax
;
114 UCONTEXT_REG_EBX (ctx
) = mctx
->ebx
;
115 UCONTEXT_REG_ECX (ctx
) = mctx
->ecx
;
116 UCONTEXT_REG_EDX (ctx
) = mctx
->edx
;
117 UCONTEXT_REG_EBP (ctx
) = mctx
->ebp
;
118 UCONTEXT_REG_ESP (ctx
) = mctx
->esp
;
119 UCONTEXT_REG_ESI (ctx
) = mctx
->esi
;
120 UCONTEXT_REG_EDI (ctx
) = mctx
->edi
;
121 UCONTEXT_REG_EIP (ctx
) = mctx
->eip
;
122 #ifdef UCONTEXT_HAS_XMM
123 if (UCONTEXT_HAS_XMM (ctx
)) {
124 UCONTEXT_REG_XMM0 (ctx
) = mctx
->fregs
[0];
125 UCONTEXT_REG_XMM1 (ctx
) = mctx
->fregs
[1];
126 UCONTEXT_REG_XMM2 (ctx
) = mctx
->fregs
[2];
127 UCONTEXT_REG_XMM3 (ctx
) = mctx
->fregs
[3];
128 UCONTEXT_REG_XMM4 (ctx
) = mctx
->fregs
[4];
129 UCONTEXT_REG_XMM5 (ctx
) = mctx
->fregs
[5];
130 UCONTEXT_REG_XMM6 (ctx
) = mctx
->fregs
[6];
131 UCONTEXT_REG_XMM7 (ctx
) = mctx
->fregs
[7];
134 #elif defined(HOST_WIN32)
135 CONTEXT
*context
= (CONTEXT
*)sigctx
;
137 context
->Eip
= mctx
->eip
;
138 context
->Edi
= mctx
->edi
;
139 context
->Esi
= mctx
->esi
;
140 context
->Ebx
= mctx
->ebx
;
141 context
->Edx
= mctx
->edx
;
142 context
->Ecx
= mctx
->ecx
;
143 context
->Eax
= mctx
->eax
;
144 context
->Ebp
= mctx
->ebp
;
145 context
->Esp
= mctx
->esp
;
147 struct sigcontext
*ctx
= (struct sigcontext
*)sigctx
;
149 ctx
->SC_EAX
= mctx
->eax
;
150 ctx
->SC_EBX
= mctx
->ebx
;
151 ctx
->SC_ECX
= mctx
->ecx
;
152 ctx
->SC_EDX
= mctx
->edx
;
153 ctx
->SC_EBP
= mctx
->ebp
;
154 ctx
->SC_ESP
= mctx
->esp
;
155 ctx
->SC_ESI
= mctx
->esi
;
156 ctx
->SC_EDI
= mctx
->edi
;
157 ctx
->SC_EIP
= mctx
->eip
;
161 #elif (defined(__x86_64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_AMD64)) /* defined(__i386__) */
163 #include <mono/utils/mono-context.h>
170 mono_sigctx_to_monoctx (void *sigctx
, MonoContext
*mctx
)
172 #ifdef MONO_CROSS_COMPILE
173 g_assert_not_reached ();
174 #elif defined(MONO_SIGNAL_USE_UCONTEXT_T)
175 ucontext_t
*ctx
= (ucontext_t
*)sigctx
;
177 mctx
->gregs
[AMD64_RAX
] = UCONTEXT_REG_RAX (ctx
);
178 mctx
->gregs
[AMD64_RBX
] = UCONTEXT_REG_RBX (ctx
);
179 mctx
->gregs
[AMD64_RCX
] = UCONTEXT_REG_RCX (ctx
);
180 mctx
->gregs
[AMD64_RDX
] = UCONTEXT_REG_RDX (ctx
);
181 mctx
->gregs
[AMD64_RBP
] = UCONTEXT_REG_RBP (ctx
);
182 mctx
->gregs
[AMD64_RSP
] = UCONTEXT_REG_RSP (ctx
);
183 mctx
->gregs
[AMD64_RSI
] = UCONTEXT_REG_RSI (ctx
);
184 mctx
->gregs
[AMD64_RDI
] = UCONTEXT_REG_RDI (ctx
);
185 mctx
->gregs
[AMD64_R8
] = UCONTEXT_REG_R8 (ctx
);
186 mctx
->gregs
[AMD64_R9
] = UCONTEXT_REG_R9 (ctx
);
187 mctx
->gregs
[AMD64_R10
] = UCONTEXT_REG_R10 (ctx
);
188 mctx
->gregs
[AMD64_R11
] = UCONTEXT_REG_R11 (ctx
);
189 mctx
->gregs
[AMD64_R12
] = UCONTEXT_REG_R12 (ctx
);
190 mctx
->gregs
[AMD64_R13
] = UCONTEXT_REG_R13 (ctx
);
191 mctx
->gregs
[AMD64_R14
] = UCONTEXT_REG_R14 (ctx
);
192 mctx
->gregs
[AMD64_R15
] = UCONTEXT_REG_R15 (ctx
);
193 mctx
->gregs
[AMD64_RIP
] = UCONTEXT_REG_RIP (ctx
);
195 #ifdef UCONTEXT_HAS_XMM
196 if (UCONTEXT_HAS_XMM (ctx
)) {
197 mctx
->fregs
[0] = UCONTEXT_REG_XMM0 (ctx
);
198 mctx
->fregs
[1] = UCONTEXT_REG_XMM1 (ctx
);
199 mctx
->fregs
[2] = UCONTEXT_REG_XMM2 (ctx
);
200 mctx
->fregs
[3] = UCONTEXT_REG_XMM3 (ctx
);
201 mctx
->fregs
[4] = UCONTEXT_REG_XMM4 (ctx
);
202 mctx
->fregs
[5] = UCONTEXT_REG_XMM5 (ctx
);
203 mctx
->fregs
[6] = UCONTEXT_REG_XMM6 (ctx
);
204 mctx
->fregs
[7] = UCONTEXT_REG_XMM7 (ctx
);
205 mctx
->fregs
[8] = UCONTEXT_REG_XMM8 (ctx
);
206 mctx
->fregs
[9] = UCONTEXT_REG_XMM9 (ctx
);
207 mctx
->fregs
[10] = UCONTEXT_REG_XMM10 (ctx
);
208 mctx
->fregs
[11] = UCONTEXT_REG_XMM11 (ctx
);
209 mctx
->fregs
[12] = UCONTEXT_REG_XMM12 (ctx
);
210 mctx
->fregs
[13] = UCONTEXT_REG_XMM13 (ctx
);
211 mctx
->fregs
[14] = UCONTEXT_REG_XMM14 (ctx
);
212 mctx
->fregs
[15] = UCONTEXT_REG_XMM15 (ctx
);
216 #elif defined(HOST_WIN32)
217 CONTEXT
*context
= (CONTEXT
*)sigctx
;
219 mctx
->gregs
[AMD64_RIP
] = context
->Rip
;
220 mctx
->gregs
[AMD64_RAX
] = context
->Rax
;
221 mctx
->gregs
[AMD64_RCX
] = context
->Rcx
;
222 mctx
->gregs
[AMD64_RDX
] = context
->Rdx
;
223 mctx
->gregs
[AMD64_RBX
] = context
->Rbx
;
224 mctx
->gregs
[AMD64_RSP
] = context
->Rsp
;
225 mctx
->gregs
[AMD64_RBP
] = context
->Rbp
;
226 mctx
->gregs
[AMD64_RSI
] = context
->Rsi
;
227 mctx
->gregs
[AMD64_RDI
] = context
->Rdi
;
228 mctx
->gregs
[AMD64_R8
] = context
->R8
;
229 mctx
->gregs
[AMD64_R9
] = context
->R9
;
230 mctx
->gregs
[AMD64_R10
] = context
->R10
;
231 mctx
->gregs
[AMD64_R11
] = context
->R11
;
232 mctx
->gregs
[AMD64_R12
] = context
->R12
;
233 mctx
->gregs
[AMD64_R13
] = context
->R13
;
234 mctx
->gregs
[AMD64_R14
] = context
->R14
;
235 mctx
->gregs
[AMD64_R15
] = context
->R15
;
236 #elif defined(__HAIKU__)
237 // Haiku uses sigcontext because there's no ucontext
238 struct sigcontext
*ctx
= (struct sigcontext
*)sigctx
;
240 mctx
->gregs
[AMD64_RIP
] = ctx
->regs
.rip
;
241 mctx
->gregs
[AMD64_RAX
] = ctx
->regs
.rax
;
242 mctx
->gregs
[AMD64_RCX
] = ctx
->regs
.rcx
;
243 mctx
->gregs
[AMD64_RDX
] = ctx
->regs
.rdx
;
244 mctx
->gregs
[AMD64_RBX
] = ctx
->regs
.rbx
;
245 mctx
->gregs
[AMD64_RSP
] = ctx
->regs
.rsp
;
246 mctx
->gregs
[AMD64_RBP
] = ctx
->regs
.rbp
;
247 mctx
->gregs
[AMD64_RSI
] = ctx
->regs
.rsi
;
248 mctx
->gregs
[AMD64_RDI
] = ctx
->regs
.rdi
;
249 mctx
->gregs
[AMD64_R8
] = ctx
->regs
.r8
;
250 mctx
->gregs
[AMD64_R9
] = ctx
->regs
.r9
;
251 mctx
->gregs
[AMD64_R10
] = ctx
->regs
.r10
;
252 mctx
->gregs
[AMD64_R11
] = ctx
->regs
.r11
;
253 mctx
->gregs
[AMD64_R12
] = ctx
->regs
.r12
;
254 mctx
->gregs
[AMD64_R13
] = ctx
->regs
.r13
;
255 mctx
->gregs
[AMD64_R14
] = ctx
->regs
.r14
;
256 mctx
->gregs
[AMD64_R15
] = ctx
->regs
.r15
;
258 g_assert_not_reached ();
263 mono_monoctx_to_sigctx (MonoContext
*mctx
, void *sigctx
)
265 #ifdef MONO_CROSS_COMPILE
266 g_assert_not_reached ();
267 #elif defined(MONO_SIGNAL_USE_UCONTEXT_T)
268 ucontext_t
*ctx
= (ucontext_t
*)sigctx
;
270 UCONTEXT_REG_RAX (ctx
) = mctx
->gregs
[AMD64_RAX
];
271 UCONTEXT_REG_RBX (ctx
) = mctx
->gregs
[AMD64_RBX
];
272 UCONTEXT_REG_RCX (ctx
) = mctx
->gregs
[AMD64_RCX
];
273 UCONTEXT_REG_RDX (ctx
) = mctx
->gregs
[AMD64_RDX
];
274 UCONTEXT_REG_RBP (ctx
) = mctx
->gregs
[AMD64_RBP
];
275 UCONTEXT_REG_RSP (ctx
) = mctx
->gregs
[AMD64_RSP
];
276 UCONTEXT_REG_RSI (ctx
) = mctx
->gregs
[AMD64_RSI
];
277 UCONTEXT_REG_RDI (ctx
) = mctx
->gregs
[AMD64_RDI
];
278 UCONTEXT_REG_R8 (ctx
) = mctx
->gregs
[AMD64_R8
];
279 UCONTEXT_REG_R9 (ctx
) = mctx
->gregs
[AMD64_R9
];
280 UCONTEXT_REG_R10 (ctx
) = mctx
->gregs
[AMD64_R10
];
281 UCONTEXT_REG_R11 (ctx
) = mctx
->gregs
[AMD64_R11
];
282 UCONTEXT_REG_R12 (ctx
) = mctx
->gregs
[AMD64_R12
];
283 UCONTEXT_REG_R13 (ctx
) = mctx
->gregs
[AMD64_R13
];
284 UCONTEXT_REG_R14 (ctx
) = mctx
->gregs
[AMD64_R14
];
285 UCONTEXT_REG_R15 (ctx
) = mctx
->gregs
[AMD64_R15
];
286 UCONTEXT_REG_RIP (ctx
) = mctx
->gregs
[AMD64_RIP
];
288 #ifdef UCONTEXT_HAS_XMM
289 if (UCONTEXT_HAS_XMM (ctx
)) {
290 UCONTEXT_REG_XMM0 (ctx
) = mctx
->fregs
[0];
291 UCONTEXT_REG_XMM1 (ctx
) = mctx
->fregs
[1];
292 UCONTEXT_REG_XMM2 (ctx
) = mctx
->fregs
[2];
293 UCONTEXT_REG_XMM3 (ctx
) = mctx
->fregs
[3];
294 UCONTEXT_REG_XMM4 (ctx
) = mctx
->fregs
[4];
295 UCONTEXT_REG_XMM5 (ctx
) = mctx
->fregs
[5];
296 UCONTEXT_REG_XMM6 (ctx
) = mctx
->fregs
[6];
297 UCONTEXT_REG_XMM7 (ctx
) = mctx
->fregs
[7];
298 UCONTEXT_REG_XMM8 (ctx
) = mctx
->fregs
[8];
299 UCONTEXT_REG_XMM9 (ctx
) = mctx
->fregs
[9];
300 UCONTEXT_REG_XMM10 (ctx
) = mctx
->fregs
[10];
301 UCONTEXT_REG_XMM11 (ctx
) = mctx
->fregs
[11];
302 UCONTEXT_REG_XMM12 (ctx
) = mctx
->fregs
[12];
303 UCONTEXT_REG_XMM13 (ctx
) = mctx
->fregs
[13];
304 UCONTEXT_REG_XMM14 (ctx
) = mctx
->fregs
[14];
305 UCONTEXT_REG_XMM15 (ctx
) = mctx
->fregs
[15];
309 #elif defined(HOST_WIN32)
310 CONTEXT
*context
= (CONTEXT
*)sigctx
;
312 context
->Rip
= mctx
->gregs
[AMD64_RIP
];
313 context
->Rax
= mctx
->gregs
[AMD64_RAX
];
314 context
->Rcx
= mctx
->gregs
[AMD64_RCX
];
315 context
->Rdx
= mctx
->gregs
[AMD64_RDX
];
316 context
->Rbx
= mctx
->gregs
[AMD64_RBX
];
317 context
->Rsp
= mctx
->gregs
[AMD64_RSP
];
318 context
->Rbp
= mctx
->gregs
[AMD64_RBP
];
319 context
->Rsi
= mctx
->gregs
[AMD64_RSI
];
320 context
->Rdi
= mctx
->gregs
[AMD64_RDI
];
321 context
->R8
= mctx
->gregs
[AMD64_R8
];
322 context
->R9
= mctx
->gregs
[AMD64_R9
];
323 context
->R10
= mctx
->gregs
[AMD64_R10
];
324 context
->R11
= mctx
->gregs
[AMD64_R11
];
325 context
->R12
= mctx
->gregs
[AMD64_R12
];
326 context
->R13
= mctx
->gregs
[AMD64_R13
];
327 context
->R14
= mctx
->gregs
[AMD64_R14
];
328 context
->R15
= mctx
->gregs
[AMD64_R15
];
329 #elif defined(__HAIKU__)
330 // Haiku uses sigcontext because there's no ucontext
331 struct sigcontext
*ctx
= (struct sigcontext
*)sigctx
;
333 ctx
->regs
.rip
= mctx
->gregs
[AMD64_RIP
];
334 ctx
->regs
.rax
= mctx
->gregs
[AMD64_RAX
];
335 ctx
->regs
.rcx
= mctx
->gregs
[AMD64_RCX
];
336 ctx
->regs
.rdx
= mctx
->gregs
[AMD64_RDX
];
337 ctx
->regs
.rbx
= mctx
->gregs
[AMD64_RBX
];
338 ctx
->regs
.rsp
= mctx
->gregs
[AMD64_RSP
];
339 ctx
->regs
.rbp
= mctx
->gregs
[AMD64_RBP
];
340 ctx
->regs
.rsi
= mctx
->gregs
[AMD64_RSI
];
341 ctx
->regs
.rdi
= mctx
->gregs
[AMD64_RDI
];
342 ctx
->regs
.r8
= mctx
->gregs
[AMD64_R8
];
343 ctx
->regs
.r9
= mctx
->gregs
[AMD64_R9
];
344 ctx
->regs
.r10
= mctx
->gregs
[AMD64_R10
];
345 ctx
->regs
.r11
= mctx
->gregs
[AMD64_R11
];
346 ctx
->regs
.r12
= mctx
->gregs
[AMD64_R12
];
347 ctx
->regs
.r13
= mctx
->gregs
[AMD64_R13
];
348 ctx
->regs
.r14
= mctx
->gregs
[AMD64_R14
];
349 ctx
->regs
.r15
= mctx
->gregs
[AMD64_R15
];
351 g_assert_not_reached ();
355 #elif defined(__s390x__)
357 #include <mono/utils/mono-context.h>
359 /*------------------------------------------------------------------*/
361 /* Name - mono_arch_sigctx_to_monoctx. */
363 /* Function - Called from the signal handler to convert signal */
364 /* context to MonoContext. */
366 /*------------------------------------------------------------------*/
369 mono_sigctx_to_monoctx (void *ctx
, MonoContext
*mctx
)
371 memcpy (mctx
, ctx
, sizeof(MonoContext
));
374 /*========================= End of Function ========================*/
376 /*------------------------------------------------------------------*/
378 /* Name - mono_arch_monoctx_to_sigctx. */
380 /* Function - Convert MonoContext structure to signal context. */
382 /*------------------------------------------------------------------*/
385 mono_monoctx_to_sigctx (MonoContext
*mctx
, void *ctx
)
387 memcpy (ctx
, mctx
, sizeof(MonoContext
));
390 /*========================= End of Function ========================*/
392 #elif (defined(__arm__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_ARM))
394 #include <mono/utils/mono-context.h>
395 #include <mono/arch/arm/arm-codegen.h>
396 #include <mono/arch/arm/arm-vfp-codegen.h>
403 mono_sigctx_to_monoctx (void *sigctx
, MonoContext
*mctx
)
405 #ifdef MONO_CROSS_COMPILE
406 g_assert_not_reached ();
407 #elif defined(HOST_WIN32)
408 CONTEXT
*context
= (CONTEXT
*)sigctx
;
410 mctx
->pc
= context
->Pc
;
411 mctx
->cpsr
= context
->Cpsr
;
412 memcpy (&mctx
->regs
, &context
->R0
, sizeof (DWORD
) * 16);
414 /* Why are we only copying 16 registers?! There are 32! */
415 memcpy (&mctx
->fregs
, &context
->D
, sizeof (double) * 16);
417 arm_ucontext
*my_uc
= sigctx
;
419 mctx
->pc
= UCONTEXT_REG_PC (my_uc
);
420 mctx
->regs
[ARMREG_SP
] = UCONTEXT_REG_SP (my_uc
);
421 mctx
->cpsr
= UCONTEXT_REG_CPSR (my_uc
);
422 memcpy (&mctx
->regs
, &UCONTEXT_REG_R0 (my_uc
), sizeof (mgreg_t
) * 16);
423 #ifdef UCONTEXT_REG_VFPREGS
424 memcpy (&mctx
->fregs
, UCONTEXT_REG_VFPREGS (my_uc
), sizeof (double) * 16);
430 mono_monoctx_to_sigctx (MonoContext
*mctx
, void *ctx
)
432 #ifdef MONO_CROSS_COMPILE
433 g_assert_not_reached ();
434 #elif defined(HOST_WIN32)
435 CONTEXT
*context
= (CONTEXT
*)ctx
;
437 context
->Pc
= mctx
->pc
;
438 context
->Cpsr
= mctx
->cpsr
;
439 memcpy (&context
->R0
, &mctx
->regs
, sizeof (DWORD
) * 16);
441 /* Why are we only copying 16 registers?! There are 32! */
442 memcpy (&context
->D
, &mctx
->fregs
, sizeof (double) * 16);
444 arm_ucontext
*my_uc
= ctx
;
446 UCONTEXT_REG_PC (my_uc
) = mctx
->pc
;
447 UCONTEXT_REG_SP (my_uc
) = mctx
->regs
[ARMREG_SP
];
448 UCONTEXT_REG_CPSR (my_uc
) = mctx
->cpsr
;
449 /* The upper registers are not guaranteed to be valid */
450 memcpy (&UCONTEXT_REG_R0 (my_uc
), &mctx
->regs
, sizeof (mgreg_t
) * 12);
451 #ifdef UCONTEXT_REG_VFPREGS
452 memcpy (UCONTEXT_REG_VFPREGS (my_uc
), &mctx
->fregs
, sizeof (double) * 16);
457 #elif (defined(__aarch64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_ARM64))
459 #include <mono/utils/mono-context.h>
462 mono_sigctx_to_monoctx (void *sigctx
, MonoContext
*mctx
)
464 #ifdef MONO_CROSS_COMPILE
465 g_assert_not_reached ();
467 memcpy (mctx
->regs
, UCONTEXT_GREGS (sigctx
), sizeof (mgreg_t
) * 31);
468 mctx
->pc
= UCONTEXT_REG_PC (sigctx
);
469 mctx
->regs
[ARMREG_SP
] = UCONTEXT_REG_SP (sigctx
);
471 struct fpsimd_context
*fpctx
= (struct fpsimd_context
*)&((ucontext_t
*)sigctx
)->uc_mcontext
.__reserved
;
474 g_assert (fpctx
->head
.magic
== FPSIMD_MAGIC
);
475 for (i
= 0; i
< 32; ++i
)
476 mctx
->fregs
[i
] = fpctx
->vregs
[i
];
483 mono_monoctx_to_sigctx (MonoContext
*mctx
, void *sigctx
)
485 #ifdef MONO_CROSS_COMPILE
486 g_assert_not_reached ();
488 memcpy (UCONTEXT_GREGS (sigctx
), mctx
->regs
, sizeof (mgreg_t
) * 31);
489 UCONTEXT_REG_PC (sigctx
) = mctx
->pc
;
490 UCONTEXT_REG_SP (sigctx
) = mctx
->regs
[ARMREG_SP
];
494 #elif (defined(__mips__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_MIPS))
496 #include <mono/utils/mono-context.h>
497 #include <mono/arch/mips/mips-codegen.h>
500 mono_sigctx_to_monoctx (void *sigctx
, MonoContext
*mctx
)
504 mctx
->sc_pc
= UCONTEXT_REG_PC (sigctx
);
505 for (i
= 0; i
< 32; ++i
) {
506 mctx
->sc_regs
[i
] = UCONTEXT_GREGS (sigctx
) [i
];
507 mctx
->sc_fpregs
[i
] = UCONTEXT_FPREGS (sigctx
) [i
];
512 mono_monoctx_to_sigctx (MonoContext
*mctx
, void *sigctx
)
516 UCONTEXT_REG_PC (sigctx
) = mctx
->sc_pc
;
517 for (i
= 0; i
< 32; ++i
) {
518 UCONTEXT_GREGS (sigctx
) [i
] = mctx
->sc_regs
[i
];
519 UCONTEXT_FPREGS (sigctx
) [i
] = mctx
->sc_fpregs
[i
];
523 #elif (((defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)) && !defined(MONO_CROSS_COMPILE))) || (defined(TARGET_POWERPC))
525 #include <mono/utils/mono-context.h>
526 #include <mono/mini/mini-ppc.h>
529 mono_sigctx_to_monoctx (void *sigctx
, MonoContext
*mctx
)
531 os_ucontext
*uc
= sigctx
;
533 mctx
->sc_ir
= UCONTEXT_REG_NIP(uc
);
534 mctx
->sc_sp
= UCONTEXT_REG_Rn(uc
, 1);
536 memcpy (&mctx
->regs
, &UCONTEXT_REG_Rn(uc
, 0), sizeof (mgreg_t
) * MONO_MAX_IREGS
);
537 memcpy (&mctx
->fregs
, &UCONTEXT_REG_FPRn(uc
, 0), sizeof (double) * MONO_MAX_FREGS
);
541 mono_monoctx_to_sigctx (MonoContext
*mctx
, void *sigctx
)
543 os_ucontext
*uc
= sigctx
;
545 memcpy (&UCONTEXT_REG_Rn(uc
, 0), &mctx
->regs
, sizeof (mgreg_t
) * MONO_MAX_IREGS
);
546 memcpy (&UCONTEXT_REG_FPRn(uc
, 0), &mctx
->fregs
, sizeof (double) * MONO_MAX_FREGS
);
548 /* The valid values for pc and sp are stored here and not in regs array */
549 UCONTEXT_REG_NIP(uc
) = mctx
->sc_ir
;
550 UCONTEXT_REG_Rn(uc
, 1) = mctx
->sc_sp
;
553 #endif /* #if defined(__i386__) */