From e0a966ee1597b6d84637263ae368389b32b24710 Mon Sep 17 00:00:00 2001 From: gbeauche <> Date: Mon, 23 Jan 2006 23:57:41 +0000 Subject: [PATCH] Code I wrote yesterday was totally broken. It's enough to make sure nPC is correctly updated too... Instruction skipper now works on Solaris/SPARC. --- BasiliskII/src/Unix/sigsegv.cpp | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/BasiliskII/src/Unix/sigsegv.cpp b/BasiliskII/src/Unix/sigsegv.cpp index 21a0bde6..3ff29567 100644 --- a/BasiliskII/src/Unix/sigsegv.cpp +++ b/BasiliskII/src/Unix/sigsegv.cpp @@ -1291,6 +1291,7 @@ enum { SPARC_REG_G1 = REG_G1, SPARC_REG_O0 = REG_O0, SPARC_REG_PC = REG_PC, + SPARC_REG_nPC = REG_nPC #endif }; static bool sparc_skip_instruction(unsigned long * regs, gwindows_t * gwins, struct rwindow * rwin) @@ -1384,24 +1385,6 @@ static bool sparc_skip_instruction(unsigned long * regs, gwindows_t * gwins, str // Zero target register in case of a load operation if (transfer_type == SIGSEGV_TRANSFER_LOAD && reg != 0) { -#if defined(__sun__) - /* - * NOTE: special trampoline code to zero out the target register - * - The code is not reentrant - * - The ABI specifies that data below %sp is undefined, can we - * really write to it in that case? - */ - static unsigned int code[4]; - if (sizeof(void *) == 8) - code[0] = 0xc05bbff8|(reg << 25); // ldx [%sp - 8], %reg - else - code[0] = 0xc003bff8|(reg << 25); // ld [%sp - 8], %reg - code[1] = 0x81c00000|(reg << 14); // jmpl %reg - code[2] = 0x80102000|(reg << 25); // clr %reg - *((unsigned long *)regs[SPARC_REG_O0 + 6]) = regs[SPARC_REG_PC] + 4; - regs[SPARC_REG_PC] = (unsigned long)code; - return true; -#else // FIXME: code to handle local & input registers is not tested if (reg >= 1 && reg < 8) { // global registers @@ -1425,10 +1408,10 @@ static bool sparc_skip_instruction(unsigned long * regs, gwindows_t * gwins, str else rwin->rw_in[reg - 24] = 0; } -#endif } regs[SPARC_REG_PC] += 4; + regs[SPARC_REG_nPC] += 4; return true; } #endif