/* src/vm/jit/sparc64/solaris/md-os.c - machine dependent SPARC Solaris functions
- 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-2005, 2006, 2007, 2008
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Christian Thalinger
-
- Changes:
-
- $Id: md-os.c 4357 2006-01-22 23:33:38Z twisti $
-
*/
+
#include "config.h"
#include <assert.h>
+#include <stdint.h>
#include <ucontext.h>
/* work around name clash */
-#define REG_SP_OS REG_SP
#undef REG_SP
#include "vm/types.h"
#include "vm/jit/sparc64/codegen.h"
#include "vm/jit/sparc64/md-abi.h"
-#include "vm/exceptions.h"
-#include "vm/signallocal.h"
-#include "vm/stringlocal.h"
+#include "vm/signallocal.hpp"
+
#include "vm/jit/asmpart.h"
-#include "vm/jit/stacktrace.h"
+#include "vm/jit/stacktrace.hpp"
+#include "vm/jit/trap.h"
ptrint md_get_reg_from_context(mcontext_t *_mc, u4 rindex)
if (rindex <= 15) {
/* register is in global or out range, available in context */
+ val = _mc->gregs[rindex + 3];
}
else {
assert(rindex <= 31);
/* register is local or in, need to fetch from regsave area on stack */
- /*
- window = ctx->sigc_regs.u_regs[REG_SP] + BIAS;
+
+ window = (s8 *) (_mc->gregs[REG_O6] + BIAS);
val = window[rindex - 16];
- */
+
}
return val;
}
+
/* md_signal_handler_sigsegv ***************************************************
NullPointerException signal handler for hardware null pointer
void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
{
- ucontext_t *_uc;
- mcontext_t *_mc;
- u4 instr;
- ptrint addr;
- u1 *pv;
- u1 *sp;
- u1 *ra;
- u1 *xpc;
- s4 d;
- s4 s1;
- s4 disp;
- ptrint val;
- s4 type;
- java_objectheader *e;
+ ucontext_t *_uc;
+ mcontext_t *_mc;
+ ptrint addr;
+ u1 *pv;
+ u1 *sp;
+ u1 *ra;
+ u1 *xpc;
+ u4 mcode;
+ int d;
+ int s1;
+ int16_t disp;
+ intptr_t val;
+ int type;
+ void *p;
_uc = (ucontext_t *) _p;
_mc = &_uc->uc_mcontext;
pv = (u1 *) md_get_reg_from_context(_mc, REG_PV_CALLEE);
-#if 0
- sp = (u1 *) md_get_reg_from_context(ctx, REG_SP);
- ra = (u1 *) md_get_reg_from_context(ctx, REG_RA_CALLEE); /* this is correct for leafs */
- xpc = (u1 *) ctx->sigc_regs.tpc;
+ sp = (u1 *) _mc->gregs[REG_O6];
+ ra = (u1 *) md_get_reg_from_context(_mc, REG_RA_CALLEE);
+ xpc = (u1 *) _mc->gregs[REG_PC];
+
/* get exception-throwing instruction */
/* flush register windows? */
- val = md_get_reg_from_context(ctx, d);
+ val = md_get_reg_from_context(_mc, d);
/* check for special-load */
/* This is a normal NPE: addr must be NULL and the NPE-type
define is 0. */
- addr = md_get_reg_from_context(ctx, s1);
- type = (s4) addr;
+ addr = md_get_reg_from_context(_mc, s1);
+ type = (int) addr;
}
-#endif
- e = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val);
-
- /* set registers */
-
- _mc->gregs[REG_G2] = (ptrint) e; /* REG_ITMP2_XPTR */
- _mc->gregs[REG_G3] = (ptrint) xpc; /* REG_ITMP3_XPC */
- _mc->gregs[REG_PC] = (ptrint) asm_handle_exception;
- _mc->gregs[REG_nPC] = (ptrint) asm_handle_exception + 4;
-#if 0
- if (addr == 0) {
+ /* Handle the trap. */
- pv = (u1 *) _mc->gregs[REG_G3];
- sp = (u1 *) (_uc->uc_stack.ss_sp);
- /*ra = (u1 *) _mc->mc_i7;*/ /* this is correct for leafs */
- ra = 0;
- xpc = (u1 *) _mc->gregs[REG_PC];
-
- _mc->gregs[REG_G4] =
- (ptrint) stacktrace_hardware_nullpointerexception(pv, sp, ra, xpc);
-
- _mc->gregs[REG_G5] = (ptrint) xpc;
- _mc->gregs[REG_PC] = (ptrint) asm_handle_exception;
-
- } else {
- addr += (long) ((instr << 16) >> 16);
-
- /*
- throw_cacao_exception_exit(string_java_lang_InternalError,
- "Segmentation fault: 0x%016lx at 0x%016lx\n",
- addr, _mc->mc_gregs[MC_PC]);
- */
- assert(0);
- }
-#endif
-}
-
-
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
-void thread_restartcriticalsection(ucontext_t *_uc)
-{
- mcontext_t *_mc;
- void *critical;
-
- _mc = &_uc->uc_mcontext;
+ p = trap_handle(type, val, pv, sp, ra, xpc, _p);
- critical = thread_checkcritical((void *) _mc->sc_pc);
+ /* Set registers. */
- if (critical)
- _mc->sc_pc = (ptrint) critical;
+ _mc->gregs[REG_G2] = (uintptr_t) p; /* REG_ITMP2_XPTR */
+ _mc->gregs[REG_G3] = (uintptr_t) xpc; /* REG_ITMP3_XPC */
+ _mc->gregs[REG_PC] = (uintptr_t) asm_handle_exception;
+ _mc->gregs[REG_nPC] = (uintptr_t) asm_handle_exception + 4;
}
-#endif
/* md_icacheflush **************************************************************