--- old/src/hotspot/cpu/x86/interp_masm_x86.cpp 2017-10-31 09:39:44.692952825 -0400 +++ new/src/hotspot/cpu/x86/interp_masm_x86.cpp 2017-10-31 09:39:44.444951596 -0400 @@ -1079,9 +1079,45 @@ notify_method_exit(state, SkipNotifyJVMTI); // preserve TOSCA } - Label vtbuffer_slow, vtbuffer_done; + if (StackReservedPages > 0) { + movptr(rbx, + Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); + // testing if reserved zone needs to be re-enabled + Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx); + Label no_reserved_zone_enabling; + + NOT_LP64(get_thread(rthread);) + + cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled); + jcc(Assembler::equal, no_reserved_zone_enabling); + + cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset())); + jcc(Assembler::lessEqual, no_reserved_zone_enabling); + + call_VM_leaf( + CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread); + call_VM(noreg, CAST_FROM_FN_PTR(address, + InterpreterRuntime::throw_delayed_StackOverflowError)); + should_not_reach_here(); + + bind(no_reserved_zone_enabling); + } + + // Code below is taking care of recycling TLVB memory, no safepoint should + // occur between this point and the end of the remove_activation() method + Label vtbuffer_slow, vtbuffer_done, no_buffered_value_returned; const Register thread1 = NOT_LP64(rcx) LP64_ONLY(r15_thread); const uintptr_t chunk_mask = VTBufferChunk::chunk_mask(); + NOT_LP64(get_thread(thread1)); + cmpptr(Address(thread1, JavaThread::return_buffered_value_offset()), (intptr_t)NULL_WORD); + jcc(Assembler::equal, no_buffered_value_returned); + movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize)); + call_VM_leaf(CAST_FROM_FN_PTR(address, + InterpreterRuntime::return_value_step2), rax, rbx); + NOT_LP64(get_thread(thread1)); + get_vm_result(rax, thread1); + jmp(vtbuffer_done); + bind(no_buffered_value_returned); movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize)); NOT_LP64(get_thread(thread1)); movptr(rcx, Address(thread1, JavaThread::vt_alloc_ptr_offset())); @@ -1096,8 +1132,9 @@ jmp(vtbuffer_done); bind(vtbuffer_slow); push(state); - call_VM(noreg, CAST_FROM_FN_PTR(address, - InterpreterRuntime::recycle_vtbuffer)); + movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize)); + call_VM_leaf(CAST_FROM_FN_PTR(address, + InterpreterRuntime::recycle_vtbuffer), rbx); pop(state); bind(vtbuffer_done); @@ -1105,27 +1142,7 @@ // get sender sp movptr(rbx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); - if (StackReservedPages > 0) { - // testing if reserved zone needs to be re-enabled - Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx); - Label no_reserved_zone_enabling; - - NOT_LP64(get_thread(rthread);) - - cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled); - jcc(Assembler::equal, no_reserved_zone_enabling); - cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset())); - jcc(Assembler::lessEqual, no_reserved_zone_enabling); - - call_VM_leaf( - CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread); - call_VM(noreg, CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_delayed_StackOverflowError)); - should_not_reach_here(); - - bind(no_reserved_zone_enabling); - } if (load_values) { // We are returning a value type, load its fields into registers #ifndef _LP64