X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fpowerpc%2Fdarwin%2Fmd-os.c;h=de7d5e8b32c31544f39bda707a752d4edd375591;hb=04c3ee00a5601736013737e98ef8106f582bffd4;hp=00d55d68f0a78e9e4d6591a2f169e869f294600a;hpb=30c38a99c738b1c6c8867171423bcb04c3ab42b8;p=cacao.git diff --git a/src/vm/jit/powerpc/darwin/md-os.c b/src/vm/jit/powerpc/darwin/md-os.c index 00d55d68f..de7d5e8b3 100644 --- a/src/vm/jit/powerpc/darwin/md-os.c +++ b/src/vm/jit/powerpc/darwin/md-os.c @@ -1,9 +1,7 @@ /* src/vm/jit/powerpc/darwin/md-os.c - machine dependent PowerPC Darwin functions - Copyright (C) 1996-2005 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, 2009 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -19,138 +17,164 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. - - Contact: cacao@complang.tuwien.ac.at - - Authors: Christian Thalinger - - Changes: - - $Id: md-os.c 2921 2005-07-07 09:26:30Z twisti $ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ +#include "config.h" + +#include #include +#include #include -#include "config.h" +#include "vm/types.h" -#include "vm/jit/powerpc/types.h" +#include "vm/jit/powerpc/codegen.h" #include "vm/jit/powerpc/darwin/md-abi.h" -#include "vm/exceptions.h" -#include "vm/global.h" -#include "vm/stringlocal.h" -#include "vm/jit/asmpart.h" +#include "threads/thread.hpp" +#include "vm/signallocal.hpp" -#if 0 -/* cacao_catch_Handler ********************************************************* +#include "vm/jit/trap.hpp" - XXX +#if !__DARWIN_UNIX03 +#define __srr0 srr0 +#define __r0 r0 +#define __r1 r1 +#define __r13 r13 +#define __lr lr +#define __ss ss +#endif + +/** + * Signal handler for hardware-exceptions. + */ +void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) +{ + ucontext_t* _uc = (ucontext_t *) _p; + mcontext_t _mc = _uc->uc_mcontext; + ppc_thread_state_t* _ss = &(_mc->__ss); + + void* xpc = (void*) _ss->__srr0; + + // Handle the trap. + trap_handle(TRAP_SIGSEGV, xpc, _p); +} -*******************************************************************************/ -int cacao_catch_Handler(mach_port_t thread) +/** + * Signal handler for hardware-traps. + */ +void md_signal_handler_sigtrap(int sig, siginfo_t *siginfo, void *_p) { -#if defined(USE_THREADS) - unsigned int *regs; - unsigned int crashpc; - s4 instr, reg; -/* java_objectheader *xptr; */ - - /* Mach stuff */ - thread_state_flavor_t flavor = PPC_THREAD_STATE; - mach_msg_type_number_t thread_state_count = PPC_THREAD_STATE_COUNT; - ppc_thread_state_t thread_state; - kern_return_t r; - - if (checknull) - return 0; - - r = thread_get_state(thread, flavor, - (natural_t*)&thread_state, &thread_state_count); - if (r != KERN_SUCCESS) { - log_text("thread_get_state failed"); - assert(0); - } - - regs = &thread_state.r0; - crashpc = thread_state.srr0; - - instr = *(s4*) crashpc; - reg = (instr >> 16) & 31; - - if (!regs[reg]) { -/* This is now handled in asmpart because it needs to run in the throwing - * thread */ -/* xptr = new_nullpointerexception(); */ - - regs[REG_ITMP2_XPC] = crashpc; -/* regs[REG_ITMP1_XPTR] = (u4) xptr; */ - thread_state.srr0 = (u4) asm_handle_nullptr_exception; - - r = thread_set_state(thread, flavor, - (natural_t*)&thread_state, thread_state_count); - if (r != KERN_SUCCESS) { - log_text("thread_set_state failed"); - assert(0); - } - - return 1; - } - - throw_cacao_exception_exit(string_java_lang_InternalError, - "Segmentation fault at %p", regs[reg]); -#endif + ucontext_t* _uc = (ucontext_t *) _p; + mcontext_t _mc = _uc->uc_mcontext; + ppc_thread_state_t* _ss = &(_mc->__ss); + + void* xpc = (void*) _ss->__srr0; - return 0; + // Handle the trap. + trap_handle(TRAP_SIGTRAP, xpc, _p); } -#endif -/* signal_handler_sigsegv ****************************************************** +/** + * Signal handler for hardware-patchers. + */ +void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p) +{ + ucontext_t* _uc = (ucontext_t *) _p; + mcontext_t _mc = _uc->uc_mcontext; + ppc_thread_state_t* _ss = &(_mc->__ss); + + void* xpc = (void*) _ss->__srr0; + + // Handle the trap. + trap_handle(TRAP_SIGILL, xpc, _p); +} + - NullPointerException signal handler for hardware null pointer check. +/* md_signal_handler_sigusr2 *************************************************** + + Signal handler for profiling sampling. *******************************************************************************/ -void signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) +void md_signal_handler_sigusr2(int sig, siginfo_t *siginfo, void *_p) { - ucontext_t *uc; - mcontext_t mc; - ppc_thread_state_t *ss; - ptrint *gregs; - u4 instr; - s4 reg; - ptrint addr; + threadobject *t; + ucontext_t *_uc; + mcontext_t _mc; + ppc_thread_state_t *_ss; + u1 *pc; + + t = THREADOBJECT; - uc = (ucontext_t *) _p; - mc = uc->uc_mcontext; - ss = &mc->ss; + _uc = (ucontext_t *) _p; + _mc = _uc->uc_mcontext; + _ss = &_mc->__ss; - /* check for NullPointerException */ + pc = (u1 *) _ss->__srr0; - gregs = &ss->r0; + t->pc = pc; +} - instr = *((u4 *) ss->srr0); - reg = (instr >> 16) & 31; - addr = gregs[reg]; - if (addr == 0) { - /* set the REG_ITMP1_XPTR, REG_ITMP2_XPC and new PC */ +/* md_executionstate_read ****************************************************** - ss->r11 = (ptrint) new_nullpointerexception(); - ss->r12 = ss->srr0; - ss->srr0 = (ptrint) asm_handle_exception; + Read the given context into an executionstate. + +*******************************************************************************/ - } else { - throw_cacao_exception_exit(string_java_lang_InternalError, - "Segmentation fault at 0x%08lx", addr); - } +void md_executionstate_read(executionstate_t *es, void *context) +{ + ucontext_t* _uc = (ucontext_t *) context; + mcontext_t _mc = _uc->uc_mcontext; + ppc_thread_state_t* _ss = &(_mc->__ss); + + /* read special registers */ + es->pc = (uint8_t*) _ss->__srr0; + es->sp = (uint8_t*) _ss->__r1; + es->pv = (uint8_t*) _ss->__r13; + es->ra = (uint8_t*) _ss->__lr; + + /* read integer registers */ + unsigned int* regs = &(_ss->__r0); + for (int i = 0; i < INT_REG_CNT; i++) + es->intregs[i] = regs[i]; + + /* read float registers */ + for (int i = 0; i < FLT_REG_CNT; i++) + es->fltregs[i] = 0xdeadbeefdeadbeefULL; +} + + +/* md_executionstate_write ***************************************************** + + Write the given executionstate back to the context. + +*******************************************************************************/ + +void md_executionstate_write(executionstate_t *es, void *context) +{ + ucontext_t* _uc = (ucontext_t *) context; + mcontext_t _mc = _uc->uc_mcontext; + ppc_thread_state_t* _ss = &(_mc->__ss); + + /* write integer registers */ + unsigned int* regs = &(_ss->__r0); + for (int i = 0; i < INT_REG_CNT; i++) + regs[i] = es->intregs[i]; + + /* write special registers */ + _ss->__srr0 = (intptr_t) es->pc; + _ss->__r1 = (intptr_t) es->sp; + _ss->__r13 = (intptr_t) es->pv; + _ss->__lr = (intptr_t) es->ra; }