1/** 2 * \file 3 * \brief Map/unmap new kernel memory test 4 */ 5 6/* 7 * Copyright (c) 2012, 2015, 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 <barrelfish/barrelfish.h> 16#include <barrelfish/cap_predicates.h> 17#include <stdio.h> 18#include "debug.h" 19#include "tests.h" 20#include "vspace_dump.h" 21 22int map_unmap(void) 23{ 24 errval_t err; 25 struct capref mem; 26 27 DEBUG_MAP_UNMAP("ram_alloc\n"); 28 err = ram_alloc(&mem, BASE_PAGE_BITS); 29 if (err_is_fail(err)) { 30 printf("ram_alloc: %s (%"PRIuERRV")\n", err_getstring(err), err); 31 return 1; 32 } 33 34 struct capref frame; 35 DEBUG_MAP_UNMAP("retype\n"); 36 err = slot_alloc(&frame); 37 if (err_is_fail(err)) { 38 printf("slot_alloc: %s (%"PRIuERRV")\n", err_getstring(err), err); 39 return 1; 40 } 41 err = cap_retype(frame, mem, 0, ObjType_Frame, BASE_PAGE_SIZE, 1); 42 if (err_is_fail(err)) { 43 printf("cap_retype: %s (%"PRIuERRV")\n", err_getstring(err), err); 44 return 1; 45 } 46 47 DEBUG_MAP_UNMAP("delete ram cap\n"); 48 err = cap_destroy(mem); 49 if (err_is_fail(err)) { 50 printf("cap_delete(mem): %s (%"PRIuERRV")\n", err_getstring(err), err); 51 return 1; 52 } 53 54 struct frame_identity fi; 55 err = invoke_frame_identify(frame, &fi); 56 if (err_is_fail(err)) { 57 printf("frame_identify: %s (%"PRIuERRV")\n", err_getstring(err), err); 58 return 1; 59 } 60 DEBUG_MAP_UNMAP("frame: base = 0x%"PRIxGENPADDR", bits = %d\n", fi.base, fi.bits); 61 62#ifdef NKMTEST_DEBUG_MAP_UNMAP 63 dump_pmap(get_current_pmap()); 64#endif 65 66 struct vregion *vr; 67 struct memobj *memobj; 68 void *vaddr; 69 DEBUG_MAP_UNMAP("map\n"); 70 err = vspace_map_one_frame(&vaddr, BASE_PAGE_SIZE, frame, &memobj, &vr); 71 if (err_is_fail(err)) { 72 printf("vspace_map_one_frame: %s (%"PRIuERRV")\n", err_getstring(err), err); 73 } 74 char *memory = vaddr; 75 DEBUG_MAP_UNMAP("vaddr = %p\n", vaddr); 76 77#ifdef NKMTEST_DEBUG_MAP_UNMAP 78 dump_pmap(get_current_pmap()); 79#endif 80 81 DEBUG_MAP_UNMAP("write 1\n"); 82 int i; 83 for (i = 0; i < BASE_PAGE_SIZE; i++) { 84 memory[i] = i % INT8_MAX; 85 } 86 DEBUG_MAP_UNMAP("verify 1\n"); 87 for (i = 0; i < BASE_PAGE_SIZE; i++) { 88 assert(memory[i] == i % INT8_MAX); 89 } 90 91 DEBUG_MAP_UNMAP("delete frame cap\n"); 92 err = cap_destroy(frame); 93 if (err_is_fail(err)) { 94 printf("cap_delete(frame): %s (%"PRIuERRV")\n", err_getstring(err), err); 95 return 1; 96 } 97 98#ifdef NKMTEST_DEBUG_MAP_UNMAP 99 // no mapping should remain here 100 dump_pmap(get_current_pmap()); 101 err = debug_dump_hw_ptables(); 102 if (err_is_fail(err)) { 103 printf("kernel dump ptables: %s (%"PRIuERRV")\n", err_getstring(err), err); 104 return 1; 105 } 106#endif 107 108 printf("%s: done\n", __FUNCTION__); 109 return 0; 110} 111 112#ifdef STANDALONE 113int main(void) { 114 return map_unmap(); 115} 116#endif 117