Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
[sfrench/cifs-2.6.git] / arch / i386 / 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/segment.h>
19
20         .text
21
22         .globl  protected_mode_jump
23         .type   protected_mode_jump, @function
24
25         .code16
26
27 /*
28  * void protected_mode_jump(u32 entrypoint, u32 bootparams);
29  */
30 protected_mode_jump:
31         xorl    %ebx, %ebx              # Flag to indicate this is a boot
32         movl    %edx, %esi              # Pointer to boot_params table
33         movl    %eax, 2f                # Patch ljmpl instruction
34         jmp     1f                      # Short jump to flush instruction q.
35
36 1:
37         movw    $__BOOT_DS, %cx
38
39         movl    %cr0, %edx
40         orb     $1, %dl                 # Protected mode (PE) bit
41         movl    %edx, %cr0
42
43         movw    %cx, %ds
44         movw    %cx, %es
45         movw    %cx, %fs
46         movw    %cx, %gs
47         movw    %cx, %ss
48
49         # Jump to the 32-bit entrypoint
50         .byte   0x66, 0xea              # ljmpl opcode
51 2:      .long   0                       # offset
52         .word   __BOOT_CS               # segment
53
54         .size   protected_mode_jump, .-protected_mode_jump