Skip to content

Commit c8d60d7

Browse files
backesV8 LUCI CQ
authored andcommitted
[liftoff][arm64] Fix address computation for trap handling
This refactors the {GetMemOp} function once again: Instead of computing (mem_start + (offset_reg + offset_imm)), do compute ((mem_start + offset_imm) + offset_reg). This avoids an overflow in (offset_reg + offset_imm) when using 32-bit computations, which hides OOB memory accesses when relying on the trap handler. As a nice side-effect, this change makes the whole method a lot nicer to read. We also need to change {StoreTaggedPointer} now, which was relying on the inner working of {GetMemOp}. The new version makes the semantics more transparent at the cost of repeating some logic from (the previous version of) {GetMemOp}. [email protected] Bug: v8:11955, chromium:1227465, v8:11951 Change-Id: Ia068ca7c4f7db89b81529edd3438b0e4eee7d23d Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3015566 Commit-Queue: Clemens Backes <[email protected]> Reviewed-by: Jakob Kummerow <[email protected]> Cr-Commit-Position: refs/heads/master@{#75693}
1 parent 408f592 commit c8d60d7

File tree

1 file changed

+19
-24
lines changed

1 file changed

+19
-24
lines changed

src/wasm/baseline/arm64/liftoff-assembler-arm64.h

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -128,23 +128,14 @@ inline MemOperand GetMemOp(LiftoffAssembler* assm,
128128
UseScratchRegisterScope* temps, Register addr,
129129
Register offset, T offset_imm,
130130
bool i64_offset = false) {
131-
if (offset.is_valid()) {
132-
if (offset_imm == 0) {
133-
return i64_offset ? MemOperand(addr.X(), offset.X())
134-
: MemOperand(addr.X(), offset.W(), UXTW);
135-
}
136-
DCHECK_GE(kMaxUInt32, offset_imm);
137-
if (i64_offset) {
138-
Register tmp = temps->AcquireX();
139-
assm->Add(tmp, offset.X(), offset_imm);
140-
return MemOperand(addr.X(), tmp);
141-
} else {
142-
Register tmp = temps->AcquireW();
143-
assm->Add(tmp, offset.W(), offset_imm);
144-
return MemOperand(addr.X(), tmp, UXTW);
145-
}
131+
if (!offset.is_valid()) return MemOperand(addr.X(), offset_imm);
132+
Register effective_addr = addr.X();
133+
if (offset_imm) {
134+
effective_addr = temps->AcquireX();
135+
assm->Add(effective_addr, addr.X(), offset_imm);
146136
}
147-
return MemOperand(addr.X(), offset_imm);
137+
return i64_offset ? MemOperand(effective_addr, offset.X())
138+
: MemOperand(effective_addr, offset.W(), UXTW);
148139
}
149140

150141
// Certain load instructions do not support offset (register or immediate).
@@ -470,11 +461,18 @@ void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
470461
LiftoffRegister src,
471462
LiftoffRegList pinned,
472463
SkipWriteBarrier skip_write_barrier) {
473-
// Store the value.
474464
UseScratchRegisterScope temps(this);
475-
MemOperand dst_op =
476-
liftoff::GetMemOp(this, &temps, dst_addr, offset_reg, offset_imm);
477-
StoreTaggedField(src.gp(), dst_op);
465+
Operand offset_op = offset_reg.is_valid() ? Operand(offset_reg.W(), UXTW)
466+
: Operand(offset_imm);
467+
// For the write barrier (below), we cannot have both an offset register and
468+
// an immediate offset. Add them to a 32-bit offset initially, but in a 64-bit
469+
// register, because that's needed in the MemOperand below.
470+
if (offset_reg.is_valid() && offset_imm) {
471+
Register effective_offset = temps.AcquireX();
472+
Add(effective_offset.W(), offset_reg.W(), offset_imm);
473+
offset_op = effective_offset;
474+
}
475+
StoreTaggedField(src.gp(), MemOperand(dst_addr.X(), offset_op));
478476

479477
if (skip_write_barrier || FLAG_disable_write_barriers) return;
480478

@@ -492,10 +490,7 @@ void LiftoffAssembler::StoreTaggedPointer(Register dst_addr,
492490
CheckPageFlag(src.gp(), MemoryChunk::kPointersToHereAreInterestingMask, ne,
493491
&exit);
494492
CallRecordWriteStubSaveRegisters(
495-
dst_addr,
496-
dst_op.IsRegisterOffset() ? Operand(dst_op.regoffset().X())
497-
: Operand(dst_op.offset()),
498-
RememberedSetAction::kEmit, SaveFPRegsMode::kSave,
493+
dst_addr, offset_op, RememberedSetAction::kEmit, SaveFPRegsMode::kSave,
499494
StubCallMode::kCallWasmRuntimeStub);
500495
bind(&exit);
501496
}

0 commit comments

Comments
 (0)