Re: [PATCH v2 01/10] x86/boot: Drop pointless re-implementation of panic()
From: Borislav Petkov
Date: Wed Sep 09 2026 - 16:33:59 EST
On Wed, Sep 09, 2026 at 01:55:32PM +0200, Ard Biesheuvel wrote:
> From: Ard Biesheuvel <ardb@xxxxxxxxxx>
>
> The decompressor has its own implementation of panic(), which is based
> on the vsnprintf() routine provided by the EFI stub.
>
> Relying on the EFI stub from code that does not execute in the context
> of the EFI boot services is a bad idea. It is also completely pointless
> in this case, given that the only user of this version of panic() only
> passes a compile time constant string, without any printf conversions.
>
> So use error() instead of panic() in that case, and drop the panic()
> implementation entirely. This is needed so that the EFI stub's
> vsnprintf() can be modified in a manner that is incompatible with the
> expectations of this caller.
>
> Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx>
> ---
> arch/x86/boot/compressed/error.c | 19 -------------------
> arch/x86/boot/compressed/error.h | 1 -
> arch/x86/boot/compressed/mem.c | 2 +-
> 3 files changed, 1 insertion(+), 21 deletions(-)
>
> diff --git a/arch/x86/boot/compressed/error.c b/arch/x86/boot/compressed/error.c
> index 19a8251de506..ce5ed7d8265e 100644
> --- a/arch/x86/boot/compressed/error.c
> +++ b/arch/x86/boot/compressed/error.c
> @@ -22,22 +22,3 @@ void error(char *m)
> while (1)
> asm("hlt");
> }
> -
> -/* EFI libstub provides vsnprintf() */
> -#ifdef CONFIG_EFI_STUB
> -void panic(const char *fmt, ...)
So this thing appeared magically in v8 of the TDX unaccepted memory patches
and I don't think we questioned it back then.
v7's tdx_accept_memory() does error():
https://lore.kernel.org/all/20220614120231.48165-15-kirill.shutemov@xxxxxxxxxxxxxxx/
and v8 started doing panic():
+void tdx_accept_memory(phys_addr_t start, phys_addr_t end)
+{
+ if (!tdx_enc_status_changed_phys(start, end, true))
+ panic("Accepting memory failed: %#llx-%#llx\n", start, end);
+}
https://lore.kernel.org/all/20221207014933.8435-15-kirill.shutemov@xxxxxxxxxxxxxxx/
and it switched to it being a vsnprintf() wrapper because it wanted to dump
start and end perhaps.
But then it ended up dropping the params in v13 and landed upstream with
a single string as an argument.
Anyway, adding Kiryl/Kirill for comment and leaving in the rest for reference.
> -{
> - static char buf[1024];
> - va_list args;
> - int len;
> -
> - va_start(args, fmt);
> - len = vsnprintf(buf, sizeof(buf), fmt, args);
> - va_end(args);
> -
> - if (len && buf[len - 1] == '\n')
> - buf[len - 1] = '\0';
> -
> - error(buf);
> -}
> -#endif
> diff --git a/arch/x86/boot/compressed/error.h b/arch/x86/boot/compressed/error.h
> index 31f9e080d61a..87062dea9a20 100644
> --- a/arch/x86/boot/compressed/error.h
> +++ b/arch/x86/boot/compressed/error.h
> @@ -6,6 +6,5 @@
>
> void warn(const char *m);
> void error(char *m) __noreturn;
> -void panic(const char *fmt, ...) __noreturn __cold;
>
> #endif /* BOOT_COMPRESSED_ERROR_H */
> diff --git a/arch/x86/boot/compressed/mem.c b/arch/x86/boot/compressed/mem.c
> index 0e9f84ab4bdc..e1c017b55184 100644
> --- a/arch/x86/boot/compressed/mem.c
> +++ b/arch/x86/boot/compressed/mem.c
> @@ -37,7 +37,7 @@ void arch_accept_memory(phys_addr_t start, phys_addr_t end)
> /* Platform-specific memory-acceptance call goes here */
> if (early_is_tdx_guest()) {
> if (!tdx_accept_memory(start, end))
> - panic("TDX: Failed to accept memory\n");
> + error("TDX: Failed to accept memory\n");
> } else if (early_is_sevsnp_guest()) {
> snp_accept_memory(start, end);
> } else {
> --
> 2.55.0.1003.g10538fe699-goog
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette