Skip to content

Commit 485ced0

Browse files
feilongjiangRealFYang
authored andcommitted
8369947: Bytecode rewriting causes Java heap corruption on RISC-V
Reviewed-by: fyang Backport-of: 462519935827e25475f2fb35746ad81a14bc5da7
1 parent aeef439 commit 485ced0

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

src/hotspot/cpu/riscv/interp_masm_riscv.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2011,6 +2011,15 @@ void InterpreterMacroAssembler::get_method_counters(Register method,
20112011
}
20122012

20132013
#ifdef ASSERT
2014+
void InterpreterMacroAssembler::verify_field_offset(Register reg) {
2015+
// Verify the field offset is not in the header, implicitly checks for 0
2016+
Label L;
2017+
mv(t0, static_cast<int>(sizeof(markWord) + (UseCompressedClassPointers ? sizeof(narrowKlass) : sizeof(Klass*))));
2018+
bge(reg, t0, L);
2019+
stop("bad field offset");
2020+
bind(L);
2021+
}
2022+
20142023
void InterpreterMacroAssembler::verify_access_flags(Register access_flags, uint32_t flag,
20152024
const char* msg, bool stop_by_hit) {
20162025
Label L;

src/hotspot/cpu/riscv/interp_masm_riscv.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
301301

302302
void load_resolved_indy_entry(Register cache, Register index);
303303

304+
void verify_field_offset(Register reg) NOT_DEBUG_RETURN;
305+
304306
#ifdef ASSERT
305307
void verify_access_flags(Register access_flags, uint32_t flag,
306308
const char* msg, bool stop_by_hit = true);

src/hotspot/cpu/riscv/templateTable_riscv.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ Address TemplateTable::at_bcp(int offset) {
131131
void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
132132
Register temp_reg, bool load_bc_into_bc_reg /*=true*/,
133133
int byte_no) {
134+
assert_different_registers(bc_reg, temp_reg);
134135
if (!RewriteBytecodes) { return; }
135136
Label L_patch_done;
136137

@@ -186,7 +187,11 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
186187
__ bind(L_okay);
187188
#endif
188189

189-
// patch bytecode
190+
// Patch bytecode with release store to coordinate with ResolvedFieldEntry loads
191+
// in fast bytecode codelets. load_field_entry has a memory barrier that gains
192+
// the needed ordering, together with control dependency on entering the fast codelet
193+
// itself.
194+
__ membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore);
190195
__ sb(bc_reg, at_bcp(0));
191196
__ bind(L_patch_done);
192197
}
@@ -2908,6 +2913,7 @@ void TemplateTable::fast_storefield(TosState state) {
29082913

29092914
// replace index with field offset from cache entry
29102915
__ ld(x11, Address(x12, in_bytes(base + ConstantPoolCacheEntry::f2_offset())));
2916+
__ verify_field_offset(x11);
29112917

29122918
{
29132919
Label notVolatile;
@@ -3003,6 +3009,8 @@ void TemplateTable::fast_accessfield(TosState state) {
30033009

30043010
__ ld(x11, Address(x12, in_bytes(ConstantPoolCache::base_offset() +
30053011
ConstantPoolCacheEntry::f2_offset())));
3012+
__ verify_field_offset(x11);
3013+
30063014
__ lwu(x13, Address(x12, in_bytes(ConstantPoolCache::base_offset() +
30073015
ConstantPoolCacheEntry::flags_offset())));
30083016

@@ -3059,8 +3067,13 @@ void TemplateTable::fast_xaccess(TosState state) {
30593067
__ ld(x10, aaddress(0));
30603068
// access constant pool cache
30613069
__ get_cache_and_index_at_bcp(x12, x13, 2);
3070+
3071+
// Must prevent reordering of the following cp cache loads with bytecode load
3072+
__ membar(MacroAssembler::LoadLoad);
3073+
30623074
__ ld(x11, Address(x12, in_bytes(ConstantPoolCache::base_offset() +
30633075
ConstantPoolCacheEntry::f2_offset())));
3076+
__ verify_field_offset(x11);
30643077

30653078
// make sure exception is reported in correct bcp range (getfield is
30663079
// next instruction)

0 commit comments

Comments
 (0)