* Removed all Id tags.
[cacao.git] / src / vm / jit / sparc64 / solaris / md-os.c
index 6a995ac625367aab4d60e71e3275f0fcdda135f7..d1528079df1b58bd58791be656870e235b59e0e3 100644 (file)
@@ -1,6 +1,6 @@
 /* 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"
@@ -68,21 +61,23 @@ 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
@@ -92,30 +87,30 @@ ptrint md_get_reg_from_context(mcontext_t *_mc, u4 rindex)
 
 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 */        
 
@@ -127,7 +122,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
 
        /* flush register windows? */
        
-       val   = md_get_reg_from_context(ctx, d);
+       val  = md_get_reg_from_context(_mc, d);
 
        /* check for special-load */
 
@@ -140,45 +135,28 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                /* 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;      
 }