rev |
line source |
pascal@13691
|
1 .text
|
pascal@13691
|
2 .code16
|
pascal@19828
|
3 .arch i8086
|
pascal@13691
|
4 .org 0
|
pascal@13691
|
5
|
pascal@13691
|
6 CODESZ = 0x8000 // 16 sectors = 32Kb
|
pascal@13972
|
7 #define EXEADRS(x) x+0xC0
|
pascal@14261
|
8 #define EXELOC(x) x-0x40
|
pascal@14261
|
9 #define EXESTR(x) x-0x7F40
|
pascal@13691
|
10
|
pascal@13691
|
11 .globl _start
|
pascal@13691
|
12 _start:
|
pascal@13691
|
13 decw %bp // Magic number: MZ
|
pascal@13691
|
14 popw %dx
|
pascal@13972
|
15 jmp start0 // Bytes on last page of file
|
pascal@13691
|
16 .word (CODESZ+511)/512 // Pages in file
|
pascal@13691
|
17 .word 0 // Relocations
|
pascal@13691
|
18 .word (end_header-_start)/16 // Size of header in paragraphs
|
pascal@13691
|
19 .word 4064-(CODESZ/16) // Minimum extra paragraphs needed
|
pascal@13691
|
20 .word 4064-(CODESZ/16) // Maximum extra paragraphs needed
|
pascal@13691
|
21 .word 0xFFF0 // Initial (relative) SS value
|
pascal@13691
|
22 .word 0xFFFE // Initial SP value
|
pascal@19872
|
23 magic:
|
pascal@13691
|
24 .word 0 // Checksum
|
pascal@13729
|
25 .word EXEADRS(exestart) // Initial IP value
|
pascal@13691
|
26 .word 0xFFF0 // Initial (relative) CS value
|
pascal@13972
|
27 initramfssize:
|
pascal@13972
|
28 .word 0 // File address of relocation table
|
pascal@17810
|
29 fdcnt: // Overlay number
|
pascal@14257
|
30 .byte 0 // Bootstrap floppy sector count
|
pascal@17810
|
31 .ascii "slitaz"
|
pascal@13691
|
32
|
pascal@13691
|
33 /////////////////////// Master Boot Record code //////////////////////////////
|
pascal@13691
|
34
|
pascal@17810
|
35 moved = 0x8000
|
pascal@17496
|
36 start0:
|
pascal@19827
|
37 //pushw %dx // restore %sp
|
pascal@19827
|
38 //incw %bp // restore %bp
|
pascal@23867
|
39 movw %ds, %ax
|
pascal@17496
|
40 xorw %bx, %bx
|
pascal@17496
|
41 movw %bx, %ds
|
pascal@17496
|
42 movb $0x7C, %bh
|
pascal@19827
|
43 pushw %ds
|
pascal@19827
|
44 popw %ss
|
pascal@19827
|
45 movw %bx, %sp
|
pascal@17496
|
46 pushw %bx // return address
|
pascal@19827
|
47 pushw %di
|
pascal@17496
|
48 pushw %es // save %es:%di
|
pascal@23867
|
49 pushw %si
|
pascal@13972
|
50 cld
|
pascal@13691
|
51 call setreg
|
pascal@13691
|
52 rep
|
pascal@19827
|
53 movsw
|
pascal@13972
|
54 movw $0x80, %dx
|
pascal@17810
|
55 ljmp $0, $moved+start2
|
pascal@17810
|
56 .byte 0
|
pascal@17810
|
57 // .org 60
|
pascal@17810
|
58 // .long 0x0080 // PE header offset
|
pascal@17810
|
59 .org 64
|
pascal@13972
|
60 end_header:
|
pascal@13972
|
61 comstart:
|
pascal@13972
|
62 .word 0
|
pascal@13691
|
63
|
pascal@17810
|
64 .org 66
|
pascal@23867
|
65 start2:
|
pascal@23867
|
66 pushw %ax // original %ds
|
pascal@23867
|
67 sti
|
pascal@17810
|
68 dxloop:
|
pascal@17810
|
69 call readsector1 // look for the boot device
|
pascal@17810
|
70 repe
|
pascal@17810
|
71 cmpsw
|
pascal@17810
|
72 je dxfound
|
pascal@17810
|
73 movb $0, %cl // ch = 0
|
pascal@17810
|
74 addb $0x7D, %dl // try every hard disk
|
pascal@17810
|
75 jno dxloop
|
pascal@17810
|
76
|
pascal@17810
|
77 dxfound:
|
pascal@17810
|
78 call readsectorX // read isolinux boot sector
|
pascal@17810
|
79 cmpw (%bx), %cx
|
pascal@23867
|
80 movw $moved+nobsmsg, %si
|
pascal@17810
|
81 jnc puts // read fail or no isohydrid boot sector
|
pascal@23863
|
82 call bootpartition // assume DS=SS SI=BX=7C00 CX=0100 DL=<drive> DI=table+66
|
pascal@23867
|
83 popw %ds
|
pascal@23867
|
84 popw %si
|
pascal@17810
|
85 popw %es
|
pascal@19827
|
86 popw %di // isolinux boot needs %es:%di and %dx
|
pascal@17810
|
87 putsret:
|
pascal@17810
|
88 ret
|
pascal@17810
|
89
|
pascal@17810
|
90 putstrlp:
|
pascal@17810
|
91 movw $7, %bx
|
pascal@17810
|
92 movb $0xE, %ah
|
pascal@17810
|
93 int $0x10
|
pascal@23867
|
94 puts:
|
pascal@17810
|
95 lodsb
|
pascal@23867
|
96 cmp $0, %al
|
pascal@23867
|
97 jnz putstrlp
|
pascal@17810
|
98 halt:
|
pascal@17810
|
99 hlt
|
pascal@17810
|
100 jmp halt
|
pascal@17810
|
101 nobsmsg:
|
pascal@17810
|
102 .asciz "No isolinux."
|
pascal@17810
|
103
|
pascal@23863
|
104 .org 0x0080,0xEE
|
pascal@17810
|
105 ////////////////////////////// EXE/PE header //////////////////////////////////
|
pascal@23863
|
106 .org 0x0178,0xFF
|
pascal@23863
|
107 ////////////////////////// partition boot code ////////////////////////////////
|
pascal@23863
|
108 // assume DS=SS SI=BX=7C00 CX=0100 DL=<drive> DI=table+66
|
pascal@17810
|
109
|
pascal@23863
|
110 bootpartition:
|
pascal@23863
|
111 movw $4,%cx
|
pascal@23863
|
112 movw $16,%ax
|
pascal@23863
|
113 next:
|
pascal@23863
|
114 subw %ax,%di
|
pascal@23863
|
115 cmpb %ch,-2(%di) // boot flag ?
|
pascal@23863
|
116 loope next
|
pascal@23863
|
117 cmpw $63,2-2(%di) // empty or isolinux partition ?
|
pascal@23863
|
118 jbe default
|
pascal@23863
|
119 .arch i486
|
pascal@23863
|
120 pushl $0
|
pascal@23863
|
121 pushl 8-2(%di)
|
pascal@23863
|
122 pushw %cs
|
pascal@23863
|
123 pushw %bx
|
pascal@23863
|
124 pushw $1
|
pascal@23863
|
125 pushw %ax
|
pascal@23863
|
126 movw %sp,%si // assume %ds = %ss
|
pascal@23863
|
127 movb $0x42,%ah
|
pascal@23863
|
128 int $0x13
|
pascal@23863
|
129 add $16,%sp
|
pascal@23863
|
130 .arch i8086
|
pascal@23863
|
131 default:
|
pascal@23863
|
132 ret
|
pascal@23863
|
133
|
pascal@23863
|
134 .org 0x01A0,0xFF
|
pascal@17496
|
135 readsectorX: // read isolinux boot sector
|
pascal@23867
|
136 movb $3, %cl // isolinux/512
|
pascal@13699
|
137 readsector1:
|
pascal@17496
|
138 andb $0x83, %dl // disk and floppy disk
|
pascal@13699
|
139 movw %cx, (%bx)
|
pascal@13699
|
140 incw %cx
|
pascal@13699
|
141 movw $0x201, %ax
|
pascal@13699
|
142 int $0x13
|
pascal@13691
|
143 setreg:
|
pascal@23867
|
144 pushw %ds
|
pascal@23867
|
145 popw %es
|
pascal@13699
|
146 movw %bx, %si
|
pascal@17810
|
147 movw $moved, %di
|
pascal@13691
|
148 movw $0x0100, %cx
|
pascal@13691
|
149 ret
|
pascal@23863
|
150 .org 0x01B8,0xEE // partition table
|
pascal@14267
|
151
|
pascal@23863
|
152 .org 0x0270,0xFF
|
pascal@19827
|
153
|
pascal@13691
|
154 ////////////////////////////// DOS EXE code ///////////////////////////////////
|
pascal@13691
|
155
|
pascal@23863
|
156 cmdline:
|
pascal@23996
|
157 .ds.b 128,0
|
pascal@23996
|
158 linldofs: // offset of linld.com in iso
|
pascal@23996
|
159 .long 0 // Updated by iso2exe
|
pascal@23996
|
160 linldsz: // size-1
|
pascal@23996
|
161 .word 0 // Updated by iso2exe
|
pascal@13729
|
162 exestart:
|
pascal@23863
|
163 movb $0x30,%ah // get DOS version
|
pascal@23863
|
164 int $0x21
|
pascal@23863
|
165 cmpb $3,%al
|
pascal@23996
|
166 jc abort
|
pascal@23996
|
167
|
pascal@23996
|
168 // load linld.com
|
pascal@13691
|
169
|
pascal@23863
|
170 cld
|
pascal@23996
|
171 linldbuf = 0x8000
|
pascal@23996
|
172 isopath = 0x7000
|
pascal@23996
|
173 movw $0x8000,%cx // clear 8000-FFFF
|
pascal@23996
|
174 movw %cx,%di
|
pascal@23996
|
175 movb %cl,%al
|
pascal@23863
|
176 rep
|
pascal@23996
|
177 stosb
|
pascal@23863
|
178
|
pascal@23996
|
179 movw %di,%ax
|
pascal@21791
|
180 movw 0x2C(%di),%es
|
pascal@23863
|
181 decw %cx
|
pascal@21791
|
182 scalp:
|
pascal@21791
|
183 repne
|
pascal@21791
|
184 scasb
|
pascal@21791
|
185 scasb
|
pascal@21791
|
186 jne scalp
|
pascal@23996
|
187 scasw // %es:%di = programme pathname
|
pascal@23863
|
188 pushw %es
|
pascal@23996
|
189 pushw %cs
|
pascal@23863
|
190 popw %es
|
pascal@23863
|
191 popw %ds
|
pascal@23996
|
192 #define CONONICALIZE_FILENAME insert obsolute path
|
pascal@23996
|
193 #ifdef CONONICALIZE_FILENAME
|
pascal@23996
|
194 movw %di,%si // %ds:%si = programme pathname
|
pascal@23996
|
195 movw $EXEADRS(isopath),%di // to filename %es:%di
|
pascal@23863
|
196 movb $0x60,%ah // canonicalize filename
|
pascal@23863
|
197 int $0x21
|
pascal@23863
|
198 pushw %es
|
pascal@23863
|
199 popw %ds
|
pascal@23996
|
200 #endif
|
pascal@23996
|
201 movw %di,%si // %ds:%si = programme pathname
|
pascal@23863
|
202 #define LONG_FILENAME
|
pascal@23863
|
203 #ifdef LONG_FILENAME
|
pascal@23863
|
204 pushw %si
|
pascal@23863
|
205 movw $0x716C,%ax
|
pascal@23863
|
206 xorw %bx,%bx // R/O
|
pascal@23863
|
207 xorw %cx,%cx // attributes
|
pascal@23863
|
208 cwd // action = open
|
pascal@23863
|
209 stc
|
pascal@23863
|
210 int $0x21
|
pascal@23863
|
211 jnc opened
|
pascal@23996
|
212 popw %dx
|
pascal@23996
|
213 #else
|
pascal@23996
|
214 movw %si,%dx
|
pascal@23863
|
215 #endif
|
pascal@23996
|
216 pushw %si
|
pascal@23863
|
217 movw $0x3D00,%ax
|
pascal@23863
|
218 // movb $0,%cl
|
pascal@23863
|
219 int $0x21
|
pascal@23996
|
220 jc popNabort
|
pascal@23863
|
221 opened:
|
pascal@23996
|
222 xchgw %ax,%bx // fd = %bx
|
pascal@23996
|
223 movw $32,%cx
|
pascal@23996
|
224 movw $EXEADRS(headbuf),%dx
|
pascal@23996
|
225 movb $0x3F,%ah
|
pascal@23996
|
226 int $0x21 // read(%bx,%dx,%cx)
|
pascal@23996
|
227 jc popNabort
|
pascal@23996
|
228 les EXEADRS(linldofs),%dx
|
pascal@23996
|
229 movw %es,%cx
|
pascal@23996
|
230 movw $0x4200,%ax // lseek(%bx,%cx:%dx,SEEK_SET)
|
pascal@23996
|
231 int $0x21
|
pascal@23996
|
232 jc popNabort
|
pascal@23996
|
233 movw EXEADRS(linldsz),%cx
|
pascal@23996
|
234 jcxz popNabort
|
pascal@23996
|
235 movw $EXEADRS(linldbuf),%dx
|
pascal@23996
|
236 movw %cx,%di
|
pascal@23996
|
237 addw %dx,%di
|
pascal@23996
|
238 movb $0x3F,%ah
|
pascal@23996
|
239 int $0x21 // read(%bx,%dx,%cx)
|
pascal@23996
|
240 jnc copycmdline
|
pascal@23996
|
241 popNabort:
|
pascal@23996
|
242 popw %si
|
pascal@23863
|
243 abort:
|
pascal@23863
|
244 movw $EXEADRS(stopmsg),%dx
|
pascal@23863
|
245 movb $9,%ah
|
pascal@23863
|
246 int $0x21
|
pascal@23863
|
247 int $0x20
|
pascal@23996
|
248
|
pascal@23996
|
249 // installed args (ex: image=/boot/bzImage initrd=rootfs4.gz,! autologin rdinit=/init.exe)
|
pascal@23996
|
250
|
pascal@23996
|
251 copycmdline:
|
pascal@23996
|
252 pushw %ds
|
pascal@23996
|
253 popw %es
|
pascal@23996
|
254 movw $EXEADRS(cmdline),%si
|
pascal@23996
|
255 movw %di,%bx
|
pascal@23996
|
256
|
pascal@23996
|
257 copylp:
|
pascal@23996
|
258 lodsb
|
pascal@23863
|
259 stosb
|
pascal@23996
|
260 orb %al,%al
|
pascal@23996
|
261 jnz copylp
|
pascal@23996
|
262
|
pascal@23996
|
263 // magic=<magic> arg
|
pascal@23996
|
264
|
pascal@23996
|
265 decw %di
|
pascal@23996
|
266 movw $7,%cx
|
pascal@23996
|
267 movw $EXEADRS(magicstr),%si
|
pascal@23863
|
268 rep
|
pascal@23863
|
269 movsb
|
pascal@23996
|
270 movw EXEADRS(headbuf+18),%ax // magic
|
pascal@23996
|
271 movw $10,%si
|
pascal@23996
|
272 magiclp1:
|
pascal@23996
|
273 xorw %dx,%dx
|
pascal@23996
|
274 divw %si
|
pascal@23996
|
275 pushw %dx
|
pascal@23996
|
276 incw %cx
|
pascal@23996
|
277 orw %ax,%ax
|
pascal@23996
|
278 jnz magiclp1
|
pascal@23996
|
279 magiclp2:
|
pascal@23996
|
280 popw %ax
|
pascal@23996
|
281 addb $'0',%al
|
pascal@23996
|
282 stosb // store magic
|
pascal@23996
|
283 loop magiclp2
|
pascal@23863
|
284
|
pascal@23996
|
285 // iso=<file> arg
|
pascal@23996
|
286
|
pascal@23996
|
287 movb $5,%cl
|
pascal@23996
|
288 movw $EXEADRS(isostr),%si
|
pascal@23996
|
289 rep
|
pascal@23996
|
290 movsb
|
pascal@23996
|
291 popw %si
|
pascal@23996
|
292 isolp:
|
pascal@23863
|
293 lodsb
|
pascal@23863
|
294 stosb
|
pascal@23996
|
295 orb %al,%al
|
pascal@23996
|
296 jne isolp
|
pascal@23996
|
297 decw %di
|
pascal@23996
|
298
|
pascal@23996
|
299 // append user args
|
pascal@23996
|
300
|
pascal@23996
|
301 movw $0x80,%si
|
pascal@23996
|
302 lodsb
|
pascal@23996
|
303 movb $0xFF,-1(%si) // long cmdline flag
|
pascal@23996
|
304 cbw
|
pascal@23996
|
305 xchgw %ax,%cx
|
pascal@23996
|
306 rep
|
pascal@23996
|
307 movsb
|
pascal@23996
|
308 movb $0,(%di)
|
pascal@23996
|
309
|
pascal@23996
|
310 // set cmdline size
|
pascal@23996
|
311
|
pascal@23996
|
312 movw %di,%ax
|
pascal@23996
|
313 subw %bx,%ax
|
pascal@23996
|
314 incw %ax
|
pascal@23996
|
315 movb %al,-1(%bx)
|
pascal@23996
|
316
|
pascal@23996
|
317 // run linld.com
|
pascal@23996
|
318
|
pascal@23996
|
319 movw $EXEADRS(mvNjump),%si
|
pascal@23996
|
320 incw %di
|
pascal@23996
|
321 movb $endmvNjump-mvNjump,%cl
|
pascal@23996
|
322 mvNjump:
|
pascal@23996
|
323 pushw %di
|
pascal@23996
|
324 rep
|
pascal@23996
|
325 movsb
|
pascal@23996
|
326 movw $EXEADRS(linldbuf),%si
|
pascal@23996
|
327 movw $0x0100,%di
|
pascal@23996
|
328 popw %cx
|
pascal@23996
|
329 pushw %cx
|
pascal@23996
|
330 subw %si,%cx
|
pascal@23996
|
331 ret
|
pascal@23996
|
332 endmvNjump:
|
pascal@23996
|
333
|
pascal@23996
|
334 magicstr: .ascii " magic="
|
pascal@23996
|
335 isostr: .ascii " iso="
|
pascal@23996
|
336
|
pascal@23863
|
337 .org 0x0400,0xEE
|
pascal@23996
|
338 headbuf:
|
pascal@23863
|
339 .org 0x0600,0xFF
|
pascal@23867
|
340 isolinux:
|
pascal@23875
|
341
|
pascal@23867
|
342 .arch i486
|
pascal@23875
|
343 #define PARTITION_SUPPORT
|
pascal@23867
|
344 /* -----------------------------------------------------------------------
|
pascal@23867
|
345 *
|
pascal@23867
|
346 * Copyright 2007-2009 H. Peter Anvin - All Rights Reserved
|
pascal@23867
|
347 * Copyright 2009 Intel Corporation; author: H. Peter Anvin
|
pascal@23867
|
348 *
|
pascal@23867
|
349 * Permission is hereby granted, free of charge, to any person
|
pascal@23867
|
350 * obtaining a copy of this software and associated documentation
|
pascal@23867
|
351 * files (the "Software"), to deal in the Software without
|
pascal@23867
|
352 * restriction, including without limitation the rights to use,
|
pascal@23867
|
353 * copy, modify, merge, publish, distribute, sublicense, and/or
|
pascal@23867
|
354 * sell copies of the Software, and to permit persons to whom
|
pascal@23867
|
355 * the Software is furnished to do so, subject to the following
|
pascal@23867
|
356 * conditions:
|
pascal@23867
|
357 *
|
pascal@23867
|
358 * The above copyright notice and this permission notice shall
|
pascal@23867
|
359 * be included in all copies or substantial portions of the Software.
|
pascal@23867
|
360 *
|
pascal@23867
|
361 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
pascal@23867
|
362 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
pascal@23867
|
363 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
pascal@23867
|
364 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
pascal@23867
|
365 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
pascal@23867
|
366 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
pascal@23867
|
367 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
pascal@23867
|
368 * OTHER DEALINGS IN THE SOFTWARE.
|
pascal@23867
|
369 *
|
pascal@23867
|
370 * ----------------------------------------------------------------------- */
|
pascal@23867
|
371
|
pascal@23867
|
372 HYBRID_MAGIC = 0x7078c0fb
|
pascal@23867
|
373 isolinux_start_hybrid = 0x7c00+64+4
|
pascal@23867
|
374
|
pascal@23875
|
375 isolinux_hybrid_signature = 64
|
pascal@23875
|
376
|
pascal@23867
|
377 stack = 0x7c00
|
pascal@23867
|
378 ebios_flag = (stack-20)
|
pascal@23867
|
379
|
pascal@23867
|
380 BIOS_page = 0x462
|
pascal@23867
|
381
|
pascal@23867
|
382 _start2:
|
pascal@23867
|
383 .byte 0x33, 0xed /* xorw %bp, %bp */
|
pascal@23867
|
384
|
pascal@23867
|
385 /* Check to see if we have a partition table entry */
|
pascal@23875
|
386 #ifdef PARTITION_SUPPORT
|
pascal@23867
|
387 xorl %ebx, %ebx
|
pascal@23867
|
388 xorl %ecx, %ecx
|
pascal@23867
|
389 andw %si, %si /* %si == 0 -> no partition data */
|
pascal@23867
|
390 jz 1f
|
pascal@23867
|
391 testb $0x7f, (%si) /* Invalid active flag field? */
|
pascal@23867
|
392 jnz 1f
|
pascal@23875
|
393 orb 4(%si), %cl /* Partition type zero == invalid? */
|
pascal@23867
|
394 je 1f
|
pascal@23875
|
395
|
pascal@23875
|
396 cmpb $0xed, %cl /* EFI partition type? */
|
pascal@23875
|
397
|
pascal@23875
|
398 /* Get non-GPT partition information */
|
pascal@23875
|
399 movl 8(%si), %ecx
|
pascal@23875
|
400
|
pascal@23875
|
401 jne 1f
|
pascal@23867
|
402 cmpl $0x58504721, %eax /* !GPT signature in EAX? */
|
pascal@23875
|
403 jne 1f
|
pascal@23867
|
404
|
pascal@23867
|
405 /* We have GPT partition information */
|
pascal@23867
|
406 movl (32+20)(%si), %ecx
|
pascal@23867
|
407 movl (36+20)(%si), %ebx
|
pascal@23867
|
408 #endif
|
pascal@23867
|
409 1:
|
pascal@23875
|
410 movw %bp, %ds
|
pascal@23875
|
411 movw $stack, %sp
|
pascal@23867
|
412
|
pascal@23867
|
413 /* We have no partition information */
|
pascal@23875
|
414 #ifdef PARTITION_SUPPORT
|
pascal@23867
|
415 pushl %ebx /* -4: partoffset_hi */
|
pascal@23867
|
416 pushl %ecx /* -8: partoffset_lo */
|
pascal@23875
|
417 #else
|
pascal@23875
|
418 pushl $0 /* -4: partoffset_hi */
|
pascal@23875
|
419 pushl $0 /* -8: partoffset_lo */
|
pascal@23875
|
420 #endif
|
pascal@23875
|
421 partoffset = -8
|
pascal@23867
|
422 pushw %es /* -10: es:di -> $PnP header */
|
pascal@23867
|
423 pushw %di /* -12: es:di -> $PnP header */
|
pascal@23867
|
424
|
pascal@23867
|
425
|
pascal@23867
|
426 //ADJUST_DRIVE
|
pascal@23867
|
427 pushw %dx /* -14: dl -> drive number */
|
pascal@23875
|
428 driveno = -14
|
pascal@23875
|
429
|
pascal@23875
|
430 pushw %ds
|
pascal@23875
|
431 popw %es
|
pascal@23867
|
432
|
pascal@23867
|
433 /* Copy down to 0:0x600 */
|
pascal@23875
|
434 movw $2f-0x600+0x7C00, %si
|
pascal@23875
|
435 movw $2f, %di
|
pascal@23875
|
436 movb $(512 >> 8), %ch
|
pascal@23875
|
437 pushw %es
|
pascal@23875
|
438 pushw %di
|
pascal@23875
|
439 rep; movsb
|
pascal@23867
|
440
|
pascal@23875
|
441 retf
|
pascal@23867
|
442 2:
|
pascal@23867
|
443
|
pascal@23867
|
444 /* Check to see if we have EBIOS */
|
pascal@23867
|
445 pushw %dx /* drive number */
|
pascal@23867
|
446 movb $0x41, %ah /* %al == 0 already */
|
pascal@23867
|
447 movw $0x55aa, %bx
|
pascal@23875
|
448 //xorw %cx, %cx
|
pascal@23867
|
449 xorb %dh, %dh
|
pascal@23867
|
450 int $0x13
|
pascal@23875
|
451 andw $1,%cx /* Bit 0 = fixed disk subset */
|
pascal@23875
|
452 jz 1f
|
pascal@23875
|
453 decw %cx /* Clear EBIOS flag. */
|
pascal@23867
|
454 cmpw $0xaa55, %bx
|
pascal@23867
|
455 jne 1f
|
pascal@23875
|
456 incw %cx /* Set EBIOS flag. */
|
pascal@23867
|
457
|
pascal@23867
|
458 /* We have EBIOS; patch in the following code at
|
pascal@23867
|
459 read_sector_cbios: movb $0x42, %ah ; jmp read_common */
|
pascal@23867
|
460 movl $0xeb42b4+((read_common-read_sector_cbios-4) << 24), \
|
pascal@23867
|
461 (read_sector_cbios)
|
pascal@23867
|
462 1:
|
pascal@23867
|
463 popw %dx
|
pascal@23867
|
464 pushw %cx /* EBIOS flag */
|
pascal@23867
|
465
|
pascal@23867
|
466 /* Get (C)HS geometry */
|
pascal@23867
|
467 movb $0x08, %ah
|
pascal@23867
|
468 int $0x13
|
pascal@23867
|
469 popw %bx /* EBIOS flag */
|
pascal@23867
|
470 movzbw %dh, %ax /* dh = max head */
|
pascal@23867
|
471 incw %ax /* From 0-based max to count */
|
pascal@23867
|
472 pushw %ax /* -16: Save heads on the stack */
|
pascal@23875
|
473 heads = -16
|
pascal@23867
|
474 andw $0x3f, %cx /* Sector count */
|
pascal@23867
|
475 pushw %cx /* -18: Save sectors on the stack */
|
pascal@23875
|
476 sectors = -18
|
pascal@23867
|
477 mulw %cx /* Heads*sectors -> sectors per cylinder */
|
pascal@23867
|
478
|
pascal@23867
|
479 pushw %bx /* -20: EBIOS flag */
|
pascal@23875
|
480
|
pascal@23875
|
481 /* Save sectors/cylinder in %esi */
|
pascal@23875
|
482 pushw %dx
|
pascal@23875
|
483 pushw %ax
|
pascal@23875
|
484 popl %edi
|
pascal@23867
|
485
|
pascal@23867
|
486 /*
|
pascal@23867
|
487 * Load sectors. We do this one at a time mostly to avoid
|
pascal@23867
|
488 * pitfalls and to share code with the stock MBR code.
|
pascal@23867
|
489 */
|
pascal@23867
|
490 movw $0x7c00, %bx
|
pascal@23875
|
491 movw %bx, %bp
|
pascal@23867
|
492 xorl %eax, %eax
|
pascal@23875
|
493 cdq
|
pascal@23867
|
494 movb $17*4, %al /* EL TORITO spec */
|
pascal@23867
|
495 call read_sector
|
pascal@23867
|
496 movl 71(%bx), %eax /* catalog */
|
pascal@23867
|
497 shll $2, %eax
|
pascal@23867
|
498 call read_sector
|
pascal@23867
|
499 movl 40(%bx), %eax /* boot code */
|
pascal@23867
|
500 shll $2, %eax
|
pascal@23875
|
501 movb $4, %cl /* Sector count */
|
pascal@23867
|
502
|
pascal@23867
|
503 2:
|
pascal@23867
|
504 call read_sector
|
pascal@23867
|
505 incl %eax
|
pascal@23867
|
506 addb $(512 >> 8), %bh
|
pascal@23867
|
507 loopw 2b
|
pascal@23867
|
508
|
pascal@23867
|
509 /*
|
pascal@23867
|
510 * Okay, that actually worked... update the stack pointer
|
pascal@23867
|
511 * and jump into isolinux.bin...
|
pascal@23867
|
512 */
|
pascal@23875
|
513 cmpl $HYBRID_MAGIC,isolinux_hybrid_signature(%bp)
|
pascal@23875
|
514 jne error_os
|
pascal@23867
|
515
|
pascal@23867
|
516 cli
|
pascal@23875
|
517 //movw $ebios_flag, %sp
|
pascal@23867
|
518
|
pascal@23867
|
519 /*
|
pascal@23867
|
520 * Use a ljmpw here to work around a bug in some unknown version
|
pascal@23867
|
521 * of gas or ld when it comes to jumping to an absolute symbol...
|
pascal@23867
|
522 *
|
pascal@23867
|
523 * Look more closely into it if we ever are short on space.
|
pascal@23867
|
524 */
|
pascal@23875
|
525 //ljmpw $0, $isolinux_start_hybrid
|
pascal@23875
|
526 pushw $isolinux_start_hybrid
|
pascal@23875
|
527 ret
|
pascal@23867
|
528
|
pascal@23867
|
529 /*
|
pascal@23867
|
530 * read_sector: read a single sector pointed to by %eax to %es:%bx.
|
pascal@23875
|
531 * All registers saved.
|
pascal@23867
|
532 */
|
pascal@23867
|
533 read_sector:
|
pascal@23867
|
534 pushal
|
pascal@23867
|
535 #ifdef PARTITION_SUPPORT
|
pascal@23875
|
536 addl partoffset(%bp), %eax
|
pascal@23875
|
537 adcl partoffset+4(%bp), %edx
|
pascal@23867
|
538 #endif
|
pascal@23867
|
539 pushl %edx /* MSW of LBA */
|
pascal@23867
|
540 pushl %eax /* LSW of LBA */
|
pascal@23867
|
541 pushw %es /* Buffer segment */
|
pascal@23867
|
542 pushw %bx /* Buffer offset */
|
pascal@23867
|
543 pushw $1 /* Sector count */
|
pascal@23867
|
544 pushw $16 /* Size of packet */
|
pascal@23867
|
545 movw %sp, %si
|
pascal@23867
|
546
|
pascal@23867
|
547 /* This chunk is skipped if we have ebios */
|
pascal@23867
|
548 /* Do not clobber %eax before this chunk! */
|
pascal@23867
|
549 /* This also relies on %bx and %edx as set up above. */
|
pascal@23867
|
550 read_sector_cbios:
|
pascal@23875
|
551 divl %edi
|
pascal@23867
|
552 shlb $6, %ah
|
pascal@23875
|
553 xchgb %al, %ah
|
pascal@23875
|
554 xchgw %ax, %cx
|
pascal@23867
|
555 xchgw %dx, %ax
|
pascal@23875
|
556 divb sectors(%bp)
|
pascal@23867
|
557 movb %al, %dh
|
pascal@23867
|
558 orb %ah, %cl
|
pascal@23867
|
559 incw %cx /* Sectors are 1-based */
|
pascal@23867
|
560 movw $0x0201, %ax
|
pascal@23867
|
561
|
pascal@23867
|
562 read_common:
|
pascal@23875
|
563 movb driveno(%bp), %dl
|
pascal@23867
|
564 int $0x13
|
pascal@23875
|
565 movw $disk_error, %si
|
pascal@23875
|
566 jc error
|
pascal@23875
|
567 addw $16, %sp /* Drop DAPA */
|
pascal@23867
|
568 popal
|
pascal@23867
|
569 ret
|
pascal@23867
|
570
|
pascal@23867
|
571 /*
|
pascal@23867
|
572 * Print error messages. This is invoked with "call", with the
|
pascal@23867
|
573 * error message at the return address.
|
pascal@23867
|
574 */
|
pascal@23875
|
575 error_os:
|
pascal@23875
|
576 movw $bad_signature, %si
|
pascal@23867
|
577 error:
|
pascal@23867
|
578 lodsb
|
pascal@23867
|
579 movb $0x0e, %ah
|
pascal@23867
|
580 movb (BIOS_page), %bh
|
pascal@23867
|
581 movb $0x07, %bl
|
pascal@23867
|
582 int $0x10 /* May destroy %bp */
|
pascal@23867
|
583 cmpb $10, %al /* Newline? */
|
pascal@23875
|
584 jne error
|
pascal@23867
|
585
|
pascal@23867
|
586 int $0x18 /* Boot failure */
|
pascal@23867
|
587 die:
|
pascal@23867
|
588 hlt
|
pascal@23867
|
589 jmp die
|
pascal@23875
|
590
|
pascal@23875
|
591 bad_signature:
|
pascal@23875
|
592 .ascii "isolinux.bin "
|
pascal@23875
|
593 .ascii "missing or corrupt.\r\n"
|
pascal@23875
|
594 disk_error:
|
pascal@23875
|
595 .ascii "Operating system "
|
pascal@23875
|
596 .ascii "load error.\r\n"
|
pascal@23875
|
597
|
pascal@23863
|
598 .org 0x0750,0xBB
|
pascal@23863
|
599 stopmsg:
|
pascal@23863
|
600 .ascii "This program cannot be run in DOS mode.$"
|
pascal@23863
|
601 .org 0x0778,0xEE
|
pascal@13713
|
602
|
pascal@23863
|
603 .end
|