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