wok rev 19827

syslinux/iso2exe: follow boot flag
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Mar 08 15:32:40 2017 +0100 (2017-03-08)
parents 008ac2992c52
children fd4b65b5c1de
files syslinux/stuff/iso2exe/bootiso.S syslinux/stuff/iso2exe/iso2exe.sh
line diff
     1.1 --- a/syslinux/stuff/iso2exe/bootiso.S	Tue Mar 07 12:21:16 2017 +0100
     1.2 +++ b/syslinux/stuff/iso2exe/bootiso.S	Wed Mar 08 15:32:40 2017 +0100
     1.3 @@ -32,14 +32,16 @@
     1.4  
     1.5  moved	=	0x8000
     1.6  start0:
     1.7 -	pushw	%dx			// restore %sp
     1.8 -	incw	%bp			// restore %bp
     1.9 +	//pushw	%dx			// restore %sp
    1.10 +	//incw	%bp			// restore %bp
    1.11  	xorw	%bx, %bx
    1.12  	movw	%bx, %ds
    1.13  	movb	$0x7C, %bh
    1.14 +	pushw	%ds
    1.15 +	popw	%ss
    1.16 +	movw	%bx, %sp
    1.17  	pushw	%bx			// return address
    1.18 -	pushaw
    1.19 -	movw	%sp, %bp
    1.20 +	pushw	%di
    1.21  	pushw	%es			// save %es:%di
    1.22  	cld
    1.23  	sti
    1.24 @@ -47,7 +49,7 @@
    1.25  	popw	%es
    1.26  	call	setreg
    1.27  	rep
    1.28 -	movsw
    1.29 +	  movsw
    1.30  	movw	$0x80, %dx
    1.31  	ljmp	$0, $moved+start2
    1.32  	.byte	0
    1.33 @@ -71,11 +73,11 @@
    1.34  
    1.35  dxfound:
    1.36  	call	readsectorX		// read isolinux boot sector
    1.37 -	movw	%dx, 10(%bp)
    1.38  	cmpw	(%bx), %cx
    1.39  	jnc	puts			// read fail or no isohydrid boot sector
    1.40 +	movw	$patch,%si
    1.41  	popw	%es
    1.42 -	popa				// isolinux boot needs %es:%di and %dx
    1.43 +	popw	%di			// isolinux boot needs %es:%di and %dx
    1.44  putsret:
    1.45  	ret
    1.46  
    1.47 @@ -118,6 +120,58 @@
    1.48  	ret
    1.49  	.org	0x01B8
    1.50  
    1.51 +////////////////////////// partition boot code ////////////////////////////////
    1.52 +// assume CS=DS=SS=0 BX=7C00 DL=<drive> SI=7DBE
    1.53 +
    1.54 +	.org	0x7C00
    1.55 +	jmp	bootpartition
    1.56 +	.org	0x7C03
    1.57 +	.org	0x7DBE
    1.58 +table	=	moved+0x1BE
    1.59 +patch:
    1.60 +	.byte	0,0,0			// head of original bs
    1.61 +partcode:
    1.62 +	popw	%di
    1.63 +	movw	$table,%si
    1.64 +	call	movepartition
    1.65 +	movb	$4,%cl
    1.66 +	movw	$table-16,%di
    1.67 +next:
    1.68 +	addw	$16,%di
    1.69 +	cmpb	%ch,(%di)		// boot flag ?
    1.70 +	loope	next
    1.71 +	pushw	%ds
    1.72 +	pushw	%ds
    1.73 +	pushl	8(%di)
    1.74 +	pushw	%ds
    1.75 +	pushw	%bx
    1.76 +	pushw	$1
    1.77 +	pushw	$0x10
    1.78 +	movw	%sp,%si			// assume %ds = %ss
    1.79 +	movb	$0x42,%ah
    1.80 +	pushw	%bx
    1.81 +	cmpw	$63,2(%di)		// empty or isolinux partition ?
    1.82 +	jbe	default
    1.83 +	int	$0x13
    1.84 +default:
    1.85 +	ret
    1.86 +	.org	0x7DEF
    1.87 +bootpartition:
    1.88 +	pushw	%ds
    1.89 +	popw	%es
    1.90 +	pushw	%si
    1.91 +	movw	%bx,%di
    1.92 +	movsw
    1.93 +	movsb
    1.94 +	movw	$partcode+0x100,%di
    1.95 +	pushw	%di
    1.96 +movepartition:
    1.97 +	movw	$66/2,%cx
    1.98 +	rep
    1.99 +	  movsw
   1.100 +	ret
   1.101 +	.org	0x7E00
   1.102 +
   1.103  	.org	0x7F48
   1.104  ////////////////////////////// DOS EXE code ///////////////////////////////////
   1.105  
     2.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh	Tue Mar 07 12:21:16 2017 +0100
     2.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh	Wed Mar 08 15:32:40 2017 +0100
     2.3 @@ -118,12 +118,17 @@
     2.4  	ddq if=/tmp/exe$$ of=$1 bs=1 count=24 seek=$((0x1A0)) skip=$((0x1A0)) conv=notrunc
     2.5  	ddq if=$2 bs=1 skip=$((0x1B8)) seek=$((0x1B8)) count=72 of=$1 conv=notrunc
     2.6  	store 510 $((0xAA55)) $1
     2.7 -	rm -f /tmp/exe$$ /tmp/coff$$
     2.8  	i=$SIZE; OFS=$(($SIZE+512))
     2.9  	[ -n "$mac" ] && OFS=$SIZE && i=1536
    2.10  	store 417 $(($i/512)) $1 8
    2.11  	printf "Moving syslinux hybrid boot record at %04X (512 bytes) ...\n" $i
    2.12  	ddq if=$2 bs=1 count=512 of=$1 seek=$i conv=notrunc
    2.13 +	if [ $(get $((0x7C00)) /tmp/exe$$) -eq 60649 ]; then
    2.14 +		ddq if=/tmp/exe$$ bs=1 count=66 skip=$((0x7DBE)) of=$1 seek=$(($i + 0x1BE)) conv=notrunc
    2.15 +		ddq if=$1 bs=1 count=3 skip=$i of=$1 seek=$(($i + 0x1BE)) conv=notrunc
    2.16 +		ddq if=/tmp/exe$$ bs=1 count=3 skip=$((0x7C00)) of=$1 seek=$i conv=notrunc
    2.17 +	fi
    2.18 +	rm -f /tmp/exe$$ /tmp/coff$$
    2.19  	if [ -z "$RECURSIVE_PARTITION" ]; then
    2.20  		store 464 $((1+$i/512)) $1 8
    2.21  		store 470 $(($i/512)) $1 8
    2.22 @@ -265,6 +270,11 @@
    2.23  		fileofs $f
    2.24  		[ $SIZE -eq 0 ] ||
    2.25  		ddq bs=1 count=$SIZE skip=$OFFSET if="$ISO" >$f
    2.26 +		if [ "$f" == "syslinux.mbr" ] && [ $(get 0 "$f") -eq 60649 ]; then
    2.27 +			ddq bs=1 conv=notrunc if="$f" of="$f" skip=$((0x1BE)) seek=0 count=3
    2.28 +			ddq bs=1 skip=$((0x1BE)) count=66 if="$ISO" | \
    2.29 +				ddq bs=1 seek=$((0x1BE)) count=66 of="$f" conv=notrunc
    2.30 +		fi
    2.31  	done
    2.32  }
    2.33  
    2.34 @@ -522,7 +532,7 @@
    2.35  	esac
    2.36  	case "$(get 0 $1)" in
    2.37  	23117)	echo "The file $1 is already an EXE file." 1>&2 && exit 1;;
    2.38 -	0)	[ -x /usr/bin/isohybrid ] && isohybrid $1;;
    2.39 +	0)	[ -x /usr/bin/isohybrid ] && isohybrid -entry 2 $1;;
    2.40  	esac
    2.41  
    2.42  	gpt= ; [ $(get 466 $1) -eq 65263 ] && gpt=1