From: Stefan Ring Date: Sat, 27 Jun 2009 15:33:23 +0000 (+0200) Subject: Now runs on OpenSolaris i386. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;ds=sidebyside;h=67fea233ee282f390d21ea14508ea0d87c11a11e;p=cacao.git Now runs on OpenSolaris i386. * src/vm/array.hpp, src/native/jni.cpp: Compile fixes (on OpenSolaris). * src/vm/jit/i386/arch.h: Added SKIP_REG_DEFS for Solaris build. Also #undef register symbols on Solaris. * src/vm/jit/i386/md-abi.h: #undef REG_SP on Solaris. * src/vm/jit/i386/codegen.c, src/vm/jit/i386/emit.c: Added an include in order to pick up the register defines from /usr/include/sys. * src/vm/jit/i386/solaris/md-os.c: Simplified signal handlers ("new-trap-decoding"). Also using UESP instead of ESP. * src/vm/jit/optimizing/recompiler.cpp: Fixed a bug. This "sanity" check is not sane in the presence of spurious wakeups. --- diff --git a/src/native/jni.cpp b/src/native/jni.cpp index 79919fe2c..25a9d77ae 100644 --- a/src/native/jni.cpp +++ b/src/native/jni.cpp @@ -1,6 +1,6 @@ /* src/native/jni.cpp - implementation of the Java Native Interface functions - Copyright (C) 1996-2005, 2006, 2007, 2008 + Copyright (C) 1996-2005, 2006, 2007, 2008, 2009 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -2876,7 +2876,7 @@ void _Jv_JNI_Release##name##ArrayElements(JNIEnv *env, type##Array array, \ } JNI_RELEASE_ARRAY_ELEMENTS(Boolean, jboolean, boolean, u1) -JNI_RELEASE_ARRAY_ELEMENTS(Byte, jbyte, byte, s1) +JNI_RELEASE_ARRAY_ELEMENTS(Byte, jbyte, byte, int8_t) JNI_RELEASE_ARRAY_ELEMENTS(Char, jchar, char, u2) JNI_RELEASE_ARRAY_ELEMENTS(Short, jshort, short, s2) JNI_RELEASE_ARRAY_ELEMENTS(Int, jint, int, s4) @@ -2907,7 +2907,7 @@ void _Jv_JNI_Get##name##ArrayRegion(JNIEnv *env, type##Array array, \ } JNI_GET_ARRAY_REGION(Boolean, jboolean, boolean, u1) -JNI_GET_ARRAY_REGION(Byte, jbyte, byte, s1) +JNI_GET_ARRAY_REGION(Byte, jbyte, byte, int8_t) JNI_GET_ARRAY_REGION(Char, jchar, char, u2) JNI_GET_ARRAY_REGION(Short, jshort, short, s2) JNI_GET_ARRAY_REGION(Int, jint, int, s4) @@ -2938,7 +2938,7 @@ void _Jv_JNI_Set##name##ArrayRegion(JNIEnv *env, type##Array array, \ } JNI_SET_ARRAY_REGION(Boolean, jboolean, boolean, u1) -JNI_SET_ARRAY_REGION(Byte, jbyte, byte, s1) +JNI_SET_ARRAY_REGION(Byte, jbyte, byte, int8_t) JNI_SET_ARRAY_REGION(Char, jchar, char, u2) JNI_SET_ARRAY_REGION(Short, jshort, short, s2) JNI_SET_ARRAY_REGION(Int, jint, int, s4) diff --git a/src/vm/array.hpp b/src/vm/array.hpp index ced1ab3a7..1097734dc 100644 --- a/src/vm/array.hpp +++ b/src/vm/array.hpp @@ -1,6 +1,6 @@ /* src/vm/array.hpp - Java array functions - Copyright (C) 2007 + Copyright (C) 2007, 2009 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO Copyright (C) 2008 Theobroma Systems Ltd. @@ -312,7 +312,7 @@ class ByteArray : public ArrayTemplate { public: ByteArray(java_handle_bytearray_t* h) : ArrayTemplate(h) {} ByteArray(int32_t length) : ArrayTemplate(length, primitivetype_table[ARRAYTYPE_BYTE].arrayclass) {} - int8_t* get_raw_data_ptr() { return ((java_bytearray_t*) get_handle())->data; } + int8_t* get_raw_data_ptr() { return (int8_t*) ((java_bytearray_t*) get_handle())->data; } }; class CharArray : public ArrayTemplate { diff --git a/src/vm/jit/i386/arch.h b/src/vm/jit/i386/arch.h index a154f54cc..f0bcdfc99 100644 --- a/src/vm/jit/i386/arch.h +++ b/src/vm/jit/i386/arch.h @@ -1,9 +1,7 @@ /* src/vm/jit/i386/arch.h - architecture defines for i386 - 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-2008, 2009 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -35,6 +33,21 @@ /* define x86 register numbers ************************************************/ +#if !defined(__SOLARIS__) || !defined(SKIP_REG_DEFS) + +#if defined(__SOLARIS__) + +#undef EAX +#undef ECX +#undef EDX +#undef EBX +#undef ESP +#undef EBP +#undef ESI +#undef EDI + +#endif + #define EAX 0 #define ECX 1 #define EDX 2 @@ -44,6 +57,8 @@ #define ESI 6 #define EDI 7 +#endif + /* define architecture features ***********************************************/ #define SUPPORT_DIVISION 1 diff --git a/src/vm/jit/i386/codegen.c b/src/vm/jit/i386/codegen.c index 10aa098df..14340d7a4 100644 --- a/src/vm/jit/i386/codegen.c +++ b/src/vm/jit/i386/codegen.c @@ -1,6 +1,6 @@ /* src/vm/jit/i386/codegen.c - machine code generator for i386 - Copyright (C) 1996-2005, 2006, 2007, 2008 + Copyright (C) 1996-2005, 2006, 2007, 2008, 2009 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -30,6 +30,7 @@ #include #include "vm/types.h" +#include "vm/os.hpp" #include "vm/jit/i386/md-abi.h" diff --git a/src/vm/jit/i386/emit.c b/src/vm/jit/i386/emit.c index 181799832..dfc62a78b 100644 --- a/src/vm/jit/i386/emit.c +++ b/src/vm/jit/i386/emit.c @@ -1,6 +1,6 @@ /* src/vm/jit/i386/emit.c - i386 code emitter functions - Copyright (C) 1996-2005, 2006, 2007, 2008 + Copyright (C) 1996-2005, 2006, 2007, 2008, 2009 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -28,6 +28,7 @@ #include #include "vm/types.h" +#include "vm/os.hpp" #include "vm/jit/i386/codegen.h" #include "vm/jit/i386/emit.h" diff --git a/src/vm/jit/i386/md-abi.h b/src/vm/jit/i386/md-abi.h index bc8a7bfed..ae8148d3e 100644 --- a/src/vm/jit/i386/md-abi.h +++ b/src/vm/jit/i386/md-abi.h @@ -1,9 +1,7 @@ /* src/vm/jit/i386/md-abi.h - defines for i386 Linux ABI - Copyright (C) 1996-2005, 2006 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-2008, 2009 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -22,12 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Contact: cacao@cacaojvm.org - - Authors: Christian Thalinger - - Changes: - */ @@ -53,6 +45,10 @@ #define REG_ITMP1_XPTR EAX /* exception pointer = temporary register 1 */ #define REG_ITMP2_XPC ECX /* exception pc = temporary register 2 */ +#if defined(__SOLARIS__) +#undef REG_SP +#endif + #define REG_SP ESP /* stack pointer */ /* floating point registers */ diff --git a/src/vm/jit/i386/solaris/md-os.c b/src/vm/jit/i386/solaris/md-os.c index 5526e4af1..911b62fb3 100644 --- a/src/vm/jit/i386/solaris/md-os.c +++ b/src/vm/jit/i386/solaris/md-os.c @@ -1,6 +1,6 @@ /* src/vm/jit/i386/solaris/md-os.c - machine dependent i386 Solaris functions - Copyright (C) 2008 + Copyright (C) 2008, 2009 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -29,115 +29,33 @@ #include #include "vm/types.h" +#include "vm/os.hpp" + +#define SKIP_REG_DEFS 1 #include "vm/jit/i386/codegen.h" #include "vm/jit/i386/md.h" #include "threads/thread.hpp" -#include "vm/jit/builtin.hpp" #include "vm/signallocal.hpp" -#include "vm/jit/asmpart.h" #include "vm/jit/executionstate.h" -#include "vm/jit/stacktrace.hpp" #include "vm/jit/trap.hpp" -/* md_signal_handler_sigsegv *************************************************** - - Signal handler for hardware exceptions. - -*******************************************************************************/ - +/** + * Signal handler for hardware exceptions. + */ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) { - ucontext_t *_uc; - mcontext_t *_mc; - u1 *pv; - u1 *sp; - u1 *ra; - u1 *xpc; - u1 opc; - u1 mod; - u1 rm; - s4 d; - s4 disp; - ptrint val; - s4 type; - void *p; - - _uc = (ucontext_t *) _p; - _mc = &_uc->uc_mcontext; - - pv = NULL; /* is resolved during stackframeinfo creation */ - sp = (u1 *) _mc->gregs[ESP]; - xpc = (u1 *) _mc->gregs[EIP]; - ra = xpc; /* return address is equal to XPC */ - - /* get exception-throwing instruction */ - - opc = M_ALD_MEM_GET_OPC(xpc); - mod = M_ALD_MEM_GET_MOD(xpc); - rm = M_ALD_MEM_GET_RM(xpc); - - /* for values see emit_mov_mem_reg and emit_mem */ - - if ((opc == 0x8b) && (mod == 0) && (rm == 5)) { - /* this was a hardware-exception */ - - d = M_ALD_MEM_GET_REG(xpc); - disp = M_ALD_MEM_GET_DISP(xpc); - - /* we use the exception type as load displacement */ - - type = disp; - - /* ATTENTION: The _mc->gregs layout is completely crazy! The - registers are reversed starting with number 4 for REG_EDI - (see /usr/include/sys/ucontext.h). We have to convert that - here. */ - - val = _mc->gregs[EAX - d]; - - if (type == TRAP_COMPILER) { - /* The PV from the compiler stub is equal to the XPC. */ - - pv = xpc; - - /* We use a framesize of zero here because the call pushed - the return addres onto the stack. */ - - ra = md_stacktrace_get_returnaddress(sp, 0); - - /* Skip the RA on the stack. */ - - sp = sp + 1 * SIZEOF_VOID_P; - - /* The XPC is the RA minus 2, because the RA points to the - instruction after the call. */ - - xpc = ra - 2; - } - } - else { - /* this was a normal NPE */ + ucontext_t *_uc = (ucontext_t *) _p; + mcontext_t *_mc = &_uc->uc_mcontext; - type = TRAP_NullPointerException; - val = 0; - } + void* xpc = (void*) _mc->gregs[EIP]; - /* Handle the trap. */ - - p = trap_handle(type, val, pv, sp, ra, xpc, _p); - - /* Set registers. */ - - if (type == TRAP_COMPILER) { - if (p == NULL) { - _mc->gregs[ESP] = (uintptr_t) sp; /* Remove RA from stack. */ - } - } + // Handle the trap. + trap_handle(TRAP_SIGSEGV, xpc, _p); } @@ -148,83 +66,34 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) *******************************************************************************/ +/** + * Signal handler for hardware divide by zero (ArithmeticException) + * check. + */ void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p) { - ucontext_t *_uc; - mcontext_t *_mc; - u1 *pv; - u1 *sp; - u1 *ra; - u1 *xpc; - s4 type; - ptrint val; + ucontext_t *_uc = (ucontext_t *) _p; + mcontext_t *_mc = &_uc->uc_mcontext; - _uc = (ucontext_t *) _p; - _mc = &_uc->uc_mcontext; - - pv = NULL; /* is resolved during stackframeinfo creation */ - sp = (u1 *) _mc->gregs[ESP]; - xpc = (u1 *) _mc->gregs[EIP]; - ra = xpc; /* return address is equal to xpc */ - - /* This is an ArithmeticException. */ + void* xpc = (void*) _mc->gregs[EIP]; - type = TRAP_ArithmeticException; - val = 0; - - /* Handle the trap. */ - - trap_handle(type, val, pv, sp, ra, xpc, _p); + // Handle the trap. + trap_handle(TRAP_SIGFPE, xpc, _p); } -/* md_signal_handler_sigill **************************************************** - - Signal handler for hardware patcher traps (ud2). - -*******************************************************************************/ - +/** + * Signal handler for hardware patcher traps (ud2). + */ void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p) { - ucontext_t *_uc; - mcontext_t *_mc; - u1 *pv; - u1 *sp; - u1 *ra; - u1 *xpc; - s4 type; - ptrint val; - - _uc = (ucontext_t *) _p; - _mc = &_uc->uc_mcontext; - - pv = NULL; /* is resolved during stackframeinfo creation */ - sp = (u1 *) _mc->gregs[ESP]; - xpc = (u1 *) _mc->gregs[EIP]; - ra = xpc; /* return address is equal to xpc */ - - // Check if the trap instruction is valid. - // TODO Move this into patcher_handler. - if (patcher_is_valid_trap_instruction_at(xpc) == false) { - // Check if the PC has been patched during our way to this - // signal handler (see PR85). - if (patcher_is_patched_at(xpc) == true) - return; - - // We have a problem... - log_println("md_signal_handler_sigill: Unknown illegal instruction at 0x%lx", xpc); -#if defined(ENABLE_DISASSEMBLER) - (void) disassinstr(xpc); -#endif - vm_abort("Aborting..."); - } - - type = TRAP_PATCHER; - val = 0; + ucontext_t *_uc = (ucontext_t *) _p; + mcontext_t *_mc = &_uc->uc_mcontext; - /* Handle the trap. */ + void* xpc = (void*) _mc->gregs[EIP]; - trap_handle(type, val, pv, sp, ra, xpc, _p); + // Handle the trap. + trap_handle(TRAP_SIGILL, xpc, _p); } @@ -247,7 +116,7 @@ void md_signal_handler_sigusr1(int sig, siginfo_t *siginfo, void *_p) /* get the PC and SP for this thread */ pc = (u1 *) _mc->gregs[EIP]; - sp = (u1 *) _mc->gregs[ESP]; + sp = (u1 *) _mc->gregs[UESP]; /* now suspend the current thread */ threads_suspend_ack(pc, sp); @@ -298,7 +167,7 @@ void md_executionstate_read(executionstate_t *es, void *context) /* read special registers */ es->pc = (u1 *) _mc->gregs[EIP]; - es->sp = (u1 *) _mc->gregs[ESP]; + es->sp = (u1 *) _mc->gregs[UESP]; es->pv = NULL; /* pv must be looked up via AVL tree */ /* read integer registers */ @@ -332,7 +201,7 @@ void md_executionstate_write(executionstate_t *es, void *context) /* write special registers */ _mc->gregs[EIP] = (ptrint) es->pc; - _mc->gregs[ESP] = (ptrint) es->sp; + _mc->gregs[UESP] = (ptrint) es->sp; } diff --git a/src/vm/jit/optimizing/recompiler.cpp b/src/vm/jit/optimizing/recompiler.cpp index 29fdc80d9..f6affc4be 100644 --- a/src/vm/jit/optimizing/recompiler.cpp +++ b/src/vm/jit/optimizing/recompiler.cpp @@ -1,6 +1,6 @@ /* src/vm/jit/optimizing/recompiler.cpp - recompilation system - Copyright (C) 1996-2005, 2006, 2007, 2008 + Copyright (C) 1996-2005, 2006, 2007, 2008, 2009 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -153,9 +153,6 @@ void Recompiler::thread() if (r._run == false) break; - // Sanity check. - assert(r._methods.empty() == false); - // Get the next method form the queue and recompile it. while (r._methods.empty() == false) { methodinfo* m = r._methods.front();