pmap: Fix lookup function and add test for it
[barrelfish] / usr / tests / pmaplookup / main.c
1 #include <stdio.h>
2 #include <barrelfish/barrelfish.h>
3
4 #define DEBUG_TEST 0
5
6 static 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
32 int 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 }