X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fpowerpc64%2Flinux%2Fmd-os.c;h=ab2a1c485a3aac2e357836e34570b5da1634561b;hb=a590a6d9252fd28eb6e248026186acce6e12e6d6;hp=98c2c2bbd0307b5d7732c47f4a66548472289c44;hpb=83879b304d381e289660d8c173b9eb42f3983818;p=cacao.git diff --git a/src/vm/jit/powerpc64/linux/md-os.c b/src/vm/jit/powerpc64/linux/md-os.c index 98c2c2bbd..ab2a1c485 100644 --- a/src/vm/jit/powerpc64/linux/md-os.c +++ b/src/vm/jit/powerpc64/linux/md-os.c @@ -1,9 +1,7 @@ /* src/vm/jit/powerpc64/linux/md-os.c - machine dependent PowerPC64 Linux functions - Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel, - C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring, - E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, - J. Wenninger, Institut f. Computersprachen - TU Wien + Copyright (C) 1996-2005, 2006, 2007, 2008 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -22,8 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: md-os.c 8283 2007-08-09 15:10:05Z twisti $ - */ @@ -36,22 +32,23 @@ #include "vm/types.h" #include "vm/jit/powerpc64/codegen.h" +#include "vm/jit/powerpc64/md.h" #include "vm/jit/powerpc64/linux/md-abi.h" -#if defined(ENABLE_THREADS) -# include "threads/native/threads.h" -#endif +#include "threads/thread.hpp" +#include "vm/builtin.h" #include "vm/exceptions.h" #include "vm/signallocal.h" #include "vm/jit/asmpart.h" +#include "vm/jit/executionstate.h" #if defined(ENABLE_PROFILING) # include "vm/jit/optimizing/profile.h" #endif -#include "vm/jit/stacktrace.h" +#include "vm/jit/trap.h" /* md_signal_handler_sigsegv *************************************************** @@ -62,7 +59,6 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) { - stackframeinfo sfi; ucontext_t *_uc; mcontext_t *_mc; u1 *pv; @@ -99,30 +95,61 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) val = _mc->gp_regs[d]; if (s1 == REG_ZERO) { - /* we use the exception type as load displacement */ + /* We use the exception type as load displacement. */ type = disp; + + if (type == TRAP_COMPILER) { + /* The XPC is the RA minus 1, because the RA points to the + instruction after the call. */ + + xpc = ra - 4; + } } else { - /* normal NPE */ + /* Normal NPE. */ addr = _mc->gp_regs[s1]; - type = (s4) addr; + type = (int) addr; } - /* create stackframeinfo */ + /* 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. */ - stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc); + pv = md_codegen_get_pv_from_pc(ra); - /* Handle the type. */ + _mc->gp_regs[REG_PV] = (uintptr_t) pv; - p = signal_handle(xpc, type, val); + /* Get the exception object. */ - /* remove stackframeinfo */ + p = builtin_retrieve_exception(); - stacktrace_remove_stackframeinfo(&sfi); + assert(p != NULL); - _mc->gp_regs[REG_ITMP1] = (intptr_t) p; - _mc->gp_regs[REG_ITMP2_XPC] = (intptr_t) xpc; - _mc->gp_regs[PT_NIP] = (intptr_t) asm_handle_exception; + /* 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; + } } @@ -152,31 +179,87 @@ void md_signal_handler_sigusr2(int sig, siginfo_t *siginfo, void *_p) #endif -/* md_critical_section_restart ************************************************* +/* md_executionstate_read ****************************************************** - Search the critical sections tree for a matching section and set - the PC to the restart point, if necessary. + Read the given context into an executionstate. *******************************************************************************/ -#if defined(ENABLE_THREADS) -void md_critical_section_restart(ucontext_t *_uc) +void md_executionstate_read(executionstate_t *es, void *context) { - mcontext_t *_mc; - u1 *pc; - u1 *npc; +#if 0 + ucontext_t *_uc; + mcontext_t *_mc; + unsigned long *_gregs; + s4 i; - _mc = &(_uc->uc_mcontext); + _uc = (ucontext_t *) context; - pc = (u1 *) _mc->gp_regs[PT_NIP]; + _mc = _uc->uc_mcontext.uc_regs; + _gregs = _mc->gregs; + + /* 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]; - npc = critical_find_restart_point(pc); + /* read integer registers */ + for (i = 0; i < INT_REG_CNT; i++) + es->intregs[i] = _gregs[i]; - if (npc != NULL) - _mc->gp_regs[PT_NIP] = (ptrint) npc; + /* 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)); + system_memcpy(&es->fltregs, &_mc->fpregs.fpregs, sizeof(_mc->fpregs.fpregs)); +#endif + + vm_abort("md_executionstate_read: IMPLEMENT ME!"); } + + +/* md_executionstate_write ***************************************************** + + Write the given executionstate back to the 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; + + /* write integer registers */ + for (i = 0; i < INT_REG_CNT; i++) + _gregs[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)); + system_memcpy(&_mc->fpregs.fpregs, &es->fltregs, sizeof(_mc->fpregs.fpregs)); + + /* 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!"); +} + /* * These are local overrides for various environment variables in Emacs.