wok-tiny annotate linux/stuff/bundle @ rev 168
memtest: 386 support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Apr 30 16:35:54 2021 +0000 (2021-04-30) |
parents | c82d2b7a51b4 |
children | 5e2b41f82f13 |
rev | line source |
---|---|
pascal@95 | 1 #!/bin/sh |
pascal@95 | 2 |
pascal@95 | 3 ddq() |
pascal@95 | 4 { |
pascal@95 | 5 dd "$@" 2> /dev/null |
pascal@95 | 6 } |
pascal@95 | 7 |
pascal@95 | 8 store() |
pascal@95 | 9 { |
pascal@95 | 10 n=$2; for i in $(seq 8 8 32); do |
pascal@95 | 11 printf '\\\\x%02X' $(($n & 255)) |
pascal@95 | 12 n=$(($n >> 8)) |
pascal@95 | 13 done | xargs echo -en | ddq bs=1 conv=notrunc of="$3" seek=$(($1)) |
pascal@95 | 14 } |
pascal@95 | 15 |
pascal@95 | 16 get() |
pascal@95 | 17 { |
pascal@95 | 18 echo $(od -j $(($1)) -N ${3:-4} -t u${3:-4} -An "$2") |
pascal@95 | 19 } |
pascal@95 | 20 |
pascal@95 | 21 end() |
pascal@95 | 22 { |
pascal@95 | 23 echo $(( $(get 0x1F1 "$1" 1)*32 +($(get 0x1F4 "$1") +31 +${2:-1})&-${2:-1} )) |
pascal@95 | 24 } |
pascal@95 | 25 |
pascal@104 | 26 #install-begin |
pascal@129 | 27 sed '1,/^bundle.bin$/!d' $0 > $0.sh |
pascal@129 | 28 gzip -9 < bundle.bin | uuencode -m - >> $0.sh |
pascal@129 | 29 sed '1,/^bundle.bin$/d' $0 >> $0.sh |
pascal@129 | 30 sed -i -e '/^bundle.bin$/d' -e '/install-begin$/,/install-end$/d' $0.sh |
pascal@104 | 31 chmod +x $0.sh |
pascal@104 | 32 exit |
pascal@104 | 33 #install-end |
pascal@104 | 34 if [ ! -s "$1" -a -z "$4" ]; then |
pascal@104 | 35 p=$(basename "$0") |
pascal@95 | 36 cat <<EOT |
pascal@104 | 37 Usage: $p kernel [initrd] [@] |
pascal@104 | 38 or: $p menufile "menu title" file1 "menu entry 1" ... |
pascal@151 | 39 or: cat floppy.* > floppyset ; $p floppyset |
pascal@95 | 40 EOT |
pascal@104 | 41 elif [ -n "$4" ]; then |
pascal@104 | 42 out="$1" |
pascal@104 | 43 uudecode <<EOT | gunzip > "$out" |
pascal@104 | 44 bundle.bin |
pascal@104 | 45 EOT |
pascal@104 | 46 pos=$(get 0x1F2 "$out") |
pascal@104 | 47 [ $(get $(($pos - 3)) "$out") -eq 24937 ] && crc=2 || crc=0 |
pascal@104 | 48 echo -en "$2\0" | ddq bs=1 of="$out" seek=$pos conv=notrunc |
pascal@104 | 49 pos=$(($pos+${#2}+1)) |
pascal@104 | 50 shift 2 |
pascal@104 | 51 free=$((0x1F1 - 2 - $pos - $crc)) |
pascal@104 | 52 while [ -n "$2" -a $free -ge ${#2} ]; do |
pascal@151 | 53 echo "$((($(stat -Lc "%s" "$1")+511)/512))?$1?$2" |
pascal@133 | 54 shift 2 |
pascal@151 | 55 done | awk -F? 'BEGIN { nxt=1; i=0 } |
pascal@151 | 56 { ofs[i]=$1; nxt+=$1 ; file[i]=$2; name[i]=$3; i++ } |
pascal@151 | 57 END { for (j = 0; j < i; j++) { nxt-=ofs[j] |
pascal@151 | 58 print nxt " " ofs[j] " " file[j] " " name[j] }}' | \ |
pascal@151 | 59 while read p s file name; do |
pascal@104 | 60 x="$(printf '\\x%02x\\x%02x' $(($p % 256)) $(($p / 256)) )" |
pascal@151 | 61 echo -en "$x$name\0" | ddq bs=1 of="$out" seek=$pos conv=notrunc |
pascal@151 | 62 pos=$(($pos+2+${#name}+1)) |
pascal@104 | 63 if [ $crc -ne 0 ]; then |
pascal@151 | 64 x=$(cat "$file" /dev/zero | ddq bs=512 count=$s | \ |
pascal@151 | 65 od -v -t u2 -w2 -An | awk '{i+=$0} \ |
pascal@151 | 66 END {print (i % 65536)}') |
pascal@151 | 67 x="$(printf '\\x%02x\\x%02x' $(($x%256)) $(($x/256)) )" |
pascal@104 | 68 echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc |
pascal@104 | 69 pos=$(($pos+2)) |
pascal@151 | 70 x="$(printf '\\x%02x\\x%02x' $(($s%256)) $(($s/256)) )" |
pascal@104 | 71 echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc |
pascal@104 | 72 pos=$(($pos+2)) |
pascal@104 | 73 fi |
pascal@151 | 74 echo "$file $s" |
pascal@151 | 75 done | awk 'BEGIN { i=0 } { file[i]=$1; size[i]=$2; i++ } |
pascal@151 | 76 END { while (--i >= 0) print file[i] " " size[i] }' | \ |
pascal@151 | 77 while read file size; do |
pascal@151 | 78 cat "$file" /dev/zero | ddq bs=512 count=$size >> "$out" |
pascal@104 | 79 done |
pascal@95 | 80 elif [ -s "$2" ]; then |
pascal@102 | 81 base_initrd=$((0x00300000)) |
pascal@151 | 82 size_initrd=$(stat -Lc %s "$2") |
pascal@95 | 83 [ $(($base_initrd + $size_initrd)) -gt $((0x1000000)) ] && |
pascal@95 | 84 base_initrd=$((0x01400000)) |
pascal@102 | 85 [ "$3" ] && base_initrd=$(($3)) |
pascal@95 | 86 printf "initrd @%X %X\n" $base_initrd $size_initrd |
pascal@95 | 87 store 0x218 $base_initrd "$1" |
pascal@95 | 88 store 0x21C $size_initrd "$1" |
pascal@95 | 89 ddq bs=16 seek=$(end "$1" 32) of="$1" if="$2" |
pascal@95 | 90 ls -l "$1" |
pascal@95 | 91 else |
pascal@104 | 92 if [ $(get 0x1F1 "$1" 1) -eq 0 ]; then |
pascal@104 | 93 menu=$(get 0x1F2 "$1") |
pascal@106 | 94 [ $(get $(($menu -3)) "$1" 2) -eq 24937 ] && skip=4 || skip=0 |
pascal@104 | 95 ddq bs=1 skip=$menu count=$((0x1F3 - $menu)) if="$1" | \ |
pascal@107 | 96 od -v -t u1 -w1 -An | awk -vx=$skip '{ |
pascal@151 | 97 if (--skip >= 0) next # crc, len |
pascal@106 | 98 if (--bytes < 0) { |
pascal@151 | 99 if ($1 == 0) { # eos |
pascal@151 | 100 if (mul > 0) { # menu label |
pascal@104 | 101 if (sector == 0) exit |
pascal@106 | 102 skip=x; print sector " " s |
pascal@104 | 103 } |
pascal@151 | 104 s=""; sector=0; mul=1; bytes=2 # menu title |
pascal@104 | 105 } |
pascal@151 | 106 else { c=sprintf("%c",$1); s=s c } # menu title/label |
pascal@104 | 107 } |
pascal@104 | 108 else { sector += $0*mul; mul *= 256 } |
pascal@104 | 109 }' | while read s name; do |
pascal@104 | 110 cnt=$(get $(($s*512 + 0x1F4)) "$1") |
pascal@104 | 111 cnt=$(($cnt+32*(1+$(get $(($s*512 + 0x1F1)) "$1" 1)))) |
pascal@106 | 112 x=0 |
pascal@106 | 113 if [ $(get $(($s*512 + 0x202)) "$1" 2) -eq 25672 ]; then |
pascal@106 | 114 x=$(get $(($s*512 + 0x21C)) "$1") |
pascal@106 | 115 [ $x -ne 0 ] && x=$(((($cnt+31)/32)*512+$x)) && |
pascal@151 | 116 cnt=$((($x+15)/16)) # initrd |
pascal@106 | 117 fi |
pascal@104 | 118 ddq bs=16 skip=$((32*$s)) count=$cnt if="$1" of="$name" |
pascal@106 | 119 [ $x -ne 0 ] && ddq bs=1 seek=$x count=0 of="$name" |
pascal@151 | 120 printf "S%04X %9d " $s $(($cnt*16)) |
pascal@151 | 121 ls -l "$name" | cut -c35- |
pascal@104 | 122 done |
pascal@104 | 123 else |
pascal@104 | 124 base_initrd=$(get 0x218 "$1") |
pascal@104 | 125 size_initrd=$(get 0x21C "$1") |
pascal@104 | 126 [ $base_initrd -ne 0 ] && |
pascal@104 | 127 printf "initrd @%X\n" $base_initrd && |
pascal@104 | 128 ddq bs=1 skip=$(($(end "$1" 32) * 16)) count=$size_initrd \ |
pascal@104 | 129 if="$1" of=initrd && ls -l initrd |
pascal@104 | 130 store 0x218 0 "$1" |
pascal@104 | 131 store 0x21C 0 "$1" |
pascal@104 | 132 ddq bs=16 count=0 seek=$(end "$1") of="$1" |
pascal@104 | 133 ls -l "$1" |
pascal@104 | 134 fi |
pascal@95 | 135 fi |
pascal@104 | 136 true |