diff --git a/src/hotspot/cpu/s390/frame_s390.inline.hpp b/src/hotspot/cpu/s390/frame_s390.inline.hpp index b033b3f939b..ede7039ce0a 100644 --- a/src/hotspot/cpu/s390/frame_s390.inline.hpp +++ b/src/hotspot/cpu/s390/frame_s390.inline.hpp @@ -203,11 +203,14 @@ inline intptr_t* frame::interpreter_frame_expression_stack() const { // Also begin is one past last monitor. inline intptr_t* frame::interpreter_frame_top_frame_sp() { - return (intptr_t*)ijava_state()->top_frame_sp; + intptr_t n = *addr_at(_z_ijava_idx(top_frame_sp)); + return &fp()[n]; // return relativized locals } inline void frame::interpreter_frame_set_top_frame_sp(intptr_t* top_frame_sp) { - ijava_state()->top_frame_sp = (intptr_t) top_frame_sp; + assert(is_interpreted_frame(), "interpreted frame expected"); + // set relativized top_frame_sp + ijava_state()->top_frame_sp = (intptr_t) (top_frame_sp - fp()); } inline void frame::interpreter_frame_set_sender_sp(intptr_t* sender_sp) { diff --git a/src/hotspot/cpu/s390/interp_masm_s390.cpp b/src/hotspot/cpu/s390/interp_masm_s390.cpp index a7bea358f4e..9717d260279 100644 --- a/src/hotspot/cpu/s390/interp_masm_s390.cpp +++ b/src/hotspot/cpu/s390/interp_masm_s390.cpp @@ -576,7 +576,10 @@ void InterpreterMacroAssembler::prepare_to_jump_from_interpreted(Register method // Satisfy interpreter calling convention (see generate_normal_entry()). z_lgr(Z_R10, Z_SP); // Set sender sp (aka initial caller sp, aka unextended sp). // Record top_frame_sp, because the callee might modify it, if it's compiled. - z_stg(Z_SP, _z_ijava_state_neg(top_frame_sp), Z_fp); + assert_different_registers(Z_R1, method); + z_sgrk(Z_R1, Z_SP, Z_fp); + z_srag(Z_R1, Z_R1, Interpreter::logStackElementSize); + z_stg(Z_R1, _z_ijava_state_neg(top_frame_sp), Z_fp); save_bcp(); save_esp(); z_lgr(Z_method, method); // Set Z_method (kills Z_fp!). diff --git a/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp b/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp index 4edf8046833..04fe574088e 100644 --- a/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp +++ b/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp @@ -637,6 +637,8 @@ address TemplateInterpreterGenerator::generate_return_entry_for (TosState state, Register sp_before_i2c_extension = Z_bcp; __ z_lg(Z_fp, _z_abi(callers_sp), Z_SP); // Restore frame pointer. __ z_lg(sp_before_i2c_extension, Address(Z_fp, _z_ijava_state_neg(top_frame_sp))); + __ z_slag(sp_before_i2c_extension, sp_before_i2c_extension, Interpreter::logStackElementSize); + __ z_agr(sp_before_i2c_extension, Z_fp); __ resize_frame_absolute(sp_before_i2c_extension, Z_locals/*tmp*/, true/*load_fp*/); // TODO(ZASM): necessary??