From 38cf40ec8fac02df12ed390dda98da0dda97b66b Mon Sep 17 00:00:00 2001 From: Alexander Kudryavtsev Date: Fri, 23 Sep 2011 23:18:41 +0400 Subject: [PATCH 10/32] Enable caching in EPT tables. XXX: hooks are not working well! Smth is wrong. --- palacios/include/palacios/vmm_mem.h | 9 ++++++++- palacios/src/palacios/vmm_mem.c | 2 ++ palacios/src/palacios/vmm_mem_hook.c | 2 ++ palacios/src/palacios/vmx_ept.c | 8 +++++++- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/palacios/include/palacios/vmm_mem.h b/palacios/include/palacios/vmm_mem.h index 6974344..8fe932b 100644 --- a/palacios/include/palacios/vmm_mem.h +++ b/palacios/include/palacios/vmm_mem.h @@ -38,7 +38,13 @@ struct v3_vm_info; #define V3_MEM_CORE_ANY ((uint16_t)-1) - +enum memory_caching_types { + MEM_TYPE_UC = 0, + MEM_TYPE_WC = 1, + MEM_TYPE_WT = 4, + MEM_TYPE_WP = 5, + MEM_TYPE_WB = 6 +}; typedef struct { union { @@ -52,6 +58,7 @@ typedef struct { uint8_t exec : 1; uint8_t base : 1; uint8_t alloced : 1; + uint8_t mt : 3; // memory type for region, see enum memory_caching_types } __attribute__((packed)); } __attribute__((packed)); } __attribute__((packed)) v3_mem_flags_t; diff --git a/palacios/src/palacios/vmm_mem.c b/palacios/src/palacios/vmm_mem.c index 6bb9f5a..c153c47 100644 --- a/palacios/src/palacios/vmm_mem.c +++ b/palacios/src/palacios/vmm_mem.c @@ -72,6 +72,7 @@ int v3_init_mem_map(struct v3_vm_info * vm) { map->base_region.host_addr = (addr_t)V3_AllocPages(mem_pages); #endif + map->base_region.flags.mt = MEM_TYPE_WB; map->base_region.flags.read = 1; map->base_region.flags.write = 1; map->base_region.flags.exec = 1; @@ -141,6 +142,7 @@ int v3_add_shadow_mem( struct v3_vm_info * vm, uint16_t core_id, entry->host_addr = host_addr; + entry->flags.mt = MEM_TYPE_UC; entry->flags.read = 1; entry->flags.write = 1; entry->flags.exec = 1; diff --git a/palacios/src/palacios/vmm_mem_hook.c b/palacios/src/palacios/vmm_mem_hook.c index a0753cf..4b8d874 100644 --- a/palacios/src/palacios/vmm_mem_hook.c +++ b/palacios/src/palacios/vmm_mem_hook.c @@ -326,6 +326,7 @@ int v3_hook_write_mem(struct v3_vm_info * vm, uint16_t core_id, entry->unhandled = handle_mem_hook; entry->priv_data = hook; + entry->flags.mt = MEM_TYPE_UC; entry->flags.read = 1; entry->flags.exec = 1; entry->flags.alloced = 1; @@ -363,6 +364,7 @@ int v3_hook_full_mem(struct v3_vm_info * vm, uint16_t core_id, entry = v3_create_mem_region(vm, core_id, guest_addr_start, guest_addr_end); hook->region = entry; + entry->flags.mt = MEM_TYPE_UC; entry->unhandled = handle_mem_hook; entry->priv_data = hook; diff --git a/palacios/src/palacios/vmx_ept.c b/palacios/src/palacios/vmx_ept.c index a66ad6b..a23dccd 100644 --- a/palacios/src/palacios/vmx_ept.c +++ b/palacios/src/palacios/vmx_ept.c @@ -45,7 +45,7 @@ int v3_init_ept(struct guest_info * core, struct vmx_hw_info * hw_info) { ept_info = &(hw_info->ept_info); /* TODO: Should we set this to WB?? */ - ept_ptr->psmt = 0; + ept_ptr->psmt = MEM_TYPE_WB; if (ept_info->pg_walk_len4) { ept_ptr->pwl1 = 3; @@ -151,6 +151,9 @@ int v3_handle_ept_fault(struct guest_info * core, addr_t fault_addr, struct ept_ pde2mb[pde_index].write = 0; } + pde2mb[pde_index].ipat = 1; // ignore PAT + pde2mb[pde_index].mt = region->flags.mt; + if (v3_gpa_to_hpa(core, fault_addr, &host_addr) == -1) { PrintError("Error: Could not translate fault addr (%p)\n", (void *)fault_addr); return -1; @@ -204,6 +207,9 @@ int v3_handle_ept_fault(struct guest_info * core, addr_t fault_addr, struct ept_ pte[pte_index].write = 0; } + pte[pte_index].ipat = 1; // ignore PAT + pte[pte_index].mt = region->flags.mt; + if (v3_gpa_to_hpa(core, fault_addr, &host_addr) == -1) { PrintError("Error Could not translate fault addr (%p)\n", (void *)fault_addr); return -1; -- 1.7.5.4