[PATCH v6 5/7] x86/sev: Register Alternate Injection protocol during OVMF boot
From: Melody Wang
Date: Thu Nov 05 2026 - 20:27:30 EST
The SVSM provides the SVSM_APIC_CONFIG_EMULATION protocol to register
and deregister Alternate Injection. This configuration must be completed
before ExitBootServices() is called. Therefore, OVMF needs to invoke
this protocol early to set up Alternate Injection for SEV-SNP guests.
Implement this registration by default for guests that have SEV-SNP
Alternate Injection enabled.
Signed-off-by: Melody Wang <huibo.wang@xxxxxxx>
---
drivers/firmware/efi/libstub/efistub.h | 11 ++++++++
drivers/firmware/efi/libstub/x86-stub.c | 36 ++++++++++++++++++++++++-
include/linux/efi.h | 2 ++
3 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h
index f5eec8c12894..edc6c4908faa 100644
--- a/drivers/firmware/efi/libstub/efistub.h
+++ b/drivers/firmware/efi/libstub/efistub.h
@@ -177,6 +177,17 @@ void efi_set_u64_split(u64 data, u32 *lo, u32 *hi)
*/
#define EFI_MMAP_NR_SLACK_SLOTS 32
+typedef union sev_alt_inj_register_protocol sev_alt_inj_register_protocol_t;
+union sev_alt_inj_register_protocol {
+ struct {
+ efi_status_t (__efiapi * sev_register_alt_inj)
+ (sev_alt_inj_register_protocol_t *);
+ };
+ struct {
+ u32 sev_register_alt_inj;
+ } mixed_mode;
+};
+
typedef struct efi_generic_dev_path efi_device_path_protocol_t;
union efi_device_path_to_text_protocol {
diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
index a2f193da9bde..878f61cd6fab 100644
--- a/drivers/firmware/efi/libstub/x86-stub.c
+++ b/drivers/firmware/efi/libstub/x86-stub.c
@@ -786,6 +786,39 @@ static efi_status_t exit_boot(struct boot_params *boot_params, void *handle)
return EFI_SUCCESS;
}
+/*
+ * When the guest is running at VMPL2 with Alternate Injection enabled,
+ * register Alternate Injection before ExitBootServices().
+ *
+ * Return true in the first conditional to mean that this is not an Alternate
+ * Injection guest and boot can continue. If it is an Alternate Injection guest,
+ * both failure to locate the protocol and to register it, means fail the boot.
+ */
+static bool svsm_register_alt_inj(void)
+{
+ efi_guid_t alt_inj_proto = OVMF_SEV_ALT_INJ_REGISTER_PROTOCOL_GUID;
+ sev_alt_inj_register_protocol_t *proto;
+ efi_status_t status;
+
+ if (!early_is_sevsnp_guest() || !snp_vmpl ||
+ !(sev_get_status() & MSR_AMD64_SNP_ALTERNATE_INJ))
+ return true;
+
+ status = efi_bs_call(locate_protocol, &alt_inj_proto, NULL, (void **)&proto);
+ if (status != EFI_SUCCESS) {
+ efi_err("Alternate Injection registration protocol not exist\n");
+ return false;
+ }
+
+ status = efi_call_proto(proto, sev_register_alt_inj);
+ if (status != EFI_SUCCESS) {
+ efi_err("Alternate Injection registration protocol failed\n");
+ return false;
+ }
+
+ return true;
+}
+
static bool sev_prepare(void)
{
u64 unsupported;
@@ -796,7 +829,8 @@ static bool sev_prepare(void)
unsupported);
return false;
}
- return true;
+
+ return svsm_register_alt_inj();
}
static void efi_get_seed(void *seed, int size)
diff --git a/include/linux/efi.h b/include/linux/efi.h
index cc1df1577d5f..8545196ecaa3 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -444,6 +444,8 @@ void efi_native_runtime_setup(void);
#define OVMF_SEV_MEMORY_ACCEPTANCE_PROTOCOL_GUID EFI_GUID(0xc5a010fe, 0x38a7, 0x4531, 0x8a, 0x4a, 0x05, 0x00, 0xd2, 0xfd, 0x16, 0x49)
#define OVMF_MEMORY_LOG_TABLE_GUID EFI_GUID(0x95305139, 0xb20f, 0x4723, 0x84, 0x25, 0x62, 0x7c, 0x88, 0x8f, 0xf1, 0x21)
+#define OVMF_SEV_ALT_INJ_REGISTER_PROTOCOL_GUID EFI_GUID(0x3cf00587, 0x2329, 0x4c44, 0xb1, 0x84, 0x8f, 0xd9, 0x87, 0x00, 0x42, 0xe0)
+
typedef struct {
efi_guid_t guid;
u64 table;
--
2.43.0