1/** 2 * \file 3 * \brief Print pmap helper 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 16#include <barrelfish/barrelfish.h> 17#include <barrelfish/vregion.h> 18#include "vspace_dump.h" 19#include <stdio.h> 20#include <string.h> 21 22#ifdef TARGET_X86_64_BARRELFISH_PMAP_H 23static int cmp_dump_info(const void *arg1, const void *arg2) 24{ 25 struct pmap_dump_info *info1, *info2; 26 info1 = (struct pmap_dump_info *)arg1; 27 info2 = (struct pmap_dump_info *)arg2; 28 29 if (info1->pml4_index < info2->pml4_index) 30 return -1; 31 if (info1->pml4_index > info2->pml4_index) 32 return 1; 33 34 // pml indices equal 35 36 if (info1->pdpt_index < info2->pdpt_index) 37 return -1; 38 if (info1->pdpt_index > info2->pdpt_index) 39 return 1; 40 41 // pdpt indices equal 42 43 if (info1->pdir_index < info2->pdir_index) 44 return -1; 45 if (info1->pdir_index > info2->pdir_index) 46 return 1; 47 48 // pdir indices equal 49 50 if (info1->pt_index < info2->pt_index) 51 return -1; 52 if (info1->pt_index > info2->pt_index) 53 return 1; 54 55 // pt indices equal 56 return 0; 57} 58#elif defined(TARGET_X86_32_BARRELFISH_PMAP_H) 59static int cmp_dump_info(const void *arg1, const void *arg2) 60{ 61 struct pmap_dump_info *info1, *info2; 62 info1 = (struct pmap_dump_info *)arg1; 63 info2 = (struct pmap_dump_info *)arg2; 64 65#if CONFIG_PAE 66 if (info1->pdpt_index < info2->pdpt_index) 67 return -1; 68 if (info1->pdpt_index > info2->pdpt_index) 69 return 1; 70 71 // pdpt indices equal 72#endif 73 74 if (info1->pdir_index < info2->pdir_index) 75 return -1; 76 if (info1->pdir_index > info2->pdir_index) 77 return 1; 78 79 // pdir indices equal 80 81 if (info1->pt_index < info2->pt_index) 82 return -1; 83 if (info1->pt_index > info2->pt_index) 84 return 1; 85 86 // pt indices equal 87 return 0; 88} 89#else 90static int cmp_dump_info(const void *arg1, const void *arg2) 91{ 92 return 0; 93} 94#endif 95 96#define BUFSIZE 8192 97void dump_pmap(struct pmap *pmap) 98{ 99 struct pmap_dump_info *buf = calloc(BUFSIZE, sizeof(struct pmap_dump_info)); 100 size_t items_written; 101 102 pmap->f.dump(pmap, buf, BUFSIZE, &items_written); 103 104 printf("items_written=%zd\n", items_written); 105 106 qsort(buf, items_written, sizeof(struct pmap_dump_info), cmp_dump_info); 107 108 for (size_t i = 0; i < items_written; i++) { 109 struct pmap_dump_info *info = buf+i; 110 struct frame_identity fi; 111 invoke_frame_identify(info->cap, &fi); 112 printf(PRIfmtPTIDX": 0x%"PRIxGENPADDR", 0x%"PRIxGENVADDR", 0x%zx\n", 113 GET_PTIDX(info), 114 fi.base, info->offset, fi.bytes); 115 } 116 printf("\n"); 117 118} 119