All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brian Gerst <brgerst@gmail.com>
To: linux-kernel@vger.kernel.org, x86@kernel.org
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Borislav Petkov <bp@alien8.de>, Ard Biesheuvel <ardb@kernel.org>,
	Juergen Gross <jgross@suse.com>,
	Tom Lendacky <thomas.lendacky@amd.com>,
	Brian Gerst <brgerst@gmail.com>
Subject: [PATCH v2 2/5] x86/boot/64: Clear BSS as early as possible
Date: Thu, 30 Jul 2026 15:58:51 -0400	[thread overview]
Message-ID: <20260730195854.421115-3-brgerst@gmail.com> (raw)
In-Reply-To: <20260730195854.421115-1-brgerst@gmail.com>

Currently, the BSS section is not cleared until x86_64_start_kernel().
Using unitialized BSS data before that point leads to difficult to debug
problems.  Fix this by moving clear_bss() to as early as possible.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/include/asm/setup.h |  2 --
 arch/x86/kernel/head64.c     | 12 ------------
 arch/x86/kernel/head_64.S    | 20 ++++++++++++++++++++
 arch/x86/xen/enlighten_pv.c  |  2 --
 arch/x86/xen/xen-head.S      |  5 ++++-
 5 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h
index 914eb32581c7..5534f4aaf73b 100644
--- a/arch/x86/include/asm/setup.h
+++ b/arch/x86/include/asm/setup.h
@@ -126,8 +126,6 @@ void *extend_brk(size_t size, size_t align);
 
 extern void probe_roms(void);
 
-void clear_bss(void);
-
 #ifdef __i386__
 
 asmlinkage void __init __noreturn i386_start_kernel(void);
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index fd28b53dbac5..9f19635c6390 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -172,16 +172,6 @@ void __init do_early_exception(struct pt_regs *regs, int trapnr)
 	early_fixup_exception(regs, trapnr);
 }
 
-/* Don't add a printk in there. printk relies on the PDA which is not initialized 
-   yet. */
-void __init clear_bss(void)
-{
-	memset(__bss_start, 0,
-	       (unsigned long) __bss_stop - (unsigned long) __bss_start);
-	memset(__brk_base, 0,
-	       (unsigned long) __brk_limit - (unsigned long) __brk_base);
-}
-
 static unsigned long get_cmd_line_ptr(void)
 {
 	unsigned long cmd_line_ptr = boot_params.hdr.cmd_line_ptr;
@@ -246,8 +236,6 @@ asmlinkage __visible void __init __noreturn x86_64_start_kernel(char * real_mode
 		vmemmap_base		= __VMEMMAP_BASE_L5;
 	}
 
-	clear_bss();
-
 	/*
 	 * This needs to happen *before* kasan_early_init() because latter maps stuff
 	 * into that page.
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index 7ed5520dd52e..15ef5ea52b9a 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -37,6 +37,8 @@
 	.code64
 SYM_CODE_START_NOALIGN(startup_64)
 	UNWIND_HINT_END_OF_STACK
+	cld
+
 	/*
 	 * At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 0,
 	 * and someone has loaded an identity mapped page table
@@ -61,6 +63,8 @@ SYM_CODE_START_NOALIGN(startup_64)
 	/* Set up the stack for verify_cpu() */
 	leaq	__top_init_kernel_stack(%rip), %rsp
 
+	call	clear_bss
+
 	/*
 	 * Set up GSBASE.
 	 * Note that on SMP the boot CPU uses the init data section until
@@ -140,6 +144,22 @@ SYM_CODE_START_NOALIGN(startup_64)
 	jmp	*.Lcommon_startup_64(%rip)
 SYM_CODE_END(startup_64)
 
+SYM_FUNC_START(clear_bss)
+	xorl	%eax, %eax
+
+	leaq	__bss_start(%rip), %rdi
+	leaq	__bss_stop(%rip), %rcx
+	subq	%rdi, %rcx
+	rep stosb
+
+	leaq	__brk_base(%rip), %rdi
+	leaq	__brk_limit(%rip), %rcx
+	subq	%rdi, %rcx
+	rep stosb
+
+	RET
+SYM_FUNC_END(clear_bss)
+
 	__INITRODATA
 SYM_DATA_LOCAL(.Lcommon_startup_64, .quad common_startup_64)
 
diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
index 2c64b388f616..6aa13d19c0a4 100644
--- a/arch/x86/xen/enlighten_pv.c
+++ b/arch/x86/xen/enlighten_pv.c
@@ -1334,8 +1334,6 @@ asmlinkage __visible void __init xen_start_kernel(struct start_info *si)
 	if (!si)
 		return;
 
-	clear_bss();
-
 	xen_start_info = si;
 
 	__text_gen_insn(&early_xen_iret_patch,
diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S
index 5dad6c51cdc3..9b56659246fe 100644
--- a/arch/x86/xen/xen-head.S
+++ b/arch/x86/xen/xen-head.S
@@ -31,6 +31,9 @@ SYM_CODE_START(startup_xen)
 
 	leaq	__top_init_kernel_stack(%rip), %rsp
 
+	movq	%rsi, %r15
+	call	clear_bss
+
 	/*
 	 * Set up GSBASE.
 	 * Note that, on SMP, the boot cpu uses init data section until
@@ -41,7 +44,7 @@ SYM_CODE_START(startup_xen)
 	xorl	%edx, %edx
 	wrmsr
 
-	mov	%rsi, %rdi
+	mov	%r15, %rdi
 	call xen_start_kernel
 SYM_CODE_END(startup_xen)
 	__FINIT
-- 
2.55.0


  parent reply	other threads:[~2026-07-30 19:59 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-30 19:58 [PATCH v2 0/5] x86/boot: Early boot cleanups Brian Gerst
2026-07-30 19:58 ` [PATCH v2 1/5] x86/sme: Clear decrypted BSS separately Brian Gerst
2026-07-30 19:58 ` Brian Gerst [this message]
2026-07-30 19:58 ` [PATCH v2 3/5] x86/boot: Remove hardcoded boot_param constants Brian Gerst
2026-07-30 19:58 ` [PATCH v2 4/5] x86/boot/64: Remove copy_bootdata() call Brian Gerst
2026-07-30 19:58 ` [PATCH v2 5/5] x86/boot/64: Copy boot parameters and command line earlier Brian Gerst

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=20260730195854.421115-3-brgerst@gmail.com \
    --to=brgerst@gmail.com \
    --cc=ardb@kernel.org \
    --cc=bp@alien8.de \
    --cc=jgross@suse.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.