blob: 0da21e4e9fe7ef6ffb63903a7b0fce81ca91a534 [file] [log] [blame]
# 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
# ***** README ******
#
# The following variables can be set in kernel/target/arm64/board/<board>/rules.mk
# to customize the zircon boot image produced for a board:
#
# PLATFORM_USE_SHIM := true # enable building a zircon image with a board name
#
# PLATFORM_BOARD_NAME := <board-name> # required if using the boot shim
#
# PLATFORM_USE_GZIP := true # set if bootloader expects a gzipped image
#
# PLATFORM_USE_MKBOOTIMG := true # package the zircon image with the Android mkbootimg tool
#
# PLATFORM_DTB_PATH := <path> # set if bootloader requires a custom device tree (optional)
# # common dummy dtb used if none specified
#
# PLATFORM_DTB_TYPE := append # set if bootloader expects dtb appended to the image
#
# PLATFORM_DTB_TYPE := kdtb # set if bootloader expects dtb packaged in kdtb format
#
# PLATFORM_DTB_TYPE := mkbootimg # set if bootloader expects dtb added via mkbootimg --second
# (requires PLATFORM_DTB_OFFSET)
#
# PLATFORM_DTB_OFFSET := <offset> # DTB offset passed to mkbootimg
# (required if using PLATFORM_DTB_TYPE := mkbootimg)
#
# PLATFORM_KERNEL_OFFSET := <offset> # kernel offset to pass to mkbootimg
#
# PLATFORM_MEMBASE := <membase> # memory base address to pass to mkbootimg
#
# PLATFORM_CMDLINE := <cmdline> # kernel command line to pass to mkbootimg
#
# PLATFORM_BOOT_PARTITION_SIZE := <size> # boot partition size to pass to avbtool
#
# PLATFORM_USE_AVB := true # set to sign image with avbtool and generate a vbmeta image
# Rules for building boot shim and prepending it to ZBI.
ifeq ($(PLATFORM_USE_SHIM),true)
ifeq ($(PLATFORM_BOARD_NAME),)
$(error PLATFORM_BOARD_NAME not defined)
endif
BOARD_ZIRCON_BOOTIMAGE := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-zircon-bootimage.bin
KDTBTOOL=$(BUILDDIR)/tools/mkkdtb
ifeq ($(TARGET),arm64)
include kernel/target/arm64/boot-shim/rules.mk
else
$(error PLATFORM_USE_SHIM not supported for target $(TARGET))
endif
ifeq ($(PLATFORM_DTB_PATH),)
PLATFORM_DTB_PATH := kernel/target/arm64/dtb/dummy-device-tree.dtb
endif
# capture board specific variables for the build rules
$(BOARD_ZIRCON_BOOTIMAGE): BOARD_ZIRCON_BOOTIMAGE:=$(BOARD_ZIRCON_BOOTIMAGE)
$(BOARD_ZIRCON_BOOTIMAGE): BOOT_SHIM_BIN:=$(BOOT_SHIM_BIN)
# prepend shim to the zircon bootimage
$(BOARD_ZIRCON_BOOTIMAGE): $(ZIRCON_BOOTIMAGE) $(BOOT_SHIM_BIN)
$(call BUILDECHO,generating $@)
@$(MKDIR)
$(NOECHO)cat $(BOOT_SHIM_BIN) $(ZIRCON_BOOTIMAGE) > $@
GENERATED += $(BOARD_ZIRCON_BOOTIMAGE)
EXTRA_BUILDDEPS += $(BOARD_ZIRCON_BOOTIMAGE)
endif # PLATFORM_USE_SHIM
# Rules for building an Android style boot.img containing the boot shim and ZBI.
# Bootloaders often require that the image be gzip compressed and followed by a
# Linux device tree binary, so a dummy dtb is concatenated at the end of the
# compressed image.
ifeq ($(PLATFORM_USE_MKBOOTIMG),true)
ifneq ($(PLATFORM_USE_SHIM),true)
$(error PLATFORM_USE_MKBOOTIMG requires PLATFORM_USE_SHIM)
endif
ifeq ($(PLATFORM_BOARD_NAME),)
$(error PLATFORM_BOARD_NAME not defined)
endif
ifeq ($(PLATFORM_KERNEL_OFFSET),)
$(error PLATFORM_KERNEL_OFFSET not defined)
endif
ifeq ($(PLATFORM_MEMBASE),)
$(error PLATFORM_MEMBASE not defined)
endif
ifeq ($(PLATFORM_CMDLINE),)
$(error PLATFORM_CMDLINE not defined)
endif
MKBOOTIMG := third_party/tools/android/mkbootimg
MKBOOTFS_ARGS :=
BOARD_BOOTIMG := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-boot.img
ifeq ($(PLATFORM_USE_GZIP),true)
BOARD_ZIRCON_BOOTIMAGE2 := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-zircon-bootimage.gz
else
BOARD_ZIRCON_BOOTIMAGE2 := $(BOARD_ZIRCON_BOOTIMAGE)
endif
ifeq ($(PLATFORM_DTB_TYPE),append)
# device tree binary is appended to end of zircon image
BOARD_ZIRCON_BOOTIMAGE3 := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-zircon-bootimage-dtb
else ifeq ($(PLATFORM_DTB_TYPE),kdtb)
# device tree binary is appended with the mkkdtb tool
BOARD_ZIRCON_BOOTIMAGE3 := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-zircon-bootimage-kdtb
else ifeq ($(PLATFORM_DTB_TYPE),mkbootimg)
# device tree binary passed via mkbootimg
ifeq ($(PLATFORM_DTB_OFFSET),)
$(error PLATFORM_DTB_OFFSET not defined)
endif
BOARD_ZIRCON_BOOTIMAGE3 := $(BOARD_ZIRCON_BOOTIMAGE2)
MKBOOTFS_ARGS += --second $(PLATFORM_DTB_PATH) --second_offset $(PLATFORM_DTB_OFFSET)
else
# no device tree is necessary
BOARD_ZIRCON_BOOTIMAGE3 := $(BOARD_ZIRCON_BOOTIMAGE2)
endif
$(BOARD_ZIRCON_BOOTIMAGE2): BOARD_ZIRCON_BOOTIMAGE2:=$(BOARD_ZIRCON_BOOTIMAGE2)
$(BOARD_ZIRCON_BOOTIMAGE2): BOARD_ZIRCON_BOOTIMAGE:=$(BOARD_ZIRCON_BOOTIMAGE)
$(BOARD_ZIRCON_BOOTIMAGE3): BOARD_ZIRCON_BOOTIMAGE3:=$(BOARD_ZIRCON_BOOTIMAGE3)
$(BOARD_ZIRCON_BOOTIMAGE3): BOARD_ZIRCON_BOOTIMAGE:=$(BOARD_ZIRCON_BOOTIMAGE)
$(BOARD_ZIRCON_BOOTIMAGE3): BOARD_ZIRCON_BOOTIMAGE2:=$(BOARD_ZIRCON_BOOTIMAGE2)
$(BOARD_ZIRCON_BOOTIMAGE3): PLATFORM_DTB_PATH:=$(PLATFORM_DTB_PATH)
$(BOARD_BOOTIMG): BOARD_BOOTIMG:=$(BOARD_BOOTIMG)
$(BOARD_BOOTIMG): BOARD_ZIRCON_BOOTIMAGE:=$(BOARD_ZIRCON_BOOTIMAGE)
$(BOARD_BOOTIMG): BOARD_ZIRCON_BOOTIMAGE2:=$(BOARD_ZIRCON_BOOTIMAGE2)
$(BOARD_BOOTIMG): BOARD_ZIRCON_BOOTIMAGE3:=$(BOARD_ZIRCON_BOOTIMAGE3)
$(BOARD_BOOTIMG): PLATFORM_KERNEL_OFFSET:=$(PLATFORM_KERNEL_OFFSET)
$(BOARD_BOOTIMG): PLATFORM_MEMBASE:=$(PLATFORM_MEMBASE)
$(BOARD_BOOTIMG): PLATFORM_CMDLINE:=$(PLATFORM_CMDLINE)
$(BOARD_BOOTIMG): MKBOOTFS_ARGS:=$(MKBOOTFS_ARGS)
$(BOARD_BOOTIMG): PLATFORM_DTB_PATH:=$(PLATFORM_DTB_PATH)
ifeq ($(PLATFORM_USE_GZIP),true)
$(BOARD_ZIRCON_BOOTIMAGE2): $(BOARD_ZIRCON_BOOTIMAGE)
$(call BUILDECHO,generating $@)
$(NOECHO)gzip -c $< > $@
endif
ifeq ($(PLATFORM_DTB_TYPE),append)
# device tree binary is appended to end of zircon image
$(BOARD_ZIRCON_BOOTIMAGE3): $(BOARD_ZIRCON_BOOTIMAGE2) $(PLATFORM_DTB_PATH)
$(call BUILDECHO,generating $@)
$(NOECHO)cat $(BOARD_ZIRCON_BOOTIMAGE2) $(PLATFORM_DTB_PATH) > $@
else ifeq ($(PLATFORM_DTB_TYPE),kdtb)
# device tree binary is appended with the mkkdtb tool
$(BOARD_ZIRCON_BOOTIMAGE3): $(BOARD_ZIRCON_BOOTIMAGE2) $(PLATFORM_DTB_PATH) $(KDTBTOOL)
$(call BUILDECHO,generating $@)
$(NOECHO)$(KDTBTOOL) $(BOARD_ZIRCON_BOOTIMAGE2) $(PLATFORM_DTB_PATH) $@
endif
$(BOARD_BOOTIMG): $(BOARD_ZIRCON_BOOTIMAGE3)
$(call BUILDECHO,generating $@)
$(NOECHO)$(MKBOOTIMG) --kernel $< --kernel_offset $(PLATFORM_KERNEL_OFFSET) $(MKBOOTFS_ARGS) \
--base $(PLATFORM_MEMBASE) --tags_offset 0xE000000 --cmdline $(PLATFORM_CMDLINE) -o $@
GENERATED += $(BOARD_ZIRCON_BOOTIMAGE2) $(BOARD_ZIRCON_BOOTIMAGE3) $(BOARD_BOOTIMG)
EXTRA_BUILDDEPS += $(BOARD_ZIRCON_BOOTIMAGE2) $(BOARD_ZIRCON_BOOTIMAGE3) $(BOARD_BOOTIMG)
endif # PLATFORM_USE_MKBOOTIMG
# Android Verified Boot (AVB) support: Hash footer is added to the boot image
# and a vbmeta image is generated with signature for the boot image.
ifeq ($(PLATFORM_USE_AVB),true)
ifneq ($(PLATFORM_USE_MKBOOTIMG),true)
$(error PLATFORM_USE_AVB requires PLATFORM_USE_MKBOOTIMG)
endif
ifeq ($(PLATFORM_BOARD_NAME),)
$(error PLATFORM_BOARD_NAME not defined)
endif
ifeq ($(PLATFORM_BOOT_PARTITION_SIZE),)
$(error PLATFORM_BOOT_PARTITION_SIZE not defined)
endif
AVBDIR := third_party/tools/android/avb
AVBTOOL := $(AVBDIR)/avbtool
AVB_KEY := $(AVBDIR)/test/data/testkey_atx_psk.pem
AVB_PUBLIC_KEY_METADATA := $(AVBDIR)/test/data/atx_metadata.bin
BOARD_VBMETA := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-vbmeta.img
$(BOARD_VBMETA): BOARD_VBMETA:=$(BOARD_VBMETA)
$(BOARD_VBMETA): BOARD_BOOTIMG:=$(BOARD_BOOTIMG)
$(BOARD_VBMETA): PLATFORM_BOOT_PARTITION_SIZE:=$(PLATFORM_BOOT_PARTITION_SIZE)
$(BOARD_VBMETA): $(BOARD_BOOTIMG)
$(call BUILDECHO,generating $@)
$(NOECHO)$(AVBTOOL) add_hash_footer --image $(BOARD_BOOTIMG) \
--partition_size $(PLATFORM_BOOT_PARTITION_SIZE) --partition_name boot
$(NOECHO)$(AVBTOOL) make_vbmeta_image --include_descriptors_from_image $(BOARD_BOOTIMG) \
--algorithm SHA512_RSA4096 --key $(AVB_KEY) --public_key_metadata $(AVB_PUBLIC_KEY_METADATA) \
--padding_size 4096 --output $@
GENERATED += $(BOARD_VBMETA)
EXTRA_BUILDDEPS += $(BOARD_VBMETA)
endif # PLATFORM_USE_AVB
# clear variables that were passed in to us
PLATFORM_USE_SHIM :=
PLATFORM_USE_GZIP :=
PLATFORM_DTB_PATH :=
PLATFORM_DTB_TYPE :=
PLATFORM_USE_MKBOOTIMG :=
PLATFORM_USE_AVB :=
PLATFORM_BOARD_NAME :=
PLATFORM_KERNEL_OFFSET :=
PLATFORM_DTB_OFFSET :=
PLATFORM_MEMBASE :=
PLATFORM_CMDLINE :=
PLATFORM_BOOT_PARTITION_SIZE :=
# clear variables we set here
BOARD_ZIRCON_BOOTIMAGE :=
BOARD_ZIRCON_BOOTIMAGE2 :=
BOARD_ZIRCON_BOOTIMAGE3 :=
BOARD_BOOTIMG :=
BOARD_VBMETA :=
MKBOOTFS_ARGS :=