* First cut of "wrapper" program
@ 2006-09-20 23:38 Paul Mackerras
2006-09-21 0:49 ` Geoff Levand
2006-09-21 11:03 ` Simon Richter
0 siblings, 2 replies; 4+ messages in thread
From: Paul Mackerras @ 2006-09-20 23:38 UTC (permalink / raw)
To: linuxppc-dev
Here is a prototype of a "wrapper" program which will take a kernel,
and optionally an initrd image and/or a device tree blob, and create a
bootable zImage. My idea is that the Makefile in arch/powerpc/boot
will construct the files that this needs, then run it one or more
times to create whatever images are needed.
The type of zImage that is created is selected with the -p flag. This
also specifies an extra object file to be linked in that will contain
the platform_init() function. So for the xyzzy platform, we would
arrange for an xyzzy.o to be made in arch/powerpc/boot, and for the
wrapper to be invoked with "-p xyzzy".
Currently the wrapper uses the strip, objcopy and ld programs, which
need to be the powerpc cross-utilities if you are cross-building. You
can use the -C flag to specify a prefix for these programs if
necessary.
It also uses several files which it gets from a data directory, which
is by default ./arch/powerpc/boot, but which can be changed with the
-D flag. The files it needs from there are:
a platform-specific object file (of.o for OF-based platforms)
crt0.o
empty.o
wrapper.a
zImage.lds
zImage.coff.lds
addnote
hack-coff
Although this will start out in arch/powerpc/boot, my idea is that it
is a stand-alone thing that could be pulled out and built and used
quite independently of the kernel source tree. For this reason I
really want to avoid using CONFIG_* symbols in the code.
Comments?
Paul.
#!/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 dts 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=
# 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] [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"
;;
-?)
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
case "$platform" in
pmac|pseries)
platformo=$object/of.o
;;
pmaccoff)
platformo=$object/of.o
lds=$object/zImage.coff.lds
;;
miboot)
# this is quite different...
tmpvm=$tmpdir/vmlinux.bin.$$
${CROSS}objcopy -O binary "$kernel" $tmpvm
gzip -f -9 $tmpvm
tmpir=
if [ -n "$initrd" ]; then
tmpir=--add-section=initrd="$initrd"
fi
${CROSS}objcopy -O aixcoff-rs6000 -R .stab -R .stabstr -R .comment \
--add-section=image=$tmpvm.gz $tmpir \
$object/empty.o "$ofile"
rm $tmpvm.gz
exit 0
esac
tmp=$tmpdir/zImage.$$.o
cp $object/empty.o $tmp
addsec() {
${CROSS}objcopy $1 \
--add-section=.kernel:$3="$2" \
--set-section-flags=.kernel:$3=contents,alloc,load,readonly,data
}
if [ -n "$cacheit" ]; then
vmz="$tmpdir/`basename \"$kernel\"`.strip"
if [ ! -f "$vmz.gz" -o "$vmz.gz" -ot "$kernel" ]; then
cp "$kernel" "$vmz"
${CROSS}strip "$vmz"
gzip -f -9 "$vmz"
fi
addsec $tmp "$vmz.gz" vmlinux.strip
else
tmpvmz=$tmpdir/vmlinux.$$
cp "$kernel" $tmpvmz
${CROSS}strip $tmpvmz
gzip -f -9 $tmpvmz
addsec $tmp $tmpvmz.gz vmlinux.strip
rm $tmpvmz.gz
fi
if [ -n "$initrd" ]; then
addsec $tmp "$initrd" initrd
fi
if [ -n "$dtb" ]; then
addsec $tmp "$dtb" dtb
fi
${CROSS}ld -m elf32ppc -T $lds -o "$ofile" \
$object/crt0.o $platformo $tmp $object/wrapper.a
rm $tmp
# post-processing needed for some platforms
case "$platform" in
pseries)
$object/addnote "$ofile"
;;
pmaccoff)
${CROSS}objcopy -O aixcoff-rs6000 --set-start 0x500000 "$ofile"
$object/hack-coff "$ofile"
;;
esac
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: First cut of "wrapper" program
2006-09-20 23:38 First cut of "wrapper" program Paul Mackerras
@ 2006-09-21 0:49 ` Geoff Levand
2006-09-21 11:03 ` Simon Richter
1 sibling, 0 replies; 4+ messages in thread
From: Geoff Levand @ 2006-09-21 0:49 UTC (permalink / raw)
To: Paul Mackerras; +Cc: linuxppc-dev
Paul Mackerras wrote:
> # -s tree.dts specify device-tree source file (needs dts installed)
^^^ dtc
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: First cut of "wrapper" program
2006-09-20 23:38 First cut of "wrapper" program Paul Mackerras
2006-09-21 0:49 ` Geoff Levand
@ 2006-09-21 11:03 ` Simon Richter
2006-09-21 11:41 ` Paul Mackerras
1 sibling, 1 reply; 4+ messages in thread
From: Simon Richter @ 2006-09-21 11:03 UTC (permalink / raw)
To: Paul Mackerras; +Cc: linuxppc-dev
Hi,
Paul Mackerras wrote:
> Here is a prototype of a "wrapper" program which will take a kernel,
> and optionally an initrd image and/or a device tree blob, and create a
> bootable zImage. My idea is that the Makefile in arch/powerpc/boot
> will construct the files that this needs, then run it one or more
> times to create whatever images are needed.
Hmm, in Debian there is a tool called mkvmlinuz that does this, which is
run in a hook script after generating an initrd.
Simon
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: First cut of "wrapper" program
2006-09-21 11:03 ` Simon Richter
@ 2006-09-21 11:41 ` Paul Mackerras
0 siblings, 0 replies; 4+ messages in thread
From: Paul Mackerras @ 2006-09-21 11:41 UTC (permalink / raw)
To: Simon Richter; +Cc: linuxppc-dev
Simon Richter writes:
> Hmm, in Debian there is a tool called mkvmlinuz that does this, which is
> run in a hook script after generating an initrd.
It doesn't handle any of the embedded formats (uImage, treeboot,
etc.). Neither does my script, but it will... It also doesn't handle
including a device-tree blob.
Paul.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2006-09-21 11:41 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-09-20 23:38 First cut of "wrapper" program Paul Mackerras
2006-09-21 0:49 ` Geoff Levand
2006-09-21 11:03 ` Simon Richter
2006-09-21 11:41 ` Paul Mackerras
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).