On Wed, Nov 05, 2008 at 03:15:38PM +0100, Bastian Blank wrote: > On Wed, Nov 05, 2008 at 02:50:32PM +0100, Bastian Blank wrote: > > On Wed, Nov 05, 2008 at 01:10:30PM +0000, Ian Campbell wrote: > > > On Wed, 2008-11-05 at 10:05 +0000, Ian Campbell wrote: > > > > > What happens if you use "nopat" to disable the usage of PAT? > > > > CONFIG_X86_PAT is disabled anyway so it makes no difference. > > > Although it does turn out that PAT is implicated... > > Ah. > Shorter patch. Tries to use the compiler instead of the preprocessor. Even shorter. Bastian -- No more blah, blah, blah! -- Kirk, "Miri", stardate 2713.6
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 170d743..ae1e15b 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1141,6 +1141,7 @@ config X86_PAT
bool
prompt "x86 PAT support"
depends on MTRR
+ depends on !XEN
help
Use PAT attributes to setup page level cache control.
diff --git a/arch/x86/mm/ioremap-xen.c b/arch/x86/mm/ioremap-xen.c
index 95c214f..52c527f 100644
--- a/arch/x86/mm/ioremap-xen.c
+++ b/arch/x86/mm/ioremap-xen.c
@@ -255,9 +255,11 @@ int ioremap_change_attr(unsigned long vaddr, unsigned long size,
default:
err = _set_memory_uc(vaddr, nrpages);
break;
+#ifdef CONFIG_X86_PAT
case _PAGE_CACHE_WC:
err = _set_memory_wc(vaddr, nrpages);
break;
+#endif
case _PAGE_CACHE_WB:
err = _set_memory_wb(vaddr, nrpages);
break;
@@ -340,11 +342,16 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
* - request is uc-, return cannot be write-combine
* - request is write-combine, return cannot be write-back
*/
+#ifdef CONFIG_X86_PAT
if ((prot_val == _PAGE_CACHE_UC_MINUS &&
(new_prot_val == _PAGE_CACHE_WB ||
new_prot_val == _PAGE_CACHE_WC)) ||
(prot_val == _PAGE_CACHE_WC &&
- new_prot_val == _PAGE_CACHE_WB)) {
+ new_prot_val == _PAGE_CACHE_WB))
+#else
+ if (prot_val == _PAGE_CACHE_UC_MINUS && new_prot_val == _PAGE_CACHE_WB)
+#endif
+ {
pr_debug(
"ioremap error for 0x%llx-0x%llx, requested 0x%lx, got 0x%lx\n",
(unsigned long long)phys_addr,
@@ -364,9 +371,11 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
case _PAGE_CACHE_UC_MINUS:
prot = PAGE_KERNEL_UC_MINUS;
break;
+#ifdef CONFIG_X86_PAT
case _PAGE_CACHE_WC:
prot = PAGE_KERNEL_WC;
break;
+#endif
case _PAGE_CACHE_WB:
prot = PAGE_KERNEL;
break;
diff --git a/arch/x86/mm/pat-xen.c b/arch/x86/mm/pat-xen.c
index 6fc94ce..52f9776 100644
--- a/arch/x86/mm/pat-xen.c
+++ b/arch/x86/mm/pat-xen.c
@@ -116,9 +116,11 @@ static char *cattr_name(unsigned long flags)
case _PAGE_CACHE_UC: return "uncached";
case _PAGE_CACHE_UC_MINUS: return "uncached-minus";
case _PAGE_CACHE_WB: return "write-back";
+#ifdef CONFIG_X86_PAT
case _PAGE_CACHE_WC: return "write-combining";
case _PAGE_CACHE_WP: return "write-protected";
case _PAGE_CACHE_WT: return "write-through";
+#endif
default: return "broken";
}
}
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c
index 10fb308..5908a06 100644
--- a/arch/x86/pci/i386.c
+++ b/arch/x86/pci/i386.c
@@ -324,10 +324,16 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
* - request is uncached, return cannot be write-combine
* - request is write-combine, return cannot be write-back
*/
+#ifdef CONFIG_X86_PAT
if ((flags == _PAGE_CACHE_UC_MINUS &&
(new_flags == _PAGE_CACHE_WB)) ||
(flags == _PAGE_CACHE_WC &&
- new_flags == _PAGE_CACHE_WB)) {
+ new_flags == _PAGE_CACHE_WB))
+#else
+ if (flags == _PAGE_CACHE_UC_MINUS &&
+ new_flags == _PAGE_CACHE_WB)
+#endif
+ {
free_memtype(addr, addr+len);
return -EINVAL;
}
diff --git a/include/asm-x86/mach-xen/asm/pgtable.h b/include/asm-x86/mach-xen/asm/pgtable.h
index a9ff073..73ec9f3 100644
--- a/include/asm-x86/mach-xen/asm/pgtable.h
+++ b/include/asm-x86/mach-xen/asm/pgtable.h
@@ -74,11 +74,17 @@ extern unsigned int __kernel_page_user;
* PAT settings are part of the hypervisor interface, which sets the
* MSR to 0x050100070406 (i.e. WB, WT, UC-, UC, WC, WP [, UC, UC]).
*/
-#define _PAGE_CACHE_MASK (_PAGE_PCD | _PAGE_PWT | _PAGE_PAT)
+#define _PAGE_CACHE_MASK (_PAGE_PCD | _PAGE_PWT)
#define _PAGE_CACHE_WB (0)
+#ifdef CONFIG_X86_PAT
#define _PAGE_CACHE_WT (_PAGE_PWT)
#define _PAGE_CACHE_WC (_PAGE_PAT)
#define _PAGE_CACHE_WP (_PAGE_PAT | _PAGE_PWT)
+#else
+#define _PAGE_CACHE_WT (0)
+#define _PAGE_CACHE_WC (0)
+#define _PAGE_CACHE_WP (0)
+#endif
#define _PAGE_CACHE_UC_MINUS (_PAGE_PCD)
#define _PAGE_CACHE_UC (_PAGE_PCD | _PAGE_PWT)
Attachment:
signature.asc
Description: Digital signature