#include <geekos/vmm_shadow_paging.h>
#include <geekos/vmm.h>
+#include <geekos/vm_guest_mem.h>
extern struct vmm_os_hooks * os_hooks;
-int init_shadow_page_state(shadow_page_state_t * state) {
+int init_shadow_page_state(struct shadow_page_state * state) {
state->guest_mode = PDE32;
state->shadow_mode = PDE32;
}
-int wholesale_update_shadow_page_state(shadow_page_state_t * state, shadow_map_t * mem_map) {
+int wholesale_update_shadow_page_state(struct guest_info * guest_info) {
unsigned i, j;
- vmm_pde_t * guest_pde;
- vmm_pde_t * shadow_pde;
+ pde32_t * guest_pde;
+ pde32_t * shadow_pde;
+
+ struct shadow_page_state * state = &(guest_info->shdw_pg_state);
// For now, we'll only work with PDE32
return -1;
}
-
-
- shadow_pde = (vmm_pde_t *)(CR3_TO_PDE(state->shadow_cr3.e_reg.low));
- guest_pde = (vmm_pde_t *)(os_hooks->paddr_to_vaddr((void*)CR3_TO_PDE(state->guest_cr3.e_reg.low)));
+ shadow_pde = (pde32_t *)(CR3_TO_PDE32(state->shadow_cr3.e_reg.low));
+ guest_pde = (pde32_t *)(host_pa_to_host_va((void*)CR3_TO_PDE32(state->guest_cr3.e_reg.low)));
// Delete the current page table
delete_page_tables_pde32(shadow_pde);
shadow_pde = os_hooks->allocate_pages(1);
-
state->shadow_cr3.e_reg.low = (addr_t)shadow_pde;
state->shadow_mode = PDE32;
-
for (i = 0; i < MAX_PDE32_ENTRIES; i++) {
shadow_pde[i] = guest_pde[i];
addr_t host_addr;
shadow_region_t * ent;
- ent = get_shadow_region_by_addr(mem_map, guest_addr);
+ ent = get_shadow_region_by_addr(&(guest_info->mem_map), guest_addr);
if (!ent) {
// FIXME Panic here - guest is trying to map to physical memory
case HOST_REGION_PHYSICAL_MEMORY:
// points into currently allocated physical memory, so we just
// set up the shadow to point to the mapped location
- if (guest_paddr_to_host_paddr(ent, guest_addr, &host_addr)) {
+ if (guest_pa_to_host_pa(guest_info, guest_addr, &host_addr)) {
// Panic here
return -1;
}
break;
}
} else {
- vmm_pte_t * guest_pte;
- vmm_pte_t * shadow_pte;
+ pte32_t * guest_pte;
+ pte32_t * shadow_pte;
addr_t guest_addr;
addr_t guest_pte_host_addr;
shadow_region_t * ent;
// make our first level page table in the shadow point to it
shadow_pde[i].pt_base_addr = PAGE_ALIGNED_ADDR(shadow_pte);
- ent = get_shadow_region_by_addr(mem_map, guest_addr);
+ ent = get_shadow_region_by_addr(&(guest_info->mem_map), guest_addr);
/* JRL: This is bad.... */
}
// Address of the relevant second level page table in the guest
- if (guest_paddr_to_host_paddr(ent, guest_addr, &guest_pte_host_addr)) {
+ if (guest_pa_to_host_pa(guest_info, guest_addr, &guest_pte_host_addr)) {
// Panic here
return -1;
}
shadow_region_t * ent;
- ent = get_shadow_region_by_addr(mem_map, guest_addr);
+ ent = get_shadow_region_by_addr(&(guest_info->mem_map), guest_addr);
if (!ent) {
// FIXME Panic here - guest is trying to map to physical memory
// points into currently allocated physical memory, so we just
// set up the shadow to point to the mapped location
- if (guest_paddr_to_host_paddr(ent, guest_addr, &host_addr)) {
+ if (guest_pa_to_host_pa(guest_info, guest_addr, &host_addr)) {
// Panic here
return -1;
}