wok-current rev 6715

linux/bootloader.sh: fix signed 16bits
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Oct 14 17:08:12 2010 +0200 (2010-10-14)
parents 3bff7f88b1c8
children 5abda65ec235
files linux/stuff/bootloader.sh
line diff
     1.1 --- a/linux/stuff/bootloader.sh	Thu Oct 14 13:41:19 2010 +0200
     1.2 +++ b/linux/stuff/bootloader.sh	Thu Oct 14 17:08:12 2010 +0200
     1.3 @@ -10,8 +10,10 @@
     1.4  {
     1.5  cat <<EOT
     1.6  Usage: $0 bzImage [--prefix image_prefix] [--cmdline 'args']
     1.7 -       [--rdev device] [--video mode] [--flags rootflags] 
     1.8 -       [--format 1440|1680|1720|2880 ] [--initrd initrdfile]...
     1.9 +       [--rdev device] [--video mode] [--flags rootflags] [--tracks cnt]
    1.10 +       [--format 1440|1680|1920|2880 ] [--initrd initrdfile]...
    1.11 +
    1.12 +Default values: --format 1440 --tracks 80 --prefix floppy.
    1.13  
    1.14  Example:
    1.15  $0 /boot/vmlinuz-2.6.30.6 --rdev /dev/ram0 --video -3 --cmdline 'rw lang=fr_FR kmap=fr-latin1 laptop autologin' --initrd /boot/rootfs.gz --initrd ./myconfig.gz
    1.16 @@ -27,6 +29,7 @@
    1.17  RDEV=""
    1.18  VIDEO=""
    1.19  FLAGS=""
    1.20 +TRACKS=""
    1.21  DEBUG=""
    1.22  while [ -n "$1" ]; do
    1.23  	case "$1" in
    1.24 @@ -37,18 +40,26 @@
    1.25  	--fl*)     FLAGS="$2"; shift;;	# 1 read-only, 0 read-write
    1.26  	--r*|-r*)  RDEV="$2"; shift;;	# /dev/???
    1.27  	--v*|-v*)  VIDEO="$2"; shift;;	# -3 .. n
    1.28 +	--t*|-t*)  TRACKS="$2"; shift;; # likely 81 .. 84
    1.29  	--debug)   DEBUG="1";;
    1.30  	*) KERNEL="$1";;
    1.31  	esac
    1.32  	shift
    1.33  done
    1.34  [ -n "$KERNEL" -a -f "$KERNEL" ] || usage
    1.35 +if [ -n "$TRACKS" ]; then
    1.36 +	if [ $(( $FORMAT % $TRACKS )) -ne 0 ]; then
    1.37 +		echo "Invalid track count for format $FORMAT."
    1.38 +		usage
    1.39 +	fi
    1.40 +fi
    1.41  
    1.42  # write a 16 bits data
    1.43  # usage: store16 offset data16 file
    1.44  store16()
    1.45  {
    1.46 -	echo $2 | awk '{ printf "\\\\x%02X\\\\x%02X",$1%256,($1/256)%256 }' | \
    1.47 +	echo $(( $2 + 0x10000 )) | \
    1.48 +		awk '{ printf "\\\\x%02X\\\\x%02X",$1%256,($1/256)%256 }' | \
    1.49  		xargs echo -en | \
    1.50  	dd bs=2 conv=notrunc of=$3 seek=$(( $1 / 2 )) 2> /dev/null
    1.51  	[ -n "$DEBUG" ] && printf "store16(%04X) = %04X\n" $1 $2 1>&2
    1.52 @@ -76,6 +87,7 @@
    1.53  floppyset()
    1.54  {
    1.55  	# bzImage offsets
    1.56 +	CylinderCount=496
    1.57  	SetupSzOfs=497
    1.58  	FlagsOfs=498
    1.59  	SyssizeOfs=500
    1.60 @@ -118,19 +130,24 @@
    1.61  	setupszb=$(( $setupsz & 255 ))
    1.62  	dd if=$KERNEL bs=512 skip=1 count=$setupszb 2> /dev/null >> $bs
    1.63  
    1.64 +	if [ -n "$TRACKS" ]; then
    1.65 +		[ -n "$DEBUG" ] && echo -n "--tracks " 1>&2
    1.66 +		n=$(getlong $CylinderCount $bs)
    1.67 +		store16 $CylinderCount $(( ($n & -256) + $TRACKS )) $bs
    1.68 +	fi
    1.69  	if [ -n "$FLAGS" ]; then
    1.70  		[ -n "$DEBUG" ] && echo -n "--flags " 1>&2
    1.71 -		store16 $FlagsOfs $(( $FLAGS )) $bs
    1.72 +		store16 $FlagsOfs $FLAGS $bs
    1.73  	fi
    1.74  	if [ -n "$VIDEO" ]; then
    1.75  		[ -n "$DEBUG" ] && echo -n "--video " 1>&2
    1.76 -		store16 $VideoModeOfs $(( $VIDEO )) $bs
    1.77 +		store16 $VideoModeOfs $VIDEO $bs
    1.78  	fi
    1.79  	if [ -n "$RDEV" ]; then
    1.80  		[ -n "$DEBUG" ] && echo -n "--rdev " 1>&2
    1.81  		n=$(stat -c '0x%02t%02T' $RDEV 2> /dev/null)
    1.82  		[ -n "$n" ] || n=$RDEV
    1.83 -		store16 $RootDevOfs $(( $n )) $bs
    1.84 +		store16 $RootDevOfs $n $bs
    1.85  	fi
    1.86  
    1.87  	# Store cmdline after setup
    1.88 @@ -186,6 +203,10 @@
    1.89  	rm -f $bs
    1.90  }
    1.91  
    1.92 +if [ "$FORMAT" == "0" ]; then # unsplitted
    1.93 +	floppyset > $PREFIX
    1.94 +	exit
    1.95 +fi
    1.96  floppyset | split -b ${FORMAT}k /dev/stdin floppy$$
    1.97  i=1
    1.98  ls floppy$$* | while read file ; do