x86/page: Introduce and use PAGE_HYPERVISOR_UC
authorAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 14 Aug 2017 10:52:20 +0000 (11:52 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 14 Aug 2017 12:52:28 +0000 (13:52 +0100)
Always map the PCI MMCFG region as strongly uncacheable.  Nothing good will
happen if stray MTRR settings end up converting UC- to WC.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/x86_64/mmconfig_64.c
xen/include/asm-x86/page.h
xen/include/asm-x86/x86_64/page.h

index a7d2e33654b5ac34c14f3c4836c7ecf47d4039fd..958b6cf2f4163e6b4574b1e9a40ee8467cab800b 100644 (file)
@@ -140,7 +140,7 @@ int pci_mmcfg_arch_enable(unsigned int idx)
 
     if (pci_mmcfg_virt[idx].virt)
         return 0;
-    pci_mmcfg_virt[idx].virt = mcfg_ioremap(cfg, idx, PAGE_HYPERVISOR_UCMINUS);
+    pci_mmcfg_virt[idx].virt = mcfg_ioremap(cfg, idx, PAGE_HYPERVISOR_UC);
     if (!pci_mmcfg_virt[idx].virt) {
         printk(KERN_ERR "PCI: Cannot map MCFG aperture for segment %04x\n",
                cfg->pci_segment);
index 0b68c5ee95948b7698a4b78c77d893b6b0432528..263ca5bc3c3e31f498c561b527487b0d3a01c04d 100644 (file)
@@ -323,6 +323,7 @@ void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t);
 #define __PAGE_HYPERVISOR         (__PAGE_HYPERVISOR_RX | \
                                    _PAGE_DIRTY | _PAGE_RW)
 #define __PAGE_HYPERVISOR_UCMINUS (__PAGE_HYPERVISOR | _PAGE_PCD)
+#define __PAGE_HYPERVISOR_UC      (__PAGE_HYPERVISOR | _PAGE_PCD | _PAGE_PWT)
 
 #define MAP_SMALL_PAGES _PAGE_AVAIL0 /* don't use superpages mappings */
 
index e10262456310ab388ee84825d5592d273595355b..603ecacf9cd90da7c1817b2625b566e95b44c8c1 100644 (file)
@@ -167,10 +167,13 @@ typedef l4_pgentry_t root_pgentry_t;
 /* Dependency on NX being available can't be expressed. */
 # define PAGE_HYPERVISOR         PAGE_HYPERVISOR_RWX
 # define PAGE_HYPERVISOR_UCMINUS (__PAGE_HYPERVISOR_UCMINUS | _PAGE_GLOBAL)
+# define PAGE_HYPERVISOR_UC      (__PAGE_HYPERVISOR_UC      | _PAGE_GLOBAL)
 #else
 # define PAGE_HYPERVISOR         PAGE_HYPERVISOR_RW
 # define PAGE_HYPERVISOR_UCMINUS (__PAGE_HYPERVISOR_UCMINUS | \
                                   _PAGE_GLOBAL | _PAGE_NX)
+# define PAGE_HYPERVISOR_UC      (__PAGE_HYPERVISOR_UC | \
+                                  _PAGE_GLOBAL | _PAGE_NX)
 #endif
 
 #endif /* __X86_64_PAGE_H__ */