x86/boot: Explicitly clean pcpu stacks in debug builds
authorAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 27 Aug 2013 09:28:26 +0000 (11:28 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 27 Aug 2013 09:28:26 +0000 (11:28 +0200)
This reduces confusion when looking at a hexdump of the pcpu stacks and
wondering were on earth some of the junk was coming from.  Also leave some
grep fodder for finding where the BSP switches stack (because it took me
far longer to find than I care to admit to).

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/boot/x86_64.S
xen/arch/x86/smpboot.c

index ed3888d4697515292bfda7afc9257b4dd5735cfb..399541d19a2e4bf059a17664d124274eb68f5d57 100644 (file)
         mov     mmu_cr4_features(%rip),%rcx
         mov     %rcx,%cr4
 
+#ifndef NDEBUG
+        /* Clean stack. */
+        mov     stack_start(%rip),%rdi
+        mov     $(STACK_SIZE / 8),%rcx
+        xor     %eax,%eax
+        rep stosq
+#endif
+
+        /* Switch to cpu0_stack. */
         mov     stack_start(%rip),%rsp
         or      $(STACK_SIZE-CPUINFO_sizeof),%rsp
 
index 9f81c7ba62ca7e2e77062ab4f0c5dfd2b6a3a6fe..8bfa151a401593ab7e2f1b4b0c1e6c54783ec1c1 100644 (file)
@@ -659,6 +659,10 @@ static int cpu_smpboot_alloc(unsigned int cpu)
     stack_base[cpu] = alloc_xenheap_pages(STACK_ORDER, 0);
     if ( stack_base[cpu] == NULL )
         goto oom;
+#ifndef NDEBUG
+    for ( order = 0 ; order < (1<<STACK_ORDER); ++order )
+        clear_page(stack_base[cpu] + order * PAGE_SIZE);
+#endif
     memguard_guard_stack(stack_base[cpu]);
 
     order = get_order_from_pages(NR_RESERVED_GDT_PAGES);