Use MonoContext on MIPS in sgen-archdep.h.
authorZoltan Varga <vargaz@gmail.com>
Tue, 27 Dec 2011 14:28:46 +0000 (15:28 +0100)
committerZoltan Varga <vargaz@gmail.com>
Tue, 27 Dec 2011 14:28:46 +0000 (15:28 +0100)
mono/metadata/sgen-archdep.h
mono/mini/exceptions-mips.c
mono/utils/mono-context.c
mono/utils/mono-context.h

index b68b8aece7e7de804bf3396ef68e0d6c79883523..28168e537f1dc47499ac36d2d9110805883faeef 100644 (file)
 
 #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__)
 
index bf511e7407c27939857c4d4b89362384a5e3b8ce..ea38a836aab28b452bba4658198d47d4be1369ef 100644 (file)
@@ -493,26 +493,14 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
 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)
index ecf9a488b0cd61cfb91f60ccde42c88c80fbcebb..734aa77e99f83ae15463f4489e84cf3dc3f2fbae 100644 (file)
@@ -277,4 +277,33 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *ctx)
 #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__) */
index b456c8aa5b4a57cec77a92d7232cbc042d315b59..d449564910191746063b7e011d99a36f67755f68 100644 (file)
@@ -364,19 +364,12 @@ mono_ia64_context_get_fp (MonoContext *ctx)
 
 #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);
@@ -385,6 +378,44 @@ typedef struct {
 #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