xref: /OK3568_Linux_fs/kernel/arch/powerpc/boot/wrapper (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/sh
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun# Copyright (C) 2006 Paul Mackerras, IBM Corporation <paulus@samba.org>
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun# This script takes a kernel binary and optionally an initrd image
7*4882a593Smuzhiyun# and/or a device-tree blob, and creates a bootable zImage for a
8*4882a593Smuzhiyun# given platform.
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun# Options:
11*4882a593Smuzhiyun# -o zImage	specify output file
12*4882a593Smuzhiyun# -p platform	specify platform (links in $platform.o)
13*4882a593Smuzhiyun# -i initrd	specify initrd file
14*4882a593Smuzhiyun# -d devtree	specify device-tree blob
15*4882a593Smuzhiyun# -s tree.dts	specify device-tree source file (needs dtc installed)
16*4882a593Smuzhiyun# -e esm_blob   specify ESM blob for secure images
17*4882a593Smuzhiyun# -c		cache $kernel.strip.gz (use if present & newer, else make)
18*4882a593Smuzhiyun# -C prefix	specify command prefix for cross-building tools
19*4882a593Smuzhiyun#		(strip, objcopy, ld)
20*4882a593Smuzhiyun# -D dir	specify directory containing data files used by script
21*4882a593Smuzhiyun#		(default ./arch/powerpc/boot)
22*4882a593Smuzhiyun# -W dir	specify working directory for temporary files (default .)
23*4882a593Smuzhiyun# -z		use gzip (legacy)
24*4882a593Smuzhiyun# -Z zsuffix    compression to use (gz, xz or none)
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun# Stop execution if any command fails
27*4882a593Smuzhiyunset -e
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun# Allow for verbose output
30*4882a593Smuzhiyunif [ "$V" = 1 ]; then
31*4882a593Smuzhiyun    set -x
32*4882a593Smuzhiyun    map="-Map wrapper.map"
33*4882a593Smuzhiyunfi
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun# defaults
36*4882a593Smuzhiyunkernel=
37*4882a593Smuzhiyunofile=zImage
38*4882a593Smuzhiyunplatform=of
39*4882a593Smuzhiyuninitrd=
40*4882a593Smuzhiyundtb=
41*4882a593Smuzhiyundts=
42*4882a593Smuzhiyunesm_blob=
43*4882a593Smuzhiyuncacheit=
44*4882a593Smuzhiyunbinary=
45*4882a593Smuzhiyuncompression=.gz
46*4882a593Smuzhiyunuboot_comp=gzip
47*4882a593Smuzhiyunpie=
48*4882a593Smuzhiyunformat=
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun# cross-compilation prefix
51*4882a593SmuzhiyunCROSS=
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun# mkimage wrapper script
54*4882a593SmuzhiyunMKIMAGE=$srctree/scripts/mkuboot.sh
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun# directory for object and other files used by this script
57*4882a593Smuzhiyunobject=arch/powerpc/boot
58*4882a593Smuzhiyunobjbin=$object
59*4882a593Smuzhiyundtc=scripts/dtc/dtc
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun# directory for working files
62*4882a593Smuzhiyuntmpdir=.
63*4882a593Smuzhiyun
64*4882a593Smuzhiyunusage() {
65*4882a593Smuzhiyun    echo 'Usage: wrapper [-o output] [-p platform] [-i initrd]' >&2
66*4882a593Smuzhiyun    echo '       [-d devtree] [-s tree.dts] [-e esm_blob]' >&2
67*4882a593Smuzhiyun    echo '       [-c] [-C cross-prefix] [-D datadir] [-W workingdir]' >&2
68*4882a593Smuzhiyun    echo '       [-Z (gz|xz|none)] [--no-compression] [vmlinux]' >&2
69*4882a593Smuzhiyun    exit 1
70*4882a593Smuzhiyun}
71*4882a593Smuzhiyun
72*4882a593Smuzhiyunrun_cmd() {
73*4882a593Smuzhiyun    if [ "$V" = 1 ]; then
74*4882a593Smuzhiyun        $* 2>&1
75*4882a593Smuzhiyun    else
76*4882a593Smuzhiyun        local msg
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun        set +e
79*4882a593Smuzhiyun        msg=$($* 2>&1)
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun        if [ $? -ne "0" ]; then
82*4882a593Smuzhiyun                echo $msg
83*4882a593Smuzhiyun                exit 1
84*4882a593Smuzhiyun        fi
85*4882a593Smuzhiyun        set -e
86*4882a593Smuzhiyun    fi
87*4882a593Smuzhiyun}
88*4882a593Smuzhiyun
89*4882a593Smuzhiyunwhile [ "$#" -gt 0 ]; do
90*4882a593Smuzhiyun    case "$1" in
91*4882a593Smuzhiyun    -o)
92*4882a593Smuzhiyun	shift
93*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
94*4882a593Smuzhiyun	ofile="$1"
95*4882a593Smuzhiyun	;;
96*4882a593Smuzhiyun    -p)
97*4882a593Smuzhiyun	shift
98*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
99*4882a593Smuzhiyun	platform="$1"
100*4882a593Smuzhiyun	;;
101*4882a593Smuzhiyun    -i)
102*4882a593Smuzhiyun	shift
103*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
104*4882a593Smuzhiyun	initrd="$1"
105*4882a593Smuzhiyun	;;
106*4882a593Smuzhiyun    -d)
107*4882a593Smuzhiyun	shift
108*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
109*4882a593Smuzhiyun	dtb="$1"
110*4882a593Smuzhiyun	;;
111*4882a593Smuzhiyun    -e)
112*4882a593Smuzhiyun	shift
113*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
114*4882a593Smuzhiyun	esm_blob="$1"
115*4882a593Smuzhiyun	;;
116*4882a593Smuzhiyun    -s)
117*4882a593Smuzhiyun	shift
118*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
119*4882a593Smuzhiyun	dts="$1"
120*4882a593Smuzhiyun	;;
121*4882a593Smuzhiyun    -c)
122*4882a593Smuzhiyun	cacheit=y
123*4882a593Smuzhiyun	;;
124*4882a593Smuzhiyun    -C)
125*4882a593Smuzhiyun	shift
126*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
127*4882a593Smuzhiyun	CROSS="$1"
128*4882a593Smuzhiyun	;;
129*4882a593Smuzhiyun    -D)
130*4882a593Smuzhiyun	shift
131*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
132*4882a593Smuzhiyun	object="$1"
133*4882a593Smuzhiyun	objbin="$1"
134*4882a593Smuzhiyun	;;
135*4882a593Smuzhiyun    -W)
136*4882a593Smuzhiyun	shift
137*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
138*4882a593Smuzhiyun	tmpdir="$1"
139*4882a593Smuzhiyun	;;
140*4882a593Smuzhiyun    -z)
141*4882a593Smuzhiyun	compression=.gz
142*4882a593Smuzhiyun	uboot_comp=gzip
143*4882a593Smuzhiyun	;;
144*4882a593Smuzhiyun    -Z)
145*4882a593Smuzhiyun	shift
146*4882a593Smuzhiyun	[ "$#" -gt 0 ] || usage
147*4882a593Smuzhiyun        [ "$1" != "gz" -o "$1" != "xz" -o "$1" != "lzma" -o "$1" != "lzo" -o "$1" != "none" ] || usage
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun	compression=".$1"
150*4882a593Smuzhiyun	uboot_comp=$1
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun        if [ $compression = ".none" ]; then
153*4882a593Smuzhiyun                compression=
154*4882a593Smuzhiyun		uboot_comp=none
155*4882a593Smuzhiyun        fi
156*4882a593Smuzhiyun	if [ $uboot_comp = "gz" ]; then
157*4882a593Smuzhiyun		uboot_comp=gzip
158*4882a593Smuzhiyun	fi
159*4882a593Smuzhiyun	;;
160*4882a593Smuzhiyun    --no-gzip)
161*4882a593Smuzhiyun        # a "feature" of the the wrapper script is that it can be used outside
162*4882a593Smuzhiyun        # the kernel tree. So keeping this around for backwards compatibility.
163*4882a593Smuzhiyun        compression=
164*4882a593Smuzhiyun	uboot_comp=none
165*4882a593Smuzhiyun        ;;
166*4882a593Smuzhiyun    -?)
167*4882a593Smuzhiyun	usage
168*4882a593Smuzhiyun	;;
169*4882a593Smuzhiyun    *)
170*4882a593Smuzhiyun	[ -z "$kernel" ] || usage
171*4882a593Smuzhiyun	kernel="$1"
172*4882a593Smuzhiyun	;;
173*4882a593Smuzhiyun    esac
174*4882a593Smuzhiyun    shift
175*4882a593Smuzhiyundone
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun
178*4882a593Smuzhiyunif [ -n "$dts" ]; then
179*4882a593Smuzhiyun    if [ ! -r "$dts" -a -r "$object/dts/$dts" ]; then
180*4882a593Smuzhiyun	dts="$object/dts/$dts"
181*4882a593Smuzhiyun    fi
182*4882a593Smuzhiyun    if [ -z "$dtb" ]; then
183*4882a593Smuzhiyun	dtb="$platform.dtb"
184*4882a593Smuzhiyun    fi
185*4882a593Smuzhiyun    $dtc -O dtb -o "$dtb" -b 0 "$dts"
186*4882a593Smuzhiyunfi
187*4882a593Smuzhiyun
188*4882a593Smuzhiyunif [ -z "$kernel" ]; then
189*4882a593Smuzhiyun    kernel=vmlinux
190*4882a593Smuzhiyunfi
191*4882a593Smuzhiyun
192*4882a593SmuzhiyunLANG=C elfformat="`${CROSS}objdump -p "$kernel" | grep 'file format' | awk '{print $4}'`"
193*4882a593Smuzhiyuncase "$elfformat" in
194*4882a593Smuzhiyun    elf64-powerpcle)	format=elf64lppc	;;
195*4882a593Smuzhiyun    elf64-powerpc)	format=elf32ppc	;;
196*4882a593Smuzhiyun    elf32-powerpc)	format=elf32ppc	;;
197*4882a593Smuzhiyunesac
198*4882a593Smuzhiyun
199*4882a593Smuzhiyunld_version()
200*4882a593Smuzhiyun{
201*4882a593Smuzhiyun    # Poached from scripts/ld-version.sh, but we don't want to call that because
202*4882a593Smuzhiyun    # this script (wrapper) is distributed separately from the kernel source.
203*4882a593Smuzhiyun    # Extract linker version number from stdin and turn into single number.
204*4882a593Smuzhiyun    awk '{
205*4882a593Smuzhiyun	gsub(".*\\)", "");
206*4882a593Smuzhiyun	gsub(".*version ", "");
207*4882a593Smuzhiyun	gsub("-.*", "");
208*4882a593Smuzhiyun	split($1,a, ".");
209*4882a593Smuzhiyun	print a[1]*100000000 + a[2]*1000000 + a[3]*10000;
210*4882a593Smuzhiyun	exit
211*4882a593Smuzhiyun    }'
212*4882a593Smuzhiyun}
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun# Do not include PT_INTERP segment when linking pie. Non-pie linking
215*4882a593Smuzhiyun# just ignores this option.
216*4882a593SmuzhiyunLD_VERSION=$(${CROSS}ld --version | ld_version)
217*4882a593SmuzhiyunLD_NO_DL_MIN_VERSION=$(echo 2.26 | ld_version)
218*4882a593Smuzhiyunif [ "$LD_VERSION" -ge "$LD_NO_DL_MIN_VERSION" ] ; then
219*4882a593Smuzhiyun	nodl="--no-dynamic-linker"
220*4882a593Smuzhiyunfi
221*4882a593Smuzhiyun
222*4882a593Smuzhiyunplatformo=$object/"$platform".o
223*4882a593Smuzhiyunlds=$object/zImage.lds
224*4882a593Smuzhiyunext=strip
225*4882a593Smuzhiyunobjflags=-S
226*4882a593Smuzhiyuntmp=$tmpdir/zImage.$$.o
227*4882a593Smuzhiyunksection=.kernel:vmlinux.strip
228*4882a593Smuzhiyunisection=.kernel:initrd
229*4882a593Smuzhiyunesection=.kernel:esm_blob
230*4882a593Smuzhiyunlink_address='0x400000'
231*4882a593Smuzhiyunmake_space=y
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun
234*4882a593Smuzhiyunif [ -n "$esm_blob" -a "$platform" != "pseries" ]; then
235*4882a593Smuzhiyun    echo "ESM blob not support on non-pseries platforms" >&2
236*4882a593Smuzhiyun    exit 1
237*4882a593Smuzhiyunfi
238*4882a593Smuzhiyun
239*4882a593Smuzhiyuncase "$platform" in
240*4882a593Smuzhiyunof)
241*4882a593Smuzhiyun    platformo="$object/of.o $object/epapr.o"
242*4882a593Smuzhiyun    make_space=n
243*4882a593Smuzhiyun    ;;
244*4882a593Smuzhiyunpseries)
245*4882a593Smuzhiyun    platformo="$object/pseries-head.o $object/of.o $object/epapr.o"
246*4882a593Smuzhiyun    link_address='0x4000000'
247*4882a593Smuzhiyun    if [ "$format" != "elf32ppc" ]; then
248*4882a593Smuzhiyun	link_address=
249*4882a593Smuzhiyun	pie=-pie
250*4882a593Smuzhiyun    fi
251*4882a593Smuzhiyun    make_space=n
252*4882a593Smuzhiyun    ;;
253*4882a593Smuzhiyunmaple)
254*4882a593Smuzhiyun    platformo="$object/of.o $object/epapr.o"
255*4882a593Smuzhiyun    link_address='0x400000'
256*4882a593Smuzhiyun    make_space=n
257*4882a593Smuzhiyun    ;;
258*4882a593Smuzhiyunpmac|chrp)
259*4882a593Smuzhiyun    platformo="$object/of.o $object/epapr.o"
260*4882a593Smuzhiyun    make_space=n
261*4882a593Smuzhiyun    ;;
262*4882a593Smuzhiyuncoff)
263*4882a593Smuzhiyun    platformo="$object/crt0.o $object/of.o $object/epapr.o"
264*4882a593Smuzhiyun    lds=$object/zImage.coff.lds
265*4882a593Smuzhiyun    link_address='0x500000'
266*4882a593Smuzhiyun    make_space=n
267*4882a593Smuzhiyun    pie=
268*4882a593Smuzhiyun    ;;
269*4882a593Smuzhiyunmiboot|uboot*)
270*4882a593Smuzhiyun    # miboot and U-boot want just the bare bits, not an ELF binary
271*4882a593Smuzhiyun    ext=bin
272*4882a593Smuzhiyun    objflags="-O binary"
273*4882a593Smuzhiyun    tmp="$ofile"
274*4882a593Smuzhiyun    ksection=image
275*4882a593Smuzhiyun    isection=initrd
276*4882a593Smuzhiyun    ;;
277*4882a593Smuzhiyuncuboot*)
278*4882a593Smuzhiyun    binary=y
279*4882a593Smuzhiyun    compression=
280*4882a593Smuzhiyun    case "$platform" in
281*4882a593Smuzhiyun    *-mpc866ads|*-mpc885ads|*-adder875*|*-ep88xc)
282*4882a593Smuzhiyun        platformo=$object/cuboot-8xx.o
283*4882a593Smuzhiyun        ;;
284*4882a593Smuzhiyun    *5200*|*-motionpro)
285*4882a593Smuzhiyun        platformo=$object/cuboot-52xx.o
286*4882a593Smuzhiyun        ;;
287*4882a593Smuzhiyun    *-pq2fads|*-ep8248e|*-mpc8272*|*-storcenter)
288*4882a593Smuzhiyun        platformo=$object/cuboot-pq2.o
289*4882a593Smuzhiyun        ;;
290*4882a593Smuzhiyun    *-mpc824*)
291*4882a593Smuzhiyun        platformo=$object/cuboot-824x.o
292*4882a593Smuzhiyun        ;;
293*4882a593Smuzhiyun    *-mpc83*|*-asp834x*)
294*4882a593Smuzhiyun        platformo=$object/cuboot-83xx.o
295*4882a593Smuzhiyun        ;;
296*4882a593Smuzhiyun    *-tqm8541|*-mpc8560*|*-tqm8560|*-tqm8555|*-ksi8560*)
297*4882a593Smuzhiyun        platformo=$object/cuboot-85xx-cpm2.o
298*4882a593Smuzhiyun        ;;
299*4882a593Smuzhiyun    *-mpc85*|*-tqm85*|*-sbc85*)
300*4882a593Smuzhiyun        platformo=$object/cuboot-85xx.o
301*4882a593Smuzhiyun        ;;
302*4882a593Smuzhiyun    *-amigaone)
303*4882a593Smuzhiyun        link_address='0x800000'
304*4882a593Smuzhiyun        ;;
305*4882a593Smuzhiyun    esac
306*4882a593Smuzhiyun    ;;
307*4882a593Smuzhiyunps3)
308*4882a593Smuzhiyun    platformo="$object/ps3-head.o $object/ps3-hvcall.o $object/ps3.o"
309*4882a593Smuzhiyun    lds=$object/zImage.ps3.lds
310*4882a593Smuzhiyun    compression=
311*4882a593Smuzhiyun    ext=bin
312*4882a593Smuzhiyun    objflags="-O binary --set-section-flags=.bss=contents,alloc,load,data"
313*4882a593Smuzhiyun    ksection=.kernel:vmlinux.bin
314*4882a593Smuzhiyun    isection=.kernel:initrd
315*4882a593Smuzhiyun    link_address=''
316*4882a593Smuzhiyun    make_space=n
317*4882a593Smuzhiyun    pie=
318*4882a593Smuzhiyun    ;;
319*4882a593Smuzhiyunep88xc|ep405|ep8248e)
320*4882a593Smuzhiyun    platformo="$object/fixed-head.o $object/$platform.o"
321*4882a593Smuzhiyun    binary=y
322*4882a593Smuzhiyun    ;;
323*4882a593Smuzhiyunadder875-redboot)
324*4882a593Smuzhiyun    platformo="$object/fixed-head.o $object/redboot-8xx.o"
325*4882a593Smuzhiyun    binary=y
326*4882a593Smuzhiyun    ;;
327*4882a593Smuzhiyunsimpleboot-*)
328*4882a593Smuzhiyun    platformo="$object/fixed-head.o $object/simpleboot.o"
329*4882a593Smuzhiyun    binary=y
330*4882a593Smuzhiyun    ;;
331*4882a593Smuzhiyunasp834x-redboot)
332*4882a593Smuzhiyun    platformo="$object/fixed-head.o $object/redboot-83xx.o"
333*4882a593Smuzhiyun    binary=y
334*4882a593Smuzhiyun    ;;
335*4882a593Smuzhiyunxpedite52*)
336*4882a593Smuzhiyun    link_address='0x1400000'
337*4882a593Smuzhiyun    platformo=$object/cuboot-85xx.o
338*4882a593Smuzhiyun    ;;
339*4882a593Smuzhiyungamecube|wii)
340*4882a593Smuzhiyun    link_address='0x600000'
341*4882a593Smuzhiyun    platformo="$object/$platform-head.o $object/$platform.o"
342*4882a593Smuzhiyun    ;;
343*4882a593Smuzhiyuntreeboot-currituck)
344*4882a593Smuzhiyun    link_address='0x1000000'
345*4882a593Smuzhiyun    ;;
346*4882a593Smuzhiyuntreeboot-akebono)
347*4882a593Smuzhiyun    link_address='0x1000000'
348*4882a593Smuzhiyun    ;;
349*4882a593Smuzhiyuntreeboot-iss4xx-mpic)
350*4882a593Smuzhiyun    platformo="$object/treeboot-iss4xx.o"
351*4882a593Smuzhiyun    ;;
352*4882a593Smuzhiyunepapr)
353*4882a593Smuzhiyun    platformo="$object/pseries-head.o $object/epapr.o $object/epapr-wrapper.o"
354*4882a593Smuzhiyun    link_address='0x20000000'
355*4882a593Smuzhiyun    pie=-pie
356*4882a593Smuzhiyun    ;;
357*4882a593Smuzhiyunmvme5100)
358*4882a593Smuzhiyun    platformo="$object/fixed-head.o $object/mvme5100.o"
359*4882a593Smuzhiyun    binary=y
360*4882a593Smuzhiyun    ;;
361*4882a593Smuzhiyunmvme7100)
362*4882a593Smuzhiyun    platformo="$object/motload-head.o $object/mvme7100.o"
363*4882a593Smuzhiyun    link_address='0x4000000'
364*4882a593Smuzhiyun    binary=y
365*4882a593Smuzhiyun    ;;
366*4882a593Smuzhiyunesac
367*4882a593Smuzhiyun
368*4882a593Smuzhiyunvmz="$tmpdir/`basename \"$kernel\"`.$ext"
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun# Calculate the vmlinux.strip size
371*4882a593Smuzhiyun${CROSS}objcopy $objflags "$kernel" "$vmz.$$"
372*4882a593Smuzhiyunstrip_size=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" "$vmz.$$")
373*4882a593Smuzhiyun
374*4882a593Smuzhiyunif [ -z "$cacheit" -o ! -f "$vmz$compression" -o "$vmz$compression" -ot "$kernel" ]; then
375*4882a593Smuzhiyun    # recompress the image if we need to
376*4882a593Smuzhiyun    case $compression in
377*4882a593Smuzhiyun    .xz)
378*4882a593Smuzhiyun        xz --check=crc32 -f -6 "$vmz.$$"
379*4882a593Smuzhiyun        ;;
380*4882a593Smuzhiyun    .gz)
381*4882a593Smuzhiyun        gzip -n -f -9 "$vmz.$$"
382*4882a593Smuzhiyun        ;;
383*4882a593Smuzhiyun    .lzma)
384*4882a593Smuzhiyun        xz --format=lzma -f -6 "$vmz.$$"
385*4882a593Smuzhiyun	;;
386*4882a593Smuzhiyun    .lzo)
387*4882a593Smuzhiyun        lzop -f -9 "$vmz.$$"
388*4882a593Smuzhiyun	;;
389*4882a593Smuzhiyun    *)
390*4882a593Smuzhiyun        # drop the compression suffix so the stripped vmlinux is used
391*4882a593Smuzhiyun        compression=
392*4882a593Smuzhiyun	uboot_comp=none
393*4882a593Smuzhiyun	;;
394*4882a593Smuzhiyun    esac
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun    if [ -n "$cacheit" ]; then
397*4882a593Smuzhiyun	mv -f "$vmz.$$$compression" "$vmz$compression"
398*4882a593Smuzhiyun    else
399*4882a593Smuzhiyun	vmz="$vmz.$$"
400*4882a593Smuzhiyun    fi
401*4882a593Smuzhiyunelse
402*4882a593Smuzhiyun    rm -f $vmz.$$
403*4882a593Smuzhiyunfi
404*4882a593Smuzhiyun
405*4882a593Smuzhiyunvmz="$vmz$compression"
406*4882a593Smuzhiyun
407*4882a593Smuzhiyunif [ "$make_space" = "y" ]; then
408*4882a593Smuzhiyun	# Round the size to next higher MB limit
409*4882a593Smuzhiyun	round_size=$(((strip_size + 0xfffff) & 0xfff00000))
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun	round_size=0x$(printf "%x" $round_size)
412*4882a593Smuzhiyun	link_addr=$(printf "%d" $link_address)
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun	if [ $link_addr -lt $strip_size ]; then
415*4882a593Smuzhiyun	    echo "INFO: Uncompressed kernel (size 0x$(printf "%x\n" $strip_size))" \
416*4882a593Smuzhiyun			"overlaps the address of the wrapper($link_address)"
417*4882a593Smuzhiyun	    echo "INFO: Fixing the link_address of wrapper to ($round_size)"
418*4882a593Smuzhiyun	    link_address=$round_size
419*4882a593Smuzhiyun	fi
420*4882a593Smuzhiyunfi
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun# Extract kernel version information, some platforms want to include
423*4882a593Smuzhiyun# it in the image header
424*4882a593Smuzhiyunversion=`${CROSS}strings "$kernel" | grep '^Linux version [-0-9.]' | \
425*4882a593Smuzhiyun    cut -d' ' -f3`
426*4882a593Smuzhiyunif [ -n "$version" ]; then
427*4882a593Smuzhiyun    uboot_version="-n Linux-$version"
428*4882a593Smuzhiyunfi
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun# physical offset of kernel image
431*4882a593Smuzhiyunmembase=`${CROSS}objdump -p "$kernel" | grep -m 1 LOAD | awk '{print $7}'`
432*4882a593Smuzhiyun
433*4882a593Smuzhiyuncase "$platform" in
434*4882a593Smuzhiyunuboot)
435*4882a593Smuzhiyun    rm -f "$ofile"
436*4882a593Smuzhiyun    ${MKIMAGE} -A ppc -O linux -T kernel -C $uboot_comp -a $membase -e $membase \
437*4882a593Smuzhiyun	$uboot_version -d "$vmz" "$ofile"
438*4882a593Smuzhiyun    if [ -z "$cacheit" ]; then
439*4882a593Smuzhiyun	rm -f "$vmz"
440*4882a593Smuzhiyun    fi
441*4882a593Smuzhiyun    exit 0
442*4882a593Smuzhiyun    ;;
443*4882a593Smuzhiyunuboot-obs600)
444*4882a593Smuzhiyun    rm -f "$ofile"
445*4882a593Smuzhiyun    # obs600 wants a multi image with an initrd, so we need to put a fake
446*4882a593Smuzhiyun    # one in even when building a "normal" image.
447*4882a593Smuzhiyun    if [ -n "$initrd" ]; then
448*4882a593Smuzhiyun	real_rd="$initrd"
449*4882a593Smuzhiyun    else
450*4882a593Smuzhiyun	real_rd=`mktemp`
451*4882a593Smuzhiyun	echo "\0" >>"$real_rd"
452*4882a593Smuzhiyun    fi
453*4882a593Smuzhiyun    ${MKIMAGE} -A ppc -O linux -T multi -C gzip -a $membase -e $membase \
454*4882a593Smuzhiyun	$uboot_version -d "$vmz":"$real_rd":"$dtb" "$ofile"
455*4882a593Smuzhiyun    if [ -z "$initrd" ]; then
456*4882a593Smuzhiyun	rm -f "$real_rd"
457*4882a593Smuzhiyun    fi
458*4882a593Smuzhiyun    if [ -z "$cacheit" ]; then
459*4882a593Smuzhiyun	rm -f "$vmz"
460*4882a593Smuzhiyun    fi
461*4882a593Smuzhiyun    exit 0
462*4882a593Smuzhiyun    ;;
463*4882a593Smuzhiyunesac
464*4882a593Smuzhiyun
465*4882a593Smuzhiyunaddsec() {
466*4882a593Smuzhiyun    ${CROSS}objcopy $4 $1 \
467*4882a593Smuzhiyun	--add-section=$3="$2" \
468*4882a593Smuzhiyun	--set-section-flags=$3=contents,alloc,load,readonly,data
469*4882a593Smuzhiyun}
470*4882a593Smuzhiyun
471*4882a593Smuzhiyunaddsec $tmp "$vmz" $ksection $object/empty.o
472*4882a593Smuzhiyunif [ -z "$cacheit" ]; then
473*4882a593Smuzhiyun    rm -f "$vmz"
474*4882a593Smuzhiyunfi
475*4882a593Smuzhiyun
476*4882a593Smuzhiyunif [ -n "$initrd" ]; then
477*4882a593Smuzhiyun    addsec $tmp "$initrd" $isection
478*4882a593Smuzhiyunfi
479*4882a593Smuzhiyun
480*4882a593Smuzhiyunif [ -n "$dtb" ]; then
481*4882a593Smuzhiyun    addsec $tmp "$dtb" .kernel:dtb
482*4882a593Smuzhiyun    if [ -n "$dts" ]; then
483*4882a593Smuzhiyun	rm $dtb
484*4882a593Smuzhiyun    fi
485*4882a593Smuzhiyunfi
486*4882a593Smuzhiyun
487*4882a593Smuzhiyunif [ -n "$esm_blob" ]; then
488*4882a593Smuzhiyun    addsec $tmp "$esm_blob" $esection
489*4882a593Smuzhiyunfi
490*4882a593Smuzhiyun
491*4882a593Smuzhiyunif [ "$platform" != "miboot" ]; then
492*4882a593Smuzhiyun    if [ -n "$link_address" ] ; then
493*4882a593Smuzhiyun        text_start="-Ttext $link_address"
494*4882a593Smuzhiyun    fi
495*4882a593Smuzhiyun#link everything
496*4882a593Smuzhiyun    ${CROSS}ld -m $format -T $lds $text_start $pie $nodl -o "$ofile" $map \
497*4882a593Smuzhiyun	$platformo $tmp $object/wrapper.a
498*4882a593Smuzhiyun    rm $tmp
499*4882a593Smuzhiyunfi
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun# Some platforms need the zImage's entry point and base address
502*4882a593Smuzhiyunbase=0x`${CROSS}nm "$ofile" | grep ' _start$' | cut -d' ' -f1`
503*4882a593Smuzhiyunentry=`${CROSS}objdump -f "$ofile" | grep '^start address ' | cut -d' ' -f3`
504*4882a593Smuzhiyun
505*4882a593Smuzhiyunif [ -n "$binary" ]; then
506*4882a593Smuzhiyun    mv "$ofile" "$ofile".elf
507*4882a593Smuzhiyun    ${CROSS}objcopy -O binary "$ofile".elf "$ofile"
508*4882a593Smuzhiyunfi
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun# post-processing needed for some platforms
511*4882a593Smuzhiyuncase "$platform" in
512*4882a593Smuzhiyunpseries|chrp|maple)
513*4882a593Smuzhiyun    $objbin/addnote "$ofile"
514*4882a593Smuzhiyun    ;;
515*4882a593Smuzhiyuncoff)
516*4882a593Smuzhiyun    ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile"
517*4882a593Smuzhiyun    $objbin/hack-coff "$ofile"
518*4882a593Smuzhiyun    ;;
519*4882a593Smuzhiyuncuboot*)
520*4882a593Smuzhiyun    gzip -n -f -9 "$ofile"
521*4882a593Smuzhiyun    ${MKIMAGE} -A ppc -O linux -T kernel -C gzip -a "$base" -e "$entry" \
522*4882a593Smuzhiyun            $uboot_version -d "$ofile".gz "$ofile"
523*4882a593Smuzhiyun    ;;
524*4882a593Smuzhiyuntreeboot*)
525*4882a593Smuzhiyun    mv "$ofile" "$ofile.elf"
526*4882a593Smuzhiyun    $objbin/mktree "$ofile.elf" "$ofile" "$base" "$entry"
527*4882a593Smuzhiyun    if [ -z "$cacheit" ]; then
528*4882a593Smuzhiyun	rm -f "$ofile.elf"
529*4882a593Smuzhiyun    fi
530*4882a593Smuzhiyun    exit 0
531*4882a593Smuzhiyun    ;;
532*4882a593Smuzhiyunps3)
533*4882a593Smuzhiyun    # The ps3's loader supports loading a gzipped binary image from flash
534*4882a593Smuzhiyun    # rom to ram addr zero. The loader then enters the system reset
535*4882a593Smuzhiyun    # vector at addr 0x100.  A bootwrapper overlay is used to arrange for
536*4882a593Smuzhiyun    # a binary image of the kernel to be at addr zero, and yet have a
537*4882a593Smuzhiyun    # suitable bootwrapper entry at 0x100.  To construct the final rom
538*4882a593Smuzhiyun    # image 512 bytes from offset 0x100 is copied to the bootwrapper
539*4882a593Smuzhiyun    # place holder at symbol __system_reset_kernel.  The 512 bytes of the
540*4882a593Smuzhiyun    # bootwrapper entry code at symbol __system_reset_overlay is then
541*4882a593Smuzhiyun    # copied to offset 0x100.  At runtime the bootwrapper program copies
542*4882a593Smuzhiyun    # the data at __system_reset_kernel back to addr 0x100.
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun    system_reset_overlay=0x`${CROSS}nm "$ofile" \
545*4882a593Smuzhiyun        | grep ' __system_reset_overlay$'       \
546*4882a593Smuzhiyun        | cut -d' ' -f1`
547*4882a593Smuzhiyun    system_reset_overlay=`printf "%d" $system_reset_overlay`
548*4882a593Smuzhiyun    system_reset_kernel=0x`${CROSS}nm "$ofile" \
549*4882a593Smuzhiyun        | grep ' __system_reset_kernel$'       \
550*4882a593Smuzhiyun        | cut -d' ' -f1`
551*4882a593Smuzhiyun    system_reset_kernel=`printf "%d" $system_reset_kernel`
552*4882a593Smuzhiyun    overlay_dest="256"
553*4882a593Smuzhiyun    overlay_size="512"
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun    ${CROSS}objcopy -O binary "$ofile" "$ofile.bin"
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun    run_cmd dd if="$ofile.bin" of="$ofile.bin" conv=notrunc   \
558*4882a593Smuzhiyun        skip=$overlay_dest seek=$system_reset_kernel          \
559*4882a593Smuzhiyun        count=$overlay_size bs=1
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun    run_cmd dd if="$ofile.bin" of="$ofile.bin" conv=notrunc   \
562*4882a593Smuzhiyun        skip=$system_reset_overlay seek=$overlay_dest         \
563*4882a593Smuzhiyun        count=$overlay_size bs=1
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun    odir="$(dirname "$ofile.bin")"
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun    # The ps3's flash loader has a size limit of 16 MiB for the uncompressed
568*4882a593Smuzhiyun    # image.  If a compressed image that exceeded this limit is written to
569*4882a593Smuzhiyun    # flash the loader will decompress that image until the 16 MiB limit is
570*4882a593Smuzhiyun    # reached, then enter the system reset vector of the partially decompressed
571*4882a593Smuzhiyun    # image.  No warning is issued.
572*4882a593Smuzhiyun    rm -f "$odir"/{otheros,otheros-too-big}.bld
573*4882a593Smuzhiyun    size=$(${CROSS}nm --no-sort --radix=d "$ofile" | egrep ' _end$' | cut -d' ' -f1)
574*4882a593Smuzhiyun    bld="otheros.bld"
575*4882a593Smuzhiyun    if [ $size -gt $((0x1000000)) ]; then
576*4882a593Smuzhiyun        bld="otheros-too-big.bld"
577*4882a593Smuzhiyun    fi
578*4882a593Smuzhiyun    gzip -n --force -9 --stdout "$ofile.bin" > "$odir/$bld"
579*4882a593Smuzhiyun    ;;
580*4882a593Smuzhiyunesac
581