#define REDZONE_SIZE 0
+#define USE_MONO_CTX
#define ARCH_NUM_REGS 32
-#define ARCH_STORE_REGS(ptr) \
- __asm__ __volatile__( \
- "sw $0,0(%0)\n\t" \
- "sw $1,4(%0)\n\t" \
- "sw $2,8(%0)\n\t" \
- "sw $3,12(%0)\n\t" \
- "sw $4,16(%0)\n\t" \
- "sw $5,20(%0)\n\t" \
- "sw $6,24(%0)\n\t" \
- "sw $7,28(%0)\n\t" \
- "sw $8,32(%0)\n\t" \
- "sw $9,36(%0)\n\t" \
- "sw $10,40(%0)\n\t" \
- "sw $11,44(%0)\n\t" \
- "sw $12,48(%0)\n\t" \
- "sw $13,52(%0)\n\t" \
- "sw $14,56(%0)\n\t" \
- "sw $15,60(%0)\n\t" \
- "sw $16,64(%0)\n\t" \
- "sw $17,68(%0)\n\t" \
- "sw $18,72(%0)\n\t" \
- "sw $19,76(%0)\n\t" \
- "sw $20,80(%0)\n\t" \
- "sw $21,84(%0)\n\t" \
- "sw $22,88(%0)\n\t" \
- "sw $23,92(%0)\n\t" \
- "sw $24,96(%0)\n\t" \
- "sw $25,100(%0)\n\t" \
- "sw $26,104(%0)\n\t" \
- "sw $27,108(%0)\n\t" \
- "sw $28,112(%0)\n\t" \
- "sw $29,116(%0)\n\t" \
- "sw $30,120(%0)\n\t" \
- "sw $31,124(%0)\n\t" \
- : \
- : "r" (ptr) \
- : "memory" \
- )
#define ARCH_SIGCTX_SP(ctx) (UCONTEXT_GREGS((ctx))[29])
#define ARCH_SIGCTX_IP(ctx) (UCONTEXT_REG_PC((ctx)))
-#define ARCH_COPY_SIGCTX_REGS(a,ctx) do { \
- int __regnum; \
- for (__regnum = 0; __regnum < 32; ++__regnum) \
- ((a)[__regnum]) = (gpointer) (UCONTEXT_GREGS((ctx))[__regnum]); \
- } while (0)
#elif defined(__s390x__)
void
mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
{
- int i;
-
- mctx->sc_pc = UCONTEXT_REG_PC (sigctx);
- for (i = 0; i < 32; ++i) {
- mctx->sc_regs[i] = UCONTEXT_GREGS (sigctx) [i];
- mctx->sc_fpregs[i] = UCONTEXT_FPREGS (sigctx) [i];
- }
+ mono_sigctx_to_monoctx (sigctx, mctx);
}
void
mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
{
- int i;
-
- UCONTEXT_REG_PC (sigctx) = mctx->sc_pc;
- for (i = 0; i < 32; ++i) {
- UCONTEXT_GREGS (sigctx) [i] = mctx->sc_regs[i];
- UCONTEXT_FPREGS (sigctx) [i] = mctx->sc_fpregs[i];
- }
-}
+ mono_monoctx_to_sigctx (mctx, sigctx);
+}
gpointer
mono_arch_ip_from_context (void *sigctx)
#endif
}
+#elif (defined(__mips__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_MIPS))
+
+#include <mono/utils/mono-context.h>
+#include <mono/arch/mips/mips-codegen.h>
+
+void
+mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
+{
+ int i;
+
+ mctx->sc_pc = UCONTEXT_REG_PC (sigctx);
+ for (i = 0; i < 32; ++i) {
+ mctx->sc_regs[i] = UCONTEXT_GREGS (sigctx) [i];
+ mctx->sc_fpregs[i] = UCONTEXT_FPREGS (sigctx) [i];
+ }
+}
+
+void
+mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
+{
+ int i;
+
+ UCONTEXT_REG_PC (sigctx) = mctx->sc_pc;
+ for (i = 0; i < 32; ++i) {
+ UCONTEXT_GREGS (sigctx) [i] = mctx->sc_regs[i];
+ UCONTEXT_FPREGS (sigctx) [i] = mctx->sc_fpregs[i];
+ }
+}
+
#endif /* #if defined(__i386__) */
#elif ((defined(__mips__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_MIPS))) && SIZEOF_REGISTER == 4 /* defined(__ia64__) */
-/* we define our own structure and we'll copy the data
- * from sigcontext/ucontext/mach when we need it.
- * This also makes us save stack space and time when copying
- * We might also want to add an additional field to propagate
- * the original context from the signal handler.
- */
typedef struct {
mgreg_t sc_pc;
mgreg_t sc_regs [32];
gfloat sc_fpregs [32];
} MonoContext;
-/* we have the stack pointer, not the base pointer in sigcontext */
#define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->sc_pc = (mgreg_t)(ip); } while (0);
#define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->sc_regs[mips_fp] = (mgreg_t)(bp); } while (0);
#define MONO_CONTEXT_SET_SP(ctx,sp) do { (ctx)->sc_regs[mips_sp] = (mgreg_t)(sp); } while (0);
#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->sc_regs[mips_fp]))
#define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sc_regs[mips_sp]))
+#define MONO_CONTEXT_GET_CURRENT(ctx) \
+ __asm__ __volatile__( \
+ "sw $0,0(%0)\n\t" \
+ "sw $1,4(%0)\n\t" \
+ "sw $2,8(%0)\n\t" \
+ "sw $3,12(%0)\n\t" \
+ "sw $4,16(%0)\n\t" \
+ "sw $5,20(%0)\n\t" \
+ "sw $6,24(%0)\n\t" \
+ "sw $7,28(%0)\n\t" \
+ "sw $8,32(%0)\n\t" \
+ "sw $9,36(%0)\n\t" \
+ "sw $10,40(%0)\n\t" \
+ "sw $11,44(%0)\n\t" \
+ "sw $12,48(%0)\n\t" \
+ "sw $13,52(%0)\n\t" \
+ "sw $14,56(%0)\n\t" \
+ "sw $15,60(%0)\n\t" \
+ "sw $16,64(%0)\n\t" \
+ "sw $17,68(%0)\n\t" \
+ "sw $18,72(%0)\n\t" \
+ "sw $19,76(%0)\n\t" \
+ "sw $20,80(%0)\n\t" \
+ "sw $21,84(%0)\n\t" \
+ "sw $22,88(%0)\n\t" \
+ "sw $23,92(%0)\n\t" \
+ "sw $24,96(%0)\n\t" \
+ "sw $25,100(%0)\n\t" \
+ "sw $26,104(%0)\n\t" \
+ "sw $27,108(%0)\n\t" \
+ "sw $28,112(%0)\n\t" \
+ "sw $29,116(%0)\n\t" \
+ "sw $30,120(%0)\n\t" \
+ "sw $31,124(%0)\n\t" \
+ : : "r" (&(ctx).sc_regs [0]) \
+ : "memory" \
+ )
+
#elif defined(__s390x__)
#define MONO_ARCH_HAS_MONO_CONTEXT 1