wok rev 17473
syslinux/iso2exe: add 64bits support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sat Dec 27 17:56:57 2014 +0100 (2014-12-27) |
parents | c8d2616c785e |
children | f889c01820d0 |
files | ipxe/stuff/lkrnprefix.S syslinux/stuff/iso2exe/bootiso.S syslinux/stuff/iso2exe/bootlinux.c syslinux/stuff/iso2exe/init syslinux/stuff/iso2exe/iso9660.c syslinux/stuff/iso2exe/libdos.c |
line diff
1.1 --- a/ipxe/stuff/lkrnprefix.S Sat Dec 27 17:44:46 2014 +0200 1.2 +++ b/ipxe/stuff/lkrnprefix.S Sat Dec 27 17:56:57 2014 +0100 1.3 @@ -101,6 +101,7 @@ 1.4 .word -( HEADER_SIZE / 16 ) // Initial (relative) CS value 1.5 // .word 0x001C // File address of relocation table 1.6 // .word 0,0,0 // Overlay number 1.7 + .ascii "(SliTaz)" 1.8 1.9 start: 1.10 pushw %dx
2.1 --- a/syslinux/stuff/iso2exe/bootiso.S Sat Dec 27 17:44:46 2014 +0200 2.2 +++ b/syslinux/stuff/iso2exe/bootiso.S Sat Dec 27 17:56:57 2014 +0100 2.3 @@ -90,9 +90,7 @@ 2.4 dxfound: 2.5 movw %dx, 10(%bp) 2.6 call checkboot 2.7 -noboot: 2.8 .ascii "No isolinux mbr." 2.9 -noboot_end: 2.10 2.11 .org 0x0080 2.12 ////////////////////////////// EXE/PE header ////////////////////////////////// 2.13 @@ -109,13 +107,12 @@ 2.14 iret 2.15 2.16 error: 2.17 - movw $noboot_end-noboot, %cx 2.18 -putsloop: 2.19 lodsb 2.20 movw $7, %bx 2.21 movb $0xE, %ah 2.22 int $0x10 2.23 - loop putsloop 2.24 + cmp $'.', %al 2.25 + jne error 2.26 halt: 2.27 hlt 2.28 jmp halt 2.29 @@ -128,10 +125,13 @@ 2.30 cld 2.31 movw $0x100, %si 2.32 movw -127(%si), %ax 2.33 + cmpb $0x2F, %al 2.34 + je ishelp 2.35 + cmpw $0x2F20, %ax 2.36 +ishelp: 2.37 + movw $0x3000+EXESTR(help), %ax 2.38 cwd // clear dx 2.39 pushw %dx // dos exit() 2.40 - cmpw $0x2F20, %ax 2.41 - movw $0x3000+EXESTR(help), %ax 2.42 je abort 2.43 int $0x21 // get DOS version 2.44 cmpb $3, %al 2.45 @@ -197,9 +197,9 @@ 2.46 movw $0x0100, %di 2.47 movw comstart-end_header(%di), %si // .com address 2.48 pushw %di 2.49 - movb $0x7D, %ch 2.50 + movb $0x7C/2, %ch // 31K-31.5K, > com length 2.51 rep 2.52 - movsb 2.53 + movsw 2.54 moveret: 2.55 ret 2.56 2.57 @@ -213,12 +213,13 @@ 2.58 movw %dx, %ds // %dx = 0 2.59 movw 0x67*4+2, %ds 2.60 movw $10, %si 2.61 - lodsl 2.62 + lodsw 2.63 xorw $0x4D45, %ax // EM(MX) or EM(MQ) 2.64 - lodsl 2.65 + lodsw 2.66 + lodsw 2.67 popw %ds 2.68 jne NoVCPI 2.69 - xorl $0x30585858, %eax // XXX0 2.70 + xorw $0x5858, %ax // XX(X0) 2.71 movw $EXEADRS(CmdVCPI), %si 2.72 ChkVCPI: 2.73 NoVCPI: 2.74 @@ -237,11 +238,10 @@ 2.75 .byte 0x46 // version 2.76 .byte 0 2.77 2.78 -// ------------------------------------------------------------------- 2.79 - 2.80 -help: 2.81 - .ascii "SliTaz GNU/L" // SliTaz GNU/Linux boot loader 2.82 - .byte EXESTR(iloader) 2.83 +// --------------- Must be in 7F40 7FFF range ------------------------ 2.84 +//noloader: 2.85 +// .ascii "No isol" // No isolinux boot loader 2.86 +// .byte EXESTR(iloader) 2.87 no386: 2.88 .ascii "No 386" // No 386+ 2.89 .byte EXESTR(plus) 2.90 @@ -258,20 +258,12 @@ 2.91 .ascii "Invalid: paging + " // Invalid: paging + real mode. 2.92 realmodemsg: 2.93 .ascii "real" // real mode. 2.94 -// --------------- Must be in 00C0 013F range ------------------------ 2.95 +// --------------- Must be in 7FC0 7FFF range ------------------------ 2.96 mode: 2.97 .ascii " mod" 2.98 eeol: 2.99 .ascii "e" 2.100 .byte EXESTR(eol) 2.101 -//noloader: 2.102 -// .ascii "No isol" // No isolinux boot loader 2.103 -iloader: 2.104 - .ascii "inux boot loader" 2.105 -eol: 2.106 - .ascii "." 2.107 -eol2: 2.108 - .asciz "\r\n" 2.109 noDOS3: 2.110 .ascii "No DOS 3" // No DOS 3.0+ 2.111 dot0: 2.112 @@ -279,6 +271,14 @@ 2.113 plus: 2.114 .ascii "+" 2.115 .byte EXESTR(eol2) 2.116 +help: 2.117 + .ascii "SliTaz GNU/L" // SliTaz GNU/Linux boot loader 2.118 +iloader: 2.119 + .ascii "inux boot loader" 2.120 +eol: 2.121 + .ascii "." 2.122 +eol2: 2.123 + .asciz "\r\n" 2.124 2.125 .org 0x8000 2.126 ////////////////////////// ISO9660 header /////////////////////////////////////
3.1 --- a/syslinux/stuff/iso2exe/bootlinux.c Sat Dec 27 17:44:46 2014 +0200 3.2 +++ b/syslinux/stuff/iso2exe/bootlinux.c Sat Dec 27 17:56:57 2014 +0100 3.3 @@ -1,6 +1,9 @@ 3.4 #include <stdio.h> 3.5 #include "libdos.h" 3.6 #include "iso9660.h" 3.7 +#asm 3.8 + use16 86 3.9 +#endasm 3.10 3.11 #define ELKSSIG 0x1E6 3.12 #define SETUPSECTORS 0x1F1 3.13 @@ -47,8 +50,10 @@ 3.14 mov ax, _iselks 3.15 dec ax 3.16 je fakerealmode // elks may run on a 8086 3.17 + use16 286 3.18 smsw ax // 286+ 3.19 and ax, #1 // 0:realmode 1:vm86 3.20 + use16 86 3.21 fakerealmode: 3.22 #endasm 3.23 } 3.24 @@ -95,20 +100,23 @@ 3.25 movw 3.26 jmp movedone 3.27 movehiz: // 30 3.28 + use16 286 // more than 1Mb => 286+ 3.29 mov cx, #9 // 2E..1E 3.30 zero1: 3.31 push ax 3.32 loop zero1 3.33 - push dword [si] // 1A mem.base 3.34 + push word [si+2] 3.35 + push word [si] // 1A mem.base 3.36 push #-1 // 18 3.37 push ax // 16 3.38 - cwde 3.39 - cdq 3.40 - mov dx, ds 3.41 - shl edx, #4 3.42 - mov ax, #_buffer 3.43 - add edx, eax 3.44 - push edx // 12 linear_address(buffer) 3.45 + mov ax, ds 3.46 + mov dx, ax 3.47 + shl ax, #4 3.48 + shr dx, #12 3.49 + add ax, #_buffer 3.50 + adc dx, #0 3.51 + push dx 3.52 + push ax 3.53 push #-1 // 10 3.54 mov cl, #8 // 0E..00 3.55 zero2: 3.56 @@ -124,6 +132,7 @@ 3.57 xchg [si+0x1F], al // bits 24..31 3.58 int 0x15 3.59 add sp, #0x30 3.60 + use16 86 3.61 movedone: 3.62 pop di 3.63 pop si 3.64 @@ -427,11 +436,13 @@ 3.65 mvdown: 3.66 mov [si+0x12+2], bx // srce 3.67 mov [si+0x1A+2], cx // dest 3.68 - pusha // more than 1Mb => 286+ 3.69 + use16 286 // more than 1Mb => 286+ 3.70 + pusha 3.71 mov cx, #0x8000 3.72 mov ah, #0x87 3.73 int 0x15 3.74 popa 3.75 + use16 86 3.76 inc bx 3.77 inc cx 3.78 cmp dl, bl
4.1 --- a/syslinux/stuff/iso2exe/init Sat Dec 27 17:44:46 2014 +0200 4.2 +++ b/syslinux/stuff/iso2exe/init Sat Dec 27 17:56:57 2014 +0100 4.3 @@ -33,6 +33,13 @@ 4.4 umount /proc 4.5 } 4.6 4.7 +bytes2bin() 4.8 +{ 4.9 + for i in $@ ; do 4.10 + printf '\\\\x%02X' $(($i&255)) | xargs echo -en 4.11 + done 4.12 +} 4.13 + 4.14 words2bin() 4.15 { 4.16 for i in $@ ; do 4.17 @@ -218,7 +225,7 @@ 4.18 if [ -d /media/cdrom/fs ]; then 4.19 cp -a /media/cdrom/fs/. /mnt/slitaz 4.20 elif is_loram ; then 4.21 - for i in /media/cdrom/boot/rootfs?.* ; do 4.22 + for i in /media/cdrom/boot/rootfs?*.* ; do 4.23 [ -s $(basename $i) ] && continue 4.24 cpio -i $i 4.25 done 4.26 @@ -393,6 +400,31 @@ 4.27 cp /media/cdrom/boot/memtest /mnt/memtest.exe 4.28 } 4.29 4.30 +mkfloppy() 4.31 +{ 4.32 + ddq if=$1 of=/dev/fd0 4.33 + [ $(($(get 0 $1) - 0x5A4D)) -eq 0 ] || return 4.34 + J=$(($(get 3 $1 1) + 0x02)) 4.35 + R=$((1 + $(get 497 $1 1) + 1 + ($(get 500 $1)-1)/32)) 4.36 + [ $R -lt 2500 ] || return 4.37 + [ $((($(get 500 $file)-1) & 31)) -lt 30 ] && 4.38 + dd if=$file bs=32 count=1 seek=$(($R*16 - 1)) of=/dev/fd0 4.39 + G="18 0 2 0 0 0 0 0" 4.40 + [ $J -gt 25 ] || G="" 4.41 + F=0 4.42 + for i in 1 2 3; do 4.43 + F=$((((2880-$R-$F-$F)*3+1023)/1024)) 4.44 + done 4.45 + bytes2bin 0xEB $J 0x90 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 \ 4.46 + 0 2 2 $(($R%256)) $(($R/256)) 2 64 0 64 11 0xF0 $F 0 \ 4.47 + $G | ddq bs=1 of=/dev/fd0 4.48 + ddq if=/dev/zero bs=512 count=$((4+$F+$F)) seek=$R of=/dev/fd0 4.49 + for i in $R $(($R+$F)) ; do 4.50 + bytes2bin 0xF0 0xFF 0xFF | ddq bs=512 seek=$i of=/dev/fd0 4.51 + done 4.52 + echo -n $(basename $1) | ddq bs=1 seek=3 count=8 of=/dev/fd0 4.53 +} 4.54 + 4.55 fdmemtest() 4.56 { 4.57 $DIALOG --clear \ 4.58 @@ -403,8 +435,7 @@ 4.59 miss many of the failures that are detected by Memtest86.\n\n 4.60 Please insert a blank disk in floppy drive.\n 4.61 " 12 70 4.62 - [ $? -eq 0 ] || return 4.63 - ddq if=/media/cdrom/boot/memtest of=/dev/fd0 4.64 + [ $? -eq 0 ] && mkfloppy /media/cdrom/boot/memtest 4.65 } 4.66 4.67 pxe() 4.68 @@ -433,8 +464,7 @@ 4.69 from the Web using PXE and HTTP protocols.\n\n 4.70 Please insert a blank disk in floppy drive.\n 4.71 " 12 70 4.72 - [ $? -eq 0 ] || return 4.73 - ddq if=/media/cdrom/boot/?pxe of=/dev/fd0 4.74 + [ $? -eq 0 ] && mkfloppy /media/cdrom/boot/?pxe 4.75 } 4.76 4.77 gotposixovl()
5.1 --- a/syslinux/stuff/iso2exe/iso9660.c Sat Dec 27 17:44:46 2014 +0200 5.2 +++ b/syslinux/stuff/iso2exe/iso9660.c Sat Dec 27 17:56:57 2014 +0100 5.3 @@ -3,6 +3,9 @@ 5.4 #include <stdio.h> 5.5 #include "iso9660.h" 5.6 #define __ROCKRIDGE 5.7 +#asm 5.8 + use16 86 5.9 +#endasm 5.10 5.11 char *isofilename; 5.12 unsigned long isofileofs, isofilesize; 5.13 @@ -121,12 +124,56 @@ 5.14 return 0; 5.15 } 5.16 5.17 +static int cpuhaslm(void) 5.18 +{ 5.19 +#asm 5.20 + pushf // save flags 5.21 + // bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 5.22 + // flags 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF 5.23 + mov ax, #0x1000 5.24 + push ax 5.25 + popf // < 286 : flags[12..15] are forced 1 5.26 + pushf // = 286 : flags[12..15] are forced 0 5.27 + pop bx // > 286 : only flags[15] is forced 0 5.28 + popf // restore flags (IOPL) 5.29 + add bh, ah // test F0 and 00 cases 5.30 + cmp bh, ah 5.31 + cbw 5.32 + jbe not386 // C=8086/80186, Z=80286 5.33 + use16 386 5.34 + pushfd 5.35 + pushfd 5.36 + pop ebx 5.37 + mov ecx, ebx 5.38 + btc ebx, #21 // toggle CPUID feature bit 5.39 + push ebx 5.40 + popfd 5.41 + pushfd 5.42 + pop ebx 5.43 + popfd 5.44 + xor ebx, ecx 5.45 + bt ebx, #21 // CPUID feature bit ? 5.46 + jnc nocpuid 5.47 + mov eax, #0x80000001 // Extended Processor Info and Feature Bits 5.48 + .byte 0x0F, 0xA2 // cpuid 5.49 + xor ax, ax 5.50 + bt edx, #29 // LM feature bit ? 5.51 + adc ax, ax 5.52 + use16 86 5.53 +nocpuid: 5.54 +not386: 5.55 +#endasm 5.56 +} 5.57 + 5.58 #define IS_DIR(x)( ((x) & ~0777) == 040000) 5.59 -int isoopen(char *name) 5.60 +int isoopen(char *filename) 5.61 { 5.62 int restart; 5.63 - char *s, c; 5.64 + char *name, *s, c; 5.65 + int _64bits = cpuhaslm(); 5.66 5.67 +retry32: 5.68 + name = filename; 5.69 while (*name == '/') { 5.70 name++; 5.71 isoreset(NULL); 5.72 @@ -137,7 +184,14 @@ 5.73 c = *s; 5.74 *s = 0; 5.75 for (restart = 1; isoreaddir(restart) == 0; restart = 0) { 5.76 - if (strcmp(name, isofilename)) continue; 5.77 + char *n = name, *i = isofilename; 5.78 + if (_64bits) { 5.79 + int len = strlen(name); 5.80 + if (strncmp(name, isofilename), len) continue; 5.81 + n = "64"; 5.82 + i += len; 5.83 + } 5.84 + if (strcmp(n, i)) continue; 5.85 if (IS_DIR(isofilemod)) { 5.86 isodirofs = isofileofs; 5.87 isodirsize = isofilesize; 5.88 @@ -149,6 +203,11 @@ 5.89 } 5.90 return 0; 5.91 } 5.92 + if (_64bits) { 5.93 + _64bits = 0; 5.94 + *s = c; 5.95 + goto retry32; 5.96 + } 5.97 return -1; 5.98 next: ; 5.99 }
6.1 --- a/syslinux/stuff/iso2exe/libdos.c Sat Dec 27 17:44:46 2014 +0200 6.2 +++ b/syslinux/stuff/iso2exe/libdos.c Sat Dec 27 17:56:57 2014 +0100 6.3 @@ -1,4 +1,7 @@ 6.4 #include "libdos.h" 6.5 +#asm 6.6 + use16 86 6.7 +#endasm 6.8 6.9 char *progname(void) 6.10 { 6.11 @@ -165,7 +168,10 @@ 6.12 pop si 6.13 jne stepagain 6.14 seg cs 6.15 - lss sp, stack 6.16 + lds di, stack 6.17 + push ds 6.18 + pop ss 6.19 + mov sp, di 6.20 pop ds 6.21 pop di 6.22 pop si