wok rev 17562

syslinux/iso2exe: use iso size to compute md5sum
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Feb 07 15:39:46 2015 +0100 (2015-02-07)
parents 4460c3cc7f05
children fc3051b88ee8
files syslinux/stuff/iso2exe/boot.c syslinux/stuff/iso2exe/bootiso.S syslinux/stuff/iso2exe/init syslinux/stuff/iso2exe/iso2exe.sh syslinux/stuff/iso2exe/libdos.c syslinux/stuff/iso2exe/libdos.h
line diff
     1.1 --- a/syslinux/stuff/iso2exe/boot.c	Fri Feb 06 22:54:07 2015 +0000
     1.2 +++ b/syslinux/stuff/iso2exe/boot.c	Sat Feb 07 15:39:46 2015 +0100
     1.3 @@ -158,16 +158,7 @@
     1.4  			cmdfile = argv[1] + 1;
     1.5  		else {
     1.6  			cmdfile = NULL;
     1.7 -#asm
     1.8 -		push	ds
     1.9 -		pop	es
    1.10 -		mov	si, #0x82
    1.11 -		mov	di, #_args
    1.12 -		mov	cx, #0x7E/2
    1.13 -		rep
    1.14 -		 seg	cs
    1.15 -		  movsw
    1.16 -#endasm
    1.17 +			copycmdline(args);
    1.18  		}
    1.19  	}
    1.20  	if (cmdfile) {
     2.1 --- a/syslinux/stuff/iso2exe/bootiso.S	Fri Feb 06 22:54:07 2015 +0000
     2.2 +++ b/syslinux/stuff/iso2exe/bootiso.S	Sat Feb 07 15:39:46 2015 +0100
     2.3 @@ -119,7 +119,7 @@
     2.4  	jmp	halt
     2.5  	.org	0x01BE
     2.6  
     2.7 -	.org	0x7F10
     2.8 +	.org	0x7F26
     2.9  ////////////////////////////// DOS EXE code ///////////////////////////////////
    2.10  
    2.11  exestart:
    2.12 @@ -134,14 +134,16 @@
    2.13  	cwd				// clear dx
    2.14  	pushw	%dx			// dos exit()
    2.15  	je	abort
    2.16 +	pushw	%si
    2.17  	int	$0x21			// get DOS version
    2.18 -	cmpb	$3, %al
    2.19 +	popw	%di			// %di = 0x100: .COM start address
    2.20 +	addb	$-3, %al
    2.21  	movb	$EXESTR(noDOS3), %al
    2.22 -	jb	abort
    2.23 +	jnc	abort
    2.24  	movw	$(EXELOC(0x8000))/2, %cx
    2.25  chklp:
    2.26  	lodsw
    2.27 -	addw	%ax, %dx
    2.28 +	addw	%ax, %dx	// break C
    2.29  	loop	chklp
    2.30  chked:
    2.31  	movw	$0x1000+EXESTR(chkerr), %ax
    2.32 @@ -164,15 +166,11 @@
    2.33  	addb	%ah, %bh	// test F0 and 00 cases
    2.34  	cmpb	%ah, %bh
    2.35  	movb	$EXESTR(no386), %al
    2.36 -#undef NEED386
    2.37 -#ifdef NEED386
    2.38 -	jbe	abort		// C=8086/80186, Z=80286
    2.39 -#else
    2.40  	jbe	is86		// C=8086/80186, Z=80286
    2.41 -#endif
    2.42  is386:
    2.43  	smsww	%ax		// not privileged
    2.44  	andb	$1, %al
    2.45 +	movw	$10, %si
    2.46  	jne	tstvcpi
    2.47  	movl	%cr0, %eax	// privileged
    2.48  	incl	%eax
    2.49 @@ -182,7 +180,6 @@
    2.50  realmode:
    2.51  is86:
    2.52  	call	puts
    2.53 -	movw	$0x0100, %di
    2.54  	movw	comstart-end_header(%di), %si		// .com address
    2.55  	pushw	%di
    2.56  	movb	$0x7C/2, %ch	// 31K-31.5K, > com length
    2.57 @@ -191,15 +188,13 @@
    2.58  	ret
    2.59  
    2.60  VersionVCPI:
    2.61 -	cmpb	$0x40, %dl		// >= 4.0 ?
    2.62 -	jb	NoVCPI
    2.63  	xchgw	%ax, %si		// movb	$EXESTR(vm86modemsg), %al
    2.64 -	jmp	realmode
    2.65 +	cmpb	$0x40, %cl		// EMM386 / VCPI 4.0 mini
    2.66 +	jnc	realmode		// %si = 0
    2.67  tstvcpi:
    2.68  	pushw	%ds
    2.69  	movw	%dx, %ds		// %dx = 0
    2.70  	movw	0x67*4+2, %ds
    2.71 -	movw	$10, %si
    2.72  	lodsw
    2.73  	xorw	$0x4D45, %ax		// EM(MX) or EM(MQ)
    2.74  	lodsw
    2.75 @@ -217,7 +212,7 @@
    2.76  	je	VersionVCPI
    2.77  	int	$0x67
    2.78  	testb	%ah, %ah
    2.79 -	xchgw	%ax, %dx
    2.80 +	xchgw	%ax, %cx
    2.81  	jmp	ChkVCPI
    2.82  CmdVCPI:
    2.83  	.byte	0x40			// status
    2.84 @@ -227,39 +222,36 @@
    2.85  
    2.86  vm86modemsg:
    2.87  // --------------- Must be in 7F40 7FFF range ------------------------
    2.88 -	.ascii	"vm"			// vm86
    2.89 -	.byte	EXESTR(_86)
    2.90 +	.ascii	"vm86"			// vm86 mode
    2.91 +	.byte	EXESTR(mode)
    2.92  ERRvcpi:
    2.93 -	.ascii	"No VCPI-4.0/EMM"	// No VCPI-4.0/EMM386
    2.94 -	.byte	EXESTR(_386)
    2.95 -noDOS3:
    2.96 -	.ascii	"No DOS 3"		// No DOS 3
    2.97 -	.byte	EXESTR(eol)
    2.98 +	.ascii	"EMM"			// EMM386 need
    2.99 +no386:
   2.100 +	.ascii	"386"			// 386 need
   2.101 +	.byte	EXESTR(need)
   2.102  chkerr:
   2.103 -	.ascii	"Broken c"		// Broken code
   2.104 +	.ascii	"Bad c"			// Bad code
   2.105  	.byte	EXESTR(ode)
   2.106  rmPaging:
   2.107  	.ascii	"Un"			// Unreal mode
   2.108  realmodemsg:
   2.109 -	.ascii	"real m"		// real mode
   2.110 +	.ascii	"real"			// real mode
   2.111  // --------------- Must be in 7FC0 7FFF range ------------------------
   2.112 +mode:
   2.113 +	.ascii	" m"
   2.114  ode:
   2.115 -	.ascii	"od"
   2.116 -eeol:
   2.117 -	.ascii  "e"
   2.118 +	.ascii	"ode"
   2.119  	.byte	EXESTR(eol)
   2.120 -no386:
   2.121 -	.ascii	"No "			// No 386
   2.122 -_386:
   2.123 -	.ascii	"3"
   2.124 -_86:
   2.125 -	.ascii	"86"
   2.126 +noDOS3:
   2.127 +	.ascii	"DOS3"			// DOS3 need
   2.128 +need:
   2.129 +	.ascii	" need"
   2.130  	.byte	EXESTR(eol)
   2.131  help:
   2.132 -	.ascii	"SliTaz boot loader"	// SliTaz boot loader
   2.133 +	.ascii	"SliTaz iso boot"	// SliTaz iso boot
   2.134  eol:
   2.135  	.ascii	"\r\n"
   2.136 -	.byte	1
   2.137 +	.byte	1			// putstr will return
   2.138  
   2.139  	.space	16,0			// ISO md5
   2.140  	.org	0x8000
     3.1 --- a/syslinux/stuff/iso2exe/init	Fri Feb 06 22:54:07 2015 +0000
     3.2 +++ b/syslinux/stuff/iso2exe/init	Sat Feb 07 15:39:46 2015 +0100
     3.3 @@ -70,8 +70,9 @@
     3.4  			done >> /tmp/data
     3.5  			while ! grep -q "^$n	" /tmp/data ; do
     3.6  				clear
     3.7 -				[ $(wc -l < /tmp/data) -gt 20 ] && 
     3.8 -				less /tmp/data || cat /tmp/data
     3.9 +				[ $(wc -l < /tmp/data) -gt 22 ] && 
    3.10 +				sed 's/..3.;4.m/===/g;$aPress q to continue' \
    3.11 +				/tmp/data | less || cat /tmp/data
    3.12  				echo -en "\n   <- Enter the selection number\r"
    3.13  				read n
    3.14  			done 2> /dev/null
    3.15 @@ -637,22 +638,24 @@
    3.16  
    3.17  gotisomd5()
    3.18  {
    3.19 +	[ "$(which md5sum 2> /dev/null)" ] &&
    3.20  	[ $(get 18 /dev/loop0) -ne 0 ] && echo -en "\"$1\"	\"$2\""
    3.21  }
    3.22  
    3.23  isomd5()
    3.24  {
    3.25  	dotwait "Checking iso image"
    3.26 -	[ "$(ddq if=/dev/loop0 bs=32k skip=1 | md5sum)" == \
    3.27 +	[ "$(ddq if=/dev/loop0 bs=2k skip=16 \
    3.28 +	     count=$(echo $(get 32848 /dev/loop0)) | md5sum)" == \
    3.29  	  "$(ddq if=/dev/loop0 bs=16 count=1 skip=2047 | od -N 16 -t x1 -An | \
    3.30  	     sed 's/ //g')  -" ] && echo "OK" || echo "ERROR"
    3.31 -	echo -n "Checking iso hybrid boot"
    3.32 +	echo -en "\rChecking iso hybrid boot"
    3.33  	n=$(($(get 2 /dev/loop0)-1+($(get 4 /dev/loop0)-1)*512))
    3.34  	s=$(get 0 /dev/loop0 2 $n | awk '{ i+= $0 } END { print i }')
    3.35  	[ $(((1+$s+$(get $(($n+1)) /dev/loop0 1)) % 65536)) -eq 0 ] &&
    3.36  	echo "OK" || echo "ERROR"
    3.37  	rm -f /tmp/wait
    3.38 -	echo "Press RETURN to continue."
    3.39 +	echo -e "\rPress RETURN to continue."
    3.40  	read n
    3.41  }
    3.42  
    3.43 @@ -746,11 +749,11 @@
    3.44  			$ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
    3.45  			ddq bs=1 seek=446 of=$device
    3.46  		if [ "$(which mkdosfs 2> /dev/null)" ]; then
    3.47 -			losetup -o $((512*$ofs)) /dev/loop0 $device
    3.48 -			mkdosfs -n "SLITAZ BOOT" /dev/loop0
    3.49 +			losetup -o $((512*$ofs)) /dev/loop2 $device
    3.50 +			mkdosfs -n "SLITAZ BOOT" /dev/loop2
    3.51  			words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
    3.52 -				ddq bs=1 seek=28 of=/dev/loop0
    3.53 -			losetup -d /dev/loop0
    3.54 +				ddq bs=1 seek=28 of=/dev/loop2
    3.55 +			losetup -d /dev/loop2
    3.56  		fi
    3.57   	fi ; }
    3.58  }
    3.59 @@ -831,7 +834,8 @@
    3.60  {
    3.61  	n=0
    3.62  	dotwait "Extract filesystem..."
    3.63 -	for i in $(ls_r /media/cdrom/boot/rootfs*); do
    3.64 +	for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
    3.65 +		grep -q ' lm ' /proc/cpuinfo && [ -s ${i}64 ] && i=${i}64
    3.66  		[ $((n++)) -eq 0 ] || uncpio $i
    3.67  	done
    3.68  	rm -f /tmp/wait
     4.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh	Fri Feb 06 22:54:07 2015 +0000
     4.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh	Sat Feb 07 15:39:46 2015 +0100
     4.3 @@ -205,7 +205,8 @@
     4.4  	*)	cat > /dev/null
     4.5  	esac
     4.6  	
     4.7 -	[ ! -s "$1" ] && echo "usage: $0 image.iso [--undo]" 1>&2 && exit 1
     4.8 +	[ ! -s "$1" ] &&
     4.9 +	echo "usage: $0 image.iso [--undo|\"DOS help message\"]" 1>&2 && exit 1
    4.10  	case "${2/--/-}" in
    4.11  	-u*|-r*|-w*)
    4.12  	    case "$(get 0 $1)" in
    4.13 @@ -237,10 +238,13 @@
    4.14  	add_fdbootstrap $1
    4.15  	printf "%d free bytes in %04X..%04X\n" $(($OFS-$HOLE)) $HOLE $OFS
    4.16  	store 26 ${RANDOM:-0} $1
    4.17 -	if [ $(stat -c %s $1) -gt 32768 ]; then
    4.18 -		echo "Adding ISO image md5 ..."
    4.19 -		echo -en "$(ddq if=$1 bs=32k skip=1 | md5sum | cut -c-32 | sed \
    4.20 -		  's/\(..\)/\\x\1/g')" | ddq bs=16 seek=2047 conv=notrunc of=$1
    4.21 +	[ "$2" ] && echo "$2               " | \
    4.22 +		ddq bs=1 seek=$((0x7FDE)) count=15 conv=notrunc of=$1
    4.23 +	if [ $(stat -c %s $1) -gt 34816 ]; then
    4.24 +		echo "Adding ISO image md5 at 7FF0 (16 bytes) ..."
    4.25 +		echo -en "$(ddq if=$1 bs=2k skip=16 count=$(get 32848 $1) | \
    4.26 +			md5sum | cut -c-32 | sed 's/\(..\)/\\x\1/g')" | \
    4.27 +			ddq bs=16 seek=2047 conv=notrunc of=$1
    4.28  	fi
    4.29  	echo -n "Adding boot checksum..."
    4.30  	store 64 $(od -v -j 66 -N 32702 -t u2 -w2 -An $1 | \
     5.1 --- a/syslinux/stuff/iso2exe/libdos.c	Fri Feb 06 22:54:07 2015 +0000
     5.2 +++ b/syslinux/stuff/iso2exe/libdos.c	Sat Feb 07 15:39:46 2015 +0100
     5.3 @@ -189,3 +189,27 @@
     5.4  		mov	_versiondos, ax
     5.5  #endasm
     5.6  }
     5.7 +
     5.8 +void copycmdline(char store[])
     5.9 +{
    5.10 +#asm
    5.11 +		push	si
    5.12 +		push	di
    5.13 +		push	ds
    5.14 +		pop	es
    5.15 +		mov	si, #0x81
    5.16 +space:
    5.17 +		seg	cs
    5.18 +		lodsb
    5.19 +		cmp	al, #0x20
    5.20 +		je	space
    5.21 +		dec	si
    5.22 +		mov	di, [bp+4]
    5.23 +		mov	cx, #0x80/2
    5.24 +		rep
    5.25 +		 seg	cs
    5.26 +		  movsw
    5.27 +		pop	di
    5.28 +		pop	si
    5.29 +#endasm
    5.30 +}
     6.1 --- a/syslinux/stuff/iso2exe/libdos.h	Fri Feb 06 22:54:07 2015 +0000
     6.2 +++ b/syslinux/stuff/iso2exe/libdos.h	Sat Feb 07 15:39:46 2015 +0100
     6.3 @@ -9,10 +9,18 @@
     6.4  extern void dosshutdown(void);
     6.5  extern int versiondos;
     6.6  extern int dosversion(void);
     6.7 +extern void copycmdline(char store[]);
     6.8  # else
     6.9  #define progname() (argv[0])
    6.10  #define chdirname(x) chdir(dirname(x))
    6.11  #define dosshutdown()
    6.12  #define dosversion() (0)
    6.13 +#define copycmdline(x) { \
    6.14 +	int n; \
    6.15 +	char *s, *p; \
    6.16 +	for (n = 1, s = x; n < argc; n++, *s++ = ' ') \
    6.17 +		for (p = argv[n]; *p; *s++ = *p++); \
    6.18 +	*s = 0; \
    6.19 +}
    6.20  # endif
    6.21  #endif