[PATCH v4 2/3] x86/efistub: Obtain SEV CC blob address from the stub

Ard Biesheuvel
2025-09-09T08:06:48Z

From: Ard Biesheuvel <ardb@kernel.org>

The x86 EFI stub no longer boots the core kernel via the traditional
decompressor but jumps straight to it, avoiding all the page fault
handling and other complexity that is entirely unnecessary when booting
via EFI, which guarantees that all system memory is mapped 1:1.

The SEV startup code in the core kernel expects the address of the CC
blob configuration table in boot_params, so store it there when booting
from EFI with SEV-SNP enabled. This removes the need to call
sev_enable() from the EFI stub.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
drivers/firmware/efi/libstub/x86-stub.c | 21 +++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
index 0d05eac7c72b..c4ef645762ec 100644
--- a/drivers/firmware/efi/libstub/x86-stub.c
+++ b/drivers/firmware/efi/libstub/x86-stub.c
@@ -681,17 +681,28 @@ static efi_status_t exit_boot(struct boot_params *boot_params, void *handle)
return EFI_SUCCESS;
}

-static bool have_unsupported_snp_features(void)
+static bool check_snp_features(struct boot_params *bp)
{
+ u64 status = sev_get_status();
u64 unsupported;

- unsupported = snp_get_unsupported_features(sev_get_status());
+ unsupported = snp_get_unsupported_features(status);
if (unsupported) {
efi_err("Unsupported SEV-SNP features detected: 0x%llx\n",
unsupported);
- return true;
+ return false;
}
- return false;
+
+ if (status & MSR_AMD64_SEV_SNP_ENABLED) {
+ void *tbl = get_efi_config_table(EFI_CC_BLOB_GUID);
+
+ if (!tbl) {
+ efi_err("SEV-SNP is enabled but CC blob not found\n");
+ return false;
+ }
+ bp->cc_blob_address = (u32)(unsigned long)tbl;
+ }
+ return true;
}

static void efi_get_seed(void *seed, int size)
@@ -831,7 +842,7 @@ void __noreturn efi_stub_entry(efi_handle_t handle,

hdr = &boot_params->hdr;

- if (have_unsupported_snp_features())
+ if (!check_snp_features(boot_params))
efi_exit(handle, EFI_UNSUPPORTED);

if (IS_ENABLED(CONFIG_EFI_DXE_MEM_ATTRIBUTES)) {
--
2.51.0.384.g4c02a37b29-goog