1
2
3
4#include <linux/linkage.h>
5#include <asm/segment.h>
6#include <asm/msr-index.h>
7#include <asm/page_types.h>
8#include <asm/pgtable_types.h>
9#include <asm/processor-flags.h>
10#include "realmode.h"
11#include "wakeup.h"
12
13 .code16
14
15
16 .section ".data", "aw"
17
18 .balign 16
19GLOBAL(wakeup_header)
20 video_mode: .short 0
21 pmode_entry: .long 0
22 pmode_cs: .short __KERNEL_CS
23 pmode_cr0: .long 0
24 pmode_cr3: .long 0
25 pmode_cr4: .long 0
26 pmode_efer: .quad 0
27 pmode_gdt: .quad 0
28 pmode_misc_en: .quad 0
29 pmode_behavior: .long 0
30 realmode_flags: .long 0
31 real_magic: .long 0
32 signature: .long WAKEUP_HEADER_SIGNATURE
33END(wakeup_header)
34
35 .text
36 .code16
37
38 .balign 16
39ENTRY(wakeup_start)
40 cli
41 cld
42
43 LJMPW_RM(3f)
443:
45
46
47
48
49 movw $16, %cx
50 lgdtl %cs:wakeup_gdt
51 movl %cr0, %eax
52 orb $X86_CR0_PE, %al
53 movl %eax, %cr0
54 ljmpw $8, $2f
552:
56 movw %cx, %ds
57 movw %cx, %es
58 movw %cx, %ss
59 movw %cx, %fs
60 movw %cx, %gs
61
62 andb $~X86_CR0_PE, %al
63 movl %eax, %cr0
64 LJMPW_RM(3f)
653:
66
67 movw %cs, %ax
68 movw %ax, %ss
69 movl $rm_stack_end, %esp
70 movw %ax, %ds
71 movw %ax, %es
72 movw %ax, %fs
73 movw %ax, %gs
74
75 lidtl wakeup_idt
76
77
78 pushl $0
79 popfl
80
81
82 movl signature, %eax
83 cmpl $WAKEUP_HEADER_SIGNATURE, %eax
84 jne bogus_real_magic
85
86
87 movl end_signature, %eax
88 cmpl $REALMODE_END_SIGNATURE, %eax
89 jne bogus_real_magic
90
91
92 calll main
93
94
95
96 movl pmode_behavior, %edi
97 btl $WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE, %edi
98 jnc 1f
99
100 movl pmode_misc_en, %eax
101 movl pmode_misc_en + 4, %edx
102 movl $MSR_IA32_MISC_ENABLE, %ecx
103 wrmsr
1041:
105
106
107
108#ifndef CONFIG_64BIT
109
110 movl pmode_cr3, %eax
111 movl %eax, %cr3
112
113 btl $WAKEUP_BEHAVIOR_RESTORE_CR4, %edi
114 jnc 1f
115 movl pmode_cr4, %eax
116 movl %eax, %cr4
1171:
118 btl $WAKEUP_BEHAVIOR_RESTORE_EFER, %edi
119 jnc 1f
120 movl pmode_efer, %eax
121 movl pmode_efer + 4, %edx
122 movl $MSR_EFER, %ecx
123 wrmsr
1241:
125
126 lgdtl pmode_gdt
127
128
129 movl pmode_entry, %eax
130 movl pmode_cr0, %ecx
131 movl %ecx, %cr0
132 ljmpl $__KERNEL_CS, $pa_startup_32
133
134#else
135 jmp trampoline_start
136#endif
137
138bogus_real_magic:
1391:
140 hlt
141 jmp 1b
142
143 .section ".rodata","a"
144
145
146
147
148
149
150
151
152
153 .balign 16
154GLOBAL(wakeup_gdt)
155 .word 3*8-1
156 .long pa_wakeup_gdt
157 .word 0
158
159 .word 0xffff
160 .long 0x9b000000 + pa_real_mode_base
161 .word 0x008f
162
163 .word 0xffff
164 .long 0x93000000 + pa_real_mode_base
165 .word 0x008f
166END(wakeup_gdt)
167
168 .section ".rodata","a"
169 .balign 8
170
171
172 .balign 16
173GLOBAL(wakeup_idt)
174 .word 0xffff
175 .long 0
176 .word 0
177END(wakeup_idt)
178