diff options
Diffstat (limited to 'arch/x86/boot/pmjump.S')
-rw-r--r-- | arch/x86/boot/pmjump.S | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/arch/x86/boot/pmjump.S b/arch/x86/boot/pmjump.S index fa6bed1fac1..f5402d51f7c 100644 --- a/arch/x86/boot/pmjump.S +++ b/arch/x86/boot/pmjump.S | |||
@@ -15,6 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include <asm/boot.h> | 17 | #include <asm/boot.h> |
18 | #include <asm/processor-flags.h> | ||
18 | #include <asm/segment.h> | 19 | #include <asm/segment.h> |
19 | 20 | ||
20 | .text | 21 | .text |
@@ -29,28 +30,55 @@ | |||
29 | */ | 30 | */ |
30 | protected_mode_jump: | 31 | protected_mode_jump: |
31 | movl %edx, %esi # Pointer to boot_params table | 32 | movl %edx, %esi # Pointer to boot_params table |
32 | movl %eax, 2f # Patch ljmpl instruction | 33 | |
34 | xorl %ebx, %ebx | ||
35 | movw %cs, %bx | ||
36 | shll $4, %ebx | ||
37 | addl %ebx, 2f | ||
33 | 38 | ||
34 | movw $__BOOT_DS, %cx | 39 | movw $__BOOT_DS, %cx |
35 | xorl %ebx, %ebx # Per the 32-bit boot protocol | 40 | movw $__BOOT_TSS, %di |
36 | xorl %ebp, %ebp # Per the 32-bit boot protocol | ||
37 | xorl %edi, %edi # Per the 32-bit boot protocol | ||
38 | 41 | ||
39 | movl %cr0, %edx | 42 | movl %cr0, %edx |
40 | orb $1, %dl # Protected mode (PE) bit | 43 | orb $X86_CR0_PE, %dl # Protected mode |
41 | movl %edx, %cr0 | 44 | movl %edx, %cr0 |
42 | jmp 1f # Short jump to serialize on 386/486 | 45 | jmp 1f # Short jump to serialize on 386/486 |
43 | 1: | 46 | 1: |
44 | 47 | ||
45 | movw %cx, %ds | 48 | # Transition to 32-bit mode |
46 | movw %cx, %es | ||
47 | movw %cx, %fs | ||
48 | movw %cx, %gs | ||
49 | movw %cx, %ss | ||
50 | |||
51 | # Jump to the 32-bit entrypoint | ||
52 | .byte 0x66, 0xea # ljmpl opcode | 49 | .byte 0x66, 0xea # ljmpl opcode |
53 | 2: .long 0 # offset | 50 | 2: .long in_pm32 # offset |
54 | .word __BOOT_CS # segment | 51 | .word __BOOT_CS # segment |
55 | 52 | ||
56 | .size protected_mode_jump, .-protected_mode_jump | 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 | ||