Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1732)

Unified Diff: src/native_client/tests/dynamic_code_loading/dyncode_demand_alloc_test.c

Issue 7068021: Dynamic loading: Fill pages with halts only when they are needed (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: Fix log messages Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/native_client/tests/dynamic_code_loading/dyncode_demand_alloc_test.c
diff --git a/src/native_client/tests/dynamic_code_loading/dyncode_demand_alloc_test.c b/src/native_client/tests/dynamic_code_loading/dyncode_demand_alloc_test.c
new file mode 100644
index 0000000000000000000000000000000000000000..6b62c4fae8cc14ddde5b17a4290e5a370e594eb5
--- /dev/null
+++ b/src/native_client/tests/dynamic_code_loading/dyncode_demand_alloc_test.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2011 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 <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/nacl_syscalls.h>
+
+#include "native_client/tests/dynamic_code_loading/dynamic_segment.h"
+
+
+uint8_t halts[] =
+#if defined(__i386__) || defined(__x86_64__)
+ { 0xf4 }; /* HLT */
+#elif defined(__arm__)
+ { 0x76, 0x66, 0x26, 0xe1 }; /* 0xe1266676 - BKPT 0x6666 */
+#else
+# error "Unknown arch"
+#endif
+
+
+void load_into_page(uint8_t *dest) {
+ uint8_t buf[32];
+ int rc;
+ uint8_t *ptr;
+
+ /* Touch the page by loading some halt instructions into it. */
+ for (ptr = buf; ptr < buf + sizeof(buf); ptr += sizeof(halts)) {
+ memcpy(ptr, halts, sizeof(halts));
+ }
+ rc = nacl_dyncode_create(dest, buf, sizeof(buf));
+ assert(rc == 0);
+
+ /* Check that the whole page is correctly filled with halts. */
+ for (ptr = dest; ptr < dest + DYNAMIC_CODE_PAGE_SIZE; ptr += sizeof(halts)) {
+ if (memcmp(ptr, halts, sizeof(halts)) != 0) {
+ fprintf(stderr, "Mismatch at %p\n", ptr);
+ exit(1);
+ }
+ }
+}
+
+int main() {
+ uint8_t *dyncode = (uint8_t *) DYNAMIC_CODE_SEGMENT_START;
+ int value;
+
+ /* Sanity check: First check that two code pages can be written and
+ read, before we check that the page inbetween is unreadable. */
+ load_into_page(dyncode);
+ load_into_page(dyncode + DYNAMIC_CODE_PAGE_SIZE * 2);
+
+ printf("Attempting to read from unallocated dyncode page. "
+ "This should fault...\n");
+ value = dyncode[DYNAMIC_CODE_PAGE_SIZE];
+ printf("Failed: Dynamic code page was readable and contained the "
+ "byte 0x%x.\n", value);
+ return 1;
+}

Powered by Google App Engine
This is Rietveld 408576698