Hi, here is version 7 of my patches to enable PTI on x86-32. Changes to the previous version are: * Rebased to v4.18-rc4 * Introduced pti_finalize() which is called after mark_readonly() and used to update the kernel mappings in the user page-table after RO/NX protections are in place. The patches need the vmalloc/ioremap fixes in tip/x86/mm to work correctly, because this enablement makes the issues fixed there more likely to happen. I did the load-testing again with 'perf top', the ldt_gdt self-test and a kernel-compile running in a loop again. The patches posted here were tested for 16 hours without any regression showing up. An earlier version of these patches based on v4.18-rc1 survived this test for over a week before I canceled the test. The test ran with enabled CR3 debugging added in the last patch of this series. A git-branch with these patches and the fixes from tip/x86/mm merged can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux.git pti-x32-v7 The previous version of these patches can be found at: * For v6: Post : https://lore.kernel.org/lkml/1524498460-25530-1-git-send-email-joro@xxxxxxxxxx/ Git : git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux.git pti-x32-v6 * For v5: Post : https://marc.info/?l=linux-kernel&m=152389297705480&w=2 Git : git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux.git pti-x32-v5 * For v4: Post : https://marc.info/?l=linux-kernel&m=152122860630236&w=2 Git : git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux.git pti-x32-v4 * For v3: Post : https://marc.info/?l=linux-kernel&m=152024559419876&w=2 Git : git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux.git pti-x32-v3 * For v2: Post : https://marc.info/?l=linux-kernel&m=151816914932088&w=2 Git : git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux.git pti-x32-v2 Please review. Thanks, Joerg Joerg Roedel (39): x86/asm-offsets: Move TSS_sp0 and TSS_sp1 to asm-offsets.c x86/entry/32: Rename TSS_sysenter_sp0 to TSS_entry_stack x86/entry/32: Load task stack from x86_tss.sp1 in SYSENTER handler x86/entry/32: Put ESPFIX code into a macro x86/entry/32: Unshare NMI return path x86/entry/32: Split off return-to-kernel path x86/entry/32: Enter the kernel via trampoline stack x86/entry/32: Leave the kernel via trampoline stack x86/entry/32: Introduce SAVE_ALL_NMI and RESTORE_ALL_NMI x86/entry/32: Handle Entry from Kernel-Mode on Entry-Stack x86/entry/32: Simplify debug entry point x86/32: Use tss.sp1 as cpu_current_top_of_stack x86/entry/32: Add PTI cr3 switch to non-NMI entry/exit points x86/entry/32: Add PTI cr3 switches to NMI handler code x86/pgtable: Rename pti_set_user_pgd to pti_set_user_pgtbl x86/pgtable/pae: Unshare kernel PMDs when PTI is enabled x86/pgtable/32: Allocate 8k page-tables when PTI is enabled x86/pgtable: Move pgdp kernel/user conversion functions to pgtable.h x86/pgtable: Move pti_set_user_pgtbl() to pgtable.h x86/pgtable: Move two more functions from pgtable_64.h to pgtable.h x86/mm/pae: Populate valid user PGD entries x86/mm/pae: Populate the user page-table with user pgd's x86/mm/legacy: Populate the user page-table with user pgd's x86/mm/pti: Add an overflow check to pti_clone_pmds() x86/mm/pti: Define X86_CR3_PTI_PCID_USER_BIT on x86_32 x86/mm/pti: Clone CPU_ENTRY_AREA on PMD level on x86_32 x86/mm/pti: Make pti_clone_kernel_text() compile on 32 bit x86/mm/pti: Keep permissions when cloning kernel text in pti_clone_kernel_text() x86/mm/pti: Introduce pti_finalize() x86/mm/pti: Clone entry-text again in pti_finalize() x86/mm/dump_pagetables: Define INIT_PGD x86/pgtable/pae: Use separate kernel PMDs for user page-table x86/ldt: Reserve address-space range on 32 bit for the LDT x86/ldt: Define LDT_END_ADDR x86/ldt: Split out sanity check in map_ldt_struct() x86/ldt: Enable LDT user-mapping for PAE x86/pti: Allow CONFIG_PAGE_TABLE_ISOLATION for x86_32 x86/mm/pti: Add Warning when booting on a PCID capable CPU x86/entry/32: Add debug code to check entry/exit cr3 arch/x86/Kconfig.debug | 12 + arch/x86/entry/entry_32.S | 640 +++++++++++++++++++++++----- arch/x86/include/asm/mmu_context.h | 5 - arch/x86/include/asm/pgtable-2level.h | 9 + arch/x86/include/asm/pgtable-2level_types.h | 3 + arch/x86/include/asm/pgtable-3level.h | 7 + arch/x86/include/asm/pgtable-3level_types.h | 6 +- arch/x86/include/asm/pgtable.h | 87 ++++ arch/x86/include/asm/pgtable_32.h | 2 - arch/x86/include/asm/pgtable_32_types.h | 9 +- arch/x86/include/asm/pgtable_64.h | 89 +--- arch/x86/include/asm/pgtable_64_types.h | 3 + arch/x86/include/asm/pgtable_types.h | 28 +- arch/x86/include/asm/processor-flags.h | 8 +- arch/x86/include/asm/processor.h | 4 - arch/x86/include/asm/pti.h | 3 +- arch/x86/include/asm/sections.h | 1 + arch/x86/include/asm/switch_to.h | 6 +- arch/x86/include/asm/thread_info.h | 2 - arch/x86/kernel/asm-offsets.c | 5 + arch/x86/kernel/asm-offsets_32.c | 2 +- arch/x86/kernel/asm-offsets_64.c | 2 - arch/x86/kernel/cpu/common.c | 9 +- arch/x86/kernel/head_32.S | 20 +- arch/x86/kernel/ldt.c | 137 ++++-- arch/x86/kernel/process.c | 2 - arch/x86/kernel/process_32.c | 4 +- arch/x86/kernel/vmlinux.lds.S | 17 +- arch/x86/mm/dump_pagetables.c | 21 +- arch/x86/mm/init_64.c | 6 - arch/x86/mm/pgtable.c | 105 ++++- arch/x86/mm/pti.c | 67 ++- include/linux/pti.h | 1 + init/main.c | 7 + security/Kconfig | 2 +- 35 files changed, 1008 insertions(+), 323 deletions(-) -- 2.7.4