From: Michael Starzinger Date: Tue, 16 Sep 2008 12:03:22 +0000 (+0200) Subject: * src/vm/jit/trap.c (trap_handle) [__POWERPC64__]: Use executionstate for trap X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=dcc439c91b5f5c6b6f56b486c964db912ce2e3c2;hp=b888e3c868a239a45fa77770a8294485f1154b53;p=cacao.git * src/vm/jit/trap.c (trap_handle) [__POWERPC64__]: Use executionstate for trap handling. * src/vm/jit/powerpc64/linux/md-os.c: Simplified signal handlers. (md_executionstate_read): Implemented. (md_executionstate_write): Implemented. --- diff --git a/src/vm/jit/powerpc64/linux/md-os.c b/src/vm/jit/powerpc64/linux/md-os.c index f6ed327f9..ebb284b44 100644 --- a/src/vm/jit/powerpc64/linux/md-os.c +++ b/src/vm/jit/powerpc64/linux/md-os.c @@ -74,7 +74,6 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) int type; intptr_t addr; intptr_t val; - void *p; _uc = (ucontext_t *) _p; _mc = &(_uc->uc_mcontext); @@ -115,43 +114,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) /* Handle the trap. */ - p = trap_handle(type, val, pv, sp, ra, xpc, _p); - - /* Set registers. */ - - switch (type) { - case TRAP_COMPILER: - if (p != NULL) { - _mc->gp_regs[REG_PV] = (uintptr_t) p; - _mc->gp_regs[PT_NIP] = (uintptr_t) p; - break; - } - - /* Get and set the PV from the parent Java method. */ - - pv = md_codegen_get_pv_from_pc(ra); - - _mc->gp_regs[REG_PV] = (uintptr_t) pv; - - /* Get the exception object. */ - - p = builtin_retrieve_exception(); - - assert(p != NULL); - - /* fall-through */ - - case TRAP_PATCHER: - if (p == NULL) - break; - - /* fall-through */ - - default: - _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; - } + trap_handle(type, val, pv, sp, ra, xpc, _p); } @@ -194,15 +157,7 @@ void md_signal_handler_sigill(int sig, siginfo_t* siginfo, void* _p) 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; - } + trap_handle(type, val, pv, sp, ra, xpc, _p); } @@ -240,36 +195,31 @@ void md_signal_handler_sigusr2(int sig, siginfo_t *siginfo, void *_p) void md_executionstate_read(executionstate_t *es, void *context) { -#if 0 ucontext_t *_uc; mcontext_t *_mc; - unsigned long *_gregs; s4 i; _uc = (ucontext_t *) context; - - _mc = _uc->uc_mcontext.uc_regs; - _gregs = _mc->gregs; + _mc = &(_uc->uc_mcontext); /* read special registers */ - es->pc = (u1 *) _gregs[PT_NIP]; - es->sp = (u1 *) _gregs[REG_SP]; - es->pv = (u1 *) _gregs[REG_PV]; - es->ra = (u1 *) _gregs[PT_LNK]; + es->pc = (u1 *) _mc->gp_regs[PT_NIP]; + es->sp = (u1 *) _mc->gp_regs[REG_SP]; + es->pv = (u1 *) _mc->gp_regs[REG_PV]; + es->ra = (u1 *) _mc->gp_regs[PT_LNK]; /* read integer registers */ for (i = 0; i < INT_REG_CNT; i++) - es->intregs[i] = _gregs[i]; + es->intregs[i] = _mc->gp_regs[i]; /* read float registers */ /* Do not use the assignment operator '=', as the type of * the _mc->fpregs[i] can cause invalid conversions. */ - assert(sizeof(_mc->fpregs.fpregs) == sizeof(es->fltregs)); - os_memcpy(&es->fltregs, &_mc->fpregs.fpregs, sizeof(_mc->fpregs.fpregs)); -#endif - - vm_abort("md_executionstate_read: IMPLEMENT ME!"); + // The assertion below will fail because _mc->fp_regs[] also + // contains the "fpscr" register. + //assert(sizeof(_mc->fp_regs) == sizeof(es->fltregs)); + os_memcpy(&es->fltregs, &_mc->fp_regs, sizeof(es->fltregs)); } @@ -281,36 +231,31 @@ void md_executionstate_read(executionstate_t *es, void *context) void md_executionstate_write(executionstate_t *es, void *context) { -#if 0 ucontext_t *_uc; mcontext_t *_mc; - unsigned long *_gregs; s4 i; _uc = (ucontext_t *) context; - - _mc = _uc->uc_mcontext.uc_regs; - _gregs = _mc->gregs; + _mc = &(_uc->uc_mcontext); /* write integer registers */ for (i = 0; i < INT_REG_CNT; i++) - _gregs[i] = es->intregs[i]; + _mc->gp_regs[i] = es->intregs[i]; /* write float registers */ /* Do not use the assignment operator '=', as the type of * the _mc->fpregs[i] can cause invalid conversions. */ - assert(sizeof(_mc->fpregs.fpregs) == sizeof(es->fltregs)); - os_memcpy(&_mc->fpregs.fpregs, &es->fltregs, sizeof(_mc->fpregs.fpregs)); + // The assertion below will fail because _mc->fp_regs[] also + // contains the "fpscr" register. + //assert(sizeof(_mc->fp_regs) == sizeof(es->fltregs)); + os_memcpy(&_mc->fp_regs, &es->fltregs, sizeof(es->fltregs)); /* write special registers */ - _gregs[PT_NIP] = (ptrint) es->pc; - _gregs[REG_SP] = (ptrint) es->sp; - _gregs[REG_PV] = (ptrint) es->pv; - _gregs[PT_LNK] = (ptrint) es->ra; -#endif - - vm_abort("md_executionstate_write: IMPLEMENT ME!"); + _mc->gp_regs[PT_NIP] = (ptrint) es->pc; + _mc->gp_regs[REG_SP] = (ptrint) es->sp; + _mc->gp_regs[REG_PV] = (ptrint) es->pv; + _mc->gp_regs[PT_LNK] = (ptrint) es->ra; } diff --git a/src/vm/jit/trap.c b/src/vm/jit/trap.c index 642858b7c..86d5272f8 100644 --- a/src/vm/jit/trap.c +++ b/src/vm/jit/trap.c @@ -120,7 +120,7 @@ void* trap_handle(int type, intptr_t val, void *pv, void *sp, void *ra, void *xp o = NULL; m = NULL; -#if defined(__ARM__) || defined(__I386__) || defined(__POWERPC__) || defined(__X86_64__) +#if defined(__ARM__) || defined(__I386__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__) # if !defined(NDEBUG) /* Perform a sanity check on our execution state functions. */ @@ -240,7 +240,7 @@ void* trap_handle(int type, intptr_t val, void *pv, void *sp, void *ra, void *xp stacktrace_stackframeinfo_remove(&sfi); -#if defined(__ARM__) || defined(__I386__) || defined(__POWERPC__) || defined(__X86_64__) +#if defined(__ARM__) || defined(__I386__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__) /* Update execution state and set registers. */ /* AFTER: removing stackframeinfo */