Messages in this thread | | | Date | Mon, 21 Feb 2022 00:42:25 -0800 | From | Kees Cook <> | Subject | Re: [PATCH 00/29] x86: Kernel IBT |
| |
On February 19, 2022 1:58:27 AM PST, Peter Zijlstra <peterz@infradead.org> wrote: >On Sat, Feb 19, 2022 at 01:29:45AM +0000, Edgecombe, Rick P wrote: >> On Fri, 2022-02-18 at 17:49 +0100, Peter Zijlstra wrote: >> > This is an (almost!) complete Kernel IBT implementation. It's been >> > self-hosting >> > for a few days now. That is, it runs on IBT enabled hardware >> > (Tigerlake) and is >> > capable of building the next kernel. >> > >> > It is also almost clean on allmodconfig using GCC-11.2. >> > >> > The biggest TODO item at this point is Clang, I've not yet looked at >> > that. >> >> Do you need to turn this off before kexec? > >Probably... :-) I've never looked at that code though; so I'm not >exactly sure where to put things. > >I'm assuming kexec does a hot-unplug of all but the boot-cpu which then >leaves only a single CPU with state in machine_kexec() ? Does the below >look reasonable? > >--- a/arch/x86/kernel/cpu/common.c >+++ b/arch/x86/kernel/cpu/common.c >@@ -638,6 +638,12 @@ static __always_inline void setup_cet(st > } > } > >+void cet_disable(void) >+{ >+ cr4_clear_bits(X86_CR4_CET);
I'd rather keep the pinning...
>+ wrmsrl(MSR_IA32_S_CET, 0); >+}
Eh, why not just require kexec to be IBT safe? That seems a reasonable exercise if we ever expect UEFI to enforce IBT when starting the kernel on a normal boot...
-Kees
>+ > /* > * Some CPU features depend on higher CPUID levels, which may not always > * be available due to CPUID level capping or broken virtualization >diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h >index 33d41e350c79..cf26356db53e 100644 >--- a/arch/x86/include/asm/cpu.h >+++ b/arch/x86/include/asm/cpu.h >@@ -72,4 +72,7 @@ void init_ia32_feat_ctl(struct cpuinfo_x86 *c); > #else > static inline void init_ia32_feat_ctl(struct cpuinfo_x86 *c) {} > #endif >+ >+extern void cet_disable(void); >+ > #endif /* _ASM_X86_CPU_H */ >diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c >index f5da4a18070a..29a2a1732605 100644 >--- a/arch/x86/kernel/machine_kexec_64.c >+++ b/arch/x86/kernel/machine_kexec_64.c >@@ -310,6 +310,7 @@ void machine_kexec(struct kimage *image) > /* Interrupts aren't acceptable while we reboot */ > local_irq_disable(); > hw_breakpoint_disable(); >+ cet_disable(); > > if (image->preserve_context) { > #ifdef CONFIG_X86_IO_APIC
-- Kees Cook
| |