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.


lots of changes...
[palacios.git] / palacios / src / palacios / vmm_shadow_paging.c
1 #include <palacios/vmm_shadow_paging.h>
2
3
4 #include <palacios/vmm.h>
5 #include <palacios/vm_guest_mem.h>
6
7 extern struct vmm_os_hooks * os_hooks;
8
9
10 int init_shadow_page_state(struct shadow_page_state * state) {
11   state->guest_mode = PDE32;
12   state->shadow_mode = PDE32;
13   
14   state->guest_cr3 = 0;
15   state->shadow_cr3 = 0;
16
17   return 0;
18 }
19
20 int handle_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
21   if (info->cpu_mode == PROTECTED_PG) {
22     return handle_shadow_pagefault32(info, fault_addr, error_code);
23   } else {
24     return -1;
25   }
26 }
27
28
29 int handle_shadow_pagefault32(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
30   pde32_t * guest_pde = NULL;
31   pde32_t * shadow_pde = (pde32_t *)CR3_TO_PDE32(info->shdw_pg_state.shadow_cr3);
32   addr_t guest_cr3 = CR3_TO_PDE32(info->shdw_pg_state.guest_cr3);
33
34   if (guest_pa_to_host_va(info, guest_cr3, (addr_t*)&guest_pde) == -1) {
35     return -1;
36   }
37
38   if (error_code.present == 0) {
39     // Faulted because page was not present...
40     if (shadow_pde[PDE32_INDEX(fault_addr)].present) {
41       
42       
43     } else {
44       return -1;
45     }    
46   }
47
48   // Checks:
49   // Shadow PDE
50   // Guest PDE
51   // Shadow PTE
52   // Guest PTE
53   // Mem Map
54   
55   return -1;
56 }
57
58
59 addr_t create_new_shadow_pt32(struct guest_info * info) {
60   void * host_pde = 0;
61
62   V3_AllocPages(host_pde, 1);
63   memset(host_pde, 0, PAGE_SIZE);
64
65   return (addr_t)host_pde;
66 }
67
68
69
70
71 addr_t setup_shadow_pt32(struct guest_info * info, addr_t virt_cr3) {
72   addr_t cr3_guest_addr = CR3_TO_PDE32(virt_cr3);
73   pde32_t * guest_pde;
74   pde32_t * host_pde = NULL;
75   int i;
76   
77   // Setup up guest_pde to point to the PageDir in host addr
78   if (guest_pa_to_host_va(info, cr3_guest_addr, (addr_t*)&guest_pde) == -1) {
79     return 0;
80   }
81   
82   V3_AllocPages(host_pde, 1);
83   memset(host_pde, 0, PAGE_SIZE);
84
85   for (i = 0; i < MAX_PDE32_ENTRIES; i++) {
86     if (guest_pde[i].present == 1) {
87       addr_t pt_host_addr;
88       addr_t host_pte;
89
90       if (guest_pa_to_host_va(info, PDE32_T_ADDR(guest_pde[i]), &pt_host_addr) == -1) {
91         return 0;
92       }
93
94       if ((host_pte = setup_shadow_pte32(info, pt_host_addr)) == 0) {
95         return 0;
96       }
97
98       host_pde[i].present = 1;
99       host_pde[i].pt_base_addr = PD32_BASE_ADDR(host_pte);
100
101       //
102       // Set Page DIR flags
103       //
104     }
105   }
106
107   PrintDebugPageTables(host_pde);
108
109   return (addr_t)host_pde;
110 }
111
112
113
114 addr_t setup_shadow_pte32(struct guest_info * info, addr_t pt_host_addr) {
115   pte32_t * guest_pte = (pte32_t *)pt_host_addr;
116   pte32_t * host_pte = NULL;
117   int i;
118
119   V3_AllocPages(host_pte, 1);
120   memset(host_pte, 0, PAGE_SIZE);
121
122   for (i = 0; i < MAX_PTE32_ENTRIES; i++) {
123     if (guest_pte[i].present == 1) {
124       addr_t guest_pa = PTE32_T_ADDR(guest_pte[i]);
125       shadow_mem_type_t page_type;
126       addr_t host_pa = 0;
127
128       page_type = get_shadow_addr_type(info, guest_pa);
129
130       if (page_type == HOST_REGION_PHYSICAL_MEMORY) {
131         host_pa = get_shadow_addr(info, guest_pa);
132       } else {
133         
134         //
135         // Setup various memory types
136         //
137       }
138
139       host_pte[i].page_base_addr = PT32_BASE_ADDR(host_pa);
140       host_pte[i].present = 1;
141     }
142   }
143
144   return (addr_t)host_pte;
145 }
146
147