Merge git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86
[sfrench/cifs-2.6.git] / arch / x86 / boot / pmjump.S
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright (C) 1991, 1992 Linus Torvalds
4  *   Copyright 2007 rPath, Inc. - All Rights Reserved
5  *
6  *   This file is part of the Linux kernel, and is made available under
7  *   the terms of the GNU General Public License version 2.
8  *
9  * ----------------------------------------------------------------------- */
10
11 /*
12  * arch/i386/boot/pmjump.S
13  *
14  * The actual transition into protected mode
15  */
16
17 #include <asm/boot.h>
18 #include <asm/processor-flags.h>
19 #include <asm/segment.h>
20
21         .text
22
23         .globl  protected_mode_jump
24         .type   protected_mode_jump, @function
25
26         .code16
27
28 /*
29  * void protected_mode_jump(u32 entrypoint, u32 bootparams);
30  */
31 protected_mode_jump:
32         movl    %edx, %esi              # Pointer to boot_params table
33
34         xorl    %ebx, %ebx
35         movw    %cs, %bx
36         shll    $4, %ebx
37         addl    %ebx, 2f
38
39         movw    $__BOOT_DS, %cx
40         movw    $__BOOT_TSS, %di
41
42         movl    %cr0, %edx
43         orb     $X86_CR0_PE, %dl        # Protected mode
44         movl    %edx, %cr0
45         jmp     1f                      # Short jump to serialize on 386/486
46 1:
47
48         # Transition to 32-bit mode
49         .byte   0x66, 0xea              # ljmpl opcode
50 2:      .long   in_pm32                 # offset
51         .word   __BOOT_CS               # segment
52
53         .size   protected_mode_jump, .-protected_mode_jump
54
55         .code32
56         .type   in_pm32, @function
57 in_pm32:
58         # Set up data segments for flat 32-bit mode
59         movl    %ecx, %ds
60         movl    %ecx, %es
61         movl    %ecx, %fs
62         movl    %ecx, %gs
63         movl    %ecx, %ss
64         # The 32-bit code sets up its own stack, but this way we do have
65         # a valid stack if some debugging hack wants to use it.
66         addl    %ebx, %esp
67
68         # Set up TR to make Intel VT happy
69         ltr     %di
70
71         # Clear registers to allow for future extensions to the
72         # 32-bit boot protocol
73         xorl    %ecx, %ecx
74         xorl    %edx, %edx
75         xorl    %ebx, %ebx
76         xorl    %ebp, %ebp
77         xorl    %edi, %edi
78
79         # Set up LDTR to make Intel VT happy
80         lldt    %cx
81
82         jmpl    *%eax                   # Jump to the 32-bit entrypoint
83
84         .size   in_pm32, .-in_pm32