From 38cf40ec8fac02df12ed390dda98da0dda97b66b Mon Sep 17 00:00:00 2001
From: Alexander Kudryavtsev <alexk@ispras.ru>
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