wok-6.x diff syslinux/stuff/tools/isohybrid.sh @ rev 19425
syslinux/isohybrid: boot efi support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Sep 30 21:29:58 2016 +0200 (2016-09-30) |
parents | 2188bfc43e67 |
children | 087d71ec38ce |
line diff
1.1 --- a/syslinux/stuff/tools/isohybrid.sh Wed Nov 21 21:44:02 2012 +0100 1.2 +++ b/syslinux/stuff/tools/isohybrid.sh Fri Sep 30 21:29:58 2016 +0200 1.3 @@ -14,7 +14,7 @@ 1.4 heads=64 # zipdrive-style geometry 1.5 sectors=32 1.6 partype=23 # "Windows hidden IFS" 1.7 -entry=1 1.8 +entry= 1.9 id=$(( ($RANDOM <<16) + $RANDOM)) 1.10 offset=0 1.11 partok=0 1.12 @@ -74,15 +74,111 @@ 1.13 readiso $1 $2 4 | od -N 4 -t u4 -An 1.14 } 1.15 1.16 +# read a 16 bits data 1.17 +read16() 1.18 +{ 1.19 + readiso $1 $2 2 | od -N 2 -t u2 -An 1.20 +} 1.21 + 1.22 +# read a 8 bits data 1.23 +read8() 1.24 +{ 1.25 + readiso $1 $2 1 | od -N 1 -t u1 -An 1.26 +} 1.27 + 1.28 # write a 32 bits data 1.29 store32() 1.30 { 1.31 - n=$2; for i in 1 2 3 4; do 1.32 - printf '\\\\x%02X' $(($n & 255)) 1.33 - n=$(($n >> 8)) 1.34 + n=$2; for i in 0 8 16 24; do 1.35 + printf '\\\\x%02X' $((($n >> $i) & 255)) 1.36 done | xargs echo -en | ddq bs=1 conv=notrunc of=$iso seek=$(($1)) 1.37 } 1.38 1.39 +store32sw() 1.40 +{ 1.41 + n=$2; for i in 24 16 8 0; do 1.42 + printf '\\\\x%02X' $((($n >> $i) & 255)) 1.43 + done | xargs echo -en | ddq bs=1 conv=notrunc of=$iso seek=$(($1)) 1.44 +} 1.45 + 1.46 +crc32() 1.47 +{ 1.48 + t0=00000000; t1=77073096; t2=EE0E612C; t3=990951BA; 1.49 + t4=076DC419; t5=706AF48F; t6=E963A535; t7=9E6495A3; 1.50 + t8=0EDB8832; t9=79DCB8A4; t10=E0D5E91E; t11=97D2D988; 1.51 + t12=09B64C2B; t13=7EB17CBD; t14=E7B82D07; t15=90BF1D91; 1.52 + t16=1DB71064; t17=6AB020F2; t18=F3B97148; t19=84BE41DE; 1.53 + t20=1ADAD47D; t21=6DDDE4EB; t22=F4D4B551; t23=83D385C7; 1.54 + t24=136C9856; t25=646BA8C0; t26=FD62F97A; t27=8A65C9EC; 1.55 + t28=14015C4F; t29=63066CD9; t30=FA0F3D63; t31=8D080DF5; 1.56 + t32=3B6E20C8; t33=4C69105E; t34=D56041E4; t35=A2677172; 1.57 + t36=3C03E4D1; t37=4B04D447; t38=D20D85FD; t39=A50AB56B; 1.58 + t40=35B5A8FA; t41=42B2986C; t42=DBBBC9D6; t43=ACBCF940; 1.59 + t44=32D86CE3; t45=45DF5C75; t46=DCD60DCF; t47=ABD13D59; 1.60 + t48=26D930AC; t49=51DE003A; t50=C8D75180; t51=BFD06116; 1.61 + t52=21B4F4B5; t53=56B3C423; t54=CFBA9599; t55=B8BDA50F; 1.62 + t56=2802B89E; t57=5F058808; t58=C60CD9B2; t59=B10BE924; 1.63 + t60=2F6F7C87; t61=58684C11; t62=C1611DAB; t63=B6662D3D; 1.64 + t64=76DC4190; t65=01DB7106; t66=98D220BC; t67=EFD5102A; 1.65 + t68=71B18589; t69=06B6B51F; t70=9FBFE4A5; t71=E8B8D433; 1.66 + t72=7807C9A2; t73=0F00F934; t74=9609A88E; t75=E10E9818; 1.67 + t76=7F6A0DBB; t77=086D3D2D; t78=91646C97; t79=E6635C01; 1.68 + t80=6B6B51F4; t81=1C6C6162; t82=856530D8; t83=F262004E; 1.69 + t84=6C0695ED; t85=1B01A57B; t86=8208F4C1; t87=F50FC457; 1.70 + t88=65B0D9C6; t89=12B7E950; t90=8BBEB8EA; t91=FCB9887C; 1.71 + t92=62DD1DDF; t93=15DA2D49; t94=8CD37CF3; t95=FBD44C65; 1.72 + t96=4DB26158; t97=3AB551CE; t98=A3BC0074; t99=D4BB30E2; 1.73 + t100=4ADFA541; t101=3DD895D7; t102=A4D1C46D; t103=D3D6F4FB; 1.74 + t104=4369E96A; t105=346ED9FC; t106=AD678846; t107=DA60B8D0; 1.75 + t108=44042D73; t109=33031DE5; t110=AA0A4C5F; t111=DD0D7CC9; 1.76 + t112=5005713C; t113=270241AA; t114=BE0B1010; t115=C90C2086; 1.77 + t116=5768B525; t117=206F85B3; t118=B966D409; t119=CE61E49F; 1.78 + t120=5EDEF90E; t121=29D9C998; t122=B0D09822; t123=C7D7A8B4; 1.79 + t124=59B33D17; t125=2EB40D81; t126=B7BD5C3B; t127=C0BA6CAD; 1.80 + t128=EDB88320; t129=9ABFB3B6; t130=03B6E20C; t131=74B1D29A; 1.81 + t132=EAD54739; t133=9DD277AF; t134=04DB2615; t135=73DC1683; 1.82 + t136=E3630B12; t137=94643B84; t138=0D6D6A3E; t139=7A6A5AA8; 1.83 + t140=E40ECF0B; t141=9309FF9D; t142=0A00AE27; t143=7D079EB1; 1.84 + t144=F00F9344; t145=8708A3D2; t146=1E01F268; t147=6906C2FE; 1.85 + t148=F762575D; t149=806567CB; t150=196C3671; t151=6E6B06E7; 1.86 + t152=FED41B76; t153=89D32BE0; t154=10DA7A5A; t155=67DD4ACC; 1.87 + t156=F9B9DF6F; t157=8EBEEFF9; t158=17B7BE43; t159=60B08ED5; 1.88 + t160=D6D6A3E8; t161=A1D1937E; t162=38D8C2C4; t163=4FDFF252; 1.89 + t164=D1BB67F1; t165=A6BC5767; t166=3FB506DD; t167=48B2364B; 1.90 + t168=D80D2BDA; t169=AF0A1B4C; t170=36034AF6; t171=41047A60; 1.91 + t172=DF60EFC3; t173=A867DF55; t174=316E8EEF; t175=4669BE79; 1.92 + t176=CB61B38C; t177=BC66831A; t178=256FD2A0; t179=5268E236; 1.93 + t180=CC0C7795; t181=BB0B4703; t182=220216B9; t183=5505262F; 1.94 + t184=C5BA3BBE; t185=B2BD0B28; t186=2BB45A92; t187=5CB36A04; 1.95 + t188=C2D7FFA7; t189=B5D0CF31; t190=2CD99E8B; t191=5BDEAE1D; 1.96 + t192=9B64C2B0; t193=EC63F226; t194=756AA39C; t195=026D930A; 1.97 + t196=9C0906A9; t197=EB0E363F; t198=72076785; t199=05005713; 1.98 + t200=95BF4A82; t201=E2B87A14; t202=7BB12BAE; t203=0CB61B38; 1.99 + t204=92D28E9B; t205=E5D5BE0D; t206=7CDCEFB7; t207=0BDBDF21; 1.100 + t208=86D3D2D4; t209=F1D4E242; t210=68DDB3F8; t211=1FDA836E; 1.101 + t212=81BE16CD; t213=F6B9265B; t214=6FB077E1; t215=18B74777; 1.102 + t216=88085AE6; t217=FF0F6A70; t218=66063BCA; t219=11010B5C; 1.103 + t220=8F659EFF; t221=F862AE69; t222=616BFFD3; t223=166CCF45; 1.104 + t224=A00AE278; t225=D70DD2EE; t226=4E048354; t227=3903B3C2; 1.105 + t228=A7672661; t229=D06016F7; t230=4969474D; t231=3E6E77DB; 1.106 + t232=AED16A4A; t233=D9D65ADC; t234=40DF0B66; t235=37D83BF0; 1.107 + t236=A9BCAE53; t237=DEBB9EC5; t238=47B2CF7F; t239=30B5FFE9; 1.108 + t240=BDBDF21C; t241=CABAC28A; t242=53B39330; t243=24B4A3A6; 1.109 + t244=BAD03605; t245=CDD70693; t246=54DE5729; t247=23D967BF; 1.110 + t248=B3667A2E; t249=C4614AB8; t250=5D681B02; t251=2A6F2B94; 1.111 + t252=B40BBE37; t253=C30C8EA1; t254=5A05DF1B; t255=2D02EF8D; 1.112 + crc=$((0xFFFFFFFF)) 1.113 + dd if=$iso bs=1 skip=$(($1)) count=$(($2)) 2> /dev/null | \ 1.114 + od -v -w1 -t u1 -An | { 1.115 + while read n; do 1.116 + local x=$((($crc ^ $n) & 255)) 1.117 + eval x=0x\$t$x 1.118 + crc=$(((($crc >> 8) & 0x00FFFFFF) ^ $x)) 1.119 + done 1.120 + echo $(($crc ^ 0xFFFFFFFF)) 1.121 + } 1.122 +} 1.123 + 1.124 main() 1.125 { 1.126 uudecode | gunzip | ddq bs=512 count=1 of=$iso conv=notrunc \ 1.127 @@ -90,13 +186,44 @@ 1.128 store32 432 $(($lba * 4)) 1.129 store32 440 $id 1.130 store32 508 0xAA550000 1.131 - e=$(( (($entry -1) % 4) *16 +446)) 1.132 + e=$(( ((${entry:-1} -1) % 4) *16 +446)) 1.133 store32 $e 0x10080 1.134 esect=$(( ($sectors + ((($cylinders -1) & 0x300) >>2)) <<16)) 1.135 ecyl=$(( (($cylinders -1) & 0xff) <<24)) 1.136 store32 $(($e + 4)) $(($partype + (($heads - 1) <<8) +$esect +$ecyl)) 1.137 store32 $(($e + 8)) $offset 1.138 store32 $(($e + 12)) $(($cylinders * $heads * $sectors)) 1.139 + if [ -n "$efi_ofs" ]; then 1.140 + [ $(read16 0 1024) -eq 35615 -a $(read16 11 0) -ne 35615 ] && 1.141 + ddq bs=512 conv=notrunc skip=2 seek=44 count=20 if=$iso of=$iso 1.142 + store32 $((446+16)) $((0xFFFFFE00)) 1.143 + store32 $((446+16+4)) $((0xFFFFFEEF)) 1.144 + store32 $((446+16+8)) $efi_ofs 1.145 + store32 $((446+16+12)) $efi_len 1.146 + uudecode <<EOT | unlzma | ddq bs=512 seek=1 of=$iso conv=notrunc 1.147 +begin-base64 644 - 1.148 +XQAAgAD//////////wAikYVN1N2VY3JXMnUMJn1RCdQOHHdkT27O1I77zn8t 1.149 +AiDDPDQv3ovn0t2ksyOkm/KVCwPcaMYXgukPNUeg8Tbavo+kXx/HVFkHHHB+ 1.150 +c4gUdeTmJ31kL/btVwMG38di4lFL7bpUU61H7P0wJfcUrv0LYsPoW28D5f8s 1.151 +kaLvWB73gnnsIUYI9VNL4S9txwz2cCL67LZYGGAqMBdtdnp8Jv9qm36wvqJZ 1.152 +Bne0qEprzeTBrUFK74YLSrVbxK/fa6rz5pQxkLvyOVz4VfRMsVEA1G9IjF// 1.153 +BXwoAA== 1.154 +==== 1.155 +EOT 1.156 + lastlba=$((($cylinders * $heads * $sectors) -1)) 1.157 + usablelba=34 1.158 + store32 $((0x218)) 1 1.159 + store32 $((0x220)) $lastlba 1.160 + store32 $((0x228)) $usablelba 1.161 + store32 $((0x230)) $(($lastlba-$usablelba+1)) 1.162 + store32 $((0x428)) $(($lastlba-0x800)) 1.163 + store32 $((0x4A0)) $efi_ofs 1.164 + store32 $((0x4A8)) $(($efi_ofs+$efi_len-1)) 1.165 + store32 $((0x258)) $(crc32 0x400 0x4000) 1.166 + store32 $((0x210)) $(crc32 0x200 $(read32 0 $((0x20C)))) 1.167 + store32sw $((0x1008)) $(($efi_ofs/4)) 1.168 + store32sw $((0x1054)) $(($efi_len/4)) 1.169 + fi 1.170 } 1.171 1.172 abort() 1.173 @@ -110,6 +237,13 @@ 1.174 cat=$(read32 17 71) 1.175 [ $(read32 $cat 0) -eq 1 -a $(read32 $cat 30) -eq $(( 0x88AA55 )) ] || 1.176 abort "invalid boot catalog." 1.177 +efi_ofs= 1.178 +if [ $(read8 $cat 65) -eq 239 ]; then 1.179 + [ -n "$entry" ] && echo "$iso: efi boot ignore --entry $entry" && entry= 1.180 + partype=0 1.181 + efi_len=$(read16 $cat 102) 1.182 + efi_ofs=$((4*$(read32 $cat 104))) 1.183 +fi 1.184 lba=$(read32 $cat 40) 1.185 [ $(read32 $lba 64) -eq 1886961915 ] || 1.186 abort "no isolinux.bin hybrid signature in bootloader."