tazpanel annotate bootloader @ rev 567
hardware.cgi: fix detect-usb output
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Feb 14 10:14:04 2016 +0100 (2016-02-14) |
parents | d7b7403d5f2a |
children | bf8941ab3cc3 |
rev | line source |
---|---|
pascal@516 | 1 #!/bin/sh |
pascal@516 | 2 # |
pascal@516 | 3 # This script creates a floppy image set from a linux bzImage and can merge |
pascal@516 | 4 # a cmdline and/or one or more initramfs. |
pascal@516 | 5 # |
pascal@516 | 6 # (C) 2009-2015 Pascal Bellard - GNU General Public License v3. |
pascal@516 | 7 |
pascal@516 | 8 usage() |
pascal@516 | 9 { |
pascal@516 | 10 cat <<EOT |
pascal@516 | 11 Usage: $0 bzImage [--prefix image_prefix] [--info file] [--quiet] |
pascal@516 | 12 [--format 1200|1440|1680|1920|2880|...] [--mem mb] [--tracks cnt] |
pascal@516 | 13 [--rdev device] [--video mode] [--flags rootflags] [--no-syssize-fix] |
pascal@516 | 14 [--dont-edit-cmdline] [--cmdline 'args'] [--hide-version-string] |
pascal@516 | 15 [--address-initrd address] [--initrd initrdfile]... |
pascal@516 | 16 |
pascal@516 | 17 Default values: --format 1440 --tracks 80 --rdev /dev/fd0 --prefix floppy. --mem 16 |
pascal@516 | 18 |
pascal@516 | 19 Example: |
pascal@516 | 20 $0 /boot/bzImage --rdev /dev/ram0 --video -3 --cmdline 'rw lang=fr_FR kmap=fr-latin1 laptop autologin' --initrd /boot/rootfs.gz --initrd ./myconfig.gz |
pascal@516 | 21 |
pascal@516 | 22 or: $0 --extract floppy* |
pascal@516 | 23 |
pascal@516 | 24 Create kernel and maybe cmdline, initrd and info files from a floppy images set |
pascal@516 | 25 EOT |
pascal@516 | 26 exit 1 |
pascal@516 | 27 } |
pascal@516 | 28 |
pascal@516 | 29 # bzImage offsets |
pascal@516 | 30 SetupSzOfs=497 |
pascal@516 | 31 FlagsOfs=498 |
pascal@516 | 32 OldRamfsLenOfs=504 |
pascal@516 | 33 VideoModeOfs=506 |
pascal@516 | 34 RootDevOfs=508 |
pascal@516 | 35 Magic=0x202 |
pascal@516 | 36 RamfsAdrOfs=0x218 |
pascal@516 | 37 RamfsLenOfs=0x21C |
pascal@516 | 38 |
pascal@516 | 39 ddq() { dd $@ 2> /dev/null; } |
pascal@516 | 40 |
pascal@516 | 41 get() |
pascal@516 | 42 { |
pascal@516 | 43 echo $( od -v -j $(($1)) -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} -An $2 2>/dev/null || |
pascal@516 | 44 hexdump -v -s $(($1)) -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\n\"" $2 ) |
pascal@516 | 45 } |
pascal@516 | 46 |
pascal@516 | 47 trace() |
pascal@516 | 48 { |
pascal@516 | 49 [ -n "$DEBUG" ] && printf "$@" 1>&2 && echo 1>&2 |
pascal@516 | 50 } |
pascal@516 | 51 |
pascal@516 | 52 # usage: store bits offset data file |
pascal@516 | 53 store() |
pascal@516 | 54 { |
pascal@516 | 55 n=$3; for i in $(seq 8 8 $1); do |
pascal@516 | 56 printf '\\\\x%02X' $(($n & 255)) |
pascal@516 | 57 n=$(($n >> 8)) |
pascal@516 | 58 done | xargs echo -en | ddq bs=1 conv=notrunc of=$4 seek=$(($2)) |
pascal@516 | 59 s=$1; a=$2; d=$3; shift 4; c="$@" |
pascal@516 | 60 trace "store$s(%03X) = %0$(($s/4))X $c" $a $d |
pascal@516 | 61 } |
pascal@516 | 62 |
pascal@516 | 63 die() |
pascal@516 | 64 { |
pascal@516 | 65 echo $@ 1>&2 |
pascal@516 | 66 exit 1 |
pascal@516 | 67 } |
pascal@516 | 68 extract() |
pascal@516 | 69 { |
pascal@516 | 70 shift |
pascal@516 | 71 [ ! -s "$1" ] && die "No floppy ?" |
pascal@516 | 72 [ $(get 0x1FE "$1") -ne 43605 ] && die "Not bootable" |
pascal@516 | 73 [ $(get $Magic "$1" 4) != 1400005704 ] && |
pascal@516 | 74 [ $(get 0x1F4 "$1") -gt 32768 -o $(get 0x1F6 "$1") -ne 0 ] && |
pascal@516 | 75 die "Not linux." |
pascal@516 | 76 FORMAT="$(($(stat -c "%s" $1)/1024))" |
pascal@516 | 77 cat <<EOT |
pascal@516 | 78 --format $FORMAT |
pascal@516 | 79 --rdev $(printf "0x%04X" $(get $RootDevOfs $1)) |
pascal@516 | 80 --video $(get $VideoModeOfs $1) |
pascal@516 | 81 --flags $(get $FlagsOfs $1) |
pascal@516 | 82 EOT |
pascal@516 | 83 MYBB="$(ddq if=$1 bs=512 count=1 | strings | grep "Insert disk 00")" |
pascal@516 | 84 cmdline=0 |
pascal@516 | 85 info=0 |
pascal@516 | 86 if [ "$MYBB" ]; then |
pascal@516 | 87 cmdline=$(get 0x22 $1) |
pascal@516 | 88 info=$(get 0x1EF $1) |
pascal@516 | 89 [ $(get 0x75 $1) -eq $((0xDB0)) ] && echo "--dont-edit-cmdline" |
pascal@516 | 90 [ $(get 0x58 $1) -eq $((0x9090)) ] && echo "--hide-version-string" |
pascal@516 | 91 fi |
pascal@516 | 92 n=$(($(get $SetupSzOfs $1 1)+1)) |
pascal@516 | 93 [ $n -eq 1 ] && n=5 |
pascal@516 | 94 [ $info -ne 0 ] && infolen=$(($n-$info/512)) && n=$(($info/512)) |
pascal@516 | 95 [ $cmdline -ne 0 ] && n=$(($cmdline/512)) |
pascal@516 | 96 cat "$@" | { |
pascal@516 | 97 ddq bs=512 count=$n >kernel |
pascal@516 | 98 files="kernel" |
pascal@516 | 99 if [ "$MYBB" ]; then |
pascal@516 | 100 store 8 $SetupSzOfs $(($n-1)) kernel "setup size $n" |
pascal@516 | 101 store 16 0x22 0 kernel "clear cmdline" |
pascal@516 | 102 store 16 0x1EF 0 kernel "clear info" |
pascal@516 | 103 fi |
pascal@516 | 104 [ $cmdline -ne 0 ] && files="$files cmdline" && |
pascal@516 | 105 ddq bs=512 count=1 | strings | sed q > cmdline |
pascal@516 | 106 [ $info -ne 0 ] && files="$files info" && |
pascal@516 | 107 ddq bs=512 count=$infolen | sed \ |
pascal@516 | 108 's/'$(echo -en "\xff\xff$//;s/\xff/\f")'/g;s/\r/\n/g;q' > info |
pascal@516 | 109 syssz=$(get 0x1F4 kernel 4) |
pascal@516 | 110 ddq bs=16 count=$syssz >>kernel |
pascal@516 | 111 [ $(($syssz % 32)) -ne 0 ] && |
pascal@516 | 112 ddq bs=16 of=/dev/null count=$((32 - ($syssz % 32))) |
pascal@516 | 113 if [ $(get $Magic kernel 4) == 1400005704 ]; then |
pascal@516 | 114 ddq bs=1 count=200 skip=$((512+$(get 0x20E kernel 2))) \ |
pascal@516 | 115 if=kernel | strings | sed q |
pascal@516 | 116 len=$(get $RamfsLenOfs kernel 4) |
pascal@516 | 117 if [ $len -ne 0 ]; then |
pascal@516 | 118 adrs=$(get $RamfsAdrOfs kernel 4) |
pascal@516 | 119 printf "--address-initrd 0x%X \n" $adrs |
pascal@516 | 120 echo "--mem $(((($adrs+$len)/1024+512)/1024))" |
pascal@516 | 121 ddq bs=512 count=$((($len+511)/512)) > initrd |
pascal@516 | 122 ddq count=0 bs=1 seek=$len of=initrd |
pascal@516 | 123 files="$files initrd" |
pascal@516 | 124 store 64 $RamfsAdrOfs 0 kernel "reset initrd" |
pascal@516 | 125 fi |
pascal@516 | 126 if [ $(get 0x206 kernel) -ge 514 ]; then |
pascal@516 | 127 store 32 0x228 0 kernel "clean cmdline32" |
pascal@516 | 128 fi |
pascal@516 | 129 else |
pascal@516 | 130 len=$(get $OldRamfsLenOfs kernel) |
pascal@516 | 131 [ $len -ne 0 ] && files="$files initrd" && |
pascal@516 | 132 if [ -s "$2" ]; then |
pascal@516 | 133 ddq if=$2 bs=1024 count=$len of=initrd |
pascal@516 | 134 else |
pascal@516 | 135 ddq if=$1 bs=1024 skip=256 count=$len of=initrd |
pascal@516 | 136 fi |
pascal@516 | 137 fi |
pascal@516 | 138 ls -l $files |
pascal@516 | 139 } |
pascal@516 | 140 exit |
pascal@516 | 141 } |
pascal@516 | 142 |
pascal@516 | 143 KERNEL="" |
pascal@516 | 144 INITRD="" |
pascal@516 | 145 ADRSRD="" |
pascal@516 | 146 CMDLINE="" |
pascal@516 | 147 PREFIX="floppy." |
pascal@516 | 148 FORMAT="1440" |
pascal@516 | 149 RDEV="" |
pascal@516 | 150 VIDEO="" |
pascal@516 | 151 FLAGS="" |
pascal@516 | 152 TRACKS="80" |
pascal@516 | 153 MEM="16" |
pascal@516 | 154 HIDE="" |
pascal@516 | 155 NOEDIT="" |
pascal@516 | 156 QUIET="" |
pascal@516 | 157 NOSYSSIZEFIX="" |
pascal@516 | 158 INFOFILE="" |
pascal@516 | 159 DEBUG="" |
pascal@516 | 160 while [ -n "$1" ]; do |
pascal@516 | 161 case "${1/--/-}" in |
pascal@516 | 162 -c*) CMDLINE="$2"; shift;; |
pascal@516 | 163 -inf*) INFOFILE="$2"; shift;; |
pascal@516 | 164 -i*) INITRD="$INITRD $2"; shift;; |
pascal@516 | 165 -a*) ADRSRD="$2"; shift;; |
pascal@516 | 166 -h*) HIDE="1";; |
pascal@516 | 167 -p*) PREFIX="$2"; shift;; |
pascal@516 | 168 -fl*)FLAGS="$2"; shift;; # 1 read-only, 0 read-write |
pascal@516 | 169 -f*) FORMAT="$2"; shift;; |
pascal@516 | 170 -m*) MEM="$(echo $2 | sed 's/[^0-9]//g')"; shift;; |
pascal@516 | 171 -r*) RDEV="$2"; shift;; |
pascal@516 | 172 -v*) VIDEO="$2"; shift;; # -3 .. n |
pascal@516 | 173 -t*) TRACKS="$2"; shift;; # likely 81 .. 84 |
pascal@516 | 174 -n*) NOSYSSIZEFIX="1";; |
pascal@516 | 175 -debug) DEBUG="1";; |
pascal@516 | 176 -d*) NOEDIT="1";; |
pascal@516 | 177 -q*) QUIET="1";; |
pascal@516 | 178 -e*) extract "$@";; |
pascal@516 | 179 *) KERNEL="$1";; |
pascal@516 | 180 esac |
pascal@516 | 181 shift |
pascal@516 | 182 done |
pascal@516 | 183 [ -n "$KERNEL" -a -f "$KERNEL" ] || usage |
pascal@516 | 184 while [ -L "$KERNEL" ]; do KERNEL="$(readlink "$KERNEL")"; done |
pascal@516 | 185 if [ $(( $FORMAT % $TRACKS )) -ne 0 ]; then |
pascal@516 | 186 echo "Invalid track count for format $FORMAT." |
pascal@516 | 187 usage |
pascal@516 | 188 fi |
pascal@516 | 189 [ 0$MEM -lt 2 ] && MEM=2 |
pascal@516 | 190 |
pascal@516 | 191 patch() |
pascal@516 | 192 { |
pascal@516 | 193 echo -en $(echo ":$2" | sed 's/:/\\x/g') | \ |
pascal@516 | 194 ddq bs=1 conv=notrunc of=$3 seek=$((0x$1)) |
pascal@516 | 195 trace "patch $1 $2 $4" |
pascal@516 | 196 } |
pascal@516 | 197 |
pascal@516 | 198 error() |
pascal@516 | 199 { |
pascal@516 | 200 rm -f $bs |
pascal@516 | 201 die $@ |
pascal@516 | 202 } |
pascal@516 | 203 |
pascal@516 | 204 floppyset() |
pascal@516 | 205 { |
pascal@516 | 206 # boot+setup address |
pascal@516 | 207 SetupBase=0x90000 |
pascal@516 | 208 |
pascal@516 | 209 bs=/tmp/bs$$ |
pascal@516 | 210 |
pascal@516 | 211 # Get and patch boot sector |
pascal@516 | 212 # See http://hg.slitaz.org/wok/raw-file/13835bce7189/syslinux/stuff/iso2exe/bootloader.S |
pascal@516 | 213 trace "Read bootsector..." |
pascal@516 | 214 ddq if=$KERNEL bs=512 count=1 of=$bs |
pascal@516 | 215 |
pascal@516 | 216 [ $(get 0x1FE $bs) -eq 43605 ] || error "Not bootable" |
pascal@516 | 217 |
pascal@516 | 218 uudecode <<EOT | ddq of=$bs conv=notrunc |
pascal@516 | 219 begin-base64 644 - |
pascal@516 | 220 v8adaACQF4n8FgcxwLk7APOqWx+g8X1AD6H6xXd4XwZXvQAAsQbzpRYfZGaP |
pascal@516 | 221 R3jGRfg/l1hB6CQBMfYLNu8BdAzoggF0B+hgATwbdfS+AAKBTBAggMZEJZvo |
pascal@516 | 222 ZwEx9gt3G3Q6x0cZP6PoWwGwIOgtASwYc/lO6DEBmDwIdAOIBK05dxt08OgV |
pascal@516 | 223 ATwKdd+IfP4WB78AgIn+h3cbtQLzpFuJ5v9IEMdAFAiTgPMIdfO79AGxBaEV |
pascal@516 | 224 AmaLH2ZLZtPrZkOJRBtmv4AAAABmKfuccwIB31BTVjHbaACAB+hwAF5bjMG0 |
pascal@516 | 225 hxYHzRVYBQABEEwfnXfPuQkCuxwCOE/+che0iM0VPQCwcgaIbB+Ib/+hGQLT |
pascal@516 | 226 b+J1o5fNE+oAACCQWjjBdzRgzRP56HMAYVJQKMh3ArABOfhyAon4ULQCzRNa |
pascal@516 | 227 WHLclQHRjukA1wDXKddadE2M6ZU4wXXUiMixATDOdcz+xYD9UHXFtQBgvtEB |
pascal@516 | 228 U7sPAIAg8Ev+AIA4OXf16EwAW4n16CkAdRVSmM0TuAECzRNa0NQ6Zv516kVI |
pascal@516 | 229 debrjbAxHAO0DrsHAM0QPA1088O/bARkxgWmuA0BZDoldArNFnT0mM0WjudH |
pascal@516 | 230 wwN0DrAN6NL/rDwAf/jDSW5zZXJ0IGRpc2sgMDAxIGFuZCBFbnRlci4HDQAA |
pascal@516 | 231 AAA= |
pascal@516 | 232 ==== |
pascal@516 | 233 EOT |
pascal@516 | 234 # Get setup |
pascal@516 | 235 setupsz=$(get $SetupSzOfs $bs 1) |
pascal@516 | 236 if [ $setupsz -eq 0 ]; then |
pascal@516 | 237 setupsz=4 |
pascal@516 | 238 store 8 $SetupSzOfs $setupsz $bs "setup size $setupsz" |
pascal@516 | 239 fi |
pascal@516 | 240 trace "Read setup ($setupsz sectors) ..." |
pascal@516 | 241 ddq if=$KERNEL bs=512 skip=1 count=$setupsz >> $bs |
pascal@516 | 242 |
pascal@516 | 243 Version=$(get 0x206 $bs) |
pascal@516 | 244 [ $(get $Magic $bs 4) != 1400005704 ] && Version=0 |
pascal@516 | 245 feature="" |
pascal@516 | 246 while read prot kern info ; do |
pascal@516 | 247 [ $Version -lt $((0x$prot)) ] && continue |
pascal@516 | 248 feature="features $prot starting from kernel $kern " |
pascal@516 | 249 done <<EOT |
pascal@516 | 250 200 1.3.73 kernel_version, bzImage, initrd, loadflags/type_of_loader |
pascal@516 | 251 201 1.3.76 heap_end_ptr |
pascal@516 | 252 202 2.4.0 new cmdline + relocatable setup |
pascal@516 | 253 204 2.6.14 long syssize |
pascal@516 | 254 206 2.6.22 cmdline maxsize $(get 0x238 $bs 4) |
pascal@516 | 255 EOT |
pascal@516 | 256 trace "Protocol %X $feature" $Version |
pascal@516 | 257 |
pascal@516 | 258 # Old kernels need bootsector patches to disable rescent features |
pascal@516 | 259 while read minversion maxversion offset bytes rem; do |
pascal@516 | 260 [ $Version -gt $(( 0x$maxversion )) ] && continue |
pascal@516 | 261 [ $Version -lt $(( 0x$minversion )) ] && continue |
pascal@516 | 262 patch $offset $bytes $bs "$rem" |
pascal@516 | 263 done <<EOT |
pascal@516 | 264 000 1FF 0B2 B8:00:01 force zImage (movw \$0x100, %ax) |
pascal@516 | 265 000 1FF 0F9 EB skip initrd code |
pascal@516 | 266 000 1FF 059 90:90:90 no kernel version |
pascal@516 | 267 000 1FF 050 90:90:90:90:90 type_of_loader |
pascal@516 | 268 000 200 055 90:90:90:90 heap_end_ptr |
pascal@516 | 269 000 203 1F6 00:00 syssize32 |
pascal@516 | 270 EOT |
pascal@516 | 271 [ -n "$CMDLINE" ] || patch 061 EB $bs "No cmdline" |
pascal@516 | 272 [ -n "$HIDE" ] && patch 058 90 90 90 $bs "Hide version" |
pascal@516 | 273 [ -n "$NOEDIT" ] && patch 075 B0:0D:90 $bs 'mov CR,%al ; nop' |
pascal@516 | 274 [ 1$TRACKS -ne 180 ] && store 8 0x15F $TRACKS $bs TRACKS |
pascal@516 | 275 |
pascal@516 | 276 [ -n "$FLAGS" ] && store 16 $FlagsOfs $FLAGS $bs FLAGS |
pascal@516 | 277 [ -n "$VIDEO" ] && store 16 $VideoModeOfs $VIDEO $bs VIDEO |
pascal@516 | 278 [ -n "$RDEV" ] || case "$FORMAT" in |
pascal@516 | 279 1200) RDEV=0x0208 ;; |
pascal@516 | 280 1440) RDEV=0x021C ;; |
pascal@516 | 281 2880) RDEV=0x0220 ;; |
pascal@516 | 282 *) RDEV=0x0200 ;; |
pascal@516 | 283 esac |
pascal@516 | 284 while [ -L "$RDEV" ]; do RDEV="$(readlink "$RDEV")"; done |
pascal@516 | 285 [ -b "$RDEV" ] && RDEV=$(stat -c '0x%02t%02T' $RDEV 2> /dev/null) |
pascal@516 | 286 [ "$(echo $RDEV | tr '[0-9A-FXa-fx]' 0 | sed 's/0//g')" ] || |
pascal@516 | 287 store 16 $RootDevOfs $RDEV $bs RDEV |
pascal@516 | 288 |
pascal@516 | 289 [ $FORMAT -lt 720 ] && store 8 0x15F 40 $bs 360K |
pascal@516 | 290 [ $FORMAT -lt 320 ] && store 8 0x158 237 $bs 160K |
pascal@516 | 291 |
pascal@516 | 292 extra=0 |
pascal@516 | 293 # Store cmdline after setup for kernels >= 0.99 |
pascal@516 | 294 if [ -n "$CMDLINE" ]; then |
pascal@516 | 295 CmdlineOfs=$(stat -c '%s' $bs) |
pascal@516 | 296 store 16 0x22 $CmdlineOfs $bs "Cmdline @$CmdlineOfs '$CMDLINE'" |
pascal@516 | 297 [ $Version -ge 514 ] && |
pascal@516 | 298 store 32 0x228 $(( $SetupBase + 0x8000 )) $bs "Cmdline32" |
pascal@516 | 299 echo -n "$CMDLINE" | ddq bs=512 count=1 conv=sync >> $bs |
pascal@516 | 300 extra=$(($extra+1)) |
pascal@516 | 301 store 8 0x1F1 $(($setupsz+$extra)) $bs setup size |
pascal@516 | 302 [ $Version -ge 512 ] && [ -n "$QUIET" ] && |
pascal@516 | 303 store 8 0x211 $(($(get 0x211 $bs 1) | 32)) $bs suppress early messages |
pascal@516 | 304 fi |
pascal@516 | 305 |
pascal@516 | 306 # Info text after setup |
pascal@516 | 307 if [ -s "$INFOFILE" ]; then |
pascal@516 | 308 InfoOfs=$(stat -c '%s' $bs) |
pascal@516 | 309 sed -e ':a;N;$!ba;s/\r\n/\r/g;s/\n/\r/g' \ |
pascal@516 | 310 -e 's/'$(echo -e "\f/\xff/g;s/$/\xff\xff")'/' \ |
pascal@516 | 311 < "$INFOFILE" > $bs.infotext |
pascal@516 | 312 ddq if=/dev/zero bs=512 count=1 >>$bs.infotext |
pascal@516 | 313 infolen=$(($(stat -c %s $bs.infotext)/512)) |
pascal@516 | 314 ddq if=$bs.infotext count=$infolen bs=512 >> $bs |
pascal@516 | 315 extra=$(($extra+$infolen)) |
pascal@516 | 316 rm -f $bs.infotext |
pascal@516 | 317 store 8 0x1F1 $(($setupsz+$extra)) $bs setup size |
pascal@516 | 318 store 16 0x1EF $InfoOfs $bs update infoptr |
pascal@516 | 319 fi |
pascal@516 | 320 |
pascal@516 | 321 syssz=$((($(stat -c %s $KERNEL)+15)/16-32*(1+$setupsz))) |
pascal@516 | 322 #syssz=$(get 0x1F4 $bs 4) |
pascal@516 | 323 sysszsect=$((($syssz+31)/32)) |
pascal@516 | 324 store 16 $OldRamfsLenOfs 0 $bs clear oldramfs |
pascal@516 | 325 INITRD="${INITRD# }" |
pascal@516 | 326 INITRDPAD=4 |
pascal@516 | 327 [ -n "$INITRD" ] && |
pascal@516 | 328 if [ $Version -lt 512 ]; then |
pascal@516 | 329 # Compute initramfs location (protocol < 2.00) |
pascal@516 | 330 [ $syssz -gt 32768 ] && syssz=$(get 0x1F4 $bs 2) |
pascal@516 | 331 [ $syssz -eq 0 ] && syssz=$((0x7F00)) |
pascal@516 | 332 sysszsect=$((($syssz+31)/32)) |
pascal@517 | 333 INITRD="${INITRD%% *}" |
pascal@516 | 334 initrdlen=$(stat -c %s "$INITRD") |
pascal@516 | 335 store 16 $OldRamfsLenOfs $(($initrdlen/1024)) $bs set oldramfs |
pascal@516 | 336 INITRDDISKALIGN=$((0x40000)) |
pascal@516 | 337 [ $(($initrdlen+$INITRDDISKALIGN)) -gt $(($FORMAT*1024)) -o \ |
pascal@516 | 338 $(((512*$sysszsect) + $(stat -c %s $bs))) -gt $INITRDDISKALIGN -o \ |
pascal@516 | 339 -n "$ADRSRD" ] && INITRDDISKALIGN=$(($FORMAT*1024)) |
pascal@516 | 340 else |
pascal@516 | 341 INITRDRAMALIGN=0x1000 |
pascal@516 | 342 # Compute initramfs size (protocol >= 2.00) |
pascal@516 | 343 initrdlen=0 |
pascal@516 | 344 INITRDDISKALIGN=0 |
pascal@516 | 345 for i in ${INITRD//,/ }; do |
pascal@516 | 346 [ -s "$i" ] || continue |
pascal@516 | 347 while [ -L "$i" ]; do i="$(readlink $i)"; done |
pascal@516 | 348 size=$(stat -c %s "$i") |
pascal@516 | 349 trace "initrd $i $size " |
pascal@516 | 350 initrdlen=$(((($initrdlen + $INITRDPAD - 1) & -$INITRDPAD) + $size)) |
pascal@516 | 351 ADRSRD2=$(( (($MEM * 0x100000) - $initrdlen) & -$INITRDRAMALIGN )) |
pascal@516 | 352 store 32 $RamfsAdrOfs $(( ${ADRSRD:-$ADRSRD2} )) $bs initrd adrs |
pascal@516 | 353 store 32 $RamfsLenOfs $initrdlen $bs initrdlen |
pascal@516 | 354 done |
pascal@516 | 355 fi |
pascal@516 | 356 |
pascal@516 | 357 [ -n "$NOSYSSIZEFIX" ] || store 32 0x1F4 $syssz $bs fix system size |
pascal@516 | 358 |
pascal@516 | 359 # Output boot sector + setup + cmdline + info |
pascal@516 | 360 ddq if=$bs |
pascal@516 | 361 |
pascal@516 | 362 # Output kernel code |
pascal@516 | 363 [ $INITRDDISKALIGN -ne 0 ] && |
pascal@516 | 364 INITRDDISKALIGN=$(($INITRDDISKALIGN/512-$sysszsect-$extra-$setupsz-1)) |
pascal@516 | 365 cat $KERNEL /dev/zero | ddq bs=512 skip=$(( $setupsz+1 )) \ |
pascal@516 | 366 count=$(($sysszsect+$INITRDDISKALIGN)) conv=sync |
pascal@516 | 367 |
pascal@516 | 368 # Output initramfs |
pascal@516 | 369 padding=$INITRDPAD |
pascal@516 | 370 for i in ${INITRD//,/ }; do |
pascal@516 | 371 [ -s "$i" ] || continue |
pascal@516 | 372 [ $padding -eq $INITRDPAD ] || ddq if=/dev/zero bs=1 count=$padding |
pascal@516 | 373 ddq if=$i |
pascal@516 | 374 trace "initrd $i ($(stat -c %s $i) bytes) padding $INITRDPAD" |
pascal@516 | 375 padding=$(( $INITRDPAD - ($(stat -c %s $i) % $INITRDPAD) )) |
pascal@516 | 376 done |
pascal@516 | 377 |
pascal@516 | 378 # Cleanup |
pascal@516 | 379 rm -f $bs |
pascal@516 | 380 } |
pascal@516 | 381 |
pascal@516 | 382 if [ "$FORMAT" == "0" ]; then # unsplitted |
pascal@516 | 383 floppyset > $PREFIX |
pascal@516 | 384 PAD=$(( 512 - ($(stat -c %s $PREFIX) % 512) )) |
pascal@516 | 385 [ $PAD -ne 512 ] && ddq if=/dev/zero bs=1 count=$PAD >> $PREFIX |
pascal@516 | 386 exit |
pascal@516 | 387 fi |
pascal@516 | 388 floppyset | split -b ${FORMAT}k /dev/stdin floppy$$ |
pascal@516 | 389 i=1 |
pascal@516 | 390 ls floppy$$* 2> /dev/null | while read file ; do |
pascal@516 | 391 output=$PREFIX$(printf "%03d" $i) |
pascal@516 | 392 cat $file /dev/zero | ddq bs=1k count=$FORMAT conv=sync of=$output |
pascal@516 | 393 echo $output |
pascal@516 | 394 rm -f $file |
pascal@516 | 395 i=$(( $i + 1 )) |
pascal@516 | 396 done |