Commit 661654f3 authored by Clemens Backes's avatar Clemens Backes Committed by V8 LUCI CQ

[traphandler] Fix simulator test for Mac

On Mac we handle SIGBUS, not SIGSEGV, so the test should access a valid
but inaccessible pointer to trigger the right signal.

R=jkummerow@chromium.org

Bug: v8:11955, v8:12249
Change-Id: I25b93ce40bccc24ef5e84694a7c03c465eb4c51e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3168344
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/main@{#76984}
parent 1fd55617
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "src/trap-handler/trap-handler-simulator.h" #include "src/trap-handler/trap-handler-simulator.h"
#include <cstdint>
#include "include/v8-initialization.h" #include "include/v8-initialization.h"
#include "src/codegen/macro-assembler-inl.h" #include "src/codegen/macro-assembler-inl.h"
#include "src/execution/simulator.h" #include "src/execution/simulator.h"
...@@ -23,6 +25,14 @@ constexpr uintptr_t kFakePc = 11; ...@@ -23,6 +25,14 @@ constexpr uintptr_t kFakePc = 11;
class SimulatorTrapHandlerTest : public TestWithIsolate { class SimulatorTrapHandlerTest : public TestWithIsolate {
public: public:
~SimulatorTrapHandlerTest() {
if (inaccessible_memory_) {
auto* page_allocator = GetPlatformPageAllocator();
CHECK(page_allocator->FreePages(inaccessible_memory_,
page_allocator->AllocatePageSize()));
}
}
void SetThreadInWasm() { void SetThreadInWasm() {
EXPECT_EQ(0, *thread_in_wasm); EXPECT_EQ(0, *thread_in_wasm);
*thread_in_wasm = 1; *thread_in_wasm = 1;
...@@ -33,7 +43,23 @@ class SimulatorTrapHandlerTest : public TestWithIsolate { ...@@ -33,7 +43,23 @@ class SimulatorTrapHandlerTest : public TestWithIsolate {
*thread_in_wasm = 0; *thread_in_wasm = 0;
} }
uintptr_t InaccessibleMemoryPtr() {
if (!inaccessible_memory_) {
auto* page_allocator = GetPlatformPageAllocator();
size_t page_size = page_allocator->AllocatePageSize();
inaccessible_memory_ =
reinterpret_cast<uint8_t*>(page_allocator->AllocatePages(
nullptr, /* size */ page_size, /* align */ page_size,
PageAllocator::kNoAccess));
CHECK_NOT_NULL(inaccessible_memory_);
}
return reinterpret_cast<uintptr_t>(inaccessible_memory_);
}
int* thread_in_wasm = trap_handler::GetThreadInWasmThreadLocalAddress(); int* thread_in_wasm = trap_handler::GetThreadInWasmThreadLocalAddress();
private:
uint8_t* inaccessible_memory_ = nullptr;
}; };
TEST_F(SimulatorTrapHandlerTest, ProbeMemorySuccess) { TEST_F(SimulatorTrapHandlerTest, ProbeMemorySuccess) {
...@@ -41,24 +67,26 @@ TEST_F(SimulatorTrapHandlerTest, ProbeMemorySuccess) { ...@@ -41,24 +67,26 @@ TEST_F(SimulatorTrapHandlerTest, ProbeMemorySuccess) {
EXPECT_EQ(0u, ProbeMemory(reinterpret_cast<uintptr_t>(&x), kFakePc)); EXPECT_EQ(0u, ProbeMemory(reinterpret_cast<uintptr_t>(&x), kFakePc));
} }
TEST_F(SimulatorTrapHandlerTest, ProbeMemoryFail) { TEST_F(SimulatorTrapHandlerTest, ProbeMemoryFailNullptr) {
constexpr uintptr_t kNullAddress = 0; constexpr uintptr_t kNullAddress = 0;
EXPECT_DEATH_IF_SUPPORTED(ProbeMemory(kNullAddress, kFakePc), ""); EXPECT_DEATH_IF_SUPPORTED(ProbeMemory(kNullAddress, kFakePc), "");
} }
TEST_F(SimulatorTrapHandlerTest, ProbeMemoryFailInaccessible) {
EXPECT_DEATH_IF_SUPPORTED(ProbeMemory(InaccessibleMemoryPtr(), kFakePc), "");
}
TEST_F(SimulatorTrapHandlerTest, ProbeMemoryFailWhileInWasm) { TEST_F(SimulatorTrapHandlerTest, ProbeMemoryFailWhileInWasm) {
// Test that we still crash if the trap handler is set up and the "thread in // Test that we still crash if the trap handler is set up and the "thread in
// wasm" flag is set, but the PC is not registered as a protected instruction. // wasm" flag is set, but the PC is not registered as a protected instruction.
constexpr bool kUseDefaultHandler = true; constexpr bool kUseDefaultHandler = true;
CHECK(v8::V8::EnableWebAssemblyTrapHandler(kUseDefaultHandler)); CHECK(v8::V8::EnableWebAssemblyTrapHandler(kUseDefaultHandler));
constexpr uintptr_t kNullAddress = 0;
SetThreadInWasm(); SetThreadInWasm();
EXPECT_DEATH_IF_SUPPORTED(ProbeMemory(kNullAddress, kFakePc), ""); EXPECT_DEATH_IF_SUPPORTED(ProbeMemory(InaccessibleMemoryPtr(), kFakePc), "");
} }
TEST_F(SimulatorTrapHandlerTest, ProbeMemoryWithTrapHandled) { TEST_F(SimulatorTrapHandlerTest, ProbeMemoryWithTrapHandled) {
constexpr uintptr_t kNullAddress = 0;
constexpr uintptr_t kFakeLandingPad = 19; constexpr uintptr_t kFakeLandingPad = 19;
constexpr bool kUseDefaultHandler = true; constexpr bool kUseDefaultHandler = true;
...@@ -69,7 +97,7 @@ TEST_F(SimulatorTrapHandlerTest, ProbeMemoryWithTrapHandled) { ...@@ -69,7 +97,7 @@ TEST_F(SimulatorTrapHandlerTest, ProbeMemoryWithTrapHandled) {
RegisterHandlerData(0, 128, 1, &fake_protected_instruction); RegisterHandlerData(0, 128, 1, &fake_protected_instruction);
SetThreadInWasm(); SetThreadInWasm();
EXPECT_EQ(kFakeLandingPad, ProbeMemory(kNullAddress, kFakePc)); EXPECT_EQ(kFakeLandingPad, ProbeMemory(InaccessibleMemoryPtr(), kFakePc));
// Reset everything. // Reset everything.
ResetThreadInWasm(); ResetThreadInWasm();
...@@ -87,9 +115,9 @@ TEST_F(SimulatorTrapHandlerTest, ProbeMemoryWithLandingPad) { ...@@ -87,9 +115,9 @@ TEST_F(SimulatorTrapHandlerTest, ProbeMemoryWithLandingPad) {
MacroAssembler masm(nullptr, AssemblerOptions{}, CodeObjectRequired::kNo, MacroAssembler masm(nullptr, AssemblerOptions{}, CodeObjectRequired::kNo,
buffer->CreateView()); buffer->CreateView());
// Generate an illegal memory access. // Generate an illegal memory access.
masm.Mov(scratch, 0); masm.Mov(scratch, InaccessibleMemoryPtr());
uint32_t crash_offset = masm.pc_offset(); uint32_t crash_offset = masm.pc_offset();
masm.Str(scratch, MemOperand(scratch, 0)); // nullptr access masm.Str(scratch, MemOperand(scratch, 0)); // load from inaccessible memory.
uint32_t recovery_offset = masm.pc_offset(); uint32_t recovery_offset = masm.pc_offset();
// Return. // Return.
masm.Ret(); masm.Ret();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment