OSDN Git Service

x86/pti: Enable global pages for shared areas
[uclinux-h8/linux.git] / arch / x86 / mm / cpu_entry_area.c
index 476d810..b45f5aa 100644 (file)
@@ -27,8 +27,20 @@ EXPORT_SYMBOL(get_cpu_entry_area);
 void cea_set_pte(void *cea_vaddr, phys_addr_t pa, pgprot_t flags)
 {
        unsigned long va = (unsigned long) cea_vaddr;
+       pte_t pte = pfn_pte(pa >> PAGE_SHIFT, flags);
 
-       set_pte_vaddr(va, pfn_pte(pa >> PAGE_SHIFT, flags));
+       /*
+        * The cpu_entry_area is shared between the user and kernel
+        * page tables.  All of its ptes can safely be global.
+        * _PAGE_GLOBAL gets reused to help indicate PROT_NONE for
+        * non-present PTEs, so be careful not to set it in that
+        * case to avoid confusion.
+        */
+       if (boot_cpu_has(X86_FEATURE_PGE) &&
+           (pgprot_val(flags) & _PAGE_PRESENT))
+               pte = pte_set_flags(pte, _PAGE_GLOBAL);
+
+       set_pte_vaddr(va, pte);
 }
 
 static void __init