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