1# Copyright 2018 The Fuchsia Authors
2#
3# Use of this source code is governed by a MIT-style
4# license that can be found in the LICENSE file or at
5# https://opensource.org/licenses/MIT
6
7# Rules for building boot shim and prepending it to ZBI.
8ifeq ($(PLATFORM_USE_SHIM),true)
9
10ifeq ($(PLATFORM_BOARD_NAME),)
11$(error PLATFORM_BOARD_NAME not defined)
12endif
13
14BOARD_ZIRCON_BOOTIMAGE := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-zircon-bootimage.bin
15
16ifeq ($(TARGET),arm64)
17include kernel/target/arm64/boot-shim/rules.mk
18else
19$(error PLATFORM_USE_SHIM not supported for target $(TARGET))
20endif
21
22# capture board specific variables for the build rules
23$(BOARD_ZIRCON_BOOTIMAGE): BOARD_ZIRCON_BOOTIMAGE:=$(BOARD_ZIRCON_BOOTIMAGE)
24$(BOARD_ZIRCON_BOOTIMAGE): BOOT_SHIM_BIN:=$(BOOT_SHIM_BIN)
25
26# prepend shim to the zircon bootimage
27$(BOARD_ZIRCON_BOOTIMAGE): $(ZIRCON_BOOTIMAGE) $(BOOT_SHIM_BIN)
28	$(call BUILDECHO,generating $@)
29	@$(MKDIR)
30	$(NOECHO)cat $(BOOT_SHIM_BIN) $(ZIRCON_BOOTIMAGE) > $@
31
32GENERATED += $(BOARD_ZIRCON_BOOTIMAGE)
33EXTRA_BUILDDEPS += $(BOARD_ZIRCON_BOOTIMAGE)
34
35endif # PLATFORM_USE_SHIM
36
37# Rules for building an Android style boot.img containing the boot shim and ZBI.
38# Bootloaders often require that the image be gzip compressed and followed by a
39# Linux device tree binary, so a dummy dtb is concatenated at the end of the
40# compressed image.
41ifeq ($(PLATFORM_USE_MKBOOTIMG),true)
42
43ifneq ($(PLATFORM_USE_SHIM),true)
44$(error PLATFORM_USE_MKBOOTIMG requires PLATFORM_USE_SHIM)
45endif
46ifeq ($(PLATFORM_BOARD_NAME),)
47$(error PLATFORM_BOARD_NAME not defined)
48endif
49ifeq ($(PLATFORM_KERNEL_OFFSET),)
50$(error PLATFORM_KERNEL_OFFSET not defined)
51endif
52ifeq ($(PLATFORM_MEMBASE),)
53$(error PLATFORM_MEMBASE not defined)
54endif
55ifeq ($(PLATFORM_CMDLINE),)
56$(error PLATFORM_CMDLINE not defined)
57endif
58
59MKBOOTIMG := third_party/tools/android/mkbootimg
60DUMMY_DTB := kernel/target/arm64/dtb/dummy-device-tree.dtb
61
62BOARD_BOOTIMG := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-boot.img
63BOARD_ZIRCON_ZBOOTIMAGE := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-zircon-bootimage.gz
64BOARD_ZIRCON_ZBOOTIMAGE_DTB := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-zircon-bootimage.gz-dtb
65
66$(BOARD_ZIRCON_ZBOOTIMAGE): BOARD_ZIRCON_ZBOOTIMAGE:=$(BOARD_ZIRCON_ZBOOTIMAGE)
67$(BOARD_ZIRCON_ZBOOTIMAGE): BOARD_ZIRCON_BOOTIMAGE:=$(BOARD_ZIRCON_BOOTIMAGE)
68
69$(BOARD_ZIRCON_ZBOOTIMAGE_DTB): BOARD_ZIRCON_ZBOOTIMAGE_DTB:=$(BOARD_ZIRCON_ZBOOTIMAGE_DTB)
70$(BOARD_ZIRCON_ZBOOTIMAGE_DTB): BOARD_ZIRCON_ZBOOTIMAGE:=$(BOARD_ZIRCON_ZBOOTIMAGE)
71
72$(BOARD_BOOTIMG): BOARD_BOOTIMG:=$(BOARD_BOOTIMG)
73$(BOARD_BOOTIMG): BOARD_ZIRCON_BOOTIMAGE:=$(BOARD_ZIRCON_BOOTIMAGE)
74$(BOARD_BOOTIMG): BOARD_ZIRCON_ZBOOTIMAGE:=$(BOARD_ZIRCON_ZBOOTIMAGE)
75$(BOARD_BOOTIMG): BOARD_ZIRCON_ZBOOTIMAGE_DTB:=$(BOARD_ZIRCON_ZBOOTIMAGE_DTB)
76$(BOARD_BOOTIMG): PLATFORM_KERNEL_OFFSET:=$(PLATFORM_KERNEL_OFFSET)
77$(BOARD_BOOTIMG): PLATFORM_MEMBASE:=$(PLATFORM_MEMBASE)
78$(BOARD_BOOTIMG): PLATFORM_CMDLINE:=$(PLATFORM_CMDLINE)
79
80$(BOARD_ZIRCON_ZBOOTIMAGE): $(BOARD_ZIRCON_BOOTIMAGE)
81	$(call BUILDECHO,generating $@)
82	$(NOECHO)gzip -c $< > $@
83
84GENERATED += $(BOARD_ZIRCON_ZBOOTIMAGE)
85EXTRA_BUILDDEPS += $(BOARD_ZIRCON_ZBOOTIMAGE)
86
87$(BOARD_ZIRCON_ZBOOTIMAGE_DTB): $(BOARD_ZIRCON_ZBOOTIMAGE) $(DUMMY_DTB)
88	$(call BUILDECHO,generating $@)
89	$(NOECHO)cat $(BOARD_ZIRCON_ZBOOTIMAGE) $(DUMMY_DTB) > $@
90
91GENERATED += $(BOARD_ZIRCON_ZBOOTIMAGE_DTB)
92EXTRA_BUILDDEPS += $(BOARD_ZIRCON_ZBOOTIMAGE_DTB)
93
94$(BOARD_BOOTIMG): $(BOARD_ZIRCON_ZBOOTIMAGE_DTB)
95	$(call BUILDECHO,generating $@)
96	$(NOECHO)$(MKBOOTIMG) --kernel $< --kernel_offset $(PLATFORM_KERNEL_OFFSET) \
97	    --base $(PLATFORM_MEMBASE) --tags_offset 0xE000000 --cmdline $(PLATFORM_CMDLINE) -o $@
98
99GENERATED += $(BOARD_BOOTIMG)
100EXTRA_BUILDDEPS += $(BOARD_BOOTIMG)
101
102endif # PLATFORM_USE_MKBOOTIMG
103
104# Android Verified Boot (AVB) support: Hash footer is added to the boot image
105# and a vbmeta image is generated with signature for the boot image.
106ifeq ($(PLATFORM_USE_AVB),true)
107
108ifneq ($(PLATFORM_USE_MKBOOTIMG),true)
109$(error PLATFORM_USE_AVB requires PLATFORM_USE_MKBOOTIMG)
110endif
111ifeq ($(PLATFORM_BOARD_NAME),)
112$(error PLATFORM_BOARD_NAME not defined)
113endif
114ifeq ($(PLATFORM_BOOT_PARTITION_SIZE),)
115$(error PLATFORM_BOOT_PARTITION_SIZE not defined)
116endif
117
118AVBDIR := third_party/tools/android/avb
119AVBTOOL := $(AVBDIR)/avbtool
120AVB_KEY := $(AVBDIR)/test/data/testkey_atx_psk.pem
121AVB_PUBLIC_KEY_METADATA := $(AVBDIR)/test/data/atx_metadata.bin
122
123BOARD_VBMETA := $(BUILDDIR)/$(PLATFORM_BOARD_NAME)-vbmeta.img
124
125$(BOARD_VBMETA): BOARD_VBMETA:=$(BOARD_VBMETA)
126$(BOARD_VBMETA): BOARD_BOOTIMG:=$(BOARD_BOOTIMG)
127$(BOARD_VBMETA): PLATFORM_BOOT_PARTITION_SIZE:=$(PLATFORM_BOOT_PARTITION_SIZE)
128
129$(BOARD_VBMETA): $(BOARD_BOOTIMG)
130	$(call BUILDECHO,generating $@)
131	$(NOECHO)$(AVBTOOL) add_hash_footer --image $(BOARD_BOOTIMG) \
132	    --partition_size $(PLATFORM_BOOT_PARTITION_SIZE) --partition_name boot
133	$(NOECHO)$(AVBTOOL) make_vbmeta_image --include_descriptors_from_image $(BOARD_BOOTIMG) \
134	    --algorithm SHA512_RSA4096 --key $(AVB_KEY) --public_key_metadata $(AVB_PUBLIC_KEY_METADATA) \
135	    --padding_size 4096 --output $@
136
137GENERATED += $(BOARD_VBMETA)
138EXTRA_BUILDDEPS += $(BOARD_VBMETA)
139
140endif # PLATFORM_USE_AVB
141
142# clear variables that were passed in to us
143PLATFORM_USE_SHIM :=
144PLATFORM_USE_MKBOOTIMG :=
145PLATFORM_USE_AVB :=
146PLATFORM_BOARD_NAME :=
147PLATFORM_KERNEL_OFFSET :=
148PLATFORM_MEMBASE :=
149PLATFORM_CMDLINE :=
150PLATFORM_BOOT_PARTITION_SIZE :=
151
152# clear variables we set here
153BOARD_ZIRCON_BOOTIMAGE :=
154BOARD_ZIRCON_ZBOOTIMAGE :=
155BOARD_ZIRCON_ZBOOTIMAGE_DTB :=
156BOARD_BOOTIMG :=
157BOARD_VBMETA :=
158
159