hotspot/src/cpu/x86/vm/runtime_x86_32.cpp
Print this page
rev 611 : Merge
*** 1,10 ****
- #ifdef USE_PRAGMA_IDENT_SRC
- #pragma ident "@(#)runtime_x86_32.cpp 1.113 07/09/17 09:26:02 JVM"
- #endif
/*
! * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 79,146 ****
OopMapSet *oop_maps = new OopMapSet();
address start = __ pc();
! __ pushl(rdx);
! __ subl(rsp, return_off * wordSize); // Prolog!
// rbp, location is implicitly known
! __ movl(Address(rsp,rbp_off *wordSize),rbp);
// Store exception in Thread object. We cannot pass any arguments to the
// handle_exception call, since we do not want to make any assumption
// about the size of the frame where the exception happened in.
__ get_thread(rcx);
! __ movl(Address(rcx, JavaThread::exception_oop_offset()), rax);
! __ movl(Address(rcx, JavaThread::exception_pc_offset()), rdx);
// This call does all the hard work. It checks if an exception handler
// exists in the method.
// If so, it returns the handler address.
// If not, it prepares for stack-unwinding, restoring the callee-save
// registers of the frame being removed.
//
! __ movl(Address(rsp, thread_off * wordSize), rcx); // Thread is first argument
__ set_last_Java_frame(rcx, noreg, noreg, NULL);
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, OptoRuntime::handle_exception_C)));
// No registers to map, rbp is known implicitly
oop_maps->add_gc_map( __ pc() - start, new OopMap( framesize, 0 ));
__ get_thread(rcx);
__ reset_last_Java_frame(rcx, false, false);
// Restore callee-saved registers
! __ movl(rbp, Address(rsp, rbp_off * wordSize));
! __ addl(rsp, return_off * wordSize); // Epilog!
! __ popl(rdx); // Exception pc
// rax,: exception handler for given <exception oop/exception pc>
// We have a handler in rax, (could be deopt blob)
// rdx - throwing pc, deopt blob will need it.
! __ pushl(rax);
// rcx contains handler address
__ get_thread(rcx); // TLS
// Get the exception
! __ movl(rax, Address(rcx, JavaThread::exception_oop_offset()));
// Get the exception pc in case we are deoptimized
! __ movl(rdx, Address(rcx, JavaThread::exception_pc_offset()));
#ifdef ASSERT
! __ movl(Address(rcx, JavaThread::exception_handler_pc_offset()), 0);
! __ movl(Address(rcx, JavaThread::exception_pc_offset()), 0);
#endif
// Clear the exception oop so GC no longer processes it as a root.
! __ movl(Address(rcx, JavaThread::exception_oop_offset()), 0);
! __ popl(rcx);
// rax,: exception oop
// rcx: exception handler
// rdx: exception pc
__ jmp (rcx);
--- 76,143 ----
OopMapSet *oop_maps = new OopMapSet();
address start = __ pc();
! __ push(rdx);
! __ subptr(rsp, return_off * wordSize); // Prolog!
// rbp, location is implicitly known
! __ movptr(Address(rsp,rbp_off *wordSize), rbp);
// Store exception in Thread object. We cannot pass any arguments to the
// handle_exception call, since we do not want to make any assumption
// about the size of the frame where the exception happened in.
__ get_thread(rcx);
! __ movptr(Address(rcx, JavaThread::exception_oop_offset()), rax);
! __ movptr(Address(rcx, JavaThread::exception_pc_offset()), rdx);
// This call does all the hard work. It checks if an exception handler
// exists in the method.
// If so, it returns the handler address.
// If not, it prepares for stack-unwinding, restoring the callee-save
// registers of the frame being removed.
//
! __ movptr(Address(rsp, thread_off * wordSize), rcx); // Thread is first argument
__ set_last_Java_frame(rcx, noreg, noreg, NULL);
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, OptoRuntime::handle_exception_C)));
// No registers to map, rbp is known implicitly
oop_maps->add_gc_map( __ pc() - start, new OopMap( framesize, 0 ));
__ get_thread(rcx);
__ reset_last_Java_frame(rcx, false, false);
// Restore callee-saved registers
! __ movptr(rbp, Address(rsp, rbp_off * wordSize));
! __ addptr(rsp, return_off * wordSize); // Epilog!
! __ pop(rdx); // Exception pc
// rax,: exception handler for given <exception oop/exception pc>
// We have a handler in rax, (could be deopt blob)
// rdx - throwing pc, deopt blob will need it.
! __ push(rax);
// rcx contains handler address
__ get_thread(rcx); // TLS
// Get the exception
! __ movptr(rax, Address(rcx, JavaThread::exception_oop_offset()));
// Get the exception pc in case we are deoptimized
! __ movptr(rdx, Address(rcx, JavaThread::exception_pc_offset()));
#ifdef ASSERT
! __ movptr(Address(rcx, JavaThread::exception_handler_pc_offset()), (int32_t)NULL_WORD);
! __ movptr(Address(rcx, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD);
#endif
// Clear the exception oop so GC no longer processes it as a root.
! __ movptr(Address(rcx, JavaThread::exception_oop_offset()), (int32_t)NULL_WORD);
! __ pop(rcx);
// rax,: exception oop
// rcx: exception handler
// rdx: exception pc
__ jmp (rcx);