1#include <stdio.h>
2#include <barrelfish/barrelfish.h>
3
4#define DEBUG_TEST 0
5
6static void test_lookup(struct capref expected_cap, genvaddr_t addr, size_t offset){
7    addr += offset;
8    errval_t err;
9    struct pmap * my_pmap = get_current_pmap();
10    assert(my_pmap != NULL);
11    struct pmap_mapping_info mi;
12    err = my_pmap->f.lookup(my_pmap, addr, &mi);
13    if(err_is_fail(err)){
14        USER_PANIC_ERR(err, "pmap lookup");
15    }
16
17
18#if DEBUG_TEST
19    printf("=== pmap_mapping_info of 0x%"PRIxGENVADDR" ===\n", addr);
20    printf("   vaddr=0x%"PRIxGENVADDR"\n", mi.vaddr);
21    printf("   size=%zu\n", mi.size);
22    char buf[512];
23    debug_print_cap_at_capref(buf, 512, mi.cap);
24    printf("   cap = %s\n",buf);
25    printf("   offset=0x%" PRIxGENVADDR "\n", mi.offset);
26#endif
27
28    assert(capcmp(mi.cap, expected_cap));
29    assert(mi.offset + (addr - mi.vaddr) == offset);
30}
31
32int main(void){
33    printf("Hello world from pmap_test\n");
34
35    struct capref frame;
36    size_t retsize;
37    errval_t err;
38
39    #define SIZE (1024*1024*2)
40
41    err = frame_alloc(&frame, SIZE, &retsize);
42    assert(err_is_ok(err));
43
44    struct frame_identity fi;
45    err = cap_identify_mappable(frame, &fi);
46
47    assert(err_is_ok(err));
48
49    void *va;
50    err = vspace_map_one_frame_attr(&va, retsize, frame,
51            VREGION_FLAGS_READ_WRITE_NOCACHE, NULL, NULL);
52    assert(err_is_ok(err));
53
54    //lookup
55    printf("va = %p\n", va);
56    struct pmap * my_pmap = get_current_pmap();
57    assert(my_pmap != NULL);
58
59#if DEBUG_TEST
60    struct pmap_dump_info di[128];
61    size_t di_len = 0;
62    my_pmap->f.dump(my_pmap,di,128,&di_len);
63    for(int i=0; i<di_len;i++){
64        printf("pt idx =" PRIfmtPTIDX "", GET_PTIDX(di+i));
65        printf("   offset = %"PRIxGENVADDR "\n" , di[i].offset);
66        char buf[512];
67        debug_print_cap_at_capref(buf, 512, di[i].cap);
68        printf("   cap = %s\n",buf);
69    }
70#endif
71
72    for(size_t off=0; off < SIZE; off += BASE_PAGE_SIZE){
73        test_lookup(frame, (uintptr_t)va, off);
74    }
75
76    printf("pmaplookuptest passed successfully!\n");
77    return 0;
78}
79