#!/bin/sh
[ -s "$1" -a "$2" ] || {
cat << EOT
Usage: $0 zImage-to-read bzImage-to-create [version-string]
EOT
exit 1
}
ddq()
{
dd "$@" 2> /dev/null
}
get()
{
echo $( od -v -j $(($1)) -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} \
-An $2 2>/dev/null )
}
store()
{
n=$3; for i in $(seq 8 8 $1); do
printf '\\\\x%02X' $(($n & 255))
n=$(($n >> 8))
done | xargs echo -en | ddq bs=1 conv=notrunc of=$4 seek=$(($2))
}
create_bzImage()
{
ddq bs=512 count=1 of=$1
[ "$(od -j 486 $1 -An -N 4 -a|sed 's/ //g')" == "ELKS" ] && iselks=1
[ " $(get 0x3F $1 2)" == " 15080" ] && islinux001=1 && cp $1 $1$$
# from
http://hg.slitaz.org/wok/file/7184ec55b1aa/linux/stuff/linux-header.u
uudecode <<EOT | ddq of=$1 conv=notrunc
begin-base64 644 -
TVrrIEAAAAACAAAQ//8ACASeAABfAvD/TmV4dCEHDQA/owCeUuiwAZkfoPF9
QA+hxXd4XwZXsQbzpRYfZGaPR3jGRfg/+pdYQejIAL4AAoFMECCAxkQlm+hv
AVuJ5v9IEMdAFAiTgPMIdfOhFQJmix70AWZLZsHrBWZDvwAQOcd1AzWAFolE
G2a/gAAAAGYp+5xzAgHfUFZTMdtoAIAH6GEAW16MwbSHFgfNFVgFAAEQTB+/
gAedd8WITB/GRBwQx0QTgAa0h80Vl80T6gAAIJBaOMF3NGDNE/noeABhUlAo
yHcCsAE5+HICifhQtALNE1pYctyVAdGO6QDXANcp11p0UozplTjBddSIyLEB
MM51zP7FgP1QdcW1AGC+GABT6KoAW+g+AHUVUpjNE7gBAs0TWtDUOmT+depG
SHXm650x0ugAAAYftD+J+cHhCInrzSGSFh+wMRwDtA67BwDNEDwNdPPDv2wE
ZMYFprgNAWQ6JXQKzRZ09JjNFo7nR8PoVgCg0QJAvoAAigxG86SXgHz/P77g
AnQyDwHgJAF1K45fLEM5D3X7jVcEtD3NIXInleiM/4AGoAA9uwICOV8EcgXH
RyeeCR5qTMsDdA6wDeiH/6w8AH/4w16/xp1oAJAXifwWBzHAuTsA86pPW1bD
AA==
====
EOT
# from tobzimage.S
uudecode <<EOT | gunzip >> $1
begin-base64 644 -
H4sIAG2wX1cCA3ut4pFSFMzAxAACAgyMQNgAYqCCOXxZDAmG/9OOs35emnhe
LnwfB9NabpYS5v8x/wy/9d1L+1/Cote5pI6hoYb9Q7HmcReWVIYeH7Y5Ef+O
BMz9n5MSJtf5zOxoCUujzVlJ+bjSfWA9/S4pexgYgBSLmHzn452cDGGP/u5g
nDwzICwobIEYE5DayAEU2s/A1B36RYy989lOhoYt7WdF/7uI/HeRaXzFIFD+
tvmIwU4GxteCHfnifQfDDf8bftvK9nlpPJv8PgaWf74fX7MfY3cy/P95aVfu
x9MMWEGVZ25ieirDiAUAs6tFkQACAAA=
====
EOT
s="$2"
[ -s "$s" ] && s="$(cat "$s")"
[ -z "$s" ] && s="$(basename "$1")"
echo -e "\n$s" | tr '\n' '\r' | cat - /dev/zero | \
ddq conv=notrunc of=$1 bs=1 seek=768 count=255
setupsz=$(get 497 $1 1)
[ $setupsz -eq 0 ] && setupsz=4
if [ "$islinux001" == "1" ]; then
cat $1$$ /dev/zero | ddq bs=512 count=$setupsz >> $1
rm -f $1$$
else
ddq bs=512 count=$setupsz >> $1
if [ "$(od -j 1026 $1 -An -N 4 -a|sed 's/ //g')" == "HdrS" ] &&
[ $(($(get 1041 $1 1) & 1)) -eq 1 ]; then
echo "Already a bzImage file, abort."
rm -f $1
exit 1
fi
fi
store 8 497 $(($setupsz+1)) $1
syssz=$(get 500 $1 2)
[ $syssz -eq 0 ] && syssz=$((($filesz+15-512)/16-($setupsz*32)))
[ "$islinux001" == "1" ] && syssz=$((($filesz+15-512)/16))
store 16 500 $syssz $1
[ "$iselks" == "1" ] && store 16 708 37008 $1
[ "$islinux001" == "1" ] && store 16 733 37008 $1
ddq >> $1
}
filesz=$(stat -c %s $1)
create_bzImage $2 "$3" < $1