Index: tests/irt_ext/mem_calls.c |
diff --git a/tests/irt_ext/mem_calls.c b/tests/irt_ext/mem_calls.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a293ff7ec93e1bf28e37d9552822153d50fbae7e |
--- /dev/null |
+++ b/tests/irt_ext/mem_calls.c |
@@ -0,0 +1,67 @@ |
+/* |
+ * Copyright (c) 2014 The Native Client Authors. All rights reserved. |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "native_client/src/include/nacl_assert.h" |
+#include "native_client/src/untrusted/irt/irt.h" |
+#include "native_client/src/untrusted/irt/irt_extension.h" |
+#include "native_client/tests/irt_ext/mem_calls.h" |
+ |
+static struct mem_calls_environment *g_activated_env = NULL; |
+static const struct mem_calls_environment g_empty_env = { 0 }; |
+static struct nacl_irt_memory g_irt_memory = { NULL }; |
+ |
+static int my_mmap(void **addr, size_t len, int prot, int flags, int fd, |
+ nacl_irt_off_t off) { |
+ if (g_activated_env) { |
+ g_activated_env->num_mmap_calls++; |
+ } |
+ |
+ return g_irt_memory.mmap(addr, len, prot, flags, fd, off); |
+} |
+ |
+static int my_munmap(void *addr, size_t len) { |
+ if (g_activated_env) { |
+ g_activated_env->num_munmap_calls++; |
+ } |
+ |
+ return g_irt_memory.munmap(addr, len); |
+} |
+ |
+static int my_mprotect(void *addr, size_t len, int prot) { |
+ if (g_activated_env) { |
+ g_activated_env->num_mprotect_calls++; |
+ } |
+ |
+ return g_irt_memory.mprotect(addr, len, prot); |
+} |
+ |
+void init_mem_calls_module(void) { |
+ size_t bytes = nacl_interface_query(NACL_IRT_MEMORY_v0_3, |
+ &g_irt_memory, sizeof(g_irt_memory)); |
+ ASSERT_EQ(bytes, sizeof(g_irt_memory)); |
+ |
+ struct nacl_irt_memory mem = { |
+ my_mmap, |
+ my_munmap, |
+ my_mprotect |
+ }; |
+ |
+ bytes = nacl_interface_ext_supply(NACL_IRT_MEMORY_v0_3, &mem, |
+ sizeof(mem)); |
+ ASSERT_EQ(bytes, sizeof(mem)); |
+} |
+ |
+void init_mem_calls_environment(struct mem_calls_environment *env) { |
+ *env = g_empty_env; |
+} |
+ |
+void activate_mem_calls_env(struct mem_calls_environment *env) { |
+ g_activated_env = env; |
+} |
+ |
+void deactivate_mem_calls_env(void) { |
+ g_activated_env = NULL; |
+} |