X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fpowerpc%2Flinux%2Fmd-os.c;h=cdc937f5a8e329af60f7d9b1d1ff3aeb0bd52cec;hb=b76e356b0af200d2568e6fc55e82e233f1808eb9;hp=81863aee40306b211eb3b7fe9feb7ca57862e73b;hpb=442995cf7995968cef0869f3dfba20b609cbe5be;p=cacao.git diff --git a/src/vm/jit/powerpc/linux/md-os.c b/src/vm/jit/powerpc/linux/md-os.c index 81863aee4..cdc937f5a 100644 --- a/src/vm/jit/powerpc/linux/md-os.c +++ b/src/vm/jit/powerpc/linux/md-os.c @@ -1,9 +1,7 @@ /* src/vm/jit/powerpc/linux/md-os.c - machine dependent PowerPC 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. @@ -34,17 +32,18 @@ #include "vm/types.h" #include "vm/jit/powerpc/codegen.h" +#include "vm/jit/powerpc/md.h" #include "vm/jit/powerpc/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/stringlocal.h" + #include "vm/jit/asmpart.h" +#include "vm/jit/executionstate.h" #if defined(ENABLE_PROFILING) # include "vm/jit/optimizing/profile.h" @@ -52,6 +51,8 @@ #include "vm/jit/stacktrace.h" +#include "vmcore/system.h" + /* md_signal_handler_sigsegv *************************************************** @@ -299,6 +300,88 @@ void md_signal_handler_sigusr2(int sig, siginfo_t *siginfo, void *_p) #endif +/* md_executionstate_read ****************************************************** + + Read the given context into an executionstate. + +*******************************************************************************/ + +void md_executionstate_read(executionstate_t *es, void *context) +{ + ucontext_t *_uc; + mcontext_t *_mc; + unsigned long *_gregs; + s4 i; + + _uc = (ucontext_t *) context; + +#if defined(__UCLIBC__) +#error Please port md_executionstate_read to __UCLIBC__ +#else + _mc = _uc->uc_mcontext.uc_regs; + _gregs = _mc->gregs; +#endif + + /* 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]; + + /* 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)); +} + + +/* md_executionstate_write ***************************************************** + + Write the given executionstate back to the context. + +*******************************************************************************/ + +void md_executionstate_write(executionstate_t *es, void *context) +{ + ucontext_t *_uc; + mcontext_t *_mc; + unsigned long *_gregs; + s4 i; + + _uc = (ucontext_t *) context; + +#if defined(__UCLIBC__) +#error Please port md_executionstate_write to __UCLIBC__ +#else + _mc = _uc->uc_mcontext.uc_regs; + _gregs = _mc->gregs; +#endif + + /* 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; +} + + /* md_critical_section_restart ************************************************* Search the critical sections tree for a matching section and set