From: Jack Lange Date: Sat, 15 May 2010 00:03:45 +0000 (-0500) Subject: moved shadow paging implementations over to new memory region flags structure X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=e59d15ae2aab909879f817c3f45400d92af98a43;p=palacios.git moved shadow paging implementations over to new memory region flags structure --- diff --git a/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_32.h b/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_32.h index 1feb2e5..c0ce265 100644 --- a/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_32.h +++ b/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_32.h @@ -338,8 +338,8 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault // Page Table Entry Not Present PrintDebug("guest_pa =%p\n", (void *)guest_pa); - if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) || - (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) { + if ((shdw_reg->flags.alloced == 1) || + (shdw_reg->flags.read == 1)) { addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_pa); shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); @@ -369,11 +369,11 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault // Write hooks trump all, and are set Read Only - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.write == 0) { shadow_pte->writable = 0; } - } else { + } else if (shdw_reg->flags.hook == 1) { // Page fault handled by hook functions if (v3_handle_mem_hook(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { @@ -384,7 +384,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault } else if (shadow_pte_access == PT_ACCESS_WRITE_ERROR) { guest_pte->dirty = 1; - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { PrintError("Special Page fault handler returned error for address: %p\n", (void *)fault_addr); return -1; @@ -447,8 +447,8 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, if (shadow_pte_access == PT_ACCESS_NOT_PRESENT) { // Get the guest physical address of the fault - if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) || - (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) { + if ((shdw_reg->flags.alloced == 1) || + (shdw_reg->flags.read == 1)) { addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_fault_pa); shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); @@ -464,7 +464,7 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, */ shadow_pte->user_page = 1; - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.write == 0) { shadow_pte->writable = 0; } else { shadow_pte->writable = 1; @@ -476,7 +476,7 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, shadow_pte->global_page = large_guest_pde->global_page; // - } else { + } else if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); return -1; @@ -484,8 +484,7 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, } } else if (shadow_pte_access == PT_ACCESS_WRITE_ERROR) { - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { - + if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); return -1; diff --git a/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_64.h b/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_64.h index f0dcfdb..c3d2964 100644 --- a/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_64.h +++ b/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_64.h @@ -452,8 +452,8 @@ static int handle_pte_shadow_pagefault_64(struct guest_info * info, addr_t fault // Page Table Entry Not Present PrintDebug("guest_pa =%p\n", (void *)guest_pa); - if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) || - (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) { + if ((shdw_reg->flags.hook == 1) || + (shdw_reg->flags.read == 1)) { addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_pa); shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); @@ -480,11 +480,11 @@ static int handle_pte_shadow_pagefault_64(struct guest_info * info, addr_t fault // Write hooks trump all, and are set Read Only - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.write == 0) { shadow_pte->writable = 0; } - } else { + } else if (shdw_reg->flags.hook == 1) { // Page fault handled by hook functions if (v3_handle_mem_hook(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { @@ -495,7 +495,7 @@ static int handle_pte_shadow_pagefault_64(struct guest_info * info, addr_t fault } else if (shadow_pte_access == PT_ACCESS_WRITE_ERROR) { guest_pte->dirty = 1; - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { PrintError("Special Page fault handler returned error for address: %p\n", (void *)fault_addr); return -1; @@ -558,8 +558,8 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info, if (shadow_pte_access == PT_ACCESS_NOT_PRESENT) { // Get the guest physical address of the fault - if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) || - (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) { + if ((shdw_reg->flags.alloced == 1) || + (shdw_reg->flags.read == 1)) { addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_fault_pa); shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); @@ -573,7 +573,7 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info, */ shadow_pte->user_page = 1; - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.write == 0) { shadow_pte->writable = 0; } else { shadow_pte->writable = 1; @@ -585,7 +585,7 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info, shadow_pte->global_page = large_guest_pde->global_page; // - } else { + } else if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); return -1; @@ -593,7 +593,7 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info, } } else if (shadow_pte_access == PT_ACCESS_WRITE_ERROR) { - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); diff --git a/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_32.h b/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_32.h index 4771c0e..91ae34e 100644 --- a/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_32.h +++ b/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_32.h @@ -161,8 +161,6 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa guest_pde->accessed = 1; - - shadow_pde->pt_base_addr = PAGE_BASE_ADDR(shdw_page->page_pa); } else { shadow_pt = (pte32_t *)V3_VAddr((void *)BASE_TO_PAGE_ADDR(shadow_pde->pt_base_addr)); @@ -248,8 +246,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault // Page Table Entry Not Present PrintDebug("guest_pa =%p\n", (void *)guest_pa); - if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) || - (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) { + if ((shdw_reg->flags.alloced == 1) && (shdw_reg->flags.read == 1)) { addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_pa); shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); @@ -279,11 +276,11 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault // Write hooks trump all, and are set Read Only - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.write == 0) { shadow_pte->writable = 0; } - } else { + } else if (shdw_reg->flags.hook == 1) { // Page fault handled by hook functions if (v3_handle_mem_hook(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { @@ -294,7 +291,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault } else if (shadow_pte_access == PT_ACCESS_WRITE_ERROR) { guest_pte->dirty = 1; - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { PrintError("Special Page fault handler returned error for address: %p\n", (void *)fault_addr); return -1; @@ -357,8 +354,8 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, if (shadow_pte_access == PT_ACCESS_NOT_PRESENT) { // Get the guest physical address of the fault - if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) || - (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) { + if ((shdw_reg->flags.alloced == 1) && + (shdw_reg->flags.read == 1)) { addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_fault_pa); shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); @@ -374,19 +371,20 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, */ shadow_pte->user_page = 1; - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { - shadow_pte->writable = 0; - } else { - shadow_pte->writable = 1; - } - //set according to VMM policy shadow_pte->write_through = large_guest_pde->write_through; shadow_pte->cache_disable = large_guest_pde->cache_disable; shadow_pte->global_page = large_guest_pde->global_page; // - } else { + + if (shdw_reg->flags.write == 0) { + shadow_pte->writable = 0; + } else { + shadow_pte->writable = 1; + } + + } else if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); return -1; @@ -394,8 +392,7 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, } } else if (shadow_pte_access == PT_ACCESS_WRITE_ERROR) { - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { - + if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); return -1; diff --git a/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_64.h b/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_64.h index f0dcfdb..cdbb580 100644 --- a/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_64.h +++ b/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_64.h @@ -452,8 +452,8 @@ static int handle_pte_shadow_pagefault_64(struct guest_info * info, addr_t fault // Page Table Entry Not Present PrintDebug("guest_pa =%p\n", (void *)guest_pa); - if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) || - (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) { + if ((shdw_reg->flags.alloced == 1) || + (shdw_reg->flags.read == 1)) { addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_pa); shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); @@ -480,11 +480,11 @@ static int handle_pte_shadow_pagefault_64(struct guest_info * info, addr_t fault // Write hooks trump all, and are set Read Only - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.write == 0) { shadow_pte->writable = 0; } - } else { + } else if (shdw_reg->flags.hook == 1) { // Page fault handled by hook functions if (v3_handle_mem_hook(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { @@ -495,7 +495,7 @@ static int handle_pte_shadow_pagefault_64(struct guest_info * info, addr_t fault } else if (shadow_pte_access == PT_ACCESS_WRITE_ERROR) { guest_pte->dirty = 1; - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { PrintError("Special Page fault handler returned error for address: %p\n", (void *)fault_addr); return -1; @@ -558,8 +558,8 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info, if (shadow_pte_access == PT_ACCESS_NOT_PRESENT) { // Get the guest physical address of the fault - if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) || - (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) { + if ((shdw_reg->flags.alloced == 1) || + (shdw_reg->flags.read == 1)) { addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_fault_pa); shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); @@ -573,7 +573,7 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info, */ shadow_pte->user_page = 1; - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { + if (shdw_reg->flags.write == 0) { shadow_pte->writable = 0; } else { shadow_pte->writable = 1; @@ -585,7 +585,7 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info, shadow_pte->global_page = large_guest_pde->global_page; // - } else { + } else if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); return -1; @@ -593,8 +593,7 @@ static int handle_2MB_shadow_pagefault_64(struct guest_info * info, } } else if (shadow_pte_access == PT_ACCESS_WRITE_ERROR) { - if (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK) { - + if (shdw_reg->flags.hook == 1) { if (v3_handle_mem_hook(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); return -1; diff --git a/palacios/src/palacios/vm_guest.c b/palacios/src/palacios/vm_guest.c index ff5a35f..f7348ed 100644 --- a/palacios/src/palacios/vm_guest.c +++ b/palacios/src/palacios/vm_guest.c @@ -278,6 +278,8 @@ void v3_print_guest_state(struct guest_info * info) { } v3_print_GPRs(info); + v3_print_mem_map(info->vm_info); + v3_print_stack(info); }