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