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