# HG changeset patch # User kvn # Date 1275600027 25200 # Node ID 02e771df338e63d677bfc7b77399807c010a9162 # Parent e9ff18c4ace7e778062ea475a8cc0d9062a570bd 6958254: -XX:+VerifyOops is broken on x86 Summary: save and restore r10 in verify_oop(). Reviewed-by: never diff -r e9ff18c4ace7 -r 02e771df338e src/cpu/x86/vm/assembler_x86.cpp --- a/src/cpu/x86/vm/assembler_x86.cpp Wed Jun 02 22:45:42 2010 -0700 +++ b/src/cpu/x86/vm/assembler_x86.cpp Thu Jun 03 14:20:27 2010 -0700 @@ -7643,6 +7643,9 @@ // Pass register number to verify_oop_subroutine char* b = new char[strlen(s) + 50]; sprintf(b, "verify_oop: %s: %s", reg->name(), s); +#ifdef _LP64 + push(rscratch1); // save r10, trashed by movptr() +#endif push(rax); // save rax, push(reg); // pass register argument ExternalAddress buffer((address) b); @@ -7653,6 +7656,7 @@ // call indirectly to solve generation ordering problem movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address())); call(rax); + // Caller pops the arguments (oop, message) and restores rax, r10 } @@ -7767,6 +7771,9 @@ char* b = new char[strlen(s) + 50]; sprintf(b, "verify_oop_addr: %s", s); +#ifdef _LP64 + push(rscratch1); // save r10, trashed by movptr() +#endif push(rax); // save rax, // addr may contain rsp so we will have to adjust it based on the push // we just did @@ -7789,7 +7796,7 @@ // call indirectly to solve generation ordering problem movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address())); call(rax); - // Caller pops the arguments and restores rax, from the stack + // Caller pops the arguments (addr, message) and restores rax, r10. } void MacroAssembler::verify_tlab() { diff -r e9ff18c4ace7 -r 02e771df338e src/cpu/x86/vm/stubGenerator_x86_64.cpp --- a/src/cpu/x86/vm/stubGenerator_x86_64.cpp Wed Jun 02 22:45:42 2010 -0700 +++ b/src/cpu/x86/vm/stubGenerator_x86_64.cpp Thu Jun 03 14:20:27 2010 -0700 @@ -914,6 +914,7 @@ // * [tos + 5]: error message (char*) // * [tos + 6]: object to verify (oop) // * [tos + 7]: saved rax - saved by caller and bashed + // * [tos + 8]: saved r10 (rscratch1) - saved by caller // * = popped on exit address generate_verify_oop() { StubCodeMark mark(this, "StubRoutines", "verify_oop"); @@ -934,6 +935,7 @@ // After previous pushes. oop_to_verify = 6 * wordSize, saved_rax = 7 * wordSize, + saved_r10 = 8 * wordSize, // Before the call to MacroAssembler::debug(), see below. return_addr = 16 * wordSize, @@ -983,15 +985,17 @@ // return if everything seems ok __ bind(exit); __ movptr(rax, Address(rsp, saved_rax)); // get saved rax back + __ movptr(rscratch1, Address(rsp, saved_r10)); // get saved r10 back __ pop(c_rarg3); // restore c_rarg3 __ pop(c_rarg2); // restore c_rarg2 __ pop(r12); // restore r12 __ popf(); // restore flags - __ ret(3 * wordSize); // pop caller saved stuff + __ ret(4 * wordSize); // pop caller saved stuff // handle errors __ bind(error); __ movptr(rax, Address(rsp, saved_rax)); // get saved rax back + __ movptr(rscratch1, Address(rsp, saved_r10)); // get saved r10 back __ pop(c_rarg3); // get saved c_rarg3 back __ pop(c_rarg2); // get saved c_rarg2 back __ pop(r12); // get saved r12 back @@ -1009,6 +1013,7 @@ // * [tos + 17] error message (char*) // * [tos + 18] object to verify (oop) // * [tos + 19] saved rax - saved by caller and bashed + // * [tos + 20] saved r10 (rscratch1) - saved by caller // * = popped on exit __ movptr(c_rarg0, Address(rsp, error_msg)); // pass address of error message @@ -1021,7 +1026,7 @@ __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug64))); __ mov(rsp, r12); // restore rsp __ popa(); // pop registers (includes r12) - __ ret(3 * wordSize); // pop caller saved stuff + __ ret(4 * wordSize); // pop caller saved stuff return start; }