1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 .text
26
27 #include <linux/init.h>
28 #include <linux/linkage.h>
29 #include <asm/segment.h>
30 #include <asm/page_types.h>
31 #include <asm/boot.h>
32 #include <asm/asm-offsets.h>
33 #include <asm/bootparam.h>
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 .hidden _bss
59 .hidden _ebss
60 .hidden _got
61 .hidden _egot
62
63 __HEAD
64 ENTRY(startup_32)
65 cld
66
67
68
69
70 testb $KEEP_SEGMENTS, BP_loadflags(%esi)
71 jnz 1f
72
73 cli
74 movl $__BOOT_DS, %eax
75 movl %eax, %ds
76 movl %eax, %es
77 movl %eax, %fs
78 movl %eax, %gs
79 movl %eax, %ss
80 1:
81
82
83
84
85
86
87
88
89
90 leal (BP_scratch+4)(%esi), %esp
91 call 1f
92 1: popl %ebp
93 subl $1b, %ebp
94
95
96
97
98
99
100
101 #ifdef CONFIG_RELOCATABLE
102 movl %ebp, %ebx
103 movl BP_kernel_alignment(%esi), %eax
104 decl %eax
105 addl %eax, %ebx
106 notl %eax
107 andl %eax, %ebx
108 cmpl $LOAD_PHYSICAL_ADDR, %ebx
109 jae 1f
110 #endif
111 movl $LOAD_PHYSICAL_ADDR, %ebx
112 1:
113
114
115 movl BP_init_size(%esi), %eax
116 subl $_end, %eax
117 addl %eax, %ebx
118
119
120 leal boot_stack_end(%ebx), %esp
121
122
123 pushl $0
124 popfl
125
126
127
128
129
130 pushl %esi
131 leal (_bss-4)(%ebp), %esi
132 leal (_bss-4)(%ebx), %edi
133 movl $(_bss - startup_32), %ecx
134 shrl $2, %ecx
135 std
136 rep movsl
137 cld
138 popl %esi
139
140
141
142
143 leal .Lrelocated(%ebx), %eax
144 jmp *%eax
145 ENDPROC(startup_32)
146
147 #ifdef CONFIG_EFI_STUB
148
149
150
151
152 ENTRY(efi_pe_entry)
153 add $0x4, %esp
154
155 call 1f
156 1: popl %esi
157 subl $1b, %esi
158
159 popl %ecx
160 movl %ecx, efi32_config(%esi)
161 popl %ecx
162 movl %ecx, efi32_config+8(%esi)
163
164
165 leal efi32_config(%esi), %eax
166 add %esi, 40(%eax)
167 pushl %eax
168
169 call make_boot_params
170 cmpl $0, %eax
171 je fail
172 movl %esi, BP_code32_start(%eax)
173 popl %ecx
174 pushl %eax
175 pushl %ecx
176 jmp 2f
177 ENDPROC(efi_pe_entry)
178
179 ENTRY(efi32_stub_entry)
180 add $0x4, %esp
181 popl %ecx
182 popl %edx
183
184 call 1f
185 1: popl %esi
186 subl $1b, %esi
187
188 movl %ecx, efi32_config(%esi)
189 movl %edx, efi32_config+8(%esi)
190
191
192 leal efi32_config(%esi), %eax
193 add %esi, 40(%eax)
194 pushl %eax
195 2:
196 call efi_main
197 cmpl $0, %eax
198 movl %eax, %esi
199 jne 2f
200 fail:
201
202 hlt
203 jmp fail
204 2:
205 movl BP_code32_start(%esi), %eax
206 leal startup_32(%eax), %eax
207 jmp *%eax
208 ENDPROC(efi32_stub_entry)
209 #endif
210
211 .text
212 .Lrelocated:
213
214
215
216
217 xorl %eax, %eax
218 leal _bss(%ebx), %edi
219 leal _ebss(%ebx), %ecx
220 subl %edi, %ecx
221 shrl $2, %ecx
222 rep stosl
223
224
225
226
227 leal _got(%ebx), %edx
228 leal _egot(%ebx), %ecx
229 1:
230 cmpl %ecx, %edx
231 jae 2f
232 addl %ebx, (%edx)
233 addl $4, %edx
234 jmp 1b
235 2:
236
237
238
239
240
241 pushl $z_output_len
242
243 movl BP_init_size(%esi), %eax
244 subl $_end, %eax
245 movl %ebx, %ebp
246 subl %eax, %ebp
247 pushl %ebp
248
249 pushl $z_input_len
250 leal input_data(%ebx), %eax
251 pushl %eax
252 leal boot_heap(%ebx), %eax
253 pushl %eax
254 pushl %esi
255 call extract_kernel
256 addl $24, %esp
257
258
259
260
261 xorl %ebx, %ebx
262 jmp *%eax
263
264 #ifdef CONFIG_EFI_STUB
265 .data
266 efi32_config:
267 .fill 5,8,0
268 .long efi_call_phys
269 .long 0
270 .byte 0
271 #endif
272
273
274
275
276 .bss
277 .balign 4
278 boot_heap:
279 .fill BOOT_HEAP_SIZE, 1, 0
280 boot_stack:
281 .fill BOOT_STACK_SIZE, 1, 0
282 boot_stack_end: