[utest] Use <lib/fzl/memory-probe.h> in vmar-test
There's a library for this, so make the test use that instead
of rolling its own.
Bug: 3770
Change-Id: I5ff1c0b50406190607396db62d92ef235b7763d5
diff --git a/zircon/system/utest/core/vmar/BUILD.gn b/zircon/system/utest/core/vmar/BUILD.gn
index 610c426..8296d53 100644
--- a/zircon/system/utest/core/vmar/BUILD.gn
+++ b/zircon/system/utest/core/vmar/BUILD.gn
@@ -10,6 +10,7 @@
deps = [
"$zx/system/ulib/fbl",
"$zx/system/ulib/fdio",
+ "$zx/system/ulib/fzl",
"$zx/system/ulib/unittest",
"$zx/system/ulib/zircon",
"$zx/system/ulib/zx",
diff --git a/zircon/system/utest/core/vmar/vmar.cc b/zircon/system/utest/core/vmar/vmar.cc
index 3df447a..79553a6 100644
--- a/zircon/system/utest/core/vmar/vmar.cc
+++ b/zircon/system/utest/core/vmar/vmar.cc
@@ -4,6 +4,7 @@
#include <assert.h>
#include <errno.h>
+#include <lib/fzl/memory-probe.h>
#include <lib/zx/job.h>
#include <lib/zx/process.h>
#include <lib/zx/vmar.h>
@@ -55,93 +56,6 @@
return true;
}
-// Thread run by test_local_address, used to attempt an access to memory
-void TestWriteAddressThread(uintptr_t address, bool* success) {
- auto p = reinterpret_cast<std::atomic_uint8_t*>(address);
- p->store(5);
- *success = true;
-
- zx_thread_exit();
-}
-// Thread run by test_local_address, used to attempt an access to memory
-void TestReadAddressThread(uintptr_t address, bool* success) {
- auto p = reinterpret_cast<std::atomic_uint8_t*>(address);
- (void)p->load();
- *success = true;
-
- zx_thread_exit();
-}
-
-// Helper routine for testing via direct access whether or not an address in the
-// test process's address space is accessible.
-zx_status_t test_local_address(uintptr_t address, bool write, bool* success) {
- *success = false;
-
- alignas(16) static uint8_t thread_stack[PAGE_SIZE];
-
- zx_handle_t thread = ZX_HANDLE_INVALID;
- zx_handle_t exception_channel = ZX_HANDLE_INVALID;
- zx_signals_t signals = 0;
- uintptr_t entry =
- reinterpret_cast<uintptr_t>(write ? TestWriteAddressThread : TestReadAddressThread);
- uintptr_t stack = reinterpret_cast<uintptr_t>(thread_stack + sizeof(thread_stack));
-
- zx_status_t status = zx_thread_create(zx_process_self(), "vmar_test_addr", 14, 0, &thread);
- if (status != ZX_OK) {
- goto err;
- }
-
- // Create an exception channel on the thread to prevent the thread's
- // illegal access from killing the process.
- status = zx_task_create_exception_channel(thread, 0, &exception_channel);
- if (status != ZX_OK) {
- goto err;
- }
-
- status = zx_thread_start(thread, entry, stack, address, reinterpret_cast<uintptr_t>(success));
- if (status != ZX_OK) {
- goto err;
- }
-
- status = zx_object_wait_one(exception_channel, ZX_CHANNEL_READABLE | ZX_CHANNEL_PEER_CLOSED,
- ZX_TIME_INFINITE, &signals);
- if (status != ZX_OK) {
- goto err;
- }
-
- if (signals & ZX_CHANNEL_READABLE) {
- // Kill the task so the exception doesn't bubble up to the system
- // crash handler.
- status = zx_task_kill(thread);
- if (status != ZX_OK) {
- goto err;
- }
-
- zx_exception_info_t info;
- zx_handle_t exception;
- status =
- zx_channel_read(exception_channel, 0, &info, &exception, sizeof(info), 1, nullptr, nullptr);
- if (status != ZX_OK) {
- goto err;
- }
-
- // We only expect a page fault exception here.
- if (info.type != ZX_EXCP_FATAL_PAGE_FAULT) {
- status = ZX_ERR_BAD_STATE;
- goto err;
- }
- } else {
- // The thread terminated without throwing any exceptions.
- *success = true;
- }
-
- // fallthrough to cleanup
-err:
- zx_handle_close(exception_channel);
- zx_handle_close(thread);
- return status;
-}
-
bool destroy_root_test() {
BEGIN_TEST;
@@ -1776,15 +1690,14 @@
ASSERT_EQ(zx_vmar_protect(zx_vmar_root_self(), ZX_VM_PERM_READ, mapping_addr, size), ZX_OK);
// Attempt to write to the mapping again
- bool success;
- EXPECT_EQ(test_local_address(mapping_addr, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
- EXPECT_EQ(test_local_address(mapping_addr + size / 4, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
- EXPECT_EQ(test_local_address(mapping_addr + size / 2, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
- EXPECT_EQ(test_local_address(mapping_addr + size - 1, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr)),
+ "mapping should no longer be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr + size / 4)),
+ "mapping should no longer be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr + size / 2)),
+ "mapping should no longer be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr + size - 1)),
+ "mapping should no longer be writeable");
EXPECT_EQ(zx_vmar_unmap(zx_vmar_root_self(), mapping_addr, size), ZX_OK);
@@ -1821,15 +1734,14 @@
ASSERT_EQ(zx_vmar_protect(zx_vmar_root_self(), ZX_VM_PERM_READ, base, protect_size), ZX_OK);
// Attempt to write to the mapping again
- bool success;
- EXPECT_EQ(test_local_address(mapping_addr, true, &success), ZX_OK);
- EXPECT_TRUE(success, "mapping should still be writeable");
- EXPECT_EQ(test_local_address(mapping_addr + size / 4, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
- EXPECT_EQ(test_local_address(mapping_addr + size / 2, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
- EXPECT_EQ(test_local_address(mapping_addr + size - 1, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
+ EXPECT_TRUE(probe_for_write(reinterpret_cast<void*>(mapping_addr)),
+ "mapping should still be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr + size / 4)),
+ "mapping should no longer be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr + size / 2)),
+ "mapping should no longer be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr + size - 1)),
+ "mapping should no longer be writeable");
EXPECT_EQ(zx_vmar_unmap(zx_vmar_root_self(), mapping_addr, size), ZX_OK);
@@ -1866,15 +1778,14 @@
ASSERT_EQ(zx_vmar_unmap(zx_vmar_root_self(), base, unmap_size), ZX_OK);
// Attempt to write to the mapping again
- bool success;
- EXPECT_EQ(test_local_address(mapping_addr, true, &success), ZX_OK);
- EXPECT_TRUE(success, "mapping should still be writeable");
- EXPECT_EQ(test_local_address(mapping_addr + size / 4, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
- EXPECT_EQ(test_local_address(mapping_addr + size / 2, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
- EXPECT_EQ(test_local_address(mapping_addr + size - 1, true, &success), ZX_OK);
- EXPECT_FALSE(success, "mapping should no longer be writeable");
+ EXPECT_TRUE(probe_for_write(reinterpret_cast<void*>(mapping_addr)),
+ "mapping should still be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr + size / 4)),
+ "mapping should no longer be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr + size / 2)),
+ "mapping should no longer be writeable");
+ EXPECT_FALSE(probe_for_write(reinterpret_cast<void*>(mapping_addr + size - 1)),
+ "mapping should no longer be writeable");
EXPECT_EQ(zx_vmar_unmap(zx_vmar_root_self(), mapping_addr, size), ZX_OK);