vnode_map: add test with pte_count larger than fits in source Frame
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Mon, 3 Oct 2016 15:13:28 +0000 (17:13 +0200)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Mon, 3 Oct 2016 15:13:28 +0000 (17:13 +0200)
Signed-off-by: Simon Gerber <simon.gerber@inf.ethz.ch>

platforms/Hakefile
usr/tests/nkm/Hakefile
usr/tests/nkm/map_offset.c [new file with mode: 0644]

index 8dda652..eb193d2 100644 (file)
@@ -37,6 +37,7 @@ let bin_rcce_lu = [ "/sbin/" ++ f | f <- [
                         "nkmtest_all",
                         "nkmtest_map_unmap",
                         "nkmtest_modify_flags",
+                        "nkmtest_map_offset",
                         "schedtest",
                         "test_retype",
                         "test_rootcn_resize",
index 665271f..c6b9947 100644 (file)
@@ -26,6 +26,9 @@
                       addCFlags = [ "-DSTANDALONE" ],
                       cFiles = [ "invalid_mappings.c" ]
                     },
+  build application { target = "nkmtest_map_offset",
+                      cFiles = [ "map_offset.c" ]
+                    },
   build application { target = "nkmtest_all",
                       cFiles = [ "invalid_mappings.c", "main.c",
                                  "modify_flags.c", "nkmtest.c",
diff --git a/usr/tests/nkm/map_offset.c b/usr/tests/nkm/map_offset.c
new file mode 100644 (file)
index 0000000..9f467b8
--- /dev/null
@@ -0,0 +1,87 @@
+/**
+ * \file
+ * \brief test that we cannot create mappings outside of provided frame
+ */
+
+/*
+ * Copyright (c) 2016, ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <barrelfish/barrelfish.h>
+#define FLAGS (VREGION_FLAGS_READ | VREGION_FLAGS_WRITE)
+
+int main(int argc, char *argv[])
+{
+    errval_t err;
+
+    struct capref vnode;
+    err = slot_alloc(&vnode);
+    assert(err_is_ok(err));
+#ifdef __x86_64__
+    enum objtype vntype = ObjType_VNode_x86_64_ptable;
+#elif defined(__arm__)
+    enum objtype vntype = ObjType_VNode_ARM_l2;
+#else
+#error Need to define vntype for this arch
+#endif
+    err = vnode_create(vnode, vntype);
+    assert(err_is_ok(err));
+
+    struct capref mapping;
+    err = slot_alloc(&mapping);
+    assert(err_is_ok(err));
+
+    struct capref frame;
+    size_t rb;
+    err = frame_alloc(&frame, 4096, &rb);
+    assert(err_is_ok(err));
+    assert(rb == 4096);
+
+    struct frame_identity id;
+    err = frame_identify(frame, &id);
+    assert(err_is_ok(err));
+    printf("base = %" PRIxGENPADDR ", bytes = %" PRIuGENSIZE "\n", id.base, id.bytes);
+    assert(id.bytes == 4096);
+
+    err = slot_alloc(&mapping);
+    assert(err_is_ok(err));
+    // try to map 128 pages with 1page frame
+    err = vnode_map(vnode, frame, 0, FLAGS, 0, 128, mapping);
+    if (err_no(err) != SYS_ERR_FRAME_OFFSET_INVALID) {
+        printf("FAILURE: got %s from vnode_map(128 pages); expected SYS_ERR_FRAME_OFFSET_INVALID\n",
+                err_getcode(err));
+        exit(1);
+    }
+    assert(err_no(err) == SYS_ERR_FRAME_OFFSET_INVALID);
+    err = vnode_map(vnode, frame, 0, FLAGS, 0, 1, mapping);
+    assert(err_is_ok(err));
+
+    err = frame_alloc(&frame, 4096, &rb);
+    assert(err_is_ok(err));
+    assert(rb == 4096);
+
+    err = frame_identify(frame, &id);
+    assert(err_is_ok(err));
+    assert(id.bytes == 4096);
+    printf("base = %" PRIxGENPADDR ", bytes = %" PRIuGENSIZE "\n", id.base, id.bytes);
+
+    err = slot_alloc(&mapping);
+    assert(err_is_ok(err));
+    err = vnode_map(vnode, frame, 1, FLAGS, 0, 1, mapping);
+    if(err_is_fail(err)) {
+      DEBUG_ERR(err, "vnode_map");
+    }
+    assert(err_is_ok(err));
+
+    printf("SUCCESS\n");
+
+    exit(0);
+}