X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Falpha%2Flinux%2Fmd-os.c;h=afe391d11b2b86b0abc946d0a0ff509ff7ff80e1;hb=8c81647e1c96715f45498a3ada7f795b5c9dfe81;hp=013bd02b18fbb79d1da608874df5b5c2a4f5d8af;hpb=73c9a2040537f25f62de34ca6bf5502f5c1edf05;p=cacao.git diff --git a/src/vm/jit/alpha/linux/md-os.c b/src/vm/jit/alpha/linux/md-os.c index 013bd02b1..afe391d11 100644 --- a/src/vm/jit/alpha/linux/md-os.c +++ b/src/vm/jit/alpha/linux/md-os.c @@ -1,9 +1,7 @@ /* src/vm/jit/alpha/linux/md-os.c - machine dependent Alpha 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,20 @@ #include "vm/types.h" #include "vm/jit/alpha/codegen.h" +#include "vm/jit/alpha/md.h" #include "vm/jit/alpha/md-abi.h" -#if defined(ENABLE_THREADS) -# include "threads/native/threads.h" -#endif +#include "threads/thread.h" -#include "vm/exceptions.h" +#include "vm/builtin.h" #include "vm/signallocal.h" #include "vm/jit/asmpart.h" +#include "vm/jit/executionstate.h" #include "vm/jit/stacktrace.h" +#include "vm/jit/trap.h" + +#include "vmcore/system.h" /* md_signal_handler_sigsegv *************************************************** @@ -96,7 +97,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) 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. */ @@ -111,14 +112,14 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) 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->sc_regs[REG_PV] = (uintptr_t) p; _mc->sc_pc = (uintptr_t) p; @@ -133,13 +134,13 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) /* Get the exception object. */ - p = exceptions_get_and_clear_exception(); + p = builtin_retrieve_exception(); assert(p != NULL); /* fall-through */ - case EXCEPTION_HARDWARE_PATCHER: + case TRAP_PATCHER: if (p == NULL) break; @@ -206,18 +207,17 @@ void md_signal_handler_sigusr2(int sig, siginfo_t *siginfo, void *_p) #endif -/* md_replace_executionstate_read ********************************************** +/* md_executionstate_read ****************************************************** - Read the given context into an executionstate for Replacement. + Read the given context into an executionstate. *******************************************************************************/ -#if defined(ENABLE_REPLACEMENT) -void md_replace_executionstate_read(executionstate_t *es, void *context) +void md_executionstate_read(executionstate_t *es, void *context) { ucontext_t *_uc; mcontext_t *_mc; - s4 i; + int i; _uc = (ucontext_t *) context; _mc = &_uc->uc_mcontext; @@ -226,30 +226,32 @@ void md_replace_executionstate_read(executionstate_t *es, void *context) es->pc = (u1 *) _mc->sc_pc; es->sp = (u1 *) _mc->sc_regs[REG_SP]; es->pv = (u1 *) _mc->sc_regs[REG_PV]; + es->ra = (u1 *) _mc->sc_regs[REG_RA]; /* read integer registers */ for (i = 0; i < INT_REG_CNT; i++) es->intregs[i] = _mc->sc_regs[i]; /* read float registers */ - for (i = 0; i < FLT_REG_CNT; i++) - es->fltregs[i] = _mc->sc_fpregs[i]; + /* Do not use the assignment operator '=', as the type of + * the _mc->sc_fpregs[i] can cause invalid conversions. */ + + assert(sizeof(_mc->sc_fpregs) == sizeof(es->fltregs)); + system_memcpy(&es->fltregs, &_mc->sc_fpregs, sizeof(_mc->sc_fpregs)); } -#endif -/* md_replace_executionstate_write ********************************************* +/* md_executionstate_write ***************************************************** - Write the given executionstate back to the context for Replacement. + Write the given executionstate back to the context. *******************************************************************************/ -#if defined(ENABLE_REPLACEMENT) -void md_replace_executionstate_write(executionstate_t *es, void *context) +void md_executionstate_write(executionstate_t *es, void *context) { ucontext_t *_uc; mcontext_t *_mc; - s4 i; + int i; _uc = (ucontext_t *) context; _mc = &_uc->uc_mcontext; @@ -259,15 +261,18 @@ void md_replace_executionstate_write(executionstate_t *es, void *context) _mc->sc_regs[i] = es->intregs[i]; /* write float registers */ - for (i = 0; i < FLT_REG_CNT; i++) - _mc->sc_fpregs[i] = es->fltregs[i]; + /* Do not use the assignment operator '=', as the type of + * the _mc->sc_fpregs[i] can cause invalid conversions. */ + + assert(sizeof(_mc->sc_fpregs) == sizeof(es->fltregs)); + system_memcpy(&_mc->sc_fpregs, &es->fltregs, sizeof(_mc->sc_fpregs)); /* write special registers */ _mc->sc_pc = (ptrint) es->pc; _mc->sc_regs[REG_SP] = (ptrint) es->sp; _mc->sc_regs[REG_PV] = (ptrint) es->pv; + _mc->sc_regs[REG_RA] = (ptrint) es->ra; } -#endif /* md_critical_section_restart *************************************************