From: Jack Lange Date: Tue, 1 Jul 2008 18:47:21 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: boot386puppy-26-to-ide~7 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=858a36782662b04562c0d83db75e11cb55e8b91b *** empty log message *** --- diff --git a/palacios/include/palacios/vmm_paging.h b/palacios/include/palacios/vmm_paging.h index 950ff6c..7192c06 100644 --- a/palacios/include/palacios/vmm_paging.h +++ b/palacios/include/palacios/vmm_paging.h @@ -91,6 +91,8 @@ the host state in the vmcs before entering the guest. #define PT32_PAGE_OFFSET(x) (((uint_t)x) & 0xfff) #define PT32_PAGE_POWER 12 +#define PD32_4MB_PAGE_ADDR(x) (((uint_t)x) & 0xffc00000) +#define PD32_4MB_PAGE_OFFSET(x) (((uint_t)x) & 0x003fffff) /* The following should be phased out */ #define PAGE_OFFSET(x) ((((uint_t)x) & 0xfff)) @@ -102,6 +104,7 @@ the host state in the vmcs before entering the guest. + #define CR3_TO_PDE32(cr3) (((ulong_t)cr3) & 0xfffff000) #define CR3_TO_PDPTRE(cr3) (((ulong_t)cr3) & 0xffffffe0) #define CR3_TO_PML4E64(cr3) (((ullong_t)cr3) & 0x000ffffffffff000LL) @@ -110,7 +113,7 @@ the host state in the vmcs before entering the guest. /* Accessor functions for the page table structures */ #define PDE32_T_ADDR(x) (((x).pt_base_addr) << 12) #define PTE32_T_ADDR(x) (((x).page_base_addr) << 12) - +#define PDE32_4MB_T_ADDR(x) (((x).page_base_addr) << 22) /* Page Table Flag Values */ #define PT32_HOOK 0x1 @@ -148,9 +151,8 @@ typedef struct pde32_4MB { uint_t global_page : 1; uint_t vmm_info : 3; uint_t pat : 1; - uint_t page_base_addr_lo: 8; - uint_t zero : 1; - uint_t page_base_addr_hi: 10; + uint_t rsvd : 9; + uint_t page_base_addr : 10; } pde32_4MB_t; diff --git a/palacios/src/palacios/vm_guest_mem.c b/palacios/src/palacios/vm_guest_mem.c index eb342b4..0fc0e40 100644 --- a/palacios/src/palacios/vm_guest_mem.c +++ b/palacios/src/palacios/vm_guest_mem.c @@ -326,7 +326,8 @@ int read_guest_va_memory(struct guest_info * guest_info, addr_t guest_va, int co /* JRL FIXME: * This should be somewhere else.... */ - addr_t tmp_addr; + /* + addr_t tmp_addr; addr_t shadow_pde = CR3_TO_PDE32(guest_info->shdw_pg_state.shadow_cr3); @@ -346,15 +347,16 @@ int read_guest_va_memory(struct guest_info * guest_info, addr_t guest_va, int co return bytes_read; } } +*/ /* JRL: END GRUESOME HACK */ - /* - if (guest_va_to_host_va(guest_info, cursor, &host_addr) != 0) { + + if (guest_va_to_host_va(guest_info, cursor, &host_addr) != 0) { PrintDebug("Invalid GVA(%x)->HVA lookup\n", cursor); return bytes_read; - } - */ + } + memcpy(dest + bytes_read, (void*)host_addr, bytes_to_copy); diff --git a/palacios/src/palacios/vmm_paging.c b/palacios/src/palacios/vmm_paging.c index 8eefd53..95240ad 100644 --- a/palacios/src/palacios/vmm_paging.c +++ b/palacios/src/palacios/vmm_paging.c @@ -71,10 +71,12 @@ pde32_entry_type_t pde32_lookup(pde32_t * pd, addr_t addr, addr_t * entry) { *entry = 0; return PDE32_ENTRY_NOT_PRESENT; } else { - *entry = PAGE_ADDR(pde_entry->pt_base_addr); - + if (pde_entry->large_page) { - *entry += PAGE_OFFSET(addr); + pde32_4MB_t * large_pde = (pde32_4MB_t *)pde_entry; + + *entry = PDE32_4MB_T_ADDR(*large_pde); + *entry += PD32_4MB_PAGE_OFFSET(addr); return PDE32_ENTRY_LARGE_PAGE; } else { *entry = PDE32_T_ADDR(*pde_entry); diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index a2f09f9..39a024c 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -73,6 +73,10 @@ int handle_shadow_pagefault32(struct guest_info * info, addr_t fault_addr, pf_er return 0; } + + // Check that the Guest PDE entry points to valid memory + // else Machine Check the guest + shadow_pde_access = can_access_pde32(shadow_pde, fault_addr, error_code);