2 * mono-context.c: plat independent machine state definitions
5 * Copyright (c) 2011 Novell, Inc (http://www.novell.com)
8 #include <mono/utils/mono-sigcontext.h>
10 #ifdef HAVE_UCONTEXT_H
14 #if (defined(__i386__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_X86))
16 #include <mono/utils/mono-context.h>
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
);
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__) */
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
;
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>
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");
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
);
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
;
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
;
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");
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
;
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
;
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
;
207 #elif defined(__s390x__)
209 #include <mono/utils/mono-context.h>
211 /*------------------------------------------------------------------*/
213 /* Name - mono_arch_sigctx_to_monoctx. */
215 /* Function - Called from the signal handler to convert signal */
216 /* context to MonoContext. */
218 /*------------------------------------------------------------------*/
221 mono_sigctx_to_monoctx (void *ctx
, MonoContext
*mctx
)
223 memcpy (mctx
, ctx
, sizeof(MonoContext
));
226 /*========================= End of Function ========================*/
228 /*------------------------------------------------------------------*/
230 /* Name - mono_arch_monoctx_to_sigctx. */
232 /* Function - Convert MonoContext structure to signal context. */
234 /*------------------------------------------------------------------*/
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>
250 mono_sigctx_to_monoctx (void *sigctx
, MonoContext
*mctx
)
252 #ifdef MONO_CROSS_COMPILE
253 g_assert_not_reached ();
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);
265 mono_monoctx_to_sigctx (MonoContext
*mctx
, void *ctx
)
267 #ifdef MONO_CROSS_COMPILE
268 g_assert_not_reached ();
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);
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>
286 mono_sigctx_to_monoctx (void *sigctx
, MonoContext
*mctx
)
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
];
298 mono_monoctx_to_sigctx (MonoContext
*mctx
, void *sigctx
)
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__) */