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