]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/boot/pmjump.S
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux...
[linux-2.6-omap-h63xx.git] / arch / x86 / boot / pmjump.S
index 2e559233725a453845d03e19179e8620399f15ce..ab049d40a884d7ef44d32fb63e30c44ed6aedabf 100644 (file)
@@ -9,12 +9,11 @@
  * ----------------------------------------------------------------------- */
 
 /*
- * arch/i386/boot/pmjump.S
- *
  * The actual transition into protected mode
  */
 
 #include <asm/boot.h>
+#include <asm/processor-flags.h>
 #include <asm/segment.h>
 
        .text
  * void protected_mode_jump(u32 entrypoint, u32 bootparams);
  */
 protected_mode_jump:
-       xorl    %ebx, %ebx              # Flag to indicate this is a boot
        movl    %edx, %esi              # Pointer to boot_params table
-       movl    %eax, 2f                # Patch ljmpl instruction
-       jmp     1f                      # Short jump to flush instruction q.
 
-1:
+       xorl    %ebx, %ebx
+       movw    %cs, %bx
+       shll    $4, %ebx
+       addl    %ebx, 2f
+
        movw    $__BOOT_DS, %cx
+       movw    $__BOOT_TSS, %di
 
        movl    %cr0, %edx
-       orb     $1, %dl                 # Protected mode (PE) bit
+       orb     $X86_CR0_PE, %dl        # Protected mode
        movl    %edx, %cr0
+       jmp     1f                      # Short jump to serialize on 386/486
+1:
 
-       movw    %cx, %ds
-       movw    %cx, %es
-       movw    %cx, %fs
-       movw    %cx, %gs
-       movw    %cx, %ss
-
-       # Jump to the 32-bit entrypoint
+       # Transition to 32-bit mode
        .byte   0x66, 0xea              # ljmpl opcode
-2:     .long   0                       # offset
+2:     .long   in_pm32                 # offset
        .word   __BOOT_CS               # segment
 
        .size   protected_mode_jump, .-protected_mode_jump
+
+       .code32
+       .type   in_pm32, @function
+in_pm32:
+       # Set up data segments for flat 32-bit mode
+       movl    %ecx, %ds
+       movl    %ecx, %es
+       movl    %ecx, %fs
+       movl    %ecx, %gs
+       movl    %ecx, %ss
+       # The 32-bit code sets up its own stack, but this way we do have
+       # a valid stack if some debugging hack wants to use it.
+       addl    %ebx, %esp
+
+       # Set up TR to make Intel VT happy
+       ltr     %di
+
+       # Clear registers to allow for future extensions to the
+       # 32-bit boot protocol
+       xorl    %ecx, %ecx
+       xorl    %edx, %edx
+       xorl    %ebx, %ebx
+       xorl    %ebp, %ebp
+       xorl    %edi, %edi
+
+       # Set up LDTR to make Intel VT happy
+       lldt    %cx
+
+       jmpl    *%eax                   # Jump to the 32-bit entrypoint
+
+       .size   in_pm32, .-in_pm32