Message ID | 20250512190834.332684-25-ardb+git@google.com |
---|---|
State | New |
Headers | show |
Series | x86: strict separation of startup code | expand |
On Mon, May 12, 2025 at 09:08:37PM +0200, Ard Biesheuvel wrote: > From: Ard Biesheuvel <ardb@kernel.org> > > As the preceding code comment already indicates, remapping the SVSM > calling area occurs long before the GHCB page is configured, and so > calling svsm_perform_call_protocol() is guaranteed to result in a call > to svsm_perform_msr_protocol(). > > So just call the latter directly. This allows most of the GHCB based API > infrastructure to be moved out of the startup code in a subsequent > patch. > > Signed-off-by: Ard Biesheuvel <ardb@kernel.org> > --- > arch/x86/boot/startup/sev-startup.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/boot/startup/sev-startup.c b/arch/x86/boot/startup/sev-startup.c > index 435853a55768..a1d5a5632d58 100644 > --- a/arch/x86/boot/startup/sev-startup.c > +++ b/arch/x86/boot/startup/sev-startup.c > @@ -325,7 +325,9 @@ static __head void svsm_setup(struct cc_blob_sev_info *cc_info) > call.caa = svsm_get_caa(); > call.rax = SVSM_CORE_CALL(SVSM_CORE_REMAP_CA); > call.rcx = pa; > - ret = svsm_perform_call_protocol(&call); > + do { > + ret = svsm_perform_msr_protocol(&call); > + } while (ret == -EAGAIN); Right, a future cleanup for another patch would be to wrap that loop into a function. But not now. > if (ret) > sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_SVSM_CA_REMAP_FAIL); > > -- Reviewed-by: Borislav Petkov (AMD) <bp@alien8.de>
diff --git a/arch/x86/boot/startup/sev-startup.c b/arch/x86/boot/startup/sev-startup.c index 435853a55768..a1d5a5632d58 100644 --- a/arch/x86/boot/startup/sev-startup.c +++ b/arch/x86/boot/startup/sev-startup.c @@ -325,7 +325,9 @@ static __head void svsm_setup(struct cc_blob_sev_info *cc_info) call.caa = svsm_get_caa(); call.rax = SVSM_CORE_CALL(SVSM_CORE_REMAP_CA); call.rcx = pa; - ret = svsm_perform_call_protocol(&call); + do { + ret = svsm_perform_msr_protocol(&call); + } while (ret == -EAGAIN); if (ret) sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_SVSM_CA_REMAP_FAIL);