armv7: paging: proper check if `pte_count` pages fit inside source frame starting...
[barrelfish] / usr / tests / nkm / map_offset.c
1 /**
2  * \file
3  * \brief test that we cannot create mappings outside of provided frame
4  */
5
6 /*
7  * Copyright (c) 2016, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #include <stdio.h>
16 #include <stdlib.h>
17
18 #include <barrelfish/barrelfish.h>
19 #define FLAGS (VREGION_FLAGS_READ | VREGION_FLAGS_WRITE)
20
21 int main(int argc, char *argv[])
22 {
23     errval_t err;
24
25     struct capref vnode;
26     err = slot_alloc(&vnode);
27     assert(err_is_ok(err));
28 #ifdef __x86_64__
29     enum objtype vntype = ObjType_VNode_x86_64_ptable;
30 #elif defined(__arm__)
31     enum objtype vntype = ObjType_VNode_ARM_l2;
32 #else
33 #error Need to define vntype for this arch
34 #endif
35     err = vnode_create(vnode, vntype);
36     assert(err_is_ok(err));
37
38     struct capref mapping;
39     err = slot_alloc(&mapping);
40     assert(err_is_ok(err));
41
42     struct capref frame;
43     size_t rb;
44     err = frame_alloc(&frame, 4096, &rb);
45     assert(err_is_ok(err));
46     assert(rb == 4096);
47
48     struct frame_identity id;
49     err = frame_identify(frame, &id);
50     assert(err_is_ok(err));
51     printf("base = %" PRIxGENPADDR ", bytes = %" PRIuGENSIZE "\n", id.base, id.bytes);
52     assert(id.bytes == 4096);
53
54     err = slot_alloc(&mapping);
55     assert(err_is_ok(err));
56     // try to map 128 pages with 1page frame
57     err = vnode_map(vnode, frame, 0, FLAGS, 0, 128, mapping);
58     if (err_no(err) != SYS_ERR_FRAME_OFFSET_INVALID) {
59         printf("FAILURE: got %s from vnode_map(128 pages); expected SYS_ERR_FRAME_OFFSET_INVALID\n",
60                 err_getcode(err));
61         exit(1);
62     }
63     assert(err_no(err) == SYS_ERR_FRAME_OFFSET_INVALID);
64     err = vnode_map(vnode, frame, 0, FLAGS, 0, 1, mapping);
65     assert(err_is_ok(err));
66
67     err = frame_alloc(&frame, 4096, &rb);
68     assert(err_is_ok(err));
69     assert(rb == 4096);
70
71     err = frame_identify(frame, &id);
72     assert(err_is_ok(err));
73     assert(id.bytes == 4096);
74     printf("base = %" PRIxGENPADDR ", bytes = %" PRIuGENSIZE "\n", id.base, id.bytes);
75
76     err = slot_alloc(&mapping);
77     assert(err_is_ok(err));
78     err = vnode_map(vnode, frame, 1, FLAGS, 0, 1, mapping);
79     if(err_is_fail(err)) {
80       DEBUG_ERR(err, "vnode_map");
81     }
82     assert(err_is_ok(err));
83
84     printf("SUCCESS\n");
85
86     exit(0);
87 }