* src/vm/jit/powerpc64/codegen.h (M_ILLEGAL): New macro.
authorChristian Thalinger <twisti@complang.tuwien.ac.at>
Thu, 11 Sep 2008 14:47:03 +0000 (16:47 +0200)
committerChristian Thalinger <twisti@complang.tuwien.ac.at>
Thu, 11 Sep 2008 14:47:03 +0000 (16:47 +0200)
* src/vm/jit/powerpc64/emit.c (emit_trap): Use M_ILLEGAL.
* src/vm/jit/powerpc64/linux/md-os.c (md_signal_handler_sigill): New
function.
* src/vm/jit/powerpc64/md-trap.h: Use a lage number for TRAP_PATCHER.
* src/vm/signal.c (signal_init) [__POWERPC64__]: Register
md_signal_handler_sigill.
* src/vm/signallocal.h (md_signal_handler_sigill) [__POWERPC64__]:
Added defined.

src/vm/jit/powerpc64/codegen.h
src/vm/jit/powerpc64/emit.c
src/vm/jit/powerpc64/linux/md-os.c
src/vm/jit/powerpc64/md-trap.h
src/vm/signal.c
src/vm/signallocal.h

index 34a710bcb84a30a888e7418b0c7165198f980be6..df9120f088af2393c10f792277c962306969c9c5 100644 (file)
 
 /* instruction macros *********************************************************/
 
-#define M_IADD(a,b,c)                  M_LADD(a,b,c)
+#define M_ILLEGAL                       M_OP3(0, 0, 0, 0, 0, 0, 0)
+#define M_IADD(a,b,c)                   M_LADD(a,b,c)
 #define M_LADD(a,b,c)                   M_OP3(31, 266, 0, 0, c, a, b) 
 #define M_IADD_IMM(a,b,c)               M_OP2_IMM(14, c, a, b) /* XXX */
 #define M_LADD_IMM(a,b,c)               M_OP2_IMM(14, c, a, b)
index fc3b07c9c758c1c3347ba0df5f2a13775e3c5d1d..bb14ba1af5217d7456339dc23fb60f3d43b4c1e4 100644 (file)
@@ -627,15 +627,11 @@ void emit_trap_compiler(codegendata *cd)
 
 uint32_t emit_trap(codegendata *cd)
 {
-       uint32_t mcode;
+       // Get machine code which is patched back in later. The trap is 1
+       // instruction word long.
+       uint32_t mcode = *((uint32_t*) cd->mcodeptr);
 
-       /* Get machine code which is patched back in later. The
-          trap is 1 instruction word long. */
-
-       mcode = *((uint32_t *) cd->mcodeptr);
-
-       /* ALD is 4 byte aligned, ILD 2, only LWZ is byte aligned */
-       M_LWZ(REG_ZERO, REG_ZERO, TRAP_PATCHER);
+       M_ILLEGAL;
 
        return mcode;
 }
index 977992e33b2c4439eb3c50ea5f416cdec376527b..686f5f486a243c7f0d2affd86f2cb69c1e6bad1b 100644 (file)
@@ -153,6 +153,41 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
 }
 
 
+/**
+ * Signal handler for patcher calls.
+ */
+void md_signal_handler_sigill(int sig, siginfo_t* siginfo, void* _p)
+{
+       ucontext_t* _uc = (ucontext_t*) _p;
+       mcontext_t* _mc = &(_uc->uc_mcontext);
+
+       /* get register values */
+
+       void* pv = (void*) _mc->gp_regs[REG_PV];
+       void* sp = (void*) _mc->gp_regs[REG_SP];
+       void* ra = (void*) _mc->gp_regs[PT_LNK]; // The RA is correct for leag methods.
+       void* xpc =(void*) _mc->gp_regs[PT_NIP];
+
+       // Get the illegal-instruction.
+       uint32_t mcode = *((uint32_t*) xpc);
+
+       // This signal is always a patcher.
+       int      type = TRAP_PATCHER;
+       intptr_t val  = 0;
+
+       // Handle the trap.
+       void* p = trap_handle(type, val, pv, sp, ra, xpc, _p);
+
+       // Set registers if we have an exception, continue execution
+       // otherwise.
+       if (p != NULL) {
+               _mc->gp_regs[REG_ITMP1_XPTR] = (uintptr_t) p;
+               _mc->gp_regs[REG_ITMP2_XPC]  = (uintptr_t) xpc;
+               _mc->gp_regs[PT_NIP]         = (uintptr_t) asm_handle_exception;
+       }
+}
+
+
 /* md_signal_handler_sigusr2 ***************************************************
 
    Signal handler for profiling sampling.
index dad8d1f7dfcab9b9cfc2d0b56e136edee12b4e1f..3830d1598ef9eb95c94cd248c7182f98105675bf 100644 (file)
@@ -53,13 +53,15 @@ enum {
 
        TRAP_ClassCastException             = 5,
        TRAP_CHECK_EXCEPTION                = 6,
-       TRAP_PATCHER                        = 7,
+       TRAP_COMPILER                       = 7,
 
        /* Don't use 8 (could be a normal load offset). */
 
-       TRAP_COMPILER                       = 9,
-       TRAP_COUNTDOWN                      = 10,
-       TRAP_END
+       TRAP_COUNTDOWN                      = 9,
+       TRAP_END,
+
+       // This handled via SIGILL.
+       TRAP_PATCHER                        = 99 // A large number.
 };
 
 #endif /* _MD_TRAP_H */
index 59132fbea4f7c2d9f67794a1003271e1cb72f8e3..b32cfb5862512fc0f19b892302f661dee7cdf3b5 100644 (file)
@@ -139,7 +139,7 @@ bool signal_init(void)
                                                           SA_NODEFER | SA_SIGINFO);
 #  endif
 
-#  if defined(__ALPHA__) || defined(__ARM__) || defined(__I386__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__)
+#  if defined(__ALPHA__) || defined(__ARM__) || defined(__I386__) || defined(__POWERPC64__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__)
                /* XXX use better defines for that (in arch.h) */
                /* SIGILL handler */
 
index c94ba4c8dee02db093e2e01ebef275943a34bfc3..357b449333ddfca6b3132c83565bf4d6f8984239 100644 (file)
@@ -64,7 +64,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p);
 void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p);
 #endif
 
-#if defined(__ALPHA__) || defined(__ARM__) || defined(__I386__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__)
+#if defined(__ALPHA__) || defined(__ARM__) || defined(__I386__) || defined(__POWERPC64__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__)
 /* XXX use better defines for that (in arch.h) */
 void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p);
 #endif