162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci# Copyright (C) 2006 Paul Mackerras, IBM Corporation <paulus@samba.org>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci# This script takes a kernel binary and optionally an initrd image
762306a36Sopenharmony_ci# and/or a device-tree blob, and creates a bootable zImage for a
862306a36Sopenharmony_ci# given platform.
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci# Options:
1162306a36Sopenharmony_ci# -o zImage	specify output file
1262306a36Sopenharmony_ci# -p platform	specify platform (links in $platform.o)
1362306a36Sopenharmony_ci# -i initrd	specify initrd file
1462306a36Sopenharmony_ci# -d devtree	specify device-tree blob
1562306a36Sopenharmony_ci# -s tree.dts	specify device-tree source file (needs dtc installed)
1662306a36Sopenharmony_ci# -e esm_blob   specify ESM blob for secure images
1762306a36Sopenharmony_ci# -c		cache $kernel.strip.gz (use if present & newer, else make)
1862306a36Sopenharmony_ci# -C prefix	specify command prefix for cross-building tools
1962306a36Sopenharmony_ci#		(strip, objcopy, ld)
2062306a36Sopenharmony_ci# -D dir	specify directory containing data files used by script
2162306a36Sopenharmony_ci#		(default ./arch/powerpc/boot)
2262306a36Sopenharmony_ci# -W dir	specify working directory for temporary files (default .)
2362306a36Sopenharmony_ci# -z		use gzip (legacy)
2462306a36Sopenharmony_ci# -Z zsuffix    compression to use (gz, xz or none)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci# Stop execution if any command fails
2762306a36Sopenharmony_ciset -e
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciexport LC_ALL=C
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci# Allow for verbose output
3262306a36Sopenharmony_ciif [ "$V" = 1 ]; then
3362306a36Sopenharmony_ci    set -x
3462306a36Sopenharmony_ci    map="-Map wrapper.map"
3562306a36Sopenharmony_cifi
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci# defaults
3862306a36Sopenharmony_cikernel=
3962306a36Sopenharmony_ciofile=zImage
4062306a36Sopenharmony_ciplatform=of
4162306a36Sopenharmony_ciinitrd=
4262306a36Sopenharmony_cidtb=
4362306a36Sopenharmony_cidts=
4462306a36Sopenharmony_ciesm_blob=
4562306a36Sopenharmony_cicacheit=
4662306a36Sopenharmony_cibinary=
4762306a36Sopenharmony_cicompression=.gz
4862306a36Sopenharmony_ciuboot_comp=gzip
4962306a36Sopenharmony_cipie=
5062306a36Sopenharmony_ciformat=
5162306a36Sopenharmony_cinotext=
5262306a36Sopenharmony_cirodynamic=
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci# cross-compilation prefix
5562306a36Sopenharmony_ciCROSS=
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci# mkimage wrapper script
5862306a36Sopenharmony_ciMKIMAGE=$srctree/scripts/mkuboot.sh
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci# directory for object and other files used by this script
6162306a36Sopenharmony_ciobject=arch/powerpc/boot
6262306a36Sopenharmony_ciobjbin=$object
6362306a36Sopenharmony_cidtc=scripts/dtc/dtc
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci# directory for working files
6662306a36Sopenharmony_citmpdir=.
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciusage() {
6962306a36Sopenharmony_ci    echo 'Usage: wrapper [-o output] [-p platform] [-i initrd]' >&2
7062306a36Sopenharmony_ci    echo '       [-d devtree] [-s tree.dts] [-e esm_blob]' >&2
7162306a36Sopenharmony_ci    echo '       [-c] [-C cross-prefix] [-D datadir] [-W workingdir]' >&2
7262306a36Sopenharmony_ci    echo '       [-Z (gz|xz|none)] [--no-compression] [vmlinux]' >&2
7362306a36Sopenharmony_ci    exit 1
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cirun_cmd() {
7762306a36Sopenharmony_ci    if [ "$V" = 1 ]; then
7862306a36Sopenharmony_ci        $* 2>&1
7962306a36Sopenharmony_ci    else
8062306a36Sopenharmony_ci        local msg
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci        set +e
8362306a36Sopenharmony_ci        msg=$($* 2>&1)
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci        if [ $? -ne "0" ]; then
8662306a36Sopenharmony_ci                echo $msg
8762306a36Sopenharmony_ci                exit 1
8862306a36Sopenharmony_ci        fi
8962306a36Sopenharmony_ci        set -e
9062306a36Sopenharmony_ci    fi
9162306a36Sopenharmony_ci}
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ciwhile [ "$#" -gt 0 ]; do
9462306a36Sopenharmony_ci    case "$1" in
9562306a36Sopenharmony_ci    -o)
9662306a36Sopenharmony_ci	shift
9762306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
9862306a36Sopenharmony_ci	ofile="$1"
9962306a36Sopenharmony_ci	;;
10062306a36Sopenharmony_ci    -p)
10162306a36Sopenharmony_ci	shift
10262306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
10362306a36Sopenharmony_ci	platform="$1"
10462306a36Sopenharmony_ci	;;
10562306a36Sopenharmony_ci    -i)
10662306a36Sopenharmony_ci	shift
10762306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
10862306a36Sopenharmony_ci	initrd="$1"
10962306a36Sopenharmony_ci	;;
11062306a36Sopenharmony_ci    -d)
11162306a36Sopenharmony_ci	shift
11262306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
11362306a36Sopenharmony_ci	dtb="$1"
11462306a36Sopenharmony_ci	;;
11562306a36Sopenharmony_ci    -e)
11662306a36Sopenharmony_ci	shift
11762306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
11862306a36Sopenharmony_ci	esm_blob="$1"
11962306a36Sopenharmony_ci	;;
12062306a36Sopenharmony_ci    -s)
12162306a36Sopenharmony_ci	shift
12262306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
12362306a36Sopenharmony_ci	dts="$1"
12462306a36Sopenharmony_ci	;;
12562306a36Sopenharmony_ci    -c)
12662306a36Sopenharmony_ci	cacheit=y
12762306a36Sopenharmony_ci	;;
12862306a36Sopenharmony_ci    -C)
12962306a36Sopenharmony_ci	shift
13062306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
13162306a36Sopenharmony_ci	CROSS="$1"
13262306a36Sopenharmony_ci	;;
13362306a36Sopenharmony_ci    -D)
13462306a36Sopenharmony_ci	shift
13562306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
13662306a36Sopenharmony_ci	object="$1"
13762306a36Sopenharmony_ci	objbin="$1"
13862306a36Sopenharmony_ci	;;
13962306a36Sopenharmony_ci    -W)
14062306a36Sopenharmony_ci	shift
14162306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
14262306a36Sopenharmony_ci	tmpdir="$1"
14362306a36Sopenharmony_ci	;;
14462306a36Sopenharmony_ci    -z)
14562306a36Sopenharmony_ci	compression=.gz
14662306a36Sopenharmony_ci	uboot_comp=gzip
14762306a36Sopenharmony_ci	;;
14862306a36Sopenharmony_ci    -Z)
14962306a36Sopenharmony_ci	shift
15062306a36Sopenharmony_ci	[ "$#" -gt 0 ] || usage
15162306a36Sopenharmony_ci        [ "$1" != "gz" -o "$1" != "xz" -o "$1" != "lzma" -o "$1" != "lzo" -o "$1" != "none" ] || usage
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	compression=".$1"
15462306a36Sopenharmony_ci	uboot_comp=$1
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci        if [ $compression = ".none" ]; then
15762306a36Sopenharmony_ci                compression=
15862306a36Sopenharmony_ci		uboot_comp=none
15962306a36Sopenharmony_ci        fi
16062306a36Sopenharmony_ci	if [ $uboot_comp = "gz" ]; then
16162306a36Sopenharmony_ci		uboot_comp=gzip
16262306a36Sopenharmony_ci	fi
16362306a36Sopenharmony_ci	;;
16462306a36Sopenharmony_ci    --no-gzip)
16562306a36Sopenharmony_ci        # a "feature" of the wrapper script is that it can be used outside
16662306a36Sopenharmony_ci        # the kernel tree. So keeping this around for backwards compatibility.
16762306a36Sopenharmony_ci        compression=
16862306a36Sopenharmony_ci	uboot_comp=none
16962306a36Sopenharmony_ci        ;;
17062306a36Sopenharmony_ci    -?)
17162306a36Sopenharmony_ci	usage
17262306a36Sopenharmony_ci	;;
17362306a36Sopenharmony_ci    *)
17462306a36Sopenharmony_ci	[ -z "$kernel" ] || usage
17562306a36Sopenharmony_ci	kernel="$1"
17662306a36Sopenharmony_ci	;;
17762306a36Sopenharmony_ci    esac
17862306a36Sopenharmony_ci    shift
17962306a36Sopenharmony_cidone
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ciif [ -n "$dts" ]; then
18362306a36Sopenharmony_ci    if [ ! -r "$dts" -a -r "$object/dts/$dts" ]; then
18462306a36Sopenharmony_ci	dts="$object/dts/$dts"
18562306a36Sopenharmony_ci    fi
18662306a36Sopenharmony_ci    if [ -z "$dtb" ]; then
18762306a36Sopenharmony_ci	dtb="$platform.dtb"
18862306a36Sopenharmony_ci    fi
18962306a36Sopenharmony_ci    $dtc -O dtb -o "$dtb" -b 0 "$dts"
19062306a36Sopenharmony_cifi
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ciif [ -z "$kernel" ]; then
19362306a36Sopenharmony_ci    kernel=vmlinux
19462306a36Sopenharmony_cifi
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ciLC_ALL=C elfformat="`${CROSS}objdump -p "$kernel" | grep 'file format' | awk '{print $4}'`"
19762306a36Sopenharmony_cicase "$elfformat" in
19862306a36Sopenharmony_ci    elf64-powerpcle)	format=elf64lppc	;;
19962306a36Sopenharmony_ci    elf64-powerpc)	format=elf32ppc	;;
20062306a36Sopenharmony_ci    elf32-powerpc)	format=elf32ppc	;;
20162306a36Sopenharmony_ciesac
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_cild_version()
20462306a36Sopenharmony_ci{
20562306a36Sopenharmony_ci    # Poached from scripts/ld-version.sh, but we don't want to call that because
20662306a36Sopenharmony_ci    # this script (wrapper) is distributed separately from the kernel source.
20762306a36Sopenharmony_ci    # Extract linker version number from stdin and turn into single number.
20862306a36Sopenharmony_ci    awk '{
20962306a36Sopenharmony_ci	gsub(".*\\)", "");
21062306a36Sopenharmony_ci	gsub(".*version ", "");
21162306a36Sopenharmony_ci	gsub("-.*", "");
21262306a36Sopenharmony_ci	split($1,a, ".");
21362306a36Sopenharmony_ci	if( length(a[3]) == "8" )
21462306a36Sopenharmony_ci		# a[3] is probably a date of format yyyymmdd used for release snapshots. We
21562306a36Sopenharmony_ci		# can assume it to be zero as it does not signify a new version as such.
21662306a36Sopenharmony_ci		a[3] = 0;
21762306a36Sopenharmony_ci	print a[1]*100000000 + a[2]*1000000 + a[3]*10000;
21862306a36Sopenharmony_ci	exit
21962306a36Sopenharmony_ci    }'
22062306a36Sopenharmony_ci}
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_cild_is_lld()
22362306a36Sopenharmony_ci{
22462306a36Sopenharmony_ci	${CROSS}ld -V 2>&1 | grep -q LLD
22562306a36Sopenharmony_ci}
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci# Do not include PT_INTERP segment when linking pie. Non-pie linking
22862306a36Sopenharmony_ci# just ignores this option.
22962306a36Sopenharmony_ciLD_VERSION=$(${CROSS}ld --version | ld_version)
23062306a36Sopenharmony_ciLD_NO_DL_MIN_VERSION=$(echo 2.26 | ld_version)
23162306a36Sopenharmony_ciif [ "$LD_VERSION" -ge "$LD_NO_DL_MIN_VERSION" ] ; then
23262306a36Sopenharmony_ci	nodl="--no-dynamic-linker"
23362306a36Sopenharmony_cifi
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci# suppress some warnings in recent ld versions
23662306a36Sopenharmony_cinowarn="-z noexecstack"
23762306a36Sopenharmony_ciif ! ld_is_lld; then
23862306a36Sopenharmony_ci	if [ "$LD_VERSION" -ge "$(echo 2.39 | ld_version)" ]; then
23962306a36Sopenharmony_ci		nowarn="$nowarn --no-warn-rwx-segments"
24062306a36Sopenharmony_ci	fi
24162306a36Sopenharmony_cifi
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ciplatformo=$object/"$platform".o
24462306a36Sopenharmony_cilds=$object/zImage.lds
24562306a36Sopenharmony_ciext=strip
24662306a36Sopenharmony_ciobjflags=-S
24762306a36Sopenharmony_citmp=$tmpdir/zImage.$$.o
24862306a36Sopenharmony_ciksection=.kernel:vmlinux.strip
24962306a36Sopenharmony_ciisection=.kernel:initrd
25062306a36Sopenharmony_ciesection=.kernel:esm_blob
25162306a36Sopenharmony_cilink_address='0x400000'
25262306a36Sopenharmony_cimake_space=y
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ciif [ -n "$esm_blob" -a "$platform" != "pseries" ]; then
25662306a36Sopenharmony_ci    echo "ESM blob not support on non-pseries platforms" >&2
25762306a36Sopenharmony_ci    exit 1
25862306a36Sopenharmony_cifi
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_cicase "$platform" in
26162306a36Sopenharmony_ciof)
26262306a36Sopenharmony_ci    platformo="$object/of.o $object/epapr.o"
26362306a36Sopenharmony_ci    make_space=n
26462306a36Sopenharmony_ci    ;;
26562306a36Sopenharmony_cipseries)
26662306a36Sopenharmony_ci    platformo="$object/pseries-head.o $object/of.o $object/epapr.o"
26762306a36Sopenharmony_ci    link_address='0x4000000'
26862306a36Sopenharmony_ci    if [ "$format" != "elf32ppc" ]; then
26962306a36Sopenharmony_ci	link_address=
27062306a36Sopenharmony_ci	pie=-pie
27162306a36Sopenharmony_ci    fi
27262306a36Sopenharmony_ci    make_space=n
27362306a36Sopenharmony_ci    ;;
27462306a36Sopenharmony_cimaple)
27562306a36Sopenharmony_ci    platformo="$object/of.o $object/epapr.o"
27662306a36Sopenharmony_ci    link_address='0x400000'
27762306a36Sopenharmony_ci    make_space=n
27862306a36Sopenharmony_ci    ;;
27962306a36Sopenharmony_cipmac|chrp)
28062306a36Sopenharmony_ci    platformo="$object/of.o $object/epapr.o"
28162306a36Sopenharmony_ci    make_space=n
28262306a36Sopenharmony_ci    ;;
28362306a36Sopenharmony_cicoff)
28462306a36Sopenharmony_ci    platformo="$object/crt0.o $object/of.o $object/epapr.o"
28562306a36Sopenharmony_ci    lds=$object/zImage.coff.lds
28662306a36Sopenharmony_ci    link_address='0x500000'
28762306a36Sopenharmony_ci    make_space=n
28862306a36Sopenharmony_ci    pie=
28962306a36Sopenharmony_ci    ;;
29062306a36Sopenharmony_cimiboot|uboot*)
29162306a36Sopenharmony_ci    # miboot and U-boot want just the bare bits, not an ELF binary
29262306a36Sopenharmony_ci    ext=bin
29362306a36Sopenharmony_ci    objflags="-O binary"
29462306a36Sopenharmony_ci    tmp="$ofile"
29562306a36Sopenharmony_ci    ksection=image
29662306a36Sopenharmony_ci    isection=initrd
29762306a36Sopenharmony_ci    ;;
29862306a36Sopenharmony_cicuboot*)
29962306a36Sopenharmony_ci    binary=y
30062306a36Sopenharmony_ci    compression=
30162306a36Sopenharmony_ci    case "$platform" in
30262306a36Sopenharmony_ci    *-mpc866ads|*-mpc885ads|*-adder875*|*-ep88xc)
30362306a36Sopenharmony_ci        platformo=$object/cuboot-8xx.o
30462306a36Sopenharmony_ci        ;;
30562306a36Sopenharmony_ci    *5200*|*-motionpro)
30662306a36Sopenharmony_ci        platformo=$object/cuboot-52xx.o
30762306a36Sopenharmony_ci        ;;
30862306a36Sopenharmony_ci    *-pq2fads|*-ep8248e|*-mpc8272*|*-storcenter)
30962306a36Sopenharmony_ci        platformo=$object/cuboot-pq2.o
31062306a36Sopenharmony_ci        ;;
31162306a36Sopenharmony_ci    *-mpc824*)
31262306a36Sopenharmony_ci        platformo=$object/cuboot-824x.o
31362306a36Sopenharmony_ci        ;;
31462306a36Sopenharmony_ci    *-mpc83*|*-asp834x*)
31562306a36Sopenharmony_ci        platformo=$object/cuboot-83xx.o
31662306a36Sopenharmony_ci        ;;
31762306a36Sopenharmony_ci    *-tqm8541|*-mpc8560*|*-tqm8560|*-tqm8555|*-ksi8560*)
31862306a36Sopenharmony_ci        platformo=$object/cuboot-85xx-cpm2.o
31962306a36Sopenharmony_ci        ;;
32062306a36Sopenharmony_ci    *-mpc85*|*-tqm85*)
32162306a36Sopenharmony_ci        platformo=$object/cuboot-85xx.o
32262306a36Sopenharmony_ci        ;;
32362306a36Sopenharmony_ci    *-amigaone)
32462306a36Sopenharmony_ci        link_address='0x800000'
32562306a36Sopenharmony_ci        ;;
32662306a36Sopenharmony_ci    esac
32762306a36Sopenharmony_ci    ;;
32862306a36Sopenharmony_cips3)
32962306a36Sopenharmony_ci    platformo="$object/ps3-head.o $object/ps3-hvcall.o $object/ps3.o"
33062306a36Sopenharmony_ci    lds=$object/zImage.ps3.lds
33162306a36Sopenharmony_ci    compression=
33262306a36Sopenharmony_ci    ext=bin
33362306a36Sopenharmony_ci    objflags="-O binary --set-section-flags=.bss=contents,alloc,load,data"
33462306a36Sopenharmony_ci    ksection=.kernel:vmlinux.bin
33562306a36Sopenharmony_ci    isection=.kernel:initrd
33662306a36Sopenharmony_ci    link_address=''
33762306a36Sopenharmony_ci    make_space=n
33862306a36Sopenharmony_ci    pie=
33962306a36Sopenharmony_ci    ;;
34062306a36Sopenharmony_ciep88xc|ep405|ep8248e)
34162306a36Sopenharmony_ci    platformo="$object/fixed-head.o $object/$platform.o"
34262306a36Sopenharmony_ci    binary=y
34362306a36Sopenharmony_ci    ;;
34462306a36Sopenharmony_ciadder875-redboot)
34562306a36Sopenharmony_ci    platformo="$object/fixed-head.o $object/redboot-8xx.o"
34662306a36Sopenharmony_ci    binary=y
34762306a36Sopenharmony_ci    ;;
34862306a36Sopenharmony_cisimpleboot-*)
34962306a36Sopenharmony_ci    platformo="$object/fixed-head.o $object/simpleboot.o"
35062306a36Sopenharmony_ci    binary=y
35162306a36Sopenharmony_ci    ;;
35262306a36Sopenharmony_ciasp834x-redboot)
35362306a36Sopenharmony_ci    platformo="$object/fixed-head.o $object/redboot-83xx.o"
35462306a36Sopenharmony_ci    binary=y
35562306a36Sopenharmony_ci    ;;
35662306a36Sopenharmony_cixpedite52*)
35762306a36Sopenharmony_ci    link_address='0x1400000'
35862306a36Sopenharmony_ci    platformo=$object/cuboot-85xx.o
35962306a36Sopenharmony_ci    ;;
36062306a36Sopenharmony_cigamecube|wii)
36162306a36Sopenharmony_ci    link_address='0x600000'
36262306a36Sopenharmony_ci    platformo="$object/$platform-head.o $object/$platform.o"
36362306a36Sopenharmony_ci    ;;
36462306a36Sopenharmony_cimicrowatt)
36562306a36Sopenharmony_ci    link_address='0x500000'
36662306a36Sopenharmony_ci    platformo="$object/fixed-head.o $object/$platform.o"
36762306a36Sopenharmony_ci    binary=y
36862306a36Sopenharmony_ci    ;;
36962306a36Sopenharmony_citreeboot-currituck)
37062306a36Sopenharmony_ci    link_address='0x1000000'
37162306a36Sopenharmony_ci    ;;
37262306a36Sopenharmony_citreeboot-akebono)
37362306a36Sopenharmony_ci    link_address='0x1000000'
37462306a36Sopenharmony_ci    ;;
37562306a36Sopenharmony_citreeboot-iss4xx-mpic)
37662306a36Sopenharmony_ci    platformo="$object/treeboot-iss4xx.o"
37762306a36Sopenharmony_ci    ;;
37862306a36Sopenharmony_ciepapr)
37962306a36Sopenharmony_ci    platformo="$object/pseries-head.o $object/epapr.o $object/epapr-wrapper.o"
38062306a36Sopenharmony_ci    link_address='0x20000000'
38162306a36Sopenharmony_ci    pie=-pie
38262306a36Sopenharmony_ci    notext='-z notext'
38362306a36Sopenharmony_ci    rodynamic=$(if ${CROSS}ld -V 2>&1 | grep -q LLD ; then echo "-z rodynamic"; fi)
38462306a36Sopenharmony_ci    ;;
38562306a36Sopenharmony_cimvme5100)
38662306a36Sopenharmony_ci    platformo="$object/fixed-head.o $object/mvme5100.o"
38762306a36Sopenharmony_ci    binary=y
38862306a36Sopenharmony_ci    ;;
38962306a36Sopenharmony_cimvme7100)
39062306a36Sopenharmony_ci    platformo="$object/motload-head.o $object/mvme7100.o"
39162306a36Sopenharmony_ci    link_address='0x4000000'
39262306a36Sopenharmony_ci    binary=y
39362306a36Sopenharmony_ci    ;;
39462306a36Sopenharmony_ciesac
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_civmz="$tmpdir/`basename \"$kernel\"`.$ext"
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci# Calculate the vmlinux.strip size
39962306a36Sopenharmony_ci${CROSS}objcopy $objflags "$kernel" "$vmz.$$"
40062306a36Sopenharmony_cistrip_size=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" "$vmz.$$")
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ciif [ -z "$cacheit" -o ! -f "$vmz$compression" -o "$vmz$compression" -ot "$kernel" ]; then
40362306a36Sopenharmony_ci    # recompress the image if we need to
40462306a36Sopenharmony_ci    case $compression in
40562306a36Sopenharmony_ci    .xz)
40662306a36Sopenharmony_ci        xz --check=crc32 -f -6 "$vmz.$$"
40762306a36Sopenharmony_ci        ;;
40862306a36Sopenharmony_ci    .gz)
40962306a36Sopenharmony_ci        gzip -n -f -9 "$vmz.$$"
41062306a36Sopenharmony_ci        ;;
41162306a36Sopenharmony_ci    .lzma)
41262306a36Sopenharmony_ci        xz --format=lzma -f -6 "$vmz.$$"
41362306a36Sopenharmony_ci	;;
41462306a36Sopenharmony_ci    .lzo)
41562306a36Sopenharmony_ci        lzop -f -9 "$vmz.$$"
41662306a36Sopenharmony_ci	;;
41762306a36Sopenharmony_ci    *)
41862306a36Sopenharmony_ci        # drop the compression suffix so the stripped vmlinux is used
41962306a36Sopenharmony_ci        compression=
42062306a36Sopenharmony_ci	uboot_comp=none
42162306a36Sopenharmony_ci	;;
42262306a36Sopenharmony_ci    esac
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci    if [ -n "$cacheit" ]; then
42562306a36Sopenharmony_ci	mv -f "$vmz.$$$compression" "$vmz$compression"
42662306a36Sopenharmony_ci    else
42762306a36Sopenharmony_ci	vmz="$vmz.$$"
42862306a36Sopenharmony_ci    fi
42962306a36Sopenharmony_cielse
43062306a36Sopenharmony_ci    rm -f $vmz.$$
43162306a36Sopenharmony_cifi
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_civmz="$vmz$compression"
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ciif [ "$make_space" = "y" ]; then
43662306a36Sopenharmony_ci	# Round the size to next higher MB limit
43762306a36Sopenharmony_ci	round_size=$(((strip_size + 0xfffff) & 0xfff00000))
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci	round_size=0x$(printf "%x" $round_size)
44062306a36Sopenharmony_ci	link_addr=$(printf "%d" $link_address)
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci	if [ $link_addr -lt $strip_size ]; then
44362306a36Sopenharmony_ci	    echo "INFO: Uncompressed kernel (size 0x$(printf "%x\n" $strip_size))" \
44462306a36Sopenharmony_ci			"overlaps the address of the wrapper($link_address)"
44562306a36Sopenharmony_ci	    echo "INFO: Fixing the link_address of wrapper to ($round_size)"
44662306a36Sopenharmony_ci	    link_address=$round_size
44762306a36Sopenharmony_ci	fi
44862306a36Sopenharmony_cifi
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci# Extract kernel version information, some platforms want to include
45162306a36Sopenharmony_ci# it in the image header
45262306a36Sopenharmony_civersion=`${CROSS}strings "$kernel" | grep '^Linux version [-0-9.]' | \
45362306a36Sopenharmony_ci    head -n1 | cut -d' ' -f3`
45462306a36Sopenharmony_ciif [ -n "$version" ]; then
45562306a36Sopenharmony_ci    uboot_version="-n Linux-$version"
45662306a36Sopenharmony_cifi
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci# physical offset of kernel image
45962306a36Sopenharmony_cimembase=`${CROSS}objdump -p "$kernel" | grep -m 1 LOAD | awk '{print $7}'`
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_cicase "$platform" in
46262306a36Sopenharmony_ciuboot)
46362306a36Sopenharmony_ci    rm -f "$ofile"
46462306a36Sopenharmony_ci    ${MKIMAGE} -A ppc -O linux -T kernel -C $uboot_comp -a $membase -e $membase \
46562306a36Sopenharmony_ci	$uboot_version -d "$vmz" "$ofile"
46662306a36Sopenharmony_ci    if [ -z "$cacheit" ]; then
46762306a36Sopenharmony_ci	rm -f "$vmz"
46862306a36Sopenharmony_ci    fi
46962306a36Sopenharmony_ci    exit 0
47062306a36Sopenharmony_ci    ;;
47162306a36Sopenharmony_ciuboot-obs600)
47262306a36Sopenharmony_ci    rm -f "$ofile"
47362306a36Sopenharmony_ci    # obs600 wants a multi image with an initrd, so we need to put a fake
47462306a36Sopenharmony_ci    # one in even when building a "normal" image.
47562306a36Sopenharmony_ci    if [ -n "$initrd" ]; then
47662306a36Sopenharmony_ci	real_rd="$initrd"
47762306a36Sopenharmony_ci    else
47862306a36Sopenharmony_ci	real_rd=`mktemp`
47962306a36Sopenharmony_ci	echo "\0" >>"$real_rd"
48062306a36Sopenharmony_ci    fi
48162306a36Sopenharmony_ci    ${MKIMAGE} -A ppc -O linux -T multi -C gzip -a $membase -e $membase \
48262306a36Sopenharmony_ci	$uboot_version -d "$vmz":"$real_rd":"$dtb" "$ofile"
48362306a36Sopenharmony_ci    if [ -z "$initrd" ]; then
48462306a36Sopenharmony_ci	rm -f "$real_rd"
48562306a36Sopenharmony_ci    fi
48662306a36Sopenharmony_ci    if [ -z "$cacheit" ]; then
48762306a36Sopenharmony_ci	rm -f "$vmz"
48862306a36Sopenharmony_ci    fi
48962306a36Sopenharmony_ci    exit 0
49062306a36Sopenharmony_ci    ;;
49162306a36Sopenharmony_ciesac
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ciaddsec() {
49462306a36Sopenharmony_ci    ${CROSS}objcopy $4 $1 \
49562306a36Sopenharmony_ci	--add-section=$3="$2" \
49662306a36Sopenharmony_ci	--set-section-flags=$3=contents,alloc,load,readonly,data
49762306a36Sopenharmony_ci}
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_ciaddsec $tmp "$vmz" $ksection $object/empty.o
50062306a36Sopenharmony_ciif [ -z "$cacheit" ]; then
50162306a36Sopenharmony_ci    rm -f "$vmz"
50262306a36Sopenharmony_cifi
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ciif [ -n "$initrd" ]; then
50562306a36Sopenharmony_ci    addsec $tmp "$initrd" $isection
50662306a36Sopenharmony_cifi
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ciif [ -n "$dtb" ]; then
50962306a36Sopenharmony_ci    addsec $tmp "$dtb" .kernel:dtb
51062306a36Sopenharmony_ci    if [ -n "$dts" ]; then
51162306a36Sopenharmony_ci	rm $dtb
51262306a36Sopenharmony_ci    fi
51362306a36Sopenharmony_cifi
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ciif [ -n "$esm_blob" ]; then
51662306a36Sopenharmony_ci    addsec $tmp "$esm_blob" $esection
51762306a36Sopenharmony_cifi
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ciif [ "$platform" != "miboot" ]; then
52062306a36Sopenharmony_ci    if [ -n "$link_address" ] ; then
52162306a36Sopenharmony_ci        text_start="-Ttext $link_address"
52262306a36Sopenharmony_ci    fi
52362306a36Sopenharmony_ci#link everything
52462306a36Sopenharmony_ci    ${CROSS}ld -m $format -T $lds $text_start $pie $nodl $nowarn $rodynamic $notext -o "$ofile" $map \
52562306a36Sopenharmony_ci	$platformo $tmp $object/wrapper.a
52662306a36Sopenharmony_ci    rm $tmp
52762306a36Sopenharmony_cifi
52862306a36Sopenharmony_ci
52962306a36Sopenharmony_ci# Some platforms need the zImage's entry point and base address
53062306a36Sopenharmony_cibase=0x`${CROSS}nm "$ofile" | grep ' _start$' | cut -d' ' -f1`
53162306a36Sopenharmony_cientry=`${CROSS}objdump -f "$ofile" | grep '^start address ' | cut -d' ' -f3`
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ciif [ -n "$binary" ]; then
53462306a36Sopenharmony_ci    mv "$ofile" "$ofile".elf
53562306a36Sopenharmony_ci    ${CROSS}objcopy -O binary "$ofile".elf "$ofile"
53662306a36Sopenharmony_cifi
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_ci# post-processing needed for some platforms
53962306a36Sopenharmony_cicase "$platform" in
54062306a36Sopenharmony_cipseries|chrp|maple)
54162306a36Sopenharmony_ci    $objbin/addnote "$ofile"
54262306a36Sopenharmony_ci    ;;
54362306a36Sopenharmony_cicoff)
54462306a36Sopenharmony_ci    ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile"
54562306a36Sopenharmony_ci    $objbin/hack-coff "$ofile"
54662306a36Sopenharmony_ci    ;;
54762306a36Sopenharmony_cicuboot*)
54862306a36Sopenharmony_ci    gzip -n -f -9 "$ofile"
54962306a36Sopenharmony_ci    ${MKIMAGE} -A ppc -O linux -T kernel -C gzip -a "$base" -e "$entry" \
55062306a36Sopenharmony_ci            $uboot_version -d "$ofile".gz "$ofile"
55162306a36Sopenharmony_ci    ;;
55262306a36Sopenharmony_citreeboot*)
55362306a36Sopenharmony_ci    mv "$ofile" "$ofile.elf"
55462306a36Sopenharmony_ci    $objbin/mktree "$ofile.elf" "$ofile" "$base" "$entry"
55562306a36Sopenharmony_ci    if [ -z "$cacheit" ]; then
55662306a36Sopenharmony_ci	rm -f "$ofile.elf"
55762306a36Sopenharmony_ci    fi
55862306a36Sopenharmony_ci    exit 0
55962306a36Sopenharmony_ci    ;;
56062306a36Sopenharmony_cips3)
56162306a36Sopenharmony_ci    # The ps3's loader supports loading a gzipped binary image from flash
56262306a36Sopenharmony_ci    # rom to ram addr zero. The loader then enters the system reset
56362306a36Sopenharmony_ci    # vector at addr 0x100.  A bootwrapper overlay is used to arrange for
56462306a36Sopenharmony_ci    # a binary image of the kernel to be at addr zero, and yet have a
56562306a36Sopenharmony_ci    # suitable bootwrapper entry at 0x100.  To construct the final rom
56662306a36Sopenharmony_ci    # image 512 bytes from offset 0x100 is copied to the bootwrapper
56762306a36Sopenharmony_ci    # place holder at symbol __system_reset_kernel.  The 512 bytes of the
56862306a36Sopenharmony_ci    # bootwrapper entry code at symbol __system_reset_overlay is then
56962306a36Sopenharmony_ci    # copied to offset 0x100.  At runtime the bootwrapper program copies
57062306a36Sopenharmony_ci    # the data at __system_reset_kernel back to addr 0x100.
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ci    system_reset_overlay=0x`${CROSS}nm "$ofile" \
57362306a36Sopenharmony_ci        | grep ' __system_reset_overlay$'       \
57462306a36Sopenharmony_ci        | cut -d' ' -f1`
57562306a36Sopenharmony_ci    system_reset_overlay=`printf "%d" $system_reset_overlay`
57662306a36Sopenharmony_ci    system_reset_kernel=0x`${CROSS}nm "$ofile" \
57762306a36Sopenharmony_ci        | grep ' __system_reset_kernel$'       \
57862306a36Sopenharmony_ci        | cut -d' ' -f1`
57962306a36Sopenharmony_ci    system_reset_kernel=`printf "%d" $system_reset_kernel`
58062306a36Sopenharmony_ci    overlay_dest="256"
58162306a36Sopenharmony_ci    overlay_size="512"
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci    ${CROSS}objcopy -O binary "$ofile" "$ofile.bin"
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci    run_cmd dd if="$ofile.bin" of="$ofile.bin" conv=notrunc   \
58662306a36Sopenharmony_ci        skip=$overlay_dest seek=$system_reset_kernel          \
58762306a36Sopenharmony_ci        count=$overlay_size bs=1
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_ci    run_cmd dd if="$ofile.bin" of="$ofile.bin" conv=notrunc   \
59062306a36Sopenharmony_ci        skip=$system_reset_overlay seek=$overlay_dest         \
59162306a36Sopenharmony_ci        count=$overlay_size bs=1
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ci    odir="$(dirname "$ofile.bin")"
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci    # The ps3's flash loader has a size limit of 16 MiB for the uncompressed
59662306a36Sopenharmony_ci    # image.  If a compressed image that exceeded this limit is written to
59762306a36Sopenharmony_ci    # flash the loader will decompress that image until the 16 MiB limit is
59862306a36Sopenharmony_ci    # reached, then enter the system reset vector of the partially decompressed
59962306a36Sopenharmony_ci    # image.  No warning is issued.
60062306a36Sopenharmony_ci    rm -f "$odir"/{otheros,otheros-too-big}.bld
60162306a36Sopenharmony_ci    size=$(${CROSS}nm --no-sort --radix=d "$ofile" | grep -E ' _end$' | cut -d' ' -f1)
60262306a36Sopenharmony_ci    bld="otheros.bld"
60362306a36Sopenharmony_ci    if [ $size -gt $((0x1000000)) ]; then
60462306a36Sopenharmony_ci        bld="otheros-too-big.bld"
60562306a36Sopenharmony_ci    fi
60662306a36Sopenharmony_ci    gzip -n --force -9 --stdout "$ofile.bin" > "$odir/$bld"
60762306a36Sopenharmony_ci    ;;
60862306a36Sopenharmony_ciesac
609