Baremetal kernels clear .bss early in the boot. Since Xen PV guests don't
excecute that early code they should do it too.

(Since we introduce macros for specifying 32- and 64-bit registers we
can get rid of ifdefs in startup_xen())

Signed-off-by: Boris Ostrovsky <boris.ostrov...@oracle.com>
---
 arch/x86/xen/xen-head.S | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S
index b65f59a..2af87d1 100644
--- a/arch/x86/xen/xen-head.S
+++ b/arch/x86/xen/xen-head.S
@@ -35,16 +35,31 @@
 #define PVH_FEATURES (0)
 #endif
 
-       __INIT
-ENTRY(startup_xen)
-       cld
 #ifdef CONFIG_X86_32
-       mov %esi,xen_start_info
-       mov $init_thread_union+THREAD_SIZE,%esp
+#define REG(register)  %e##register
+#define WSIZE_SHIFT    2
+#define STOS           stosl
 #else
-       mov %rsi,xen_start_info
-       mov $init_thread_union+THREAD_SIZE,%rsp
+#define REG(register)  %r##register
+#define WSIZE_SHIFT    3
+#define STOS           stosq
 #endif
+
+       __INIT
+ENTRY(startup_xen)
+       cld
+
+       /* Clear .bss */
+       xor REG(ax),REG(ax)
+       mov $__bss_start,REG(di)
+       mov $__bss_stop,REG(cx)
+       sub REG(di),REG(cx)
+       shr $WSIZE_SHIFT,REG(cx)
+       rep STOS
+
+       mov REG(si),xen_start_info
+       mov $init_thread_union+THREAD_SIZE,REG(sp)
+
        jmp xen_start_kernel
 
        __FINIT
-- 
2.1.0

Reply via email to