aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.9.21/0022-kaiser-PCID-0-for-kernel-and-128-for-user.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.9.21/0022-kaiser-PCID-0-for-kernel-and-128-for-user.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.9.21/0022-kaiser-PCID-0-for-kernel-and-128-for-user.patch135
1 files changed, 0 insertions, 135 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.9.21/0022-kaiser-PCID-0-for-kernel-and-128-for-user.patch b/common/recipes-kernel/linux/linux-yocto-4.9.21/0022-kaiser-PCID-0-for-kernel-and-128-for-user.patch
deleted file mode 100644
index 1175e587..00000000
--- a/common/recipes-kernel/linux/linux-yocto-4.9.21/0022-kaiser-PCID-0-for-kernel-and-128-for-user.patch
+++ /dev/null
@@ -1,135 +0,0 @@
-From e37573e8b118ee1b8afa1b045d3a3dde73712c6a Mon Sep 17 00:00:00 2001
-From: Hugh Dickins <hughd@google.com>
-Date: Fri, 8 Sep 2017 19:26:30 -0700
-Subject: [PATCH 022/103] kaiser: PCID 0 for kernel and 128 for user
-
-Why was 4 chosen for kernel PCID and 6 for user PCID?
-No good reason in a backport where PCIDs are only used for Kaiser.
-
-If we continue with those, then we shall need to add Andy Lutomirski's
-4.13 commit 6c690ee1039b ("x86/mm: Split read_cr3() into read_cr3_pa()
-and __read_cr3()"), which deals with the problem of read_cr3() callers
-finding stray bits in the cr3 that they expected to be page-aligned;
-and for hibernation, his 4.14 commit f34902c5c6c0 ("x86/hibernate/64:
-Mask off CR3's PCID bits in the saved CR3").
-
-But if 0 is used for kernel PCID, then there's no need to add in those
-commits - whenever the kernel looks, it sees 0 in the lower bits; and
-0 for kernel seems an obvious choice.
-
-And I naughtily propose 128 for user PCID. Because there's a place
-in _SWITCH_TO_USER_CR3 where it takes note of the need for TLB FLUSH,
-but needs to reset that to NOFLUSH for the next occasion. Currently
-it does so with a "movb $(0x80)" into the high byte of the per-cpu
-quadword, but that will cause a machine without PCID support to crash.
-Now, if %al just happened to have 0x80 in it at that point, on a
-machine with PCID support, but 0 on a machine without PCID support...
-
-(That will go badly wrong once the pgd can be at a physical address
-above 2^56, but even with 5-level paging, physical goes up to 2^52.)
-
-Signed-off-by: Hugh Dickins <hughd@google.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- arch/x86/include/asm/kaiser.h | 19 ++++++++++++-------
- arch/x86/include/asm/pgtable_types.h | 7 ++++---
- arch/x86/mm/tlb.c | 3 +++
- 3 files changed, 19 insertions(+), 10 deletions(-)
-
-diff --git a/arch/x86/include/asm/kaiser.h b/arch/x86/include/asm/kaiser.h
-index 009bca5..110a73e 100644
---- a/arch/x86/include/asm/kaiser.h
-+++ b/arch/x86/include/asm/kaiser.h
-@@ -29,14 +29,19 @@ orq X86_CR3_PCID_KERN_VAR, \reg
- movq \reg, %cr3
- .endm
-
--.macro _SWITCH_TO_USER_CR3 reg
-+.macro _SWITCH_TO_USER_CR3 reg regb
-+/*
-+ * regb must be the low byte portion of reg: because we have arranged
-+ * for the low byte of the user PCID to serve as the high byte of NOFLUSH
-+ * (0x80 for each when PCID is enabled, or 0x00 when PCID and NOFLUSH are
-+ * not enabled): so that the one register can update both memory and cr3.
-+ */
- movq %cr3, \reg
- andq $(~(X86_CR3_PCID_ASID_MASK | KAISER_SHADOW_PGD_OFFSET)), \reg
- orq PER_CPU_VAR(X86_CR3_PCID_USER_VAR), \reg
- js 9f
--// FLUSH this time, reset to NOFLUSH for next time
--// But if nopcid? Consider using 0x80 for user pcid?
--movb $(0x80), PER_CPU_VAR(X86_CR3_PCID_USER_VAR+7)
-+/* FLUSH this time, reset to NOFLUSH for next time (if PCID enabled) */
-+movb \regb, PER_CPU_VAR(X86_CR3_PCID_USER_VAR+7)
- 9:
- movq \reg, %cr3
- .endm
-@@ -49,7 +54,7 @@ popq %rax
-
- .macro SWITCH_USER_CR3
- pushq %rax
--_SWITCH_TO_USER_CR3 %rax
-+_SWITCH_TO_USER_CR3 %rax %al
- popq %rax
- .endm
-
-@@ -61,7 +66,7 @@ movq PER_CPU_VAR(unsafe_stack_register_backup), %rax
-
- .macro SWITCH_USER_CR3_NO_STACK
- movq %rax, PER_CPU_VAR(unsafe_stack_register_backup)
--_SWITCH_TO_USER_CR3 %rax
-+_SWITCH_TO_USER_CR3 %rax %al
- movq PER_CPU_VAR(unsafe_stack_register_backup), %rax
- .endm
-
-@@ -69,7 +74,7 @@ movq PER_CPU_VAR(unsafe_stack_register_backup), %rax
-
- .macro SWITCH_KERNEL_CR3 reg
- .endm
--.macro SWITCH_USER_CR3 reg
-+.macro SWITCH_USER_CR3 reg regb
- .endm
- .macro SWITCH_USER_CR3_NO_STACK
- .endm
-diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h
-index ada77fd..7cf2883 100644
---- a/arch/x86/include/asm/pgtable_types.h
-+++ b/arch/x86/include/asm/pgtable_types.h
-@@ -146,16 +146,17 @@
-
- /* Mask for all the PCID-related bits in CR3: */
- #define X86_CR3_PCID_MASK (X86_CR3_PCID_NOFLUSH | X86_CR3_PCID_ASID_MASK)
-+#define X86_CR3_PCID_ASID_KERN (_AC(0x0,UL))
-+
- #if defined(CONFIG_KAISER) && defined(CONFIG_X86_64)
--#define X86_CR3_PCID_ASID_KERN (_AC(0x4,UL))
--#define X86_CR3_PCID_ASID_USER (_AC(0x6,UL))
-+/* Let X86_CR3_PCID_ASID_USER be usable for the X86_CR3_PCID_NOFLUSH bit */
-+#define X86_CR3_PCID_ASID_USER (_AC(0x80,UL))
-
- #define X86_CR3_PCID_KERN_FLUSH (X86_CR3_PCID_ASID_KERN)
- #define X86_CR3_PCID_USER_FLUSH (X86_CR3_PCID_ASID_USER)
- #define X86_CR3_PCID_KERN_NOFLUSH (X86_CR3_PCID_NOFLUSH | X86_CR3_PCID_ASID_KERN)
- #define X86_CR3_PCID_USER_NOFLUSH (X86_CR3_PCID_NOFLUSH | X86_CR3_PCID_ASID_USER)
- #else
--#define X86_CR3_PCID_ASID_KERN (_AC(0x0,UL))
- #define X86_CR3_PCID_ASID_USER (_AC(0x0,UL))
- /*
- * PCIDs are unsupported on 32-bit and none of these bits can be
-diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
-index a2532d4..852c665 100644
---- a/arch/x86/mm/tlb.c
-+++ b/arch/x86/mm/tlb.c
-@@ -52,6 +52,9 @@ static void load_new_mm_cr3(pgd_t *pgdir)
- * invpcid_flush_single_context(X86_CR3_PCID_ASID_USER) could
- * do it here, but can only be used if X86_FEATURE_INVPCID is
- * available - and many machines support pcid without invpcid.
-+ *
-+ * The line below is a no-op: X86_CR3_PCID_KERN_FLUSH is now 0;
-+ * but keep that line in there in case something changes.
- */
- new_mm_cr3 |= X86_CR3_PCID_KERN_FLUSH;
- kaiser_flush_tlb_on_return_to_user();
---
-2.7.4
-