summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/wasm/trap-handler-simulator-unittest.cc
diff options
context:
space:
mode:
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.cc42
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();