#!/usr/bin/env bash # Copyright 2018 The Fuchsia Authors # # Use of this source code is governed by a MIT-style # license that can be found in the LICENSE file or at # https://opensource.org/licenses/MIT set -eo pipefail SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ZIRCON_DIR="${SCRIPTS_DIR}/.." USE_AVB= BOARD= BUILD_DIR= CMDLINE= MKBOOTIMG_CMDLINE= MEXEC= DTB_PATH= DTB_DEST= USE_GZIP= USE_LZ4= KERNEL_OFFSET=0x00080000 MEMBASE=0x00000000 BOOT_IMG= VBMETA_IMG= ZIRCON_BOOTIMAGE= MKBOOTIMG_ARGS= function HELP { echo "help:" echo "-a : use AVB to sign image" echo "-b : board name" echo "-B : path to zircon build directory" echo "-c : Extra command line options for the ZBI" echo "-C : Extra command line options for mkbootimg" echo "-d : path to device tree binary" echo "-D (append | kdtb | mkbootimg) : destination for device tree binary" echo "-g : gzip compress the image" echo "-l : lz4 compress the image" echo "-h : print help" echo "-K : kernel offset for mkbootimg (default ${KERNEL_OFFSET})" echo "-m : Add mexec option to command line" echo "-M : membase for mkbootimg (default ${MEMBASE})" echo "-o : output boot.img file (defaults to /-boot.img)" echo "-v : output vbmeta.img file (defaults to /-vbmeta.img)" echo "-z : input zircon ZBI file (defaults to /-boot.img)" exit 1 } # These values seem to work with all our boards, so we haven't parameterized them. DTB_OFFSET=0x03000000 BOOT_PARTITION_SIZE=33554432 while getopts "ab:B:c:C::d:D:ghK:lmM:r:o:v:z:" FLAG; do case $FLAG in a) USE_AVB=true;; b) BOARD="${OPTARG}";; B) BUILD_DIR="${OPTARG}";; c) CMDLINE+="${OPTARG}";; C) MKBOOTIMG_CMDLINE+="${OPTARG}";; d) DTB_PATH="${OPTARG}";; D) DTB_DEST="${OPTARG}";; g) USE_GZIP=true;; K) KERNEL_OFFSET="${OPTARG}";; l) USE_LZ4=true;; h) HELP;; m) MEXEC=true;; M) MEMBASE="${OPTARG}";; o) BOOT_IMG="${OPTARG}";; v) VBMETA_IMG="${OPTARG}";; z) ZIRCON_BOOTIMAGE="${OPTARG}";; \?) echo unrecognized option HELP ;; esac done shift $((OPTIND-1)) if [[ -z "${BOARD}" ]]; then echo must specify a board to flash HELP fi if [[ -z "${BUILD_DIR}" ]]; then echo must specify a Zircon build directory HELP fi if [[ -n "${DTB_PATH}" ]] && [[ "${DTB_DEST}" != "append" ]] && [[ "${DTB_DEST}" != "kdtb" ]] && [[ "${DTB_DEST}" != "mkbootimg" ]]; then echo Invalid dtb destination ${DTB_DEST} HELP fi # Some tools we use MKBOOTIMG="${ZIRCON_DIR}/third_party/tools/android/mkbootimg" MKKDTB="${BUILD_DIR}/tools/mkkdtb" ZBI="${BUILD_DIR}/tools/zbi" # AVB support AVB_DIR="${ZIRCON_DIR}/third_party/tools/android/avb" AVBTOOL="${AVB_DIR}/avbtool" AVB_KEY="${AVB_DIR}/test/data/testkey_atx_psk.pem" AVB_PUBLIC_KEY_METADATA="${AVB_DIR}/test/data/atx_metadata.bin" # zircon image built by the Zircon build system if [[ -z "${ZIRCON_BOOTIMAGE}" ]]; then ZIRCON_BOOTIMAGE="${BUILD_DIR}/zircon.zbi" fi # boot shim for our board BOOT_SHIM="${BUILD_DIR}/${BOARD}-boot-shim.bin" # zircon ZBI image with prepended boot shim SHIMMED_ZIRCON_BOOTIMAGE="${BUILD_DIR}/${BOARD}-zircon.shim" # Final packaged Android style boot.img if [[ -z "${BOOT_IMG}" ]]; then BOOT_IMG="${BUILD_DIR}/${BOARD}-boot.img" fi # AVB vbmeta.img if [[ -z "${VBMETA_IMG}" ]]; then VBMETA_IMG="${BUILD_DIR}/${BOARD}-vbmeta.img" fi # PACKAGING STEPS BEGIN HERE if [[ ${MEXEC} == true ]]; then CMDLINE+=" netsvc.netboot=true" fi # Append extra command line items if [[ -n "${CMDLINE}" ]]; then CMDLINE_FILE="${BUILD_DIR}/${BOARD}-cmdline.txt" CMDLINE_BOOTIMAGE="${ZIRCON_BOOTIMAGE}.cmdline" echo ${CMDLINE} > "${CMDLINE_FILE}" "${ZBI}" -o "${CMDLINE_BOOTIMAGE}" "${ZIRCON_BOOTIMAGE}" -T cmdline "${CMDLINE_FILE}" else CMDLINE_BOOTIMAGE="${ZIRCON_BOOTIMAGE}" fi # Prepend boot shim cat "${BOOT_SHIM}" "${CMDLINE_BOOTIMAGE}" > "${SHIMMED_ZIRCON_BOOTIMAGE}" # Optionally compress the shimmed image if [[ ${USE_GZIP} == true ]]; then COMPRESSED_BOOTIMAGE="${BUILD_DIR}/${BOARD}-zircon.shim.gz" gzip -c "${SHIMMED_ZIRCON_BOOTIMAGE}" > "${COMPRESSED_BOOTIMAGE}" elif [[ ${USE_LZ4} == true ]]; then COMPRESSED_BOOTIMAGE="${BUILD_DIR}/${BOARD}-zircon.shim.lz4" lz4 -c "${SHIMMED_ZIRCON_BOOTIMAGE}" > "${COMPRESSED_BOOTIMAGE}" else COMPRESSED_BOOTIMAGE="${SHIMMED_ZIRCON_BOOTIMAGE}" fi # Handle options for packaging dtb if [[ -n "${DTB_PATH}" ]] && [[ "${DTB_DEST}" == "append" ]]; then COMPRESSED_BOOTIMAGE_DTB="${COMPRESSED_BOOTIMAGE}.dtb" cat "${COMPRESSED_BOOTIMAGE}" "${DTB_PATH}" > "${COMPRESSED_BOOTIMAGE_DTB}" elif [[ -n "${DTB_PATH}" ]] && [[ "${DTB_DEST}" == "kdtb" ]]; then COMPRESSED_BOOTIMAGE_DTB="${COMPRESSED_BOOTIMAGE}.kdtb" "${MKKDTB}" "${COMPRESSED_BOOTIMAGE}" "${DTB_PATH}" "${COMPRESSED_BOOTIMAGE_DTB}" elif [[ -n "${DTB_PATH}" ]] && [[ "${DTB_DEST}" == "mkbootimg" ]]; then COMPRESSED_BOOTIMAGE_DTB="${COMPRESSED_BOOTIMAGE}" MKBOOTIMG_ARGS+=" --second ${DTB_PATH} --second_offset ${DTB_OFFSET}" else COMPRESSED_BOOTIMAGE_DTB="${COMPRESSED_BOOTIMAGE}" fi # some bootloaders insist on having a ramdisk RAMDISK="${BUILD_DIR}/dummy-ramdisk" echo "foo" > "${RAMDISK}" # create our boot.img "${MKBOOTIMG}" \ --kernel "${COMPRESSED_BOOTIMAGE_DTB}" \ --kernel_offset ${KERNEL_OFFSET} \ --ramdisk "${RAMDISK}" \ --base ${MEMBASE} \ --tags_offset 0xE000000 \ --cmdline "${MKBOOTIMG_CMDLINE}" \ ${MKBOOTIMG_ARGS} \ -o "${BOOT_IMG}" # optionally sign with AVB tools if [[ ${USE_AVB} == true ]]; then "${AVBTOOL}" add_hash_footer \ --image "${BOOT_IMG}" \ --partition_size ${BOOT_PARTITION_SIZE} \ --partition_name boot "${AVBTOOL}" make_vbmeta_image \ --include_descriptors_from_image "${BOOT_IMG}" \ --algorithm SHA512_RSA4096 --key "${AVB_KEY}" \ --public_key_metadata "${AVB_PUBLIC_KEY_METADATA}" \ --padding_size 4096 --output "${VBMETA_IMG}" fi