/* src/vm/jit/sparc64/solaris/md-os.c - machine dependent SPARC Solaris functions
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ 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
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"
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)
{
- stackframeinfo sfi;
- 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;
+ stackframeinfo sfi;
+ 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, &sfi);
+ /* create stackframeinfo */
+
+ stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
+ /* Handle the type. */
+
+ p = signal_handle(xpc, type, val);
+
+ /* remove stackframeinfo */
+
+ stacktrace_remove_stackframeinfo(&sfi);
/* 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) {
-
- 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
+ _mc->gregs[REG_G2] = (intptr_t) p; /* REG_ITMP2_XPTR */
+ _mc->gregs[REG_G3] = (intptr_t) xpc; /* REG_ITMP3_XPC */
+ _mc->gregs[REG_PC] = (intptr_t) asm_handle_exception;
+ _mc->gregs[REG_nPC] = (intptr_t) asm_handle_exception + 4;
}