Index: sys/amd64/include/vmm.h =================================================================== --- sys/amd64/include/vmm.h (revision 261451) +++ sys/amd64/include/vmm.h (working copy) @@ -100,7 +100,8 @@ void vm_destroy(struct vm *vm); const char *vm_name(struct vm *vm); int vm_malloc(struct vm *vm, vm_paddr_t gpa, size_t len); -int vm_map_mmio(struct vm *vm, vm_paddr_t gpa, size_t len, vm_paddr_t hpa); +int vm_map_mmio(struct vm *vm, vm_paddr_t gpa, size_t len, vm_paddr_t hpa, + vm_memattr_t memattr); int vm_unmap_mmio(struct vm *vm, vm_paddr_t gpa, size_t len); void *vm_gpa_hold(struct vm *, vm_paddr_t gpa, size_t len, int prot, void **cookie); Index: sys/amd64/vmm/intel/vmx.c =================================================================== --- sys/amd64/vmm/intel/vmx.c (revision 261453) +++ sys/amd64/vmm/intel/vmx.c (working copy) @@ -833,7 +833,7 @@ if (virtual_interrupt_delivery) { error = vm_map_mmio(vm, DEFAULT_APIC_BASE, PAGE_SIZE, - APIC_ACCESS_ADDRESS); + APIC_ACCESS_ADDRESS, VM_MEMATTR_WRITE_BACK); /* XXX this should really return an error to the caller */ KASSERT(error == 0, ("vm_map_mmio(apicbase) error %d", error)); } Index: sys/amd64/vmm/io/ppt.c =================================================================== --- sys/amd64/vmm/io/ppt.c (revision 261451) +++ sys/amd64/vmm/io/ppt.c (working copy) @@ -44,6 +44,7 @@ #include #include +#include #include #include @@ -409,7 +410,8 @@ for (i = 0; i < MAX_MMIOSEGS; i++) { seg = &ppt->mmio[i]; if (seg->len == 0) { - error = vm_map_mmio(vm, gpa, len, hpa); + error = vm_map_mmio(vm, gpa, len, hpa, + VM_MEMATTR_UNCACHEABLE); if (error == 0) { seg->gpa = gpa; seg->len = len; Index: sys/amd64/vmm/vmm.c =================================================================== --- sys/amd64/vmm/vmm.c (revision 261451) +++ sys/amd64/vmm/vmm.c (working copy) @@ -400,11 +400,12 @@ } int -vm_map_mmio(struct vm *vm, vm_paddr_t gpa, size_t len, vm_paddr_t hpa) +vm_map_mmio(struct vm *vm, vm_paddr_t gpa, size_t len, vm_paddr_t hpa, + vm_memattr_t attr) { vm_object_t obj; - if ((obj = vmm_mmio_alloc(vm->vmspace, gpa, len, hpa)) == NULL) + if ((obj = vmm_mmio_alloc(vm->vmspace, gpa, len, hpa, attr)) == NULL) return (ENOMEM); else return (0); Index: sys/amd64/vmm/vmm_mem.c =================================================================== --- sys/amd64/vmm/vmm_mem.c (revision 261451) +++ sys/amd64/vmm/vmm_mem.c (working copy) @@ -57,7 +57,7 @@ vm_object_t vmm_mmio_alloc(struct vmspace *vmspace, vm_paddr_t gpa, size_t len, - vm_paddr_t hpa) + vm_paddr_t hpa, vm_memattr_t memattr) { int error; vm_object_t obj; @@ -77,7 +77,7 @@ * this object to be mapped as uncacheable. */ VM_OBJECT_WLOCK(obj); - error = vm_object_set_memattr(obj, VM_MEMATTR_UNCACHEABLE); + error = vm_object_set_memattr(obj, memattr); VM_OBJECT_WUNLOCK(obj); if (error != KERN_SUCCESS) { panic("vmm_mmio_alloc: vm_object_set_memattr error %d", Index: sys/amd64/vmm/vmm_mem.h =================================================================== --- sys/amd64/vmm/vmm_mem.h (revision 261451) +++ sys/amd64/vmm/vmm_mem.h (working copy) @@ -35,7 +35,7 @@ int vmm_mem_init(void); struct vm_object *vmm_mem_alloc(struct vmspace *, vm_paddr_t gpa, size_t size); struct vm_object *vmm_mmio_alloc(struct vmspace *, vm_paddr_t gpa, size_t len, - vm_paddr_t hpa); + vm_paddr_t hpa, vm_memattr_t attr); void vmm_mem_free(struct vmspace *, vm_paddr_t gpa, size_t size); void vmm_mmio_free(struct vmspace *, vm_paddr_t gpa, size_t size); vm_paddr_t vmm_mem_maxaddr(void);