* Updated header: Added 2006. Changed address of FSF. Changed email
[cacao.git] / src / vm / jit / i386 / freebsd / md-os.c
index 03cfc69420c1356de86b06adcfdc20575cf0ee69..6d5be3d9e5bd4b12d69a7e60d9dfd459e65a25d6 100644 (file)
@@ -1,9 +1,9 @@
 /* src/vm/jit/i386/freebsd/md-os.c - machine dependent i386 FreeBSD functions
 
-   Copyright (C) 1996-2005 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 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
 
    This file is part of CACAO.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
-   Contact: cacao@complang.tuwien.ac.at
+   Contact: cacao@cacaojvm.org
 
    Authors: Christian Thalinger
 
    Changes:
 
-   $Id: md-os.c 2916 2005-07-05 13:59:43Z twisti $
+   $Id: md-os.c 4357 2006-01-22 23:33:38Z twisti $
 
 */
 
 
+#include "config.h"
+
 #include <ucontext.h>
 
-#include "config.h"
 #include "vm/jit/i386/md-abi.h"
 
-#include "vm/stringlocal.h"
+#include "vm/exceptions.h"
+#include "vm/signallocal.h"
 #include "vm/jit/asmpart.h"
+#include "vm/jit/stacktrace.h"
 
 
-/* signal_handler_sigsegv ******************************************************
+/* md_signal_handler_sigsegv ***************************************************
 
-   NullPointerException signal handler for hardware null pointer check.
+   NullPointerException signal handler for hardware null pointer
+   check.
 
 *******************************************************************************/
 
-void signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
+void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
 {
        ucontext_t *_uc;
        mcontext_t *_mc;
+       u1         *sp;
+       u1         *ra;
+       u1         *xpc;
 
        _uc = (ucontext_t *) _p;
        _mc = &_uc->uc_mcontext;
        
-       _mc->mc_eax = (ptrint) string_java_lang_NullPointerException;
-       _mc->mc_ecx = _mc->mc_eip;                               /* REG_ITMP2_XPC */
-       _mc->mc_eip = (ptrint) asm_throw_and_handle_exception;
+       sp  = (u1 *) _mc->mc_esp;
+       xpc = (u1 *) _mc->mc_eip;
+       ra  = xpc;                          /* return address is equal to xpc     */
+
+       _mc->mc_eax =
+               (ptrint) stacktrace_hardware_nullpointerexception(NULL, sp, ra, xpc);
+       
+       _mc->mc_ecx = (ptrint) xpc;                              /* REG_ITMP2_XPC */
+       _mc->mc_eip = (ptrint) asm_handle_exception;
 }
 
 
-/* signal_handler_sigfpe *******************************************************
+/* md_signal_handler_sigfpe ****************************************************
 
-   ArithmeticException signal handler for hardware divide by zero check.
+   ArithmeticException signal handler for hardware divide by zero
+   check.
 
 *******************************************************************************/
 
-void signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
+void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
 {
        ucontext_t *_uc;
        mcontext_t *_mc;
+       u1         *sp;
+       u1         *ra;
+       u1         *xpc;
 
        _uc = (ucontext_t *) _p;
        _mc = &_uc->uc_mcontext;
 
-       _mc->mc_ecx = _mc->mc_eip;                               /* REG_ITMP2_XPC */
-       _mc->mc_eip = (ptrint) asm_throw_and_handle_hardware_arithmetic_exception;
+       sp  = (u1 *) _mc->mc_esp;
+       xpc = (u1 *) _mc->mc_eip;
+       ra  = xpc;                          /* return address is equal to xpc     */
+
+       _mc->mc_eax =
+               (ptrint) stacktrace_hardware_arithmeticexception(NULL, sp, ra, xpc);
+       
+       _mc->mc_ecx = (ptrint) xpc;                              /* REG_ITMP2_XPC */
+       _mc->mc_eip = (ptrint) asm_handle_exception;
 }