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@516
|
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
|