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
21int 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#elif defined(__aarch64__)
33    enum objtype vntype = ObjType_VNode_AARCH64_l3;
34#else
35#error Need to define vntype for this arch
36#endif
37    err = vnode_create(vnode, vntype);
38    assert(err_is_ok(err));
39
40    struct capref mapping;
41    err = slot_alloc(&mapping);
42    assert(err_is_ok(err));
43
44    struct capref frame;
45    size_t rb;
46    err = frame_alloc(&frame, 4096, &rb);
47    assert(err_is_ok(err));
48    assert(rb == 4096);
49
50    struct frame_identity id;
51    err = frame_identify(frame, &id);
52    assert(err_is_ok(err));
53    printf("base = %" PRIxGENPADDR ", bytes = %" PRIuGENSIZE "\n", id.base, id.bytes);
54    assert(id.bytes == 4096);
55
56    err = slot_alloc(&mapping);
57    assert(err_is_ok(err));
58    // try to map 128 pages with 1page frame
59    err = vnode_map(vnode, frame, 0, FLAGS, 0, 128, mapping);
60    if (err_no(err) != SYS_ERR_FRAME_OFFSET_INVALID) {
61        printf("%s: FAILURE: got %s from vnode_map(128 pages); expected SYS_ERR_FRAME_OFFSET_INVALID\n",
62                argv[0], err_getcode(err));
63        exit(1);
64    }
65    assert(err_no(err) == SYS_ERR_FRAME_OFFSET_INVALID);
66    err = vnode_map(vnode, frame, 0, FLAGS, 0, 1, mapping);
67    assert(err_is_ok(err));
68
69    err = frame_alloc(&frame, 4096, &rb);
70    assert(err_is_ok(err));
71    assert(rb == 4096);
72
73    err = frame_identify(frame, &id);
74    assert(err_is_ok(err));
75    assert(id.bytes == 4096);
76    printf("base = %" PRIxGENPADDR ", bytes = %" PRIuGENSIZE "\n", id.base, id.bytes);
77
78    err = slot_alloc(&mapping);
79    assert(err_is_ok(err));
80    err = vnode_map(vnode, frame, 1, FLAGS, 0, 1, mapping);
81    if(err_is_fail(err)) {
82      DEBUG_ERR(err, "vnode_map");
83    }
84    assert(err_is_ok(err));
85
86    printf("%s: SUCCESS\n", argv[0]);
87
88    exit(0);
89}
90