diff options
Diffstat (limited to 'deps/v8/test/unittests/wasm/trap-handler-simulator-unittest.cc')
-rw-r--r-- | deps/v8/test/unittests/wasm/trap-handler-simulator-unittest.cc | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/deps/v8/test/unittests/wasm/trap-handler-simulator-unittest.cc b/deps/v8/test/unittests/wasm/trap-handler-simulator-unittest.cc index dffa202b03..01d446879b 100644 --- a/deps/v8/test/unittests/wasm/trap-handler-simulator-unittest.cc +++ b/deps/v8/test/unittests/wasm/trap-handler-simulator-unittest.cc @@ -4,6 +4,8 @@ #include "src/trap-handler/trap-handler-simulator.h" +#include <cstdint> + #include "include/v8-initialization.h" #include "src/codegen/macro-assembler-inl.h" #include "src/execution/simulator.h" @@ -23,6 +25,14 @@ constexpr uintptr_t kFakePc = 11; class SimulatorTrapHandlerTest : public TestWithIsolate { public: + ~SimulatorTrapHandlerTest() { + if (inaccessible_memory_) { + auto* page_allocator = GetPlatformPageAllocator(); + CHECK(page_allocator->FreePages(inaccessible_memory_, + page_allocator->AllocatePageSize())); + } + } + void SetThreadInWasm() { EXPECT_EQ(0, *thread_in_wasm); *thread_in_wasm = 1; @@ -33,7 +43,23 @@ class SimulatorTrapHandlerTest : public TestWithIsolate { *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(); + + private: + uint8_t* inaccessible_memory_ = nullptr; }; TEST_F(SimulatorTrapHandlerTest, ProbeMemorySuccess) { @@ -41,24 +67,26 @@ TEST_F(SimulatorTrapHandlerTest, ProbeMemorySuccess) { EXPECT_EQ(0u, ProbeMemory(reinterpret_cast<uintptr_t>(&x), kFakePc)); } -TEST_F(SimulatorTrapHandlerTest, ProbeMemoryFail) { +TEST_F(SimulatorTrapHandlerTest, ProbeMemoryFailNullptr) { constexpr uintptr_t kNullAddress = 0; EXPECT_DEATH_IF_SUPPORTED(ProbeMemory(kNullAddress, kFakePc), ""); } +TEST_F(SimulatorTrapHandlerTest, ProbeMemoryFailInaccessible) { + EXPECT_DEATH_IF_SUPPORTED(ProbeMemory(InaccessibleMemoryPtr(), kFakePc), ""); +} + TEST_F(SimulatorTrapHandlerTest, ProbeMemoryFailWhileInWasm) { // 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. constexpr bool kUseDefaultHandler = true; CHECK(v8::V8::EnableWebAssemblyTrapHandler(kUseDefaultHandler)); - constexpr uintptr_t kNullAddress = 0; SetThreadInWasm(); - EXPECT_DEATH_IF_SUPPORTED(ProbeMemory(kNullAddress, kFakePc), ""); + EXPECT_DEATH_IF_SUPPORTED(ProbeMemory(InaccessibleMemoryPtr(), kFakePc), ""); } TEST_F(SimulatorTrapHandlerTest, ProbeMemoryWithTrapHandled) { - constexpr uintptr_t kNullAddress = 0; constexpr uintptr_t kFakeLandingPad = 19; constexpr bool kUseDefaultHandler = true; @@ -69,7 +97,7 @@ TEST_F(SimulatorTrapHandlerTest, ProbeMemoryWithTrapHandled) { RegisterHandlerData(0, 128, 1, &fake_protected_instruction); SetThreadInWasm(); - EXPECT_EQ(kFakeLandingPad, ProbeMemory(kNullAddress, kFakePc)); + EXPECT_EQ(kFakeLandingPad, ProbeMemory(InaccessibleMemoryPtr(), kFakePc)); // Reset everything. ResetThreadInWasm(); @@ -87,9 +115,9 @@ TEST_F(SimulatorTrapHandlerTest, ProbeMemoryWithLandingPad) { MacroAssembler masm(nullptr, AssemblerOptions{}, CodeObjectRequired::kNo, buffer->CreateView()); // Generate an illegal memory access. - masm.Mov(scratch, 0); + masm.Mov(scratch, InaccessibleMemoryPtr()); 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(); // Return. masm.Ret(); |