wok-current rev 23867
syslinux/bootiso.S: merge isolinux boot sector
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sat Jun 20 14:15:09 2020 +0000 (2020-06-20) |
parents | 50eb3433cb74 |
children | 9096d6788292 |
files | linld/stuff/src/ISO9660.CPP syslinux/stuff/iso2exe/bootiso.S syslinux/stuff/iso2exe/iso2exe.sh |
line diff
1.1 --- a/linld/stuff/src/ISO9660.CPP Fri Jun 19 20:32:02 2020 -0400 1.2 +++ b/linld/stuff/src/ISO9660.CPP Sat Jun 20 14:15:09 2020 +0000 1.3 @@ -84,10 +84,15 @@ 1.4 } 1.5 p += len; 1.6 } while (x->buffer + x->curpos + x->entrysize - 2 > p); 1.7 +#ifdef ISOHOOK 1.8 + *endname = 0; 1.9 +#else 1.10 if (endname) 1.11 *endname = 0; 1.12 else 1.13 #endif 1.14 +#endif 1.15 +#ifndef ISOHOOK 1.16 { 1.17 p = x->buffer + 33; x->filename = p += x->curpos; 1.18 p--; 1.19 @@ -105,6 +110,7 @@ 1.20 *p = 0; 1.21 } 1.22 } 1.23 +#endif 1.24 x->curpos += x->entrysize; 1.25 return 0; 1.26 }
2.1 --- a/syslinux/stuff/iso2exe/bootiso.S Fri Jun 19 20:32:02 2020 -0400 2.2 +++ b/syslinux/stuff/iso2exe/bootiso.S Sat Jun 20 14:15:09 2020 +0000 2.3 @@ -36,6 +36,7 @@ 2.4 start0: 2.5 //pushw %dx // restore %sp 2.6 //incw %bp // restore %bp 2.7 + movw %ds, %ax 2.8 xorw %bx, %bx 2.9 movw %bx, %ds 2.10 movb $0x7C, %bh 2.11 @@ -45,10 +46,8 @@ 2.12 pushw %bx // return address 2.13 pushw %di 2.14 pushw %es // save %es:%di 2.15 + pushw %si 2.16 cld 2.17 - sti 2.18 - pushw %ds 2.19 - popw %es 2.20 call setreg 2.21 rep 2.22 movsw 2.23 @@ -63,8 +62,10 @@ 2.24 .word 0 2.25 2.26 .org 66 2.27 +start2: 2.28 + pushw %ax // original %ds 2.29 + sti 2.30 dxloop: 2.31 -start2: 2.32 call readsector1 // look for the boot device 2.33 repe 2.34 cmpsw 2.35 @@ -76,8 +77,11 @@ 2.36 dxfound: 2.37 call readsectorX // read isolinux boot sector 2.38 cmpw (%bx), %cx 2.39 + movw $moved+nobsmsg, %si 2.40 jnc puts // read fail or no isohydrid boot sector 2.41 call bootpartition // assume DS=SS SI=BX=7C00 CX=0100 DL=<drive> DI=table+66 2.42 + popw %ds 2.43 + popw %si 2.44 popw %es 2.45 popw %di // isolinux boot needs %es:%di and %dx 2.46 putsret: 2.47 @@ -87,15 +91,10 @@ 2.48 movw $7, %bx 2.49 movb $0xE, %ah 2.50 int $0x10 2.51 -error: 2.52 +puts: 2.53 lodsb 2.54 - cmp $1, %al 2.55 - jg putstrlp 2.56 - jz putsret 2.57 -puts: 2.58 - movb $0x80, %ah 2.59 - xchgw %ax, %si 2.60 - jnc error 2.61 + cmp $0, %al 2.62 + jnz putstrlp 2.63 halt: 2.64 hlt 2.65 jmp halt 2.66 @@ -134,7 +133,7 @@ 2.67 2.68 .org 0x01A0,0xFF 2.69 readsectorX: // read isolinux boot sector 2.70 - movb $0xA5, %cl // patched by installer 2.71 + movb $3, %cl // isolinux/512 2.72 readsector1: 2.73 andb $0x83, %dl // disk and floppy disk 2.74 movw %cx, (%bx) 2.75 @@ -142,10 +141,11 @@ 2.76 movw $0x201, %ax 2.77 int $0x13 2.78 setreg: 2.79 + pushw %ds 2.80 + popw %es 2.81 movw %bx, %si 2.82 movw $moved, %di 2.83 movw $0x0100, %cx 2.84 - movb $nobsmsg, %al 2.85 ret 2.86 .org 0x01B8,0xEE // partition table 2.87 2.88 @@ -370,6 +370,254 @@ 2.89 2.90 .org 0x0400,0xEE 2.91 .org 0x0600,0xFF 2.92 +isolinux: 2.93 + .arch i486 2.94 +/* ----------------------------------------------------------------------- 2.95 + * 2.96 + * Copyright 2007-2009 H. Peter Anvin - All Rights Reserved 2.97 + * Copyright 2009 Intel Corporation; author: H. Peter Anvin 2.98 + * 2.99 + * Permission is hereby granted, free of charge, to any person 2.100 + * obtaining a copy of this software and associated documentation 2.101 + * files (the "Software"), to deal in the Software without 2.102 + * restriction, including without limitation the rights to use, 2.103 + * copy, modify, merge, publish, distribute, sublicense, and/or 2.104 + * sell copies of the Software, and to permit persons to whom 2.105 + * the Software is furnished to do so, subject to the following 2.106 + * conditions: 2.107 + * 2.108 + * The above copyright notice and this permission notice shall 2.109 + * be included in all copies or substantial portions of the Software. 2.110 + * 2.111 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2.112 + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 2.113 + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 2.114 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 2.115 + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 2.116 + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2.117 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2.118 + * OTHER DEALINGS IN THE SOFTWARE. 2.119 + * 2.120 + * ----------------------------------------------------------------------- */ 2.121 + 2.122 +HYBRID_MAGIC = 0x7078c0fb 2.123 +isolinux_hybrid_signature = 0x7c00+64 2.124 +isolinux_start_hybrid = 0x7c00+64+4 2.125 + 2.126 +stack = 0x7c00 2.127 +partoffset = (stack-8) 2.128 +driveno = (stack-14) 2.129 +heads = (stack-16) 2.130 +sectors = (stack-18) 2.131 +ebios_flag = (stack-20) 2.132 +secpercyl = (stack-24) 2.133 + 2.134 +BIOS_kbdflags = 0x417 2.135 +BIOS_page = 0x462 2.136 + 2.137 +_start2: 2.138 + .byte 0x33, 0xed /* xorw %bp, %bp */ 2.139 + 2.140 + /* Check to see if we have a partition table entry */ 2.141 + xorl %ebx, %ebx 2.142 + xorl %ecx, %ecx 2.143 +#ifdef PARTITION_SUPPORT 2.144 + andw %si, %si /* %si == 0 -> no partition data */ 2.145 + jz 1f 2.146 + testb $0x7f, (%si) /* Invalid active flag field? */ 2.147 + jnz 1f 2.148 + cmpb %cl, 4(%si) /* Partition type zero == invalid? */ 2.149 + je 1f 2.150 + cmpl $0x58504721, %eax /* !GPT signature in EAX? */ 2.151 + jne 2f 2.152 + cmpb $0xed, 4(%si) /* EFI partition type? */ 2.153 + jne 2f 2.154 + 2.155 + /* We have GPT partition information */ 2.156 + movl (32+20)(%si), %ecx 2.157 + movl (36+20)(%si), %ebx 2.158 + jmp 1f 2.159 + 2.160 + /* We have non-GPT partition information */ 2.161 +2: 2.162 + movl 8(%si), %ecx 2.163 +#endif 2.164 +1: 2.165 + movw %sp, %si 2.166 + 2.167 + /* We have no partition information */ 2.168 + pushl %ebx /* -4: partoffset_hi */ 2.169 + pushl %ecx /* -8: partoffset_lo */ 2.170 + pushw %es /* -10: es:di -> $PnP header */ 2.171 + pushw %di /* -12: es:di -> $PnP header */ 2.172 + 2.173 + movw %bp, %ds 2.174 + movw %bp, %es 2.175 + 2.176 + //ADJUST_DRIVE 2.177 + pushw %dx /* -14: dl -> drive number */ 2.178 + 2.179 + /* Copy down to 0:0x600 */ 2.180 + movw $0x7c00, %si 2.181 + movw $_start2, %di 2.182 + movw $(512/2), %cx 2.183 + rep; movsw 2.184 + 2.185 + ljmpw $0, $2f 2.186 +2: 2.187 + 2.188 + /* Check to see if we have EBIOS */ 2.189 + pushw %dx /* drive number */ 2.190 + movb $0x41, %ah /* %al == 0 already */ 2.191 + movw $0x55aa, %bx 2.192 + xorw %cx, %cx 2.193 + xorb %dh, %dh 2.194 + stc 2.195 + int $0x13 2.196 + jc 1f 2.197 + cmpw $0xaa55, %bx 2.198 + jne 1f 2.199 + andw $1,%cx /* Bit 0 = fixed disk subset */ 2.200 + jz 1f 2.201 + 2.202 + /* We have EBIOS; patch in the following code at 2.203 + read_sector_cbios: movb $0x42, %ah ; jmp read_common */ 2.204 + movl $0xeb42b4+((read_common-read_sector_cbios-4) << 24), \ 2.205 + (read_sector_cbios) 2.206 + jmp 2f 2.207 +1: 2.208 + xor %cx, %cx /* Clear EBIOS flag. */ 2.209 +2: 2.210 + popw %dx 2.211 + pushw %cx /* EBIOS flag */ 2.212 + 2.213 + /* Get (C)HS geometry */ 2.214 + movb $0x08, %ah 2.215 + int $0x13 2.216 + popw %bx /* EBIOS flag */ 2.217 + movzbw %dh, %ax /* dh = max head */ 2.218 + incw %ax /* From 0-based max to count */ 2.219 + pushw %ax /* -16: Save heads on the stack */ 2.220 + andw $0x3f, %cx /* Sector count */ 2.221 + pushw %cx /* -18: Save sectors on the stack */ 2.222 + mulw %cx /* Heads*sectors -> sectors per cylinder */ 2.223 + 2.224 + pushw %bx /* -20: EBIOS flag */ 2.225 + 2.226 + /* Save sectors/cylinder on the stack */ 2.227 + pushw %dx /* -22: High word */ 2.228 + pushw %ax /* -24: Low word */ 2.229 + 2.230 + /* 2.231 + * Load sectors. We do this one at a time mostly to avoid 2.232 + * pitfalls and to share code with the stock MBR code. 2.233 + */ 2.234 + movw $0x7c00, %bx 2.235 + xorl %eax, %eax 2.236 + movb $17*4, %al /* EL TORITO spec */ 2.237 + call read_sector 2.238 + jc disk_error 2.239 + movl 71(%bx), %eax /* catalog */ 2.240 + shll $2, %eax 2.241 + call read_sector 2.242 + jc disk_error 2.243 + movl 40(%bx), %eax /* boot code */ 2.244 + shll $2, %eax 2.245 + movw $4, %cx /* Sector count */ 2.246 + 2.247 +2: 2.248 + call read_sector 2.249 + jc disk_error 2.250 + incl %eax 2.251 + addb $(512 >> 8), %bh 2.252 + loopw 2b 2.253 + 2.254 + /* 2.255 + * Okay, that actually worked... update the stack pointer 2.256 + * and jump into isolinux.bin... 2.257 + */ 2.258 + cmpl $HYBRID_MAGIC,(isolinux_hybrid_signature) 2.259 + jne bad_signature 2.260 + 2.261 + cli 2.262 + movw $ebios_flag, %sp 2.263 + 2.264 + /* 2.265 + * Use a ljmpw here to work around a bug in some unknown version 2.266 + * of gas or ld when it comes to jumping to an absolute symbol... 2.267 + * 2.268 + * Look more closely into it if we ever are short on space. 2.269 + */ 2.270 + ljmpw $0, $isolinux_start_hybrid 2.271 + 2.272 +bad_signature: 2.273 + call error 2.274 + .ascii "isolinux.bin missing or corrupt.\r\n" 2.275 + 2.276 +disk_error: 2.277 + call error 2.278 + .ascii "Operating system load error.\r\n" 2.279 + 2.280 +/* 2.281 + * read_sector: read a single sector pointed to by %eax to %es:%bx. 2.282 + * CF is set on error. All registers saved. 2.283 + */ 2.284 +read_sector: 2.285 + pushal 2.286 + xorl %edx, %edx 2.287 +#ifdef PARTITION_SUPPORT 2.288 + addl (partoffset), %eax 2.289 + adcl (partoffset+4), %edx 2.290 +#endif 2.291 + pushl %edx /* MSW of LBA */ 2.292 + pushl %eax /* LSW of LBA */ 2.293 + pushw %es /* Buffer segment */ 2.294 + pushw %bx /* Buffer offset */ 2.295 + pushw $1 /* Sector count */ 2.296 + pushw $16 /* Size of packet */ 2.297 + movw %sp, %si 2.298 + 2.299 + /* This chunk is skipped if we have ebios */ 2.300 + /* Do not clobber %eax before this chunk! */ 2.301 + /* This also relies on %bx and %edx as set up above. */ 2.302 +read_sector_cbios: 2.303 + divl (secpercyl) 2.304 + shlb $6, %ah 2.305 + movb %ah, %cl 2.306 + movb %al, %ch 2.307 + xchgw %dx, %ax 2.308 + divb (sectors) 2.309 + movb %al, %dh 2.310 + orb %ah, %cl 2.311 + incw %cx /* Sectors are 1-based */ 2.312 + movw $0x0201, %ax 2.313 + 2.314 +read_common: 2.315 + movb (driveno), %dl 2.316 + int $0x13 2.317 + leaw 16(%si), %sp /* Drop DAPA */ 2.318 + popal 2.319 + ret 2.320 + 2.321 +/* 2.322 + * Print error messages. This is invoked with "call", with the 2.323 + * error message at the return address. 2.324 + */ 2.325 +error: 2.326 + popw %si 2.327 +2: 2.328 + lodsb 2.329 + movb $0x0e, %ah 2.330 + movb (BIOS_page), %bh 2.331 + movb $0x07, %bl 2.332 + int $0x10 /* May destroy %bp */ 2.333 + cmpb $10, %al /* Newline? */ 2.334 + jne 2b 2.335 + 2.336 + int $0x18 /* Boot failure */ 2.337 +die: 2.338 + hlt 2.339 + jmp die 2.340 .org 0x0750,0xBB 2.341 stopmsg: 2.342 .ascii "This program cannot be run in DOS mode.$"
3.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh Fri Jun 19 20:32:02 2020 -0400 3.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh Sat Jun 20 14:15:09 2020 +0000 3.3 @@ -100,13 +100,10 @@ 3.4 0000 0080 3.5 0178 0040 3.6 0270 0190 3.7 -0750 0028 3.8 +0600 0178 3.9 EOT 3.10 i=$((0x600)) 3.11 - store 417 $(($i/512)) $1 8 ### isolinux boot sector 3.12 - printf "Moving syslinux hybrid boot record at %04X (336 bytes) ...\n" $i 3.13 OFS=$SIZE 3.14 - ddn if=$2 bs=1 count=336 of=$1 seek=$i 3.15 rm -f /tmp/exe$$ /tmp/coff$$ 3.16 if [ -z "$RECURSIVE_PARTITION" -a $(get 454 $1 4) -eq 0 ]; then 3.17 store 448 $((1+$i/512)) $1 8 ### 446+2 SECTOR