a9903811bf
The --no-gzip option can be passed to the wrapper so that the kernel image is included uncompressed into the zImage. This is intended for bootloaders where the zImage itself can be compressed, or where boot time is considered more important than kernel image size. Signed-off-by: Scott Wood <scottwood@freescale.com> Acked-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
219 lines
4.1 KiB
Bash
Executable file
219 lines
4.1 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
# Copyright (C) 2006 Paul Mackerras, IBM Corporation <paulus@samba.org>
|
|
# This program may be used under the terms of version 2 of the GNU
|
|
# General Public License.
|
|
|
|
# This script takes a kernel binary and optionally an initrd image
|
|
# and/or a device-tree blob, and creates a bootable zImage for a
|
|
# given platform.
|
|
|
|
# Options:
|
|
# -o zImage specify output file
|
|
# -p platform specify platform (links in $platform.o)
|
|
# -i initrd specify initrd file
|
|
# -d devtree specify device-tree blob
|
|
# -s tree.dts specify device-tree source file (needs dtc installed)
|
|
# -c cache $kernel.strip.gz (use if present & newer, else make)
|
|
# -C prefix specify command prefix for cross-building tools
|
|
# (strip, objcopy, ld)
|
|
# -D dir specify directory containing data files used by script
|
|
# (default ./arch/powerpc/boot)
|
|
# -W dir specify working directory for temporary files (default .)
|
|
|
|
# defaults
|
|
kernel=
|
|
ofile=zImage
|
|
platform=of
|
|
initrd=
|
|
dtb=
|
|
dts=
|
|
cacheit=
|
|
gzip=.gz
|
|
|
|
# cross-compilation prefix
|
|
CROSS=
|
|
|
|
# directory for object and other files used by this script
|
|
object=arch/powerpc/boot
|
|
|
|
# directory for working files
|
|
tmpdir=.
|
|
|
|
usage() {
|
|
echo 'Usage: wrapper [-o output] [-p platform] [-i initrd]' >&2
|
|
echo ' [-d devtree] [-s tree.dts] [-c] [-C cross-prefix]' >&2
|
|
echo ' [-D datadir] [-W workingdir] [--no-gzip] [vmlinux]' >&2
|
|
exit 1
|
|
}
|
|
|
|
while [ "$#" -gt 0 ]; do
|
|
case "$1" in
|
|
-o)
|
|
shift
|
|
[ "$#" -gt 0 ] || usage
|
|
ofile="$1"
|
|
;;
|
|
-p)
|
|
shift
|
|
[ "$#" -gt 0 ] || usage
|
|
platform="$1"
|
|
;;
|
|
-i)
|
|
shift
|
|
[ "$#" -gt 0 ] || usage
|
|
initrd="$1"
|
|
;;
|
|
-d)
|
|
shift
|
|
[ "$#" -gt 0 ] || usage
|
|
dtb="$1"
|
|
;;
|
|
-s)
|
|
shift
|
|
[ "$#" -gt 0 ] || usage
|
|
dts="$1"
|
|
;;
|
|
-c)
|
|
cacheit=y
|
|
;;
|
|
-C)
|
|
shift
|
|
[ "$#" -gt 0 ] || usage
|
|
CROSS="$1"
|
|
;;
|
|
-D)
|
|
shift
|
|
[ "$#" -gt 0 ] || usage
|
|
object="$1"
|
|
;;
|
|
-W)
|
|
shift
|
|
[ "$#" -gt 0 ] || usage
|
|
tmpdir="$1"
|
|
;;
|
|
--no-gzip)
|
|
gzip=
|
|
;;
|
|
-?)
|
|
usage
|
|
;;
|
|
*)
|
|
[ -z "$kernel" ] || usage
|
|
kernel="$1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ -n "$dts" ]; then
|
|
if [ -z "$dtb" ]; then
|
|
dtb="$platform.dtb"
|
|
fi
|
|
dtc -O dtb -o "$dtb" -b 0 -V 16 "$dts" || exit 1
|
|
fi
|
|
|
|
if [ -z "$kernel" ]; then
|
|
kernel=vmlinux
|
|
fi
|
|
|
|
platformo=$object/"$platform".o
|
|
lds=$object/zImage.lds
|
|
ext=strip
|
|
objflags=-S
|
|
tmp=$tmpdir/zImage.$$.o
|
|
ksection=.kernel:vmlinux.strip
|
|
isection=.kernel:initrd
|
|
|
|
case "$platform" in
|
|
pmac|pseries|chrp)
|
|
platformo=$object/of.o
|
|
;;
|
|
pmaccoff)
|
|
platformo=$object/of.o
|
|
lds=$object/zImage.coff.lds
|
|
;;
|
|
miboot|uboot)
|
|
# miboot and U-boot want just the bare bits, not an ELF binary
|
|
ext=bin
|
|
objflags="-O binary"
|
|
tmp="$ofile"
|
|
ksection=image
|
|
isection=initrd
|
|
;;
|
|
esac
|
|
|
|
vmz="$tmpdir/`basename \"$kernel\"`.$ext"
|
|
if [ -z "$cacheit" -o ! -f "$vmz.gz" -o "$vmz.gz" -ot "$kernel" ]; then
|
|
${CROSS}objcopy $objflags "$kernel" "$vmz.$$"
|
|
|
|
if [ -n "$gzip" ]; then
|
|
gzip -f -9 "$vmz.$$"
|
|
fi
|
|
|
|
if [ -n "$cacheit" ]; then
|
|
mv -f "$vmz.$$$gzip" "$vmz$gzip"
|
|
else
|
|
vmz="$vmz.$$"
|
|
fi
|
|
fi
|
|
|
|
vmz="$vmz$gzip"
|
|
|
|
case "$platform" in
|
|
uboot)
|
|
rm -f "$ofile"
|
|
version=`${CROSS}strings "$kernel" | grep '^Linux version [-0-9.]' | \
|
|
cut -d' ' -f3`
|
|
if [ -n "$version" ]; then
|
|
version="-n Linux-$version"
|
|
fi
|
|
mkimage -A ppc -O linux -T kernel -C gzip -a 00000000 -e 00000000 \
|
|
$version -d "$vmz" "$ofile"
|
|
if [ -z "$cacheit" ]; then
|
|
rm -f "$vmz"
|
|
fi
|
|
exit 0
|
|
;;
|
|
esac
|
|
|
|
addsec() {
|
|
${CROSS}objcopy $4 $1 \
|
|
--add-section=$3="$2" \
|
|
--set-section-flags=$3=contents,alloc,load,readonly,data
|
|
}
|
|
|
|
addsec $tmp "$vmz" $ksection $object/empty.o
|
|
if [ -z "$cacheit" ]; then
|
|
rm -f "$vmz"
|
|
fi
|
|
|
|
if [ -n "$initrd" ]; then
|
|
addsec $tmp "$initrd" $isection
|
|
fi
|
|
|
|
if [ -n "$dtb" ]; then
|
|
addsec $tmp "$dtb" .kernel:dtb
|
|
if [ -n "$dts" ]; then
|
|
rm $dtb
|
|
fi
|
|
fi
|
|
|
|
if [ "$platform" != "miboot" ]; then
|
|
${CROSS}ld -m elf32ppc -T $lds -o "$ofile" \
|
|
$platformo $tmp $object/wrapper.a
|
|
rm $tmp
|
|
fi
|
|
|
|
# post-processing needed for some platforms
|
|
case "$platform" in
|
|
pseries|chrp)
|
|
$object/addnote "$ofile"
|
|
;;
|
|
pmaccoff)
|
|
entry=`objdump -f "$ofile" | grep '^start address ' | \
|
|
cut -d' ' -f3`
|
|
${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile"
|
|
$object/hack-coff "$ofile"
|
|
;;
|
|
esac
|