Annotation of /trunk/mkinitrd-magellan/isolinux/bootsect.inc
Parent Directory | Revision Log
Revision 1133 -
(hide annotations)
(download)
Thu Aug 19 09:50:43 2010 UTC (14 years, 1 month ago) by niro
File size: 5195 byte(s)
Thu Aug 19 09:50:43 2010 UTC (14 years, 1 month ago) by niro
File size: 5195 byte(s)
-updated to isolinux-3.86
1 | niro | 532 | ;; ----------------------------------------------------------------------- |
2 | ;; | ||
3 | niro | 1133 | ;; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved |
4 | ;; Copyright 2009 Intel Corporation; author: H. Peter Anvin | ||
5 | ;; | ||
6 | niro | 532 | ;; This program is free software; you can redistribute it and/or modify |
7 | ;; it under the terms of the GNU General Public License as published by | ||
8 | ;; the Free Software Foundation, Inc., 53 Temple Place Ste 330, | ||
9 | ;; Boston MA 02111-1307, USA; either version 2 of the License, or | ||
10 | ;; (at your option) any later version; incorporated herein by reference. | ||
11 | ;; | ||
12 | ;; ----------------------------------------------------------------------- | ||
13 | |||
14 | ;; | ||
15 | ;; bootsect.inc | ||
16 | niro | 1133 | ;; |
17 | niro | 532 | ;; Load a boot sector (or other bootstrap program.) |
18 | ;; | ||
19 | ;; Unlike previous versions of this software, this doesn't require that | ||
20 | ;; the length is 512 bytes. This allows PXE bootstraps and WinNT | ||
21 | ;; "CD boot sectors" to be invoked. | ||
22 | ;; | ||
23 | |||
24 | ; | ||
25 | ; Load a boot sector | ||
26 | ; | ||
27 | is_bootsector: | ||
28 | niro | 1133 | %if IS_SYSLINUX |
29 | niro | 532 | ; Transfer zero bytes |
30 | niro | 1133 | push word 0 |
31 | niro | 532 | jmp short load_bootsec |
32 | |||
33 | is_bss_sector: | ||
34 | ; Transfer the superblock | ||
35 | niro | 1133 | SuperSize equ $+1 |
36 | push word superblock_len_fat16 | ||
37 | niro | 532 | %endif |
38 | load_bootsec: | ||
39 | niro | 1133 | mov edi,100000h |
40 | niro | 532 | mov [trackbuf+4],edi ; Copy from this address |
41 | xor dx,dx ; No padding | ||
42 | niro | 1133 | mov bx,abort_check ; Don't print dots, but allow abort |
43 | niro | 532 | call load_high |
44 | |||
45 | sub edi,100000h | ||
46 | mov [trackbuf+8],edi ; Save length | ||
47 | |||
48 | mov eax,7C00h ; Entry point | ||
49 | mov [trackbuf],eax ; Copy to this address | ||
50 | |||
51 | niro | 1133 | %if IS_SYSLINUX |
52 | xor ecx,ecx | ||
53 | pop cx | ||
54 | niro | 532 | |
55 | ; For a BSS boot sector we have to patch. | ||
56 | mov esi,superblock | ||
57 | mov edi,100000h+(superblock-bootsec) | ||
58 | call bcopy | ||
59 | %endif | ||
60 | niro | 1133 | push eax ; Save entry point |
61 | niro | 532 | |
62 | xor edx,edx | ||
63 | xor esi,esi | ||
64 | niro | 1133 | %if IS_SYSLINUX || IS_EXTLINUX |
65 | niro | 532 | ; Restore original FDC table |
66 | mov eax,[OrigFDCTabPtr] | ||
67 | mov [fdctab],eax | ||
68 | |||
69 | mov dl,[DriveNumber] | ||
70 | mov si,PartInfo ; Partition info buffer | ||
71 | mov di,800h-18 ; Put partition info here | ||
72 | push di | ||
73 | mov cx,8 ; 16 bytes | ||
74 | xor ax,ax | ||
75 | rep movsw | ||
76 | pop si ; DS:SI points to partition info | ||
77 | niro | 1133 | xor bx,bx |
78 | niro | 532 | %elif IS_ISOLINUX |
79 | niro | 1133 | mov dl,[DriveNumber] |
80 | xor bx,bx | ||
81 | niro | 532 | %elif IS_PXELINUX |
82 | niro | 1133 | mov byte [KeepPXE],03h ; Chainloading + keep PXE |
83 | niro | 532 | call reset_pxe |
84 | niro | 1133 | lfs si,[InitStack] |
85 | ; Put restore DS, EDX and ESI to the true initial values | ||
86 | mov bx,[fs:si+6] | ||
87 | mov edx,[fs:si+28] | ||
88 | mov esi,[fs:si+12] | ||
89 | niro | 532 | %endif |
90 | |||
91 | ; | ||
92 | ; replace_bootstrap for the special case where we have exactly one | ||
93 | niro | 1133 | ; descriptor, based in low memory. We will generate a second descriptor |
94 | ; to clear remaining FBM. | ||
95 | niro | 532 | ; |
96 | |||
97 | replace_bootstrap_one: | ||
98 | niro | 1133 | mov eax,[trackbuf] ; Base address |
99 | add eax,[trackbuf+8] ; Length | ||
100 | movzx ecx,word [BIOS_fbm] | ||
101 | shl ecx,10 ; Free Base Memory | ||
102 | sub ecx,eax | ||
103 | mov [trackbuf+12],eax | ||
104 | or dword [trackbuf+16],-1 ; Zero memory | ||
105 | mov [trackbuf+20],ecx | ||
106 | push word 2 ; Length of descriptor list | ||
107 | niro | 532 | ; Fall through |
108 | |||
109 | niro | 1133 | ; |
110 | niro | 532 | ; Entrypoint for "shut down and replace bootstrap" -- also invoked by |
111 | niro | 1133 | ; the COMBOOT API. This routine expects the entry point (CS, IP) and the |
112 | ; count of the descriptor sequence on the stack; the shuffle | ||
113 | ; descriptors start at the first byte of the trackbuf. | ||
114 | ; | ||
115 | ; The registers EDX and ESI are passed on to the called program, | ||
116 | ; and BX is passed on as DS. | ||
117 | ; | ||
118 | niro | 532 | replace_bootstrap: |
119 | ; | ||
120 | ; Prepare for shutting down | ||
121 | ; | ||
122 | call vgaclearmode | ||
123 | |||
124 | niro | 1133 | ; |
125 | ; We jump here when loading a kernel image, so that we don't reset | ||
126 | ; the screen mode in "quiet" mode | ||
127 | ; | ||
128 | replace_bootstrap_noclearmode: | ||
129 | call cleanup_hardware | ||
130 | |||
131 | niro | 532 | ; |
132 | ; Set up initial stack frame (not used by PXE if keeppxe is | ||
133 | ; set - we use the PXE stack then.) | ||
134 | ; | ||
135 | xor ax,ax | ||
136 | mov ds,ax | ||
137 | niro | 1133 | mov es,ax |
138 | niro | 532 | |
139 | %if IS_PXELINUX | ||
140 | niro | 1133 | cmp byte [KeepPXE],0 |
141 | je .stdstack | ||
142 | niro | 532 | les di,[InitStack] ; Reset stack to PXE original |
143 | jmp .stackok | ||
144 | %endif | ||
145 | .stdstack: | ||
146 | mov di,7C00h-44 | ||
147 | push di | ||
148 | mov cx,22 ; 44 bytes | ||
149 | rep stosw | ||
150 | pop di | ||
151 | .stackok: | ||
152 | |||
153 | niro | 1133 | mov [es:di+28],edx ; New EDX |
154 | mov [es:di+12],esi ; New ESI | ||
155 | mov [es:di+6],bx ; New DS | ||
156 | niro | 532 | |
157 | niro | 1133 | %if IS_PXELINUX == 0 |
158 | ; DON'T DO THIS FOR PXELINUX... | ||
159 | ; For PXE, ES:BX -> PXENV+, and this would corrupt | ||
160 | ; that use. | ||
161 | niro | 532 | |
162 | niro | 1133 | ; Restore ES:DI -> $PnP (if we were ourselves called |
163 | ; that way...) | ||
164 | mov ax,[OrigESDI] | ||
165 | mov bx,[OrigESDI+2] | ||
166 | |||
167 | mov [es:di+8],ax ; New DI | ||
168 | mov [es:di+4],bx ; New ES | ||
169 | %endif | ||
170 | pop ax ; List length | ||
171 | |||
172 | push di | ||
173 | push es | ||
174 | |||
175 | push ds | ||
176 | pop es | ||
177 | |||
178 | mov ebx,trackbuf | ||
179 | imul di,ax,12 | ||
180 | add di,bx ; DI <- end of list | ||
181 | push di | ||
182 | |||
183 | ; Terminating entry... | ||
184 | lea eax,[replace_stub] ; Entrypoint | ||
185 | push ax | ||
186 | stosd | ||
187 | xor ax,ax ; EAX[31:16] == 0 already | ||
188 | stosd ; 16-bit mode | ||
189 | stosd ; End of list | ||
190 | |||
191 | ; Copy the stub | ||
192 | pop di | ||
193 | mov si,__replacestub_lma | ||
194 | mov cx,__replacestub_dwords | ||
195 | rep movsd | ||
196 | |||
197 | xor ecx,ecx | ||
198 | pop cx ; ECX <- length of list | ||
199 | |||
200 | pop word [replace_stub.ss] | ||
201 | pop word [replace_stub.esp] | ||
202 | pop dword [replace_stub.csip] | ||
203 | |||
204 | niro | 532 | cli |
205 | niro | 1133 | mov ss,[replace_stub.ss] |
206 | mov esp,[replace_stub.esp] | ||
207 | niro | 532 | |
208 | niro | 1133 | mov edi,trackbuf |
209 | mov esi,edi | ||
210 | niro | 532 | |
211 | niro | 1133 | jmp shuffle_and_boot_raw |
212 | |||
213 | ; This stub gets run after the shuffle. It is copied | ||
214 | ; below 0x7c00 in order to properly handle the case | ||
215 | ; of bootstrap replacement. | ||
216 | section .replacestub | ||
217 | replace_stub: | ||
218 | mov cr0,eax | ||
219 | jmp 0:.next | ||
220 | .next: | ||
221 | mov ax,strict word 0 | ||
222 | .ss equ $-2 | ||
223 | mov ss,ax | ||
224 | mov esp,strict dword 0 | ||
225 | .esp equ $-4 | ||
226 | pop gs | ||
227 | pop fs | ||
228 | pop es | ||
229 | pop ds | ||
230 | popad | ||
231 | popfd | ||
232 | jmp 0:0 | ||
233 | .csip equ $-4 | ||
234 | |||
235 | section .text |