Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


cba22a8e37f799df3f56c4c2648f3828cebab374
[palacios.git] / palacios / src / palacios / vmm_paging_debug.h
1
2 #ifdef USE_VMM_PAGING_DEBUG
3
4 /* 
5  * 
6  *  This is an implementation file that gets included only in vmm_paging.c
7  * 
8  */
9
10
11 static void PrintPDE32(addr_t virtual_address, pde32_t * pde)
12 {
13   PrintDebug("PDE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
14              (void *)virtual_address,
15              (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
16              pde->present,
17              pde->writable,
18              pde->user_page, 
19              pde->write_through,
20              pde->cache_disable,
21              pde->accessed,
22              pde->reserved,
23              pde->large_page,
24              pde->global_page,
25              pde->vmm_info);
26 }
27
28   
29 static void PrintPTE32(addr_t virtual_address, pte32_t * pte)
30 {
31   PrintDebug("PTE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, dirty=%x, pteAttribute=%x, globalPage=%x, vmm_info=%x\n",
32              (void *)virtual_address,
33              (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
34              pte->present,
35              pte->writable,
36              pte->user_page,
37              pte->write_through,
38              pte->cache_disable,
39              pte->accessed,
40              pte->dirty,
41              pte->pte_attr,
42              pte->global_page,
43              pte->vmm_info);
44 }
45
46
47
48
49
50
51
52
53 static void PrintPDPE32PAE(addr_t virtual_address, pdpe32pae_t * pdpe)
54 {
55   PrintDebug("PDPE %p -> %p : present=%x, wt=%x, cd=%x, accessed=%x, kernelInfo=%x\n",
56              (void *)virtual_address,
57              (void *)(addr_t) (pdpe->pd_base_addr << PAGE_POWER),
58              pdpe->present,
59              pdpe->write_through,
60              pdpe->cache_disable,
61              pdpe->accessed,
62              pdpe->vmm_info);
63 }
64
65 static void PrintPDE32PAE(addr_t virtual_address, pde32pae_t * pde)
66 {
67   PrintDebug("PDE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
68              (void *)virtual_address,
69              (void *)(addr_t) (pde->pt_base_addr << PAGE_POWER),
70              pde->present,
71              pde->writable,
72              pde->user_page, 
73              pde->write_through,
74              pde->cache_disable,
75              pde->accessed,
76              pde->large_page,
77              pde->global_page,
78              pde->vmm_info);
79 }
80
81   
82 static void PrintPTE32PAE(addr_t virtual_address, pte32pae_t * pte)
83 {
84   PrintDebug("PTE %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, dirty=%x, pteAttribute=%x, globalPage=%x, vmm_info=%x\n",
85              (void *)virtual_address,
86              (void*)(addr_t)(pte->page_base_addr << PAGE_POWER),
87              pte->present,
88              pte->writable,
89              pte->user_page,
90              pte->write_through,
91              pte->cache_disable,
92              pte->accessed,
93              pte->dirty,
94              pte->pte_attr,
95              pte->global_page,
96              pte->vmm_info);
97 }
98
99
100
101
102
103
104
105
106 static void PrintPML4e64(addr_t virtual_address, pml4e64_t * pml)
107 {
108   PrintDebug("PML4e64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, kernelInfo=%x\n",
109              (void *)virtual_address,
110              (void *)(addr_t) (BASE_TO_PAGE_ADDR(pml->pdp_base_addr)),
111              pml->present,
112              pml->writable,
113              pml->user_page, 
114              pml->write_through,
115              pml->cache_disable,
116              pml->accessed,
117              pml->reserved,
118              pml->vmm_info);
119 }
120
121 static void PrintPDPE64(addr_t virtual_address, pdpe64_t * pdpe)
122 {
123   PrintDebug("PDPE64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, largePages=%x, globalPage/zero=%x, kernelInfo=%x\n",
124              (void *)virtual_address,
125              (void *)(addr_t) (BASE_TO_PAGE_ADDR(pdpe->pd_base_addr)),
126              pdpe->present,
127              pdpe->writable,
128              pdpe->user_page, 
129              pdpe->write_through,
130              pdpe->cache_disable,
131              pdpe->accessed,
132              pdpe->avail,
133              pdpe->large_page,
134              pdpe->zero,
135              pdpe->vmm_info);
136 }
137
138
139
140 static void PrintPDE64(addr_t virtual_address, pde64_t * pde)
141 {
142   PrintDebug("PDE64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, reserved=%x, largePages=%x, globalPage=%x, kernelInfo=%x\n",
143              (void *)virtual_address,
144              (void *)(addr_t) (BASE_TO_PAGE_ADDR(pde->pt_base_addr)),
145              pde->present,
146              pde->writable,
147              pde->user_page, 
148              pde->write_through,
149              pde->cache_disable,
150              pde->accessed,
151              pde->avail,
152              pde->large_page,
153              pde->global_page,
154              pde->vmm_info);
155 }
156
157   
158 static void PrintPTE64(addr_t virtual_address, pte64_t * pte)
159 {
160   PrintDebug("PTE64 %p -> %p : present=%x, writable=%x, user=%x, wt=%x, cd=%x, accessed=%x, dirty=%x, pteAttribute=%x, globalPage=%x, vmm_info=%x\n",
161              (void *)virtual_address,
162              (void*)(addr_t)(BASE_TO_PAGE_ADDR(pte->page_base_addr)),
163              pte->present,
164              pte->writable,
165              pte->user_page,
166              pte->write_through,
167              pte->cache_disable,
168              pte->accessed,
169              pte->dirty,
170              pte->pte_attr,
171              pte->global_page,
172              pte->vmm_info);
173 }
174
175   
176
177
178
179
180
181
182
183
184
185
186
187
188 static int print_page_tree_cb(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data) {
189
190   switch (type) {
191
192     /* 64 Bit */
193
194   case PAGE_PML464:
195     {
196       pml4e64_t * pml = (pml4e64_t *)page_ptr;
197       PrintPML4e64(vaddr, &(pml[PML4E64_INDEX(vaddr)]));
198       break;
199     }
200   case PAGE_PDP64:
201     {
202       pdpe64_t * pdp = (pdpe64_t *)page_ptr;
203       PrintPDPE64(vaddr, &(pdp[PDPE64_INDEX(vaddr)]));
204       break;
205     }
206   case PAGE_PD64:
207     {
208       pde64_t * pd = (pde64_t *)page_ptr;
209       PrintPDE64(vaddr, &(pd[PDE64_INDEX(vaddr)]));
210       break;
211     }
212   case PAGE_PT64:
213     {
214       pte64_t * pt = (pte64_t *)page_ptr;
215       PrintPTE64(vaddr, &(pt[PTE64_INDEX(vaddr)]));
216       break;
217     }
218
219     /* 32 BIT PAE */
220     
221   case PAGE_PDP32PAE:
222     {
223       pdpe32pae_t * pdp = (pdpe32pae_t *)page_ptr;
224       PrintPDPE32PAE(vaddr, &(pdp[PDPE32PAE_INDEX(vaddr)]));
225       break;
226     }
227   case PAGE_PD32PAE:
228     {
229       pde32pae_t * pd = (pde32pae_t *)page_ptr;
230       PrintPDE32PAE(vaddr, &(pd[PDE32PAE_INDEX(vaddr)]));
231       break;
232     }
233   case PAGE_PT32PAE:
234     {
235       pte32pae_t * pt = (pte32pae_t *)page_ptr;
236       PrintPTE32PAE(vaddr, &(pt[PTE32PAE_INDEX(vaddr)]));
237       break;
238     }
239
240     /* 32 Bit */
241
242   case PAGE_PD32:
243     {
244       pde32_t * pd = (pde32_t *)page_ptr;
245       PrintPDE32(vaddr, &(pd[PDE32_INDEX(vaddr)]));
246       break;
247     }
248   case PAGE_PT32:
249     {
250       pte32_t * pt = (pte32_t *)page_ptr;
251       PrintPTE32(vaddr, &(pt[PTE32_INDEX(vaddr)]));
252       break;
253     }
254   default:
255     PrintDebug("%s %p->%p \n", v3_page_type_to_str(type), (void *)vaddr, (void *)page_pa);
256     break;
257   }
258
259   return 0;
260 }
261
262
263
264 void PrintPTEntry(page_type_t type, addr_t vaddr, void * entry) {
265   print_page_tree_cb(type, vaddr, PAGE_ADDR_4KB((addr_t)entry), 0, NULL);
266 }
267
268
269 void PrintHostPageTables(v3_vm_cpu_mode_t cpu_mode, addr_t cr3) {
270   switch (cpu_mode) {
271   case PROTECTED:
272     v3_walk_host_pt_32(cr3, print_page_tree_cb, NULL);
273   case PROTECTED_PAE:
274     v3_walk_host_pt_32pae(cr3, print_page_tree_cb, NULL);
275   case LONG:
276   case LONG_32_COMPAT:
277   case LONG_16_COMPAT:
278     v3_walk_host_pt_64(cr3, print_page_tree_cb, NULL);
279     break;
280   default:
281     PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(cpu_mode));
282     break;
283   }
284 }
285
286
287 void PrintGuestPageTables(struct guest_info * info, addr_t cr3) {
288   switch (info->cpu_mode) {
289   case PROTECTED:
290     v3_walk_guest_pt_32(info, cr3, print_page_tree_cb, NULL);
291   case PROTECTED_PAE:
292     v3_walk_guest_pt_32pae(info, cr3, print_page_tree_cb, NULL);
293   case LONG:
294   case LONG_32_COMPAT:
295   case LONG_16_COMPAT:
296     v3_walk_guest_pt_64(info, cr3, print_page_tree_cb, NULL);
297     break;
298   default:
299     PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
300     break;
301   }
302 }
303
304 void PrintHostPageTree(v3_vm_cpu_mode_t cpu_mode, addr_t virtual_addr, addr_t cr3) {
305   switch (cpu_mode) {
306   case PROTECTED:
307     v3_drill_host_pt_32(cr3, virtual_addr, print_page_tree_cb, NULL);
308   case PROTECTED_PAE:
309     v3_drill_host_pt_32pae(cr3, virtual_addr, print_page_tree_cb, NULL);
310   case LONG:
311   case LONG_32_COMPAT:
312   case LONG_16_COMPAT:
313     v3_drill_host_pt_64(cr3, virtual_addr, print_page_tree_cb, NULL);
314     break;
315   default:
316     PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(cpu_mode));
317     break;
318   }
319 }
320
321 void PrintGuestPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3) {
322   switch (info->cpu_mode) {
323   case PROTECTED:
324     v3_drill_guest_pt_32(info, cr3, virtual_addr, print_page_tree_cb, NULL);
325   case PROTECTED_PAE:
326     v3_drill_guest_pt_32pae(info, cr3, virtual_addr, print_page_tree_cb, NULL);
327   case LONG:
328   case LONG_32_COMPAT:
329   case LONG_16_COMPAT:
330     v3_drill_guest_pt_64(info, cr3, virtual_addr, print_page_tree_cb, NULL);
331     break;
332   default:
333     PrintError("Unsupported CPU MODE %s\n", v3_cpu_mode_to_str(info->cpu_mode));
334     break;
335   }
336 }
337
338
339 #endif