diff --git a/src/hotspot/cpu/s390/frame_s390.cpp b/src/hotspot/cpu/s390/frame_s390.cpp index 01ed22c7d8620..b602d0adce579 100644 --- a/src/hotspot/cpu/s390/frame_s390.cpp +++ b/src/hotspot/cpu/s390/frame_s390.cpp @@ -185,7 +185,8 @@ bool frame::is_interpreted_frame() const { void frame::interpreter_frame_set_locals(intptr_t* locs) { assert(is_interpreted_frame(), "interpreted frame expected"); - ijava_state_unchecked()->locals = (uint64_t)locs; + // set relativized locals + *addr_at(_z_ijava_idx(locals)) = (intptr_t) (locs - fp()); } // sender_sp @@ -340,7 +341,7 @@ bool frame::is_interpreted_frame_valid(JavaThread* thread) const { if (MetaspaceObj::is_valid(cp) == false) return false; // validate locals - address locals = (address)(ijava_state_unchecked()->locals); + address locals = (address)interpreter_frame_locals(); return thread->is_in_stack_range_incl(locals, (address)fp()); } diff --git a/src/hotspot/cpu/s390/frame_s390.hpp b/src/hotspot/cpu/s390/frame_s390.hpp index 3a6b3f33a5527..1aaabfb1230d0 100644 --- a/src/hotspot/cpu/s390/frame_s390.hpp +++ b/src/hotspot/cpu/s390/frame_s390.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016, 2024 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -330,6 +330,10 @@ #define _z_ijava_state_neg(_component) \ (int) (-frame::z_ijava_state_size + offset_of(frame::z_ijava_state, _component)) +// Frame slot index relative to fp +#define _z_ijava_idx(_component) \ + (_z_ijava_state_neg(_component) >> LogBytesPerWord) + // ENTRY_FRAME struct z_entry_frame_locals { diff --git a/src/hotspot/cpu/s390/frame_s390.inline.hpp b/src/hotspot/cpu/s390/frame_s390.inline.hpp index d29106cfc40d6..b033b3f939bb6 100644 --- a/src/hotspot/cpu/s390/frame_s390.inline.hpp +++ b/src/hotspot/cpu/s390/frame_s390.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016, 2024 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -180,7 +180,8 @@ inline intptr_t* frame::link_or_null() const { } inline intptr_t* frame::interpreter_frame_locals() const { - return (intptr_t*) (ijava_state()->locals); + intptr_t n = *addr_at(_z_ijava_idx(locals)); + return &fp()[n]; // return relativized locals } inline intptr_t* frame::interpreter_frame_bcp_addr() const { diff --git a/src/hotspot/cpu/s390/interp_masm_s390.cpp b/src/hotspot/cpu/s390/interp_masm_s390.cpp index cb335e407347b..f37587e5f2a7c 100644 --- a/src/hotspot/cpu/s390/interp_masm_s390.cpp +++ b/src/hotspot/cpu/s390/interp_masm_s390.cpp @@ -106,7 +106,15 @@ void InterpreterMacroAssembler::dispatch_base(TosState state, address* table, bo } { Label OK; // check if the locals pointer in Z_locals is correct - z_cg(Z_locals, _z_ijava_state_neg(locals), Z_fp); + + // _z_ijava_state_neg(locals)) is fp relativized, so we need to + // extract the pointer. + + z_lg(Z_R1_scratch, Address(Z_fp, _z_ijava_state_neg(locals))); + z_sllg(Z_R1_scratch, Z_R1_scratch, Interpreter::logStackElementSize); + z_agr(Z_R1_scratch, Z_fp); + + z_cgr(Z_locals, Z_R1_scratch); z_bre(OK); reentry = stop_chain_static(reentry, "invalid locals pointer Z_locals: " FILE_AND_LINE); bind(OK); @@ -686,6 +694,8 @@ void InterpreterMacroAssembler::save_mdp(Register mdp) { void InterpreterMacroAssembler::restore_locals() { asm_assert_ijava_state_magic(Z_locals); z_lg(Z_locals, Address(Z_fp, _z_ijava_state_neg(locals))); + z_sllg(Z_locals, Z_locals, Interpreter::logStackElementSize); + z_agr(Z_locals, Z_fp); } void InterpreterMacroAssembler::get_method(Register reg) { diff --git a/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp b/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp index c40be5edec754..1dc7b4a292586 100644 --- a/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp +++ b/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp @@ -1134,7 +1134,15 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) { __ z_agr(Z_locals, Z_esp); // z_ijava_state->locals - i*BytesPerWord points to i-th Java local (i starts at 0) // z_ijava_state->locals = Z_esp + parameter_count bytes - __ z_stg(Z_locals, _z_ijava_state_neg(locals), fp); + + __ z_lgr(Z_R0, Z_R1); // preserve Z_R1, holding cache offset + + __ z_sgrk(Z_R1, Z_locals, fp); // Z_R1 = Z_locals - fp(); + __ z_srlg(Z_R1, Z_R1, Interpreter::logStackElementSize); + // Store relativized Z_locals, see frame::interpreter_frame_locals(). + __ z_stg(Z_R1, _z_ijava_state_neg(locals), fp); + + __ z_lgr(Z_R1, Z_R0); // restore R1 // z_ijava_state->oop_temp = nullptr; __ store_const(Address(fp, oop_tmp_offset), 0);