X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fpowerpc64%2Flinux%2Fmd-os.c;h=5a0c0497b3512800e979c59b2adcbe2f7f9cbd12;hb=3696408991e1119ce2ed13203d8d3e53c6b92f4c;hp=771551676f370e7c922c57eb3d7fe504ffb54e80;hpb=a9be6929d101f0ed22f3acf1c24a8c44dbfd7e2d;p=cacao.git diff --git a/src/vm/jit/powerpc64/linux/md-os.c b/src/vm/jit/powerpc64/linux/md-os.c index 771551676..5a0c0497b 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. @@ -37,21 +35,21 @@ #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.h" #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 *************************************************** @@ -98,10 +96,10 @@ 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 == EXCEPTION_HARDWARE_COMPILER) { + if (type == TRAP_COMPILER) { /* The XPC is the RA minus 1, because the RA points to the instruction after the call. */ @@ -109,19 +107,19 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) } } else { - /* normal NPE */ + /* Normal NPE. */ addr = _mc->gp_regs[s1]; type = (int) addr; } - /* Handle the type. */ + /* Handle the trap. */ - p = signal_handle(type, val, pv, sp, ra, xpc, _p); + p = trap_handle(type, val, pv, sp, ra, xpc, _p); /* Set registers. */ switch (type) { - case EXCEPTION_HARDWARE_COMPILER: + case TRAP_COMPILER: if (p != NULL) { _mc->gp_regs[REG_PV] = (uintptr_t) p; _mc->gp_regs[PT_NIP] = (uintptr_t) p; @@ -142,7 +140,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) /* fall-through */ - case EXCEPTION_HARDWARE_PATCHER: + case TRAP_PATCHER: if (p == NULL) break; @@ -182,31 +180,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]; + + /* read integer registers */ + for (i = 0; i < INT_REG_CNT; i++) + es->intregs[i] = _gregs[i]; - npc = critical_find_restart_point(pc); + /* read float registers */ + /* Do not use the assignment operator '=', as the type of + * the _mc->fpregs[i] can cause invalid conversions. */ - if (npc != NULL) - _mc->gp_regs[PT_NIP] = (ptrint) npc; + 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.