wok-tiny annotate linux/stuff/bundle @ rev 104

Add ipxe, memtest
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Feb 07 14:42:58 2016 +0100 (2016-02-07)
parents 7cd5e798bfe2
children d592d531f72d
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@104 27 cp $0 $0.sh
pascal@104 28 gzip -9 < bundle.bin | uuencode -m - | \
pascal@104 29 sed -e '/^bundle.bin$/r/dev/stdin' -e '/^bundle.bin*/d' \
pascal@104 30 -e '/install-begin$/,/install-end$/d' -i $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@95 39 EOT
pascal@104 40 elif [ -n "$4" ]; then
pascal@104 41 out="$1"
pascal@104 42 uudecode <<EOT | gunzip > "$out"
pascal@104 43 bundle.bin
pascal@104 44 EOT
pascal@104 45 pos=$(get 0x1F2 "$out")
pascal@104 46 [ $(get $(($pos - 3)) "$out") -eq 24937 ] && crc=2 || crc=0
pascal@104 47 echo -en "$2\0" | ddq bs=1 of="$out" seek=$pos conv=notrunc
pascal@104 48 pos=$(($pos+${#2}+1))
pascal@104 49 shift 2
pascal@104 50 free=$((0x1F1 - 2 - $pos - $crc))
pascal@104 51 p=1
pascal@104 52 while [ -n "$2" -a $free -ge ${#2} ]; do
pascal@104 53 s=$((($(stat -c "%s" "$1")+511)/512))
pascal@104 54 x="$(printf '\\x%02x\\x%02x' $(($p % 256)) $(($p / 256)) )"
pascal@104 55 echo -en "$x$2\0" | ddq bs=1 of="$out" seek=$pos conv=notrunc
pascal@104 56 p=$(($p+$s))
pascal@104 57 pos=$(($pos+2+${#2}+1))
pascal@104 58 cat "$1" /dev/zero | ddq bs=512 count=$s >> "$out"
pascal@104 59 if [ $crc -ne 0 ]; then
pascal@104 60 x=$(cat "$1" /dev/zero | ddq bs=512 count=$s | od -v \
pascal@104 61 -t u2 -w2 -An|awk '{i+=$0} END {print (i % 65536)}')
pascal@104 62 x="$(printf '\\x%02x\\x%02x' $(($x % 256)) $(($x / 256)) )"
pascal@104 63 echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc
pascal@104 64 pos=$(($pos+2))
pascal@104 65 x="$(printf '\\x%02x\\x%02x' $(($s % 256)) $(($s / 256)) )"
pascal@104 66 echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc
pascal@104 67 pos=$(($pos+2))
pascal@104 68 fi
pascal@104 69 shift 2
pascal@104 70 done
pascal@104 71 [ -n "$2" ] && echo "Warning: skip $@" 1>&2 && exit 1
pascal@95 72 elif [ -s "$2" ]; then
pascal@102 73 base_initrd=$((0x00300000))
pascal@95 74 size_initrd=$(stat -c %s "$2")
pascal@95 75 [ $(($base_initrd + $size_initrd)) -gt $((0x1000000)) ] &&
pascal@95 76 base_initrd=$((0x01400000))
pascal@102 77 [ "$3" ] && base_initrd=$(($3))
pascal@95 78 printf "initrd @%X %X\n" $base_initrd $size_initrd
pascal@95 79 store 0x218 $base_initrd "$1"
pascal@95 80 store 0x21C $size_initrd "$1"
pascal@95 81 ddq bs=16 seek=$(end "$1" 32) of="$1" if="$2"
pascal@95 82 ls -l "$1"
pascal@95 83 else
pascal@104 84 if [ $(get 0x1F1 "$1" 1) -eq 0 ]; then
pascal@104 85 menu=$(get 0x1F2 "$1")
pascal@104 86 [ $(get $(($menu - 3)) "$1") -eq 24937 ] && skip=4 || skip=0
pascal@104 87 ddq bs=1 skip=$menu count=$((0x1F3 - $menu)) if="$1" | \
pascal@104 88 od -v -t u1 -w1 -An | awk -vx=$skip 'BEGIN { state=0 }
pascal@104 89 {
pascal@104 90 if (--bytes == 0) state++
pascal@104 91 if (state > 3) { state=1; bytes=2; sector=0; mul=1 }
pascal@104 92 if (state == 0 || state == 2) {
pascal@104 93 if ($1 == 0) {
pascal@104 94 if (state == 2) {
pascal@104 95 if (sector == 0) exit
pascal@104 96 print sector " " s
pascal@104 97 }
pascal@104 98 s=""; state++; sector=0; mul=1
pascal@104 99 bytes= (state == 3) ? x+1 : 3
pascal@104 100 }
pascal@104 101 else { c=sprintf("%c",$1); s=s c }
pascal@104 102 }
pascal@104 103 else { sector += $0*mul; mul *= 256 }
pascal@104 104 }' | while read s name; do
pascal@104 105 cnt=$(get $(($s*512 + 0x1F4)) "$1")
pascal@104 106 cnt=$(($cnt+32*(1+$(get $(($s*512 + 0x1F1)) "$1" 1))))
pascal@104 107 ddq bs=16 skip=$((32*$s)) count=$cnt if="$1" of="$name"
pascal@104 108 ls -l "$name"
pascal@104 109 done
pascal@104 110 else
pascal@104 111 base_initrd=$(get 0x218 "$1")
pascal@104 112 size_initrd=$(get 0x21C "$1")
pascal@104 113 [ $base_initrd -ne 0 ] &&
pascal@104 114 printf "initrd @%X\n" $base_initrd &&
pascal@104 115 ddq bs=1 skip=$(($(end "$1" 32) * 16)) count=$size_initrd \
pascal@104 116 if="$1" of=initrd && ls -l initrd
pascal@104 117 store 0x218 0 "$1"
pascal@104 118 store 0x21C 0 "$1"
pascal@104 119 ddq bs=16 count=0 seek=$(end "$1") of="$1"
pascal@104 120 ls -l "$1"
pascal@104 121 fi
pascal@95 122 fi
pascal@104 123 true