x86/cpu: reposition stack alignment check
authorAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 28 Nov 2016 08:17:00 +0000 (09:17 +0100)
committerJan Beulich <jbeulich@suse.com>
Mon, 28 Nov 2016 08:17:00 +0000 (09:17 +0100)
As identified during review, using BUG_ON() before `lidt` will result in a
triple fault, even on APs.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Release-acked-by: Wei Liu <wei.liu2@citrix.com>
xen/arch/x86/cpu/common.c

index 06ee401ff10e76051dbd904bef2429c9fa398fcf..1d78ab4d8468ef5a8102e0a60c15170d4c658c41 100644 (file)
@@ -643,11 +643,6 @@ void load_system_tables(void)
                .limit = (IDT_ENTRIES * sizeof(idt_entry_t)) - 1,
        };
 
-       /* Bottom-of-stack must be 16-byte aligned! */
-       BUILD_BUG_ON((sizeof(struct cpu_info) -
-                     offsetof(struct cpu_info, guest_cpu_user_regs.es)) & 0xf);
-       BUG_ON(system_state != SYS_STATE_early_boot && (stack_bottom & 0xf));
-
        /* Main stack for interrupts/exceptions. */
        tss->rsp0 = stack_bottom;
        tss->bitmap = IOBMP_INVALID_OFFSET;
@@ -672,6 +667,15 @@ void load_system_tables(void)
        asm volatile ("lidt %0"  : : "m"  (idtr) );
        asm volatile ("ltr  %w0" : : "rm" (TSS_ENTRY << 3) );
        asm volatile ("lldt %w0" : : "rm" (0) );
+
+       /*
+        * Bottom-of-stack must be 16-byte aligned!
+        *
+        * Defer checks until exception support is sufficiently set up.
+        */
+       BUILD_BUG_ON((sizeof(struct cpu_info) -
+                     offsetof(struct cpu_info, guest_cpu_user_regs.es)) & 0xf);
+       BUG_ON(system_state != SYS_STATE_early_boot && (stack_bottom & 0xf));
 }
 
 /*