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