x86/head/64: Load segment registers earlier
authorJoerg Roedel <jroedel@suse.de>
Mon, 7 Sep 2020 13:15:32 +0000 (15:15 +0200)
committerBorislav Petkov <bp@suse.de>
Mon, 7 Sep 2020 19:40:53 +0000 (21:40 +0200)
Make sure segments are properly set up before setting up an IDT and
doing anything that might cause a #VC exception. This is later needed
for early exception handling.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Kees Cook <keescook@chromium.org>
Link: https://lkml.kernel.org/r/20200907131613.12703-32-joro@8bytes.org
arch/x86/kernel/head_64.S

index 03b03f2..f402087 100644 (file)
@@ -166,6 +166,32 @@ SYM_CODE_START(secondary_startup_64)
         */
        lgdt    early_gdt_descr(%rip)
 
+       /* set up data segments */
+       xorl %eax,%eax
+       movl %eax,%ds
+       movl %eax,%ss
+       movl %eax,%es
+
+       /*
+        * We don't really need to load %fs or %gs, but load them anyway
+        * to kill any stale realmode selectors.  This allows execution
+        * under VT hardware.
+        */
+       movl %eax,%fs
+       movl %eax,%gs
+
+       /* Set up %gs.
+        *
+        * The base of %gs always points to fixed_percpu_data. If the
+        * stack protector canary is enabled, it is located at %gs:40.
+        * Note that, on SMP, the boot cpu uses init data section until
+        * the per cpu areas are set up.
+        */
+       movl    $MSR_GS_BASE,%ecx
+       movl    initial_gs(%rip),%eax
+       movl    initial_gs+4(%rip),%edx
+       wrmsr
+
        /* Check if nx is implemented */
        movl    $0x80000001, %eax
        cpuid
@@ -193,32 +219,6 @@ SYM_CODE_START(secondary_startup_64)
        pushq $0
        popfq
 
-       /* set up data segments */
-       xorl %eax,%eax
-       movl %eax,%ds
-       movl %eax,%ss
-       movl %eax,%es
-
-       /*
-        * We don't really need to load %fs or %gs, but load them anyway
-        * to kill any stale realmode selectors.  This allows execution
-        * under VT hardware.
-        */
-       movl %eax,%fs
-       movl %eax,%gs
-
-       /* Set up %gs.
-        *
-        * The base of %gs always points to fixed_percpu_data. If the
-        * stack protector canary is enabled, it is located at %gs:40.
-        * Note that, on SMP, the boot cpu uses init data section until
-        * the per cpu areas are set up.
-        */
-       movl    $MSR_GS_BASE,%ecx
-       movl    initial_gs(%rip),%eax
-       movl    initial_gs+4(%rip),%edx
-       wrmsr
-
        /* rsi is pointer to real mode structure with interesting info.
           pass it to C */
        movq    %rsi, %rdi