summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiuYu <liuyu@loongson.cn>2020-12-24 09:10:42 +0800
committerMichael Brüning <michael.bruning@qt.io>2021-03-29 09:42:37 +0000
commit04dac230ac31686b69132daaad47b54a960133f3 (patch)
tree6d64302bf57e4583f65cbf6c33446ffe04a2ae27
parent2269fc624d9aa8c56eab30cf803172e98744f2d2 (diff)
[Backport] Security bug 1146813 (2/2)
Cherry-pick of patch originally reviewed on https://chromium-review.googlesource.com/c/v8/v8/+/2599426: Avoid using the isolate in CallRecordWriteStub Port: 6b3994e8507b32dfb956329395dbe33a2a8fee14 Bug: chromium:1146813 Change-Id: I552f49193188d91d64a1d75307cd3390138c9e7a Reviewed-by: Zhao Jiazhong <zhaojiazhong-hf@loongson.cn> Commit-Queue: Zhao Jiazhong <zhaojiazhong-hf@loongson.cn> Cr-Commit-Position: refs/heads/master@{#71874} Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
-rw-r--r--chromium/v8/src/codegen/mips/macro-assembler-mips.cc26
-rw-r--r--chromium/v8/src/codegen/mips/macro-assembler-mips.h2
-rw-r--r--chromium/v8/src/codegen/mips64/macro-assembler-mips64.cc28
-rw-r--r--chromium/v8/src/codegen/mips64/macro-assembler-mips64.h2
4 files changed, 39 insertions, 19 deletions
diff --git a/chromium/v8/src/codegen/mips/macro-assembler-mips.cc b/chromium/v8/src/codegen/mips/macro-assembler-mips.cc
index f9a0f7f0764..f504a6a42a3 100644
--- a/chromium/v8/src/codegen/mips/macro-assembler-mips.cc
+++ b/chromium/v8/src/codegen/mips/macro-assembler-mips.cc
@@ -258,10 +258,8 @@ void TurboAssembler::CallEphemeronKeyBarrier(Register object, Register address,
void TurboAssembler::CallRecordWriteStub(
Register object, Register address,
RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode) {
- CallRecordWriteStub(
- object, address, remembered_set_action, fp_mode,
- isolate()->builtins()->builtin_handle(Builtins::kRecordWrite),
- kNullAddress);
+ CallRecordWriteStub(object, address, remembered_set_action, fp_mode,
+ Builtins::kRecordWrite, kNullAddress);
}
void TurboAssembler::CallRecordWriteStub(
@@ -269,14 +267,15 @@ void TurboAssembler::CallRecordWriteStub(
RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode,
Address wasm_target) {
CallRecordWriteStub(object, address, remembered_set_action, fp_mode,
- Handle<Code>::null(), wasm_target);
+ Builtins::kNoBuiltinId, wasm_target);
}
void TurboAssembler::CallRecordWriteStub(
Register object, Register address,
RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode,
- Handle<Code> code_target, Address wasm_target) {
- DCHECK_NE(code_target.is_null(), wasm_target == kNullAddress);
+ int builtin_index, Address wasm_target) {
+ DCHECK_NE(builtin_index == Builtins::kNoBuiltinId,
+ wasm_target == kNullAddress);
// TODO(albertnetymk): For now we ignore remembered_set_action and fp_mode,
// i.e. always emit remember set and save FP registers in RecordWriteStub. If
// large performance regression is observed, we should use these values to
@@ -303,9 +302,20 @@ void TurboAssembler::CallRecordWriteStub(
Move(remembered_set_parameter, Smi::FromEnum(remembered_set_action));
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
- if (code_target.is_null()) {
+ if (builtin_index == Builtins::kNoBuiltinId) {
Call(wasm_target, RelocInfo::WASM_STUB_CALL);
+ } else if (options().inline_offheap_trampolines) {
+ // Inline the trampoline.
+ DCHECK(Builtins::IsBuiltinId(builtin_index));
+ RecordCommentForOffHeapTrampoline(builtin_index);
+ CHECK_NE(builtin_index, Builtins::kNoBuiltinId);
+ EmbeddedData d = EmbeddedData::FromBlob();
+ Address entry = d.InstructionStartOfBuiltin(builtin_index);
+ li(t9, Operand(entry, RelocInfo::OFF_HEAP_TARGET));
+ Call(t9);
} else {
+ Handle<Code> code_target =
+ isolate()->builtins()->builtin_handle(Builtins::kRecordWrite);
Call(code_target, RelocInfo::CODE_TARGET);
}
diff --git a/chromium/v8/src/codegen/mips/macro-assembler-mips.h b/chromium/v8/src/codegen/mips/macro-assembler-mips.h
index cafcc429414..12b5702f225 100644
--- a/chromium/v8/src/codegen/mips/macro-assembler-mips.h
+++ b/chromium/v8/src/codegen/mips/macro-assembler-mips.h
@@ -900,7 +900,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
void CallRecordWriteStub(Register object, Register address,
RememberedSetAction remembered_set_action,
- SaveFPRegsMode fp_mode, Handle<Code> code_target,
+ SaveFPRegsMode fp_mode, int builtin_index,
Address wasm_target);
};
diff --git a/chromium/v8/src/codegen/mips64/macro-assembler-mips64.cc b/chromium/v8/src/codegen/mips64/macro-assembler-mips64.cc
index 509153e6c2b..abf33e9739d 100644
--- a/chromium/v8/src/codegen/mips64/macro-assembler-mips64.cc
+++ b/chromium/v8/src/codegen/mips64/macro-assembler-mips64.cc
@@ -256,10 +256,8 @@ void TurboAssembler::CallEphemeronKeyBarrier(Register object, Register address,
void TurboAssembler::CallRecordWriteStub(
Register object, Register address,
RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode) {
- CallRecordWriteStub(
- object, address, remembered_set_action, fp_mode,
- isolate()->builtins()->builtin_handle(Builtins::kRecordWrite),
- kNullAddress);
+ CallRecordWriteStub(object, address, remembered_set_action, fp_mode,
+ Builtins::kRecordWrite, kNullAddress);
}
void TurboAssembler::CallRecordWriteStub(
@@ -267,14 +265,15 @@ void TurboAssembler::CallRecordWriteStub(
RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode,
Address wasm_target) {
CallRecordWriteStub(object, address, remembered_set_action, fp_mode,
- Handle<Code>::null(), wasm_target);
+ Builtins::kNoBuiltinId, wasm_target);
}
void TurboAssembler::CallRecordWriteStub(
Register object, Register address,
RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode,
- Handle<Code> code_target, Address wasm_target) {
- DCHECK_NE(code_target.is_null(), wasm_target == kNullAddress);
+ int builtin_index, Address wasm_target) {
+ DCHECK_NE(builtin_index == Builtins::kNoBuiltinId,
+ wasm_target == kNullAddress);
// TODO(albertnetymk): For now we ignore remembered_set_action and fp_mode,
// i.e. always emit remember set and save FP registers in RecordWriteStub. If
// large performance regression is observed, we should use these values to
@@ -301,9 +300,20 @@ void TurboAssembler::CallRecordWriteStub(
Move(remembered_set_parameter, Smi::FromEnum(remembered_set_action));
Move(fp_mode_parameter, Smi::FromEnum(fp_mode));
- if (code_target.is_null()) {
+ if (builtin_index == Builtins::kNoBuiltinId) {
Call(wasm_target, RelocInfo::WASM_STUB_CALL);
- } else {
+ } else if (options().inline_offheap_trampolines) {
+ // Inline the trampoline.
+ DCHECK(Builtins::IsBuiltinId(builtin_index));
+ RecordCommentForOffHeapTrampoline(builtin_index);
+ CHECK_NE(builtin_index, Builtins::kNoBuiltinId);
+ EmbeddedData d = EmbeddedData::FromBlob();
+ Address entry = d.InstructionStartOfBuiltin(builtin_index);
+ li(t9, Operand(entry, RelocInfo::OFF_HEAP_TARGET));
+ Call(t9);
+ } else {
+ Handle<Code> code_target =
+ isolate()->builtins()->builtin_handle(Builtins::kRecordWrite);
Call(code_target, RelocInfo::CODE_TARGET);
}
diff --git a/chromium/v8/src/codegen/mips64/macro-assembler-mips64.h b/chromium/v8/src/codegen/mips64/macro-assembler-mips64.h
index 56380cc8b2b..fb8c5520296 100644
--- a/chromium/v8/src/codegen/mips64/macro-assembler-mips64.h
+++ b/chromium/v8/src/codegen/mips64/macro-assembler-mips64.h
@@ -907,7 +907,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
void CallRecordWriteStub(Register object, Register address,
RememberedSetAction remembered_set_action,
- SaveFPRegsMode fp_mode, Handle<Code> code_target,
+ SaveFPRegsMode fp_mode, int builtin_index,
Address wasm_target);
};