--- /dev/null
+From 96e8fc5818686d4a1591bb6907e7fdb64ef29884 Mon Sep 17 00:00:00 2001
+From: Juergen Gross <jgross@suse.com>
+Date: Thu, 30 Jun 2022 09:14:39 +0200
+Subject: x86/xen: Use clear_bss() for Xen PV guests
+
+From: Juergen Gross <jgross@suse.com>
+
+commit 96e8fc5818686d4a1591bb6907e7fdb64ef29884 upstream.
+
+Instead of clearing the bss area in assembly code, use the clear_bss()
+function.
+
+This requires to pass the start_info address as parameter to
+xen_start_kernel() in order to avoid the xen_start_info being zeroed
+again.
+
+Signed-off-by: Juergen Gross <jgross@suse.com>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Reviewed-by: Jan Beulich <jbeulich@suse.com>
+Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Link: https://lore.kernel.org/r/20220630071441.28576-2-jgross@suse.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/include/asm/setup.h | 3 +++
+ arch/x86/kernel/head64.c | 2 +-
+ arch/x86/xen/enlighten_pv.c | 8 ++++++--
+ arch/x86/xen/xen-head.S | 10 +---------
+ 4 files changed, 11 insertions(+), 12 deletions(-)
+
+--- a/arch/x86/include/asm/setup.h
++++ b/arch/x86/include/asm/setup.h
+@@ -132,6 +132,9 @@ void *extend_brk(size_t size, size_t ali
+ }
+
+ extern void probe_roms(void);
++
++void clear_bss(void);
++
+ #ifdef __i386__
+
+ asmlinkage void __init i386_start_kernel(void);
+--- a/arch/x86/kernel/head64.c
++++ b/arch/x86/kernel/head64.c
+@@ -421,7 +421,7 @@ void __init do_early_exception(struct pt
+
+ /* Don't add a printk in there. printk relies on the PDA which is not initialized
+ yet. */
+-static void __init clear_bss(void)
++void __init clear_bss(void)
+ {
+ memset(__bss_start, 0,
+ (unsigned long) __bss_stop - (unsigned long) __bss_start);
+--- a/arch/x86/xen/enlighten_pv.c
++++ b/arch/x86/xen/enlighten_pv.c
+@@ -1183,15 +1183,19 @@ static void __init xen_domu_set_legacy_f
+ extern void early_xen_iret_patch(void);
+
+ /* First C function to be called on Xen boot */
+-asmlinkage __visible void __init xen_start_kernel(void)
++asmlinkage __visible void __init xen_start_kernel(struct start_info *si)
+ {
+ struct physdev_set_iopl set_iopl;
+ unsigned long initrd_start = 0;
+ int rc;
+
+- if (!xen_start_info)
++ if (!si)
+ return;
+
++ clear_bss();
++
++ xen_start_info = si;
++
+ __text_gen_insn(&early_xen_iret_patch,
+ JMP32_INSN_OPCODE, &early_xen_iret_patch, &xen_iret,
+ JMP32_INSN_SIZE);
+--- a/arch/x86/xen/xen-head.S
++++ b/arch/x86/xen/xen-head.S
+@@ -48,15 +48,6 @@ SYM_CODE_START(startup_xen)
+ ANNOTATE_NOENDBR
+ cld
+
+- /* Clear .bss */
+- xor %eax,%eax
+- mov $__bss_start, %rdi
+- mov $__bss_stop, %rcx
+- sub %rdi, %rcx
+- shr $3, %rcx
+- rep stosq
+-
+- mov %rsi, xen_start_info
+ mov initial_stack(%rip), %rsp
+
+ /* Set up %gs.
+@@ -71,6 +62,7 @@ SYM_CODE_START(startup_xen)
+ cdq
+ wrmsr
+
++ mov %rsi, %rdi
+ call xen_start_kernel
+ SYM_CODE_END(startup_xen)
+ __FINIT