*/
        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
        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