< prev index next >

src/hotspot/cpu/s390/macroAssembler_s390.cpp

Print this page
rev 57534 : 8236555: [s390] Fix VerifyOops
Reviewed-by:

*** 3585,3595 **** verify_thread(); z_lg(oop_result, Address(Z_thread, JavaThread::vm_result_offset())); clear_mem(Address(Z_thread, JavaThread::vm_result_offset()), sizeof(void*)); ! verify_oop(oop_result); } void MacroAssembler::get_vm_result_2(Register result) { verify_thread(); --- 3585,3595 ---- verify_thread(); z_lg(oop_result, Address(Z_thread, JavaThread::vm_result_offset())); clear_mem(Address(Z_thread, JavaThread::vm_result_offset()), sizeof(void*)); ! verify_oop(oop_result, FILE_AND_LINE); } void MacroAssembler::get_vm_result_2(Register result) { verify_thread();
*** 6811,6840 **** if (VerifyThread) { unimplemented("", 117); } } // Plausibility check for oops. void MacroAssembler::verify_oop(Register oop, const char* msg) { if (!VerifyOops) return; BLOCK_COMMENT("verify_oop {"); ! Register tmp = Z_R0; ! unsigned int nbytes_save = 5*BytesPerWord; ! address entry = StubRoutines::verify_oop_subroutine_entry_address(); save_return_pc(); ! push_frame_abi160(nbytes_save); ! z_stmg(Z_R1, Z_R5, frame::z_abi_160_size, Z_SP); ! z_lgr(Z_ARG2, oop); ! load_const(Z_ARG1, (address) msg); ! load_const(Z_R1, entry); z_lg(Z_R1, 0, Z_R1); call_c(Z_R1); ! z_lmg(Z_R1, Z_R5, frame::z_abi_160_size, Z_SP); pop_frame(); restore_return_pc(); BLOCK_COMMENT("} verify_oop "); } --- 6811,6908 ---- if (VerifyThread) { unimplemented("", 117); } } + // Save and restore functions: Exclude Z_R0. + void MacroAssembler::save_volatile_regs(Register dst, int offset, bool include_fp, bool include_flags) { + z_stmg(Z_R1, Z_R5, offset, dst); offset += 5 * BytesPerWord; + if (include_fp) { + z_std(Z_F0, Address(dst, offset)); offset += BytesPerWord; + z_std(Z_F1, Address(dst, offset)); offset += BytesPerWord; + z_std(Z_F2, Address(dst, offset)); offset += BytesPerWord; + z_std(Z_F3, Address(dst, offset)); offset += BytesPerWord; + z_std(Z_F4, Address(dst, offset)); offset += BytesPerWord; + z_std(Z_F5, Address(dst, offset)); offset += BytesPerWord; + z_std(Z_F6, Address(dst, offset)); offset += BytesPerWord; + z_std(Z_F7, Address(dst, offset)); offset += BytesPerWord; + } + if (include_flags) { + Label done; + z_mvi(Address(dst, offset), 2); // encoding: equal + z_bre(done); + z_mvi(Address(dst, offset), 4); // encoding: higher + z_brh(done); + z_mvi(Address(dst, offset), 1); // encoding: lower + bind(done); + } + } + void MacroAssembler::restore_volatile_regs(Register src, int offset, bool include_fp, bool include_flags) { + z_lmg(Z_R1, Z_R5, offset, src); offset += 5 * BytesPerWord; + if (include_fp) { + z_ld(Z_F0, Address(src, offset)); offset += BytesPerWord; + z_ld(Z_F1, Address(src, offset)); offset += BytesPerWord; + z_ld(Z_F2, Address(src, offset)); offset += BytesPerWord; + z_ld(Z_F3, Address(src, offset)); offset += BytesPerWord; + z_ld(Z_F4, Address(src, offset)); offset += BytesPerWord; + z_ld(Z_F5, Address(src, offset)); offset += BytesPerWord; + z_ld(Z_F6, Address(src, offset)); offset += BytesPerWord; + z_ld(Z_F7, Address(src, offset)); offset += BytesPerWord; + } + if (include_flags) { + z_cli(Address(src, offset), 2); // see encoding above + } + } + // Plausibility check for oops. void MacroAssembler::verify_oop(Register oop, const char* msg) { if (!VerifyOops) return; BLOCK_COMMENT("verify_oop {"); ! unsigned int nbytes_save = (5 + 8 + 1) * BytesPerWord; ! address entry_addr = StubRoutines::verify_oop_subroutine_entry_address(); ! ! save_return_pc(); ! ! // Push frame, but preserve flags ! z_lgr(Z_R0, Z_SP); ! z_lay(Z_SP, -((int64_t)nbytes_save + frame::z_abi_160_size), Z_SP); ! z_stg(Z_R0, _z_abi(callers_sp), Z_SP); ! ! save_volatile_regs(Z_SP, frame::z_abi_160_size, true, true); ! ! lgr_if_needed(Z_ARG2, oop); ! load_const_optimized(Z_ARG1, (address)msg); ! load_const_optimized(Z_R1, entry_addr); ! z_lg(Z_R1, 0, Z_R1); ! call_c(Z_R1); ! ! restore_volatile_regs(Z_SP, frame::z_abi_160_size, true, true); ! pop_frame(); ! restore_return_pc(); ! ! BLOCK_COMMENT("} verify_oop "); ! } ! ! void MacroAssembler::verify_oop_addr(Address addr, const char* msg) { ! if (!VerifyOops) return; ! ! BLOCK_COMMENT("verify_oop {"); ! unsigned int nbytes_save = (5 + 8) * BytesPerWord; ! address entry_addr = StubRoutines::verify_oop_subroutine_entry_address(); save_return_pc(); ! unsigned int frame_size = push_frame_abi160(nbytes_save); // kills Z_R0 ! save_volatile_regs(Z_SP, frame::z_abi_160_size, true, false); ! z_lg(Z_ARG2, addr.plus_disp(frame_size)); ! load_const_optimized(Z_ARG1, (address)msg); ! load_const_optimized(Z_R1, entry_addr); z_lg(Z_R1, 0, Z_R1); call_c(Z_R1); ! restore_volatile_regs(Z_SP, frame::z_abi_160_size, true, false); pop_frame(); restore_return_pc(); BLOCK_COMMENT("} verify_oop "); }
< prev index next >