* Removed all Id tags.
[cacao.git] / src / vm / jit / sparc64 / solaris / md-os.c
index d5414e1a7d304e57f93aa99395a466a3519b0212..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 */
@@ -83,6 +77,7 @@ ptrint md_get_reg_from_context(mcontext_t *_mc, u4 rindex)
        return val;
 }
 
+
 /* md_signal_handler_sigsegv ***************************************************
 
    NullPointerException signal handler for hardware null pointer
@@ -92,21 +87,21 @@ 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;
-       ptrint       addr;
-       u1          *pv;
-       u1          *sp;
-       u1          *ra;
-       u1          *xpc;
-       u4           mcode;
-       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;
@@ -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(_mc, d);
+       val  = md_get_reg_from_context(_mc, d);
 
        /* check for special-load */
 
@@ -141,17 +136,27 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                   define is 0. */
 
                addr  = md_get_reg_from_context(_mc, s1);
-               type = (s4) addr;
+               type = (int) addr;
        }
 
-       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;        
+       _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;      
 }