[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);