Commit | Line | Data |
---|---|---|
7052fdd8 PA |
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 | /* | |
7052fdd8 PA |
12 | * The actual transition into protected mode |
13 | */ | |
14 | ||
15 | #include <asm/boot.h> | |
02a7b425 | 16 | #include <asm/processor-flags.h> |
7052fdd8 | 17 | #include <asm/segment.h> |
324bda9e | 18 | #include <linux/linkage.h> |
7052fdd8 PA |
19 | |
20 | .text | |
7052fdd8 PA |
21 | .code16 |
22 | ||
23 | /* | |
24 | * void protected_mode_jump(u32 entrypoint, u32 bootparams); | |
25 | */ | |
324bda9e | 26 | GLOBAL(protected_mode_jump) |
7052fdd8 | 27 | movl %edx, %esi # Pointer to boot_params table |
c4d9ba6d PA |
28 | |
29 | xorl %ebx, %ebx | |
30 | movw %cs, %bx | |
31 | shll $4, %ebx | |
32 | addl %ebx, 2f | |
2ee2394b PA |
33 | jmp 1f # Short jump to serialize on 386/486 |
34 | 1: | |
7052fdd8 | 35 | |
7052fdd8 | 36 | movw $__BOOT_DS, %cx |
88089519 | 37 | movw $__BOOT_TSS, %di |
7052fdd8 PA |
38 | |
39 | movl %cr0, %edx | |
02a7b425 | 40 | orb $X86_CR0_PE, %dl # Protected mode |
7052fdd8 PA |
41 | movl %edx, %cr0 |
42 | ||
c4d9ba6d | 43 | # Transition to 32-bit mode |
7052fdd8 | 44 | .byte 0x66, 0xea # ljmpl opcode |
c4d9ba6d | 45 | 2: .long in_pm32 # offset |
7052fdd8 | 46 | .word __BOOT_CS # segment |
324bda9e | 47 | ENDPROC(protected_mode_jump) |
c4d9ba6d PA |
48 | |
49 | .code32 | |
be721696 | 50 | .section ".text32","ax" |
324bda9e | 51 | GLOBAL(in_pm32) |
c4d9ba6d PA |
52 | # Set up data segments for flat 32-bit mode |
53 | movl %ecx, %ds | |
54 | movl %ecx, %es | |
55 | movl %ecx, %fs | |
56 | movl %ecx, %gs | |
57 | movl %ecx, %ss | |
58 | # The 32-bit code sets up its own stack, but this way we do have | |
59 | # a valid stack if some debugging hack wants to use it. | |
60 | addl %ebx, %esp | |
61 | ||
88089519 PA |
62 | # Set up TR to make Intel VT happy |
63 | ltr %di | |
64 | ||
c4d9ba6d PA |
65 | # Clear registers to allow for future extensions to the |
66 | # 32-bit boot protocol | |
67 | xorl %ecx, %ecx | |
68 | xorl %edx, %edx | |
69 | xorl %ebx, %ebx | |
70 | xorl %ebp, %ebp | |
71 | xorl %edi, %edi | |
72 | ||
88089519 PA |
73 | # Set up LDTR to make Intel VT happy |
74 | lldt %cx | |
75 | ||
c4d9ba6d | 76 | jmpl *%eax # Jump to the 32-bit entrypoint |
324bda9e | 77 | ENDPROC(in_pm32) |