From: Ard Biesheuvel <ardb+git@google.com>
To: linux-kernel@vger.kernel.org
Cc: linux-efi@vger.kernel.org, x86@kernel.org,
Ard Biesheuvel <ardb@kernel.org>, Borislav Petkov <bp@alien8.de>,
Ingo Molnar <mingo@kernel.org>,
Kevin Loughlin <kevinloughlin@google.com>,
Tom Lendacky <thomas.lendacky@amd.com>,
Josh Poimboeuf <jpoimboe@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Nikunj A Dadhania <nikunj@amd.com>
Subject: [PATCH v7 09/22] x86/sev: Use boot SVSM CA for all startup and init code
Date: Thu, 28 Aug 2025 12:22:12 +0200 [thread overview]
Message-ID: <20250828102202.1849035-33-ardb+git@google.com> (raw)
In-Reply-To: <20250828102202.1849035-24-ardb+git@google.com>
From: Ard Biesheuvel <ardb@kernel.org>
To avoid having to reason about whether or not to use the per-CPU SVSM
calling area when running startup and init code on the boot CPU, reuse
the boot SVSM calling area as the per-CPU area for CPU #0.
This removes the need to make the per-CPU variables and associated state
in sev_cfg accessible to the startup code once confined.
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
arch/x86/boot/compressed/sev.c | 13 ------
arch/x86/boot/startup/sev-startup.c | 11 ++---
arch/x86/coco/sev/core.c | 47 +++++++++-----------
arch/x86/include/asm/sev-internal.h | 16 -------
4 files changed, 28 insertions(+), 59 deletions(-)
diff --git a/arch/x86/boot/compressed/sev.c b/arch/x86/boot/compressed/sev.c
index dffe607e6d8b..de73da526577 100644
--- a/arch/x86/boot/compressed/sev.c
+++ b/arch/x86/boot/compressed/sev.c
@@ -37,19 +37,6 @@ struct ghcb *boot_ghcb;
#define __BOOT_COMPRESSED
-extern u64 boot_svsm_caa_pa;
-
-struct svsm_ca *svsm_get_caa(void)
-{
- /* The decompressor is mapped 1:1 so VA == PA */
- return (struct svsm_ca *)boot_svsm_caa_pa;
-}
-
-u64 svsm_get_caa_pa(void)
-{
- return boot_svsm_caa_pa;
-}
-
u8 snp_vmpl;
/* Include code for early handlers */
diff --git a/arch/x86/boot/startup/sev-startup.c b/arch/x86/boot/startup/sev-startup.c
index 8009a37d53c1..b0fc63f8dee1 100644
--- a/arch/x86/boot/startup/sev-startup.c
+++ b/arch/x86/boot/startup/sev-startup.c
@@ -50,9 +50,6 @@ u64 sev_secrets_pa __ro_after_init;
/* For early boot SVSM communication */
struct svsm_ca boot_svsm_ca_page __aligned(PAGE_SIZE);
-DEFINE_PER_CPU(struct svsm_ca *, svsm_caa);
-DEFINE_PER_CPU(u64, svsm_caa_pa);
-
/*
* Nothing shall interrupt this code path while holding the per-CPU
* GHCB. The backup GHCB is only for NMIs interrupting this path.
@@ -153,7 +150,9 @@ void __head early_snp_set_memory_private(unsigned long vaddr, unsigned long padd
unsigned long npages)
{
struct psc_desc d = {
- SNP_PAGE_STATE_PRIVATE, svsm_get_caa(), svsm_get_caa_pa()
+ SNP_PAGE_STATE_PRIVATE,
+ rip_rel_ptr(&boot_svsm_ca_page),
+ boot_svsm_caa_pa
};
/*
@@ -176,7 +175,9 @@ void __head early_snp_set_memory_shared(unsigned long vaddr, unsigned long paddr
unsigned long npages)
{
struct psc_desc d = {
- SNP_PAGE_STATE_SHARED, svsm_get_caa(), svsm_get_caa_pa()
+ SNP_PAGE_STATE_SHARED,
+ rip_rel_ptr(&boot_svsm_ca_page),
+ boot_svsm_caa_pa
};
/*
diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c
index a833b2b31d3d..9782ebe30675 100644
--- a/arch/x86/coco/sev/core.c
+++ b/arch/x86/coco/sev/core.c
@@ -46,6 +46,25 @@
#include <asm/cmdline.h>
#include <asm/msr.h>
+DEFINE_PER_CPU(struct svsm_ca *, svsm_caa);
+DEFINE_PER_CPU(u64, svsm_caa_pa);
+
+static inline struct svsm_ca *svsm_get_caa(void)
+{
+ if (sev_cfg.use_cas)
+ return this_cpu_read(svsm_caa);
+ else
+ return rip_rel_ptr(&boot_svsm_ca_page);
+}
+
+static inline u64 svsm_get_caa_pa(void)
+{
+ if (sev_cfg.use_cas)
+ return this_cpu_read(svsm_caa_pa);
+ else
+ return boot_svsm_caa_pa;
+}
+
/* AP INIT values as documented in the APM2 section "Processor Initialization State" */
#define AP_INIT_CS_LIMIT 0xffff
#define AP_INIT_DS_LIMIT 0xffff
@@ -1312,7 +1331,8 @@ static void __init alloc_runtime_data(int cpu)
struct svsm_ca *caa;
/* Allocate the SVSM CA page if an SVSM is present */
- caa = memblock_alloc_or_panic(sizeof(*caa), PAGE_SIZE);
+ caa = cpu ? memblock_alloc_or_panic(sizeof(*caa), PAGE_SIZE)
+ : &boot_svsm_ca_page;
per_cpu(svsm_caa, cpu) = caa;
per_cpu(svsm_caa_pa, cpu) = __pa(caa);
@@ -1366,32 +1386,9 @@ void __init sev_es_init_vc_handling(void)
init_ghcb(cpu);
}
- /* If running under an SVSM, switch to the per-cpu CA */
- if (snp_vmpl) {
- struct svsm_call call = {};
- unsigned long flags;
- int ret;
-
- local_irq_save(flags);
-
- /*
- * SVSM_CORE_REMAP_CA call:
- * RAX = 0 (Protocol=0, CallID=0)
- * RCX = New CA GPA
- */
- call.caa = svsm_get_caa();
- call.rax = SVSM_CORE_CALL(SVSM_CORE_REMAP_CA);
- call.rcx = this_cpu_read(svsm_caa_pa);
- ret = svsm_perform_call_protocol(&call);
- if (ret)
- panic("Can't remap the SVSM CA, ret=%d, rax_out=0x%llx\n",
- ret, call.rax_out);
-
+ if (snp_vmpl)
sev_cfg.use_cas = true;
- local_irq_restore(flags);
- }
-
sev_es_setup_play_dead();
/* Secondary CPUs use the runtime #VC handler */
diff --git a/arch/x86/include/asm/sev-internal.h b/arch/x86/include/asm/sev-internal.h
index 9ff824540b48..f98f080410ad 100644
--- a/arch/x86/include/asm/sev-internal.h
+++ b/arch/x86/include/asm/sev-internal.h
@@ -62,22 +62,6 @@ DECLARE_PER_CPU(u64, svsm_caa_pa);
extern u64 boot_svsm_caa_pa;
-static __always_inline struct svsm_ca *svsm_get_caa(void)
-{
- if (sev_cfg.use_cas)
- return this_cpu_read(svsm_caa);
- else
- return rip_rel_ptr(&boot_svsm_ca_page);
-}
-
-static __always_inline u64 svsm_get_caa_pa(void)
-{
- if (sev_cfg.use_cas)
- return this_cpu_read(svsm_caa_pa);
- else
- return boot_svsm_caa_pa;
-}
-
enum es_result verify_exception_info(struct ghcb *ghcb, struct es_em_ctxt *ctxt);
void vc_forward_exception(struct es_em_ctxt *ctxt);
--
2.51.0.268.g9569e192d0-goog
next prev parent reply other threads:[~2025-08-28 10:22 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-28 10:22 [PATCH v7 00/22] x86: strict separation of startup code Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 01/22] x86/sev: Separate MSR and GHCB based snp_cpuid() via a callback Ard Biesheuvel
2025-08-28 15:33 ` Borislav Petkov
2025-08-28 16:14 ` Ard Biesheuvel
2025-09-09 21:45 ` Tom Lendacky
2025-09-09 21:44 ` Tom Lendacky
2025-09-09 22:20 ` Borislav Petkov
2025-09-10 13:57 ` Tom Lendacky
2025-08-28 10:22 ` [PATCH v7 02/22] x86/sev: Use MSR protocol for remapping SVSM calling area Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 03/22] x86/sev: Use MSR protocol only for early SVSM PVALIDATE call Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 04/22] x86/sev: Run RMPADJUST on SVSM calling area page to test VMPL Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 05/22] x86/sev: Move GHCB page based HV communication out of startup code Ard Biesheuvel
2025-08-31 10:49 ` Borislav Petkov
2025-08-31 10:52 ` Ard Biesheuvel
2025-08-31 10:56 ` Ard Biesheuvel
2025-08-31 11:15 ` Borislav Petkov
2025-08-31 12:30 ` Ard Biesheuvel
2025-08-31 13:11 ` Ard Biesheuvel
2025-09-01 13:54 ` Borislav Petkov
2025-09-01 14:02 ` Ard Biesheuvel
2025-09-01 14:25 ` Borislav Petkov
2025-09-01 14:26 ` Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 06/22] x86/sev: Avoid global variable to store virtual address of SVSM area Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 07/22] x86/sev: Share implementation of MSR-based page state change Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 08/22] x86/sev: Pass SVSM calling area down to early page state change API Ard Biesheuvel
2025-08-28 10:22 ` Ard Biesheuvel [this message]
2025-08-28 10:22 ` [PATCH v7 10/22] x86/boot: Drop redundant RMPADJUST in SEV SVSM presence check Ard Biesheuvel
2025-09-02 12:02 ` Borislav Petkov
2025-09-02 13:50 ` Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 11/22] x86/boot: Provide PIC aliases for 5-level paging related constants Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 12/22] x86/sev: Provide PIC aliases for SEV related data objects Ard Biesheuvel
2025-09-02 12:06 ` Borislav Petkov
2025-09-02 12:24 ` Ard Biesheuvel
2025-09-02 16:24 ` Borislav Petkov
2025-08-28 10:22 ` [PATCH v7 13/22] x86/sev: Move __sev_[get|put]_ghcb() into separate noinstr object Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 14/22] x86/sev: Export startup routines for later use Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 15/22] objtool: Add action to check for absence of absolute relocations Ard Biesheuvel
2025-10-13 9:40 ` Andreas Schwab
2025-08-28 10:22 ` [PATCH v7 16/22] x86/boot: Check startup code " Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 17/22] x86/boot: Revert "Reject absolute references in .head.text" Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 18/22] x86/kbuild: Incorporate boot/startup/ via Kbuild makefile Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 19/22] x86/boot: Create a confined code area for startup code Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 20/22] efistub/x86: Remap inittext read-execute when needed Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 21/22] x86/boot: Move startup code out of __head section Ard Biesheuvel
2025-09-03 9:20 ` Ard Biesheuvel
2025-08-28 10:22 ` [PATCH v7 22/22] x86/boot: Get rid of the .head.text section Ard Biesheuvel
2025-09-03 16:22 ` [PATCH v7 00/22] x86: strict separation of startup code Borislav Petkov
2025-09-04 6:29 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250828102202.1849035-33-ardb+git@google.com \
--to=ardb+git@google.com \
--cc=ardb@kernel.org \
--cc=bp@alien8.de \
--cc=jpoimboe@kernel.org \
--cc=kevinloughlin@google.com \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=nikunj@amd.com \
--cc=peterz@infradead.org \
--cc=thomas.lendacky@amd.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox