@@ -87,6 +87,7 @@ static __always_inline void sev_es_stop_this_cpu(void)
if (static_branch_unlikely(&sev_es_enable_key))
__sev_es_stop_this_cpu();
}
+bool sev_kexec_supported(void);
#else
static inline void sev_es_ist_enter(struct pt_regs *regs) { }
static inline void sev_es_ist_exit(void) { }
@@ -94,6 +95,7 @@ static inline int sev_es_setup_ap_jump_table(struct real_mode_header *rmh) { ret
static inline void sev_es_nmi_complete(void) { }
static inline int sev_es_efi_map_ghcbs(pgd_t *pgd) { return 0; }
static inline void sev_es_stop_this_cpu(void) { }
+static bool sev_kexec_supported(void) { return true; }
#endif
#endif
@@ -26,6 +26,7 @@
#include <asm/kexec-bzimage64.h>
#include <asm/setup.h>
#include <asm/set_memory.h>
+#include <asm/sev.h>
#ifdef CONFIG_ACPI
/*
@@ -597,5 +598,8 @@ void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages)
*/
bool arch_kexec_supported(void)
{
- return !sev_es_active();
+ if (!sev_kexec_supported())
+ return false;
+
+ return true;
}
@@ -901,6 +901,18 @@ static int __init sev_es_setup_ap_jump_table_blob(void)
}
core_initcall(sev_es_setup_ap_jump_table_blob);
+bool sev_kexec_supported(void)
+{
+ /*
+ * KEXEC with SEV-ES and more than one CPU is only supported
+ * when the AP Jump Table is installed.
+ */
+ if (num_possible_cpus() > 1)
+ return !sev_es_active() || sev_ap_jumptable_blob_installed;
+ else
+ return true;
+}
+
static void __init alloc_runtime_data(int cpu)
{
struct sev_es_runtime_data *data;