From: Joerg Roedel <jroedel at suse.de> Hi, two small patches to disable kexec on x86 when running as an SEV-ES guest. Trying to kexec a new kernel would fail anyway because there is no mechanism yet to hand over the APs from the old to the new kernel. Supporting this needs changes in the Hypervisor and the guest kernel as well. This code is currently being work on, but disable kexec in SEV-ES guests until it is ready. Please review. Regards, Joerg Joerg Roedel (2): kexec: Allow architecture code to opt-out at runtime x86/kexec/64: Forbid kexec when running as an SEV-ES guest arch/x86/kernel/machine_kexec_64.c | 8 ++++++++ kernel/kexec.c | 14 ++++++++++++++ 2 files changed, 22 insertions(+) -- 2.31.1
Joerg Roedel
2021-May-06 09:31 UTC
[PATCH 1/2] kexec: Allow architecture code to opt-out at runtime
From: Joerg Roedel <jroedel at suse.de> Allow a runtime opt-out of kexec support for architecture code in case the kernel is running in an environment where kexec is not properly supported yet. This will be used on x86 when the kernel is running as an SEV-ES guest. SEV-ES guests need special handling for kexec to hand over all CPUs to the new kernel. This requires special hypervisor support and handling code in the guest which is not yet implemented. Cc: stable at vger.kernel.org # v5.10+ Signed-off-by: Joerg Roedel <jroedel at suse.de> --- kernel/kexec.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/kernel/kexec.c b/kernel/kexec.c index c82c6c06f051..d03134160458 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c @@ -195,11 +195,25 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments, * that to happen you need to do that yourself. */ +bool __weak arch_kexec_supported(void) +{ + return true; +} + static inline int kexec_load_check(unsigned long nr_segments, unsigned long flags) { int result; + /* + * The architecture may support kexec in general, but the kernel could + * run in an environment where it is not (yet) possible to execute a new + * kernel. Allow the architecture code to opt-out of kexec support when + * it is running in such an environment. + */ + if (!arch_kexec_supported()) + return -ENOSYS; + /* We only trust the superuser with rebooting the system. */ if (!capable(CAP_SYS_BOOT) || kexec_load_disabled) return -EPERM; -- 2.31.1
Joerg Roedel
2021-May-06 09:31 UTC
[PATCH 2/2] x86/kexec/64: Forbid kexec when running as an SEV-ES guest
From: Joerg Roedel <jroedel at suse.de> For now, kexec is not supported when running as an SEV-ES guest. Doing so requires additional hypervisor support and special code to hand over the CPUs to the new kernel in a safe way. Until this is implemented, do not support kexec in SEV-ES guests. Cc: stable at vger.kernel.org # v5.10+ Signed-off-by: Joerg Roedel <jroedel at suse.de> --- arch/x86/kernel/machine_kexec_64.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c index c078b0d3ab0e..f902cc9cc634 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c @@ -620,3 +620,11 @@ void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages) */ set_memory_encrypted((unsigned long)vaddr, pages); } + +/* + * Kexec is not supported in SEV-ES guests yet + */ +bool arch_kexec_supported(void) +{ + return !sev_es_active(); +} -- 2.31.1