From e1b1086ef3e20fe49a01b7eac918f68f61c82fce Mon Sep 17 00:00:00 2001 From: Steve Muckle Date: Wed, 10 Jul 2019 10:49:37 -0700 Subject: [PATCH] add vendor_boot image support The vendor_boot partition is generated by mkbootimg and contains all the device-specific information that used to reside in the boot partition. Bug: 137297791 Change-Id: I5b005097b73f59857c3a2f92d693b3e67ee8424e --- core/Makefile | 206 ++++++++++++++---- core/board_config.mk | 14 ++ core/envsetup.mk | 3 + core/main.mk | 4 + tools/releasetools/add_img_to_target_files.py | 14 ++ tools/releasetools/common.py | 140 ++++++++++-- 6 files changed, 314 insertions(+), 67 deletions(-) diff --git a/core/Makefile b/core/Makefile index 25faf6acd..473f824fc 100644 --- a/core/Makefile +++ b/core/Makefile @@ -710,12 +710,10 @@ $(1)/$(DEPMOD_STAGING_SUBDIR)/$(3): $(2) (for MODULE in $$(PRIVATE_LOAD_MODULES); do basename $$$$MODULE >> $$@; done) endef -# Until support for a vendor-boot/vendor-ramdisk is added, store vendor ramdisk -# kernel modules on the generic ramdisk as a stopgap. -ifneq ($(BOARD_VENDOR_RAMDISK_KERNEL_MODULES),) +ifneq ($(BUILDING_VENDOR_BOOT_IMAGE),true) + # If there is no vendor boot partition, store vendor ramdisk kernel modules in the + # boot ramdisk. BOARD_GENERIC_RAMDISK_KERNEL_MODULES += $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES) -endif -ifneq ($(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),) BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD += $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD) endif @@ -726,13 +724,13 @@ ifeq ($(BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD),) BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_GENERIC_RAMDISK_KERNEL_MODULES) endif -ifdef BOARD_GENERIC_RAMDISK_KERNEL_MODULES +ifneq ($(strip $(BOARD_GENERIC_RAMDISK_KERNEL_MODULES)),) ifeq ($(BOARD_USES_RECOVERY_AS_BOOT), true) BOARD_RECOVERY_KERNEL_MODULES += $(BOARD_GENERIC_RAMDISK_KERNEL_MODULES) endif endif -ifdef BOARD_RECOVERY_KERNEL_MODULES +ifneq ($(strip $(BOARD_RECOVERY_KERNEL_MODULES)),) ifeq ($(BOARD_USES_RECOVERY_AS_BOOT), true) ifdef BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD ALL_DEFAULT_INSTALLED_MODULES += $(call copy-many-files,$(call module-load-list-copy-paths,$(call intermediates-dir-for,PACKAGING,ramdisk_modules),$(BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD),modules.load,$(TARGET_RECOVERY_ROOT_OUT))) @@ -741,20 +739,27 @@ ifdef BOARD_RECOVERY_KERNEL_MODULES ALL_DEFAULT_INSTALLED_MODULES += $(call copy-many-files,$(call build-image-kernel-modules,$(BOARD_RECOVERY_KERNEL_MODULES),$(TARGET_RECOVERY_ROOT_OUT),,$(call intermediates-dir-for,PACKAGING,depmod_recovery),$(BOARD_RECOVERY_KERNEL_MODULES_LOAD),modules.load.recovery)) endif +ifneq ($(strip $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES)),) + ifeq ($(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),) + BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES) + endif + ALL_DEFAULT_INSTALLED_MODULES += $(call copy-many-files,$(call build-image-kernel-modules,$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES),$(TARGET_VENDOR_RAMDISK_OUT),,$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),modules.load)) +endif + ifneq ($(BOARD_USES_RECOVERY_AS_BOOT), true) - ifdef BOARD_GENERIC_RAMDISK_KERNEL_MODULES + ifneq ($(strip $(BOARD_GENERIC_RAMDISK_KERNEL_MODULES)),) ALL_DEFAULT_INSTALLED_MODULES += $(call copy-many-files,$(call build-image-kernel-modules,$(BOARD_GENERIC_RAMDISK_KERNEL_MODULES),$(TARGET_RAMDISK_OUT),,$(call intermediates-dir-for,PACKAGING,depmod_ramdisk),$(BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD),modules.load)) endif endif -ifdef BOARD_VENDOR_KERNEL_MODULES +ifneq ($(strip $(BOARD_VENDOR_KERNEL_MODULES)),) ifeq ($(BOARD_VENDOR_KERNEL_MODULES_LOAD),) BOARD_VENDOR_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_KERNEL_MODULES) endif ALL_DEFAULT_INSTALLED_MODULES += $(call copy-many-files,$(call build-image-kernel-modules,$(BOARD_VENDOR_KERNEL_MODULES),$(TARGET_OUT_VENDOR),vendor,$(call intermediates-dir-for,PACKAGING,depmod_vendor),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),modules.load)) endif -ifdef BOARD_ODM_KERNEL_MODULES +ifneq ($(strip $(BOARD_ODM_KERNEL_MODULES)),) ifeq ($(BOARD_RECOVERY_KERNEL_MODULES_LOAD),) BOARD_ODM_KERNEL_MODULES_LOAD := $(BOARD_ODM_KERNEL_MODULES) endif @@ -1034,24 +1039,18 @@ INTERNAL_BOOTIMAGE_ARGS := \ $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \ --kernel $(INSTALLED_KERNEL_TARGET) -ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG - INTERNAL_BOOTIMAGE_ARGS += --dtb $(INSTALLED_DTBIMAGE_TARGET) -endif - ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) INTERNAL_BOOTIMAGE_ARGS += --ramdisk $(INSTALLED_RAMDISK_TARGET) endif +ifndef BUILDING_VENDOR_BOOT_IMAGE +ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG + INTERNAL_BOOTIMAGE_ARGS += --dtb $(INSTALLED_DTBIMAGE_TARGET) +endif +endif + INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS)) -ifdef BOARD_KERNEL_BASE - INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) -endif - -ifdef BOARD_KERNEL_PAGESIZE - INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) -endif - ifeq ($(PRODUCT_SUPPORTS_VERITY),true) ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) VERITY_KEYID := veritykeyid=id:`openssl x509 -in $(PRODUCT_VERITY_SIGNING_KEY).x509.pem -text \ @@ -1060,8 +1059,22 @@ endif endif INTERNAL_KERNEL_CMDLINE := $(strip $(INTERNAL_KERNEL_CMDLINE) buildvariant=$(TARGET_BUILD_VARIANT) $(VERITY_KEYID)) + +ifndef BUILDING_VENDOR_BOOT_IMAGE +ifdef BOARD_KERNEL_BASE + INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) +endif +ifdef BOARD_KERNEL_PAGESIZE + INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) +endif ifdef INTERNAL_KERNEL_CMDLINE -INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)" + INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)" +endif +else +# building vendor boot image, dtb/base/pagesize go there +ifdef GENERIC_KERNEL_CMDLINE + INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(GENERIC_KERNEL_CMDLINE)" +endif endif INTERNAL_MKBOOTIMG_VERSION_ARGS := \ @@ -1157,6 +1170,55 @@ INSTALLED_BOOTIMAGE_TARGET := endif # BOARD_PREBUILT_BOOTIMAGE endif # TARGET_NO_KERNEL +# ----------------------------------------------------------------- +# vendor boot image +ifeq ($(BUILDING_VENDOR_BOOT_IMAGE),true) + +ifeq ($(PRODUCT_SUPPORTS_VERITY),true) + $(error vboot 1.0 does not support vendor_boot partition) +endif + +INTERNAL_VENDOR_RAMDISK_FILES := $(filter $(TARGET_VENDOR_RAMDISK_OUT)/%, \ + $(ALL_GENERATED_SOURCES) \ + $(ALL_DEFAULT_INSTALLED_MODULES)) + +INTERNAL_VENDOR_RAMDISK_TARGET := $(call intermediates-dir-for,PACKAGING,vendor-boot)/vendor-ramdisk.cpio.gz +$(INTERNAL_VENDOR_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_VENDOR_RAMDISK_FILES) | $(MINIGZIP) + $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_VENDOR_RAMDISK_OUT) | $(MINIGZIP) > $@ + +ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG + INTERNAL_VENDOR_BOOTIMAGE_ARGS += --dtb $(INSTALLED_DTBIMAGE_TARGET) +endif +ifdef BOARD_KERNEL_BASE + INTERNAL_VENDOR_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) +endif +ifdef BOARD_KERNEL_PAGESIZE + INTERNAL_VENDOR_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) +endif +ifdef INTERNAL_KERNEL_CMDLINE + INTERNAL_VENDOR_BOOTIMAGE_ARGS += --vendor_cmdline "$(INTERNAL_KERNEL_CMDLINE)" +endif + +INSTALLED_VENDOR_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/vendor_boot.img +$(INSTALLED_VENDOR_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_VENDOR_RAMDISK_TARGET) $(INSTALLED_DTBIMAGE_TARGET) +ifeq ($(BOARD_AVB_ENABLE),true) +$(INSTALLED_VENDOR_BOOTIMAGE_TARGET): $(AVBTOOL) $(BOARD_AVB_VENDOR_BOOTIMAGE_KEY_PATH) + $(call pretty,"Target vendor_boot image: $@") + $(MKBOOTIMG) $(INTERNAL_VENDOR_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --vendor_ramdisk $(INTERNAL_VENDOR_RAMDISK_TARGET) --vendor_boot $@ + $(call assert-max-image-size,$@,$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE)) + $(AVBTOOL) add_hash_footer \ + --image $@ \ + --partition_size $(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE) \ + --partition_name vendor_boot $(INTERNAL_AVB_VENDOR_BOOT_SIGNING_ARGS) \ + $(BOARD_AVB_VENDOR_BOOT_ADD_HASH_FOOTER_ARGS) +else +$(INSTALLED_VENDOR_BOOTIMAGE_TARGET): + $(call pretty,"Target vendor_boot image: $@") + $(MKBOOTIMG) $(INTERNAL_VENDOR_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --vendor_ramdisk $(INTERNAL_VENDOR_RAMDISK_TARGET) --vendor_boot $@ + $(call assert-max-image-size,$@,$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE)) +endif +endif # BUILDING_VENDOR_BOOT_IMAGE + # ----------------------------------------------------------------- # NOTICE files # @@ -1917,11 +1979,16 @@ $(INSTALLED_RECOVERY_BUILD_PROP_TARGET): \ $(hide) cat $(INSTALLED_SYSTEM_EXT_BUILD_PROP_TARGET) >> $@ $(call append-recovery-ui-properties,$(PRIVATE_RECOVERY_UI_PROPERTIES),$@) -INTERNAL_RECOVERYIMAGE_ARGS := \ - $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \ - --kernel $(recovery_kernel) \ - --ramdisk $(recovery_ramdisk) - +ifdef INSTALLED_VENDOR_BOOTIMAGE_TARGET + INTERNAL_RECOVERYIMAGE_ARGS := \ + --kernel $(recovery_kernel) --ramdisk $(recovery_ramdisk) +ifdef GENERIC_KERNEL_CMDLINE + INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(GENERIC_KERNEL_CMDLINE)" +endif +else # INSTALLED_VENDOR_BOOTIMAGE_TARGET not defined + INTERNAL_RECOVERYIMAGE_ARGS := \ + $(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \ + --kernel $(recovery_kernel) --ramdisk $(recovery_ramdisk) # Assumes this has already been stripped ifdef INTERNAL_KERNEL_CMDLINE INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)" @@ -1938,13 +2005,14 @@ ifdef BOARD_PREBUILT_RECOVERY_DTBOIMAGE else INTERNAL_RECOVERYIMAGE_ARGS += --recovery_dtbo $(BOARD_PREBUILT_DTBOIMAGE) endif -endif +endif # BOARD_INCLUDE_RECOVERY_DTBO ifdef BOARD_INCLUDE_RECOVERY_ACPIO INTERNAL_RECOVERYIMAGE_ARGS += --recovery_acpio $(BOARD_RECOVERY_ACPIO) endif ifdef BOARD_INCLUDE_DTB_IN_BOOTIMG INTERNAL_RECOVERYIMAGE_ARGS += --dtb $(INSTALLED_DTBIMAGE_TARGET) endif +endif # INSTALLED_VENDOR_BOOTIMAGE_TARGET not defined # $(1): output file define build-recoveryimage-target @@ -3184,6 +3252,7 @@ BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS += \ endif BOOT_FOOTER_ARGS := BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS +VENDOR_BOOT_FOOTER_ARGS := BOARD_AVB_VENDOR_BOOT_ADD_HASH_FOOTER_ARGS DTBO_FOOTER_ARGS := BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS SYSTEM_FOOTER_ARGS := BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS VENDOR_FOOTER_ARGS := BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS @@ -3242,6 +3311,10 @@ ifdef INSTALLED_BOOTIMAGE_TARGET $(eval $(call check-and-set-avb-args,boot)) endif +ifdef INSTALLED_VENDOR_BOOTIMAGE_TARGET +$(eval $(call check-and-set-avb-args,vendor_boot)) +endif + $(eval $(call check-and-set-avb-args,system)) ifdef INSTALLED_VENDORIMAGE_TARGET @@ -3317,6 +3390,9 @@ define extract-avb-chain-public-keys $(if $(BOARD_AVB_BOOT_KEY_PATH),\ $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_BOOT_KEY_PATH) \ --output $(1)/boot.avbpubkey) + $(if $(BOARD_AVB_VENDOR_BOOT_KEY_PATH),\ + $(AVBTOOL) extract_public_key --key $(BOARD_AVB_VENDOR_BOOT_KEY_PATH) \ + --output $(1)/vendor_boot.avbpubkey) $(if $(BOARD_AVB_SYSTEM_KEY_PATH),\ $(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_SYSTEM_KEY_PATH) \ --output $(1)/system.avbpubkey) @@ -3404,6 +3480,7 @@ $(INSTALLED_VBMETAIMAGE_TARGET): PRIVATE_AVB_VBMETA_SIGNING_ARGS := \ $(INSTALLED_VBMETAIMAGE_TARGET): \ $(AVBTOOL) \ $(INSTALLED_BOOTIMAGE_TARGET) \ + $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \ $(INSTALLED_SYSTEMIMAGE_TARGET) \ $(INSTALLED_VENDORIMAGE_TARGET) \ $(INSTALLED_PRODUCTIMAGE_TARGET) \ @@ -3770,6 +3847,10 @@ endif ifeq ($(INSTALLED_BOOTIMAGE_TARGET),) $(hide) echo "no_boot=true" >> $@ endif +ifneq ($(INSTALLED_VENDOR_BOOTIMAGE_TARGET),) + echo "vendor_boot=true" >> $@ + echo "vendor_boot_size=$(BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE)" >> $@ +endif ifeq ($(INSTALLED_RECOVERYIMAGE_TARGET),) $(hide) echo "no_recovery=true" >> $@ endif @@ -3822,6 +3903,12 @@ ifdef BOARD_AVB_BOOT_KEY_PATH $(hide) echo "avb_boot_algorithm=$(BOARD_AVB_BOOT_ALGORITHM)" >> $@ $(hide) echo "avb_boot_rollback_index_location=$(BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION)" >> $@ endif # BOARD_AVB_BOOT_KEY_PATH + echo "avb_vendor_boot_add_hash_footer_args=$(BOARD_AVB_VENDOR_BOOT_ADD_HASH_FOOTER_ARGS)" >> $@ +ifdef BOARD_AVB_VENDOR_BOOT_KEY_PATH + echo "avb_vendor_boot_key_path=$(BOARD_AVB_VENDOR_BOOT_KEY_PATH)" >> $@ + echo "avb_vendor_boot_algorithm=$(BOARD_AVB_VENDOR_BOOT_ALGORITHM)" >> $@ + echo "avb_vendor_boot_rollback_index_location=$(BOARD_AVB_VENDOR_BOOT_ROLLBACK_INDEX_LOCATION)" >> $@ +endif # BOARD_AVB_VENDOR_BOOT_KEY_PATH $(hide) echo "avb_recovery_add_hash_footer_args=$(BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS)" >> $@ ifdef BOARD_AVB_RECOVERY_KEY_PATH $(hide) echo "avb_recovery_key_path=$(BOARD_AVB_RECOVERY_KEY_PATH)" >> $@ @@ -3993,6 +4080,7 @@ endif $(BUILT_TARGET_FILES_PACKAGE): \ $(INSTALLED_RAMDISK_TARGET) \ $(INSTALLED_BOOTIMAGE_TARGET) \ + $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \ $(INSTALLED_RADIOIMAGE_TARGET) \ $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_USERDATAIMAGE_TARGET) \ @@ -4043,33 +4131,37 @@ ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_ $(hide) $(call package_files-copy-root, \ $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/$(PRIVATE_RECOVERY_OUT)/RAMDISK) ifdef INSTALLED_KERNEL_TARGET - $(hide) cp $(INSTALLED_KERNEL_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/kernel + cp $(INSTALLED_KERNEL_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/kernel endif +ifdef INSTALLED_VENDOR_BOOTIMAGE_TARGET + echo "$(GENERIC_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline +else # INSTALLED_VENDOR_BOOTIMAGE_TARGET not defined ifdef INSTALLED_2NDBOOTLOADER_TARGET - $(hide) cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second + cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second endif ifdef BOARD_INCLUDE_RECOVERY_DTBO ifdef BOARD_PREBUILT_RECOVERY_DTBOIMAGE - $(hide) cp $(BOARD_PREBUILT_RECOVERY_DTBOIMAGE) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_dtbo + cp $(BOARD_PREBUILT_RECOVERY_DTBOIMAGE) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_dtbo else - $(hide) cp $(BOARD_PREBUILT_DTBOIMAGE) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_dtbo -endif + cp $(BOARD_PREBUILT_DTBOIMAGE) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_dtbo endif +endif # BOARD_INCLUDE_RECOVERY_DTBO ifdef BOARD_INCLUDE_RECOVERY_ACPIO - $(hide) cp $(BOARD_RECOVERY_ACPIO) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_acpio + cp $(BOARD_RECOVERY_ACPIO) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/recovery_acpio endif ifdef INSTALLED_DTBIMAGE_TARGET - $(hide) cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/dtb + cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/dtb endif ifdef INTERNAL_KERNEL_CMDLINE - $(hide) echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline + echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline endif ifdef BOARD_KERNEL_BASE - $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/base + echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/base endif ifdef BOARD_KERNEL_PAGESIZE - $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/pagesize + echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/pagesize endif +endif # INSTALLED_VENDOR_BOOTIMAGE_TARGET not defined endif # INSTALLED_RECOVERYIMAGE_TARGET defined or BOARD_USES_RECOVERY_AS_BOOT is true @# Components of the boot image $(hide) mkdir -p $(zip_root)/BOOT @@ -4085,25 +4177,42 @@ endif ifdef INSTALLED_KERNEL_TARGET $(hide) cp $(INSTALLED_KERNEL_TARGET) $(zip_root)/BOOT/kernel endif +ifndef INSTALLED_VENDOR_BOOTIMAGE_TARGET ifdef INSTALLED_2NDBOOTLOADER_TARGET - $(hide) cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second + cp $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second endif ifdef INSTALLED_DTBIMAGE_TARGET - $(hide) cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/BOOT/dtb -endif -ifdef INTERNAL_KERNEL_CMDLINE - $(hide) echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline + cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/BOOT/dtb endif + echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline ifdef BOARD_KERNEL_BASE - $(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base + echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base endif ifdef BOARD_KERNEL_PAGESIZE - $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize + echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize endif -endif # BOARD_USES_RECOVERY_AS_BOOT +else # INSTALLED_VENDOR_BOOTIMAGE_TARGET defined + echo "$(GENERIC_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline +endif # INSTALLED_VENDOR_BOOTIMAGE_TARGET defined +endif # BOARD_USES_RECOVERY_AS_BOOT not true $(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\ mkdir -p $(zip_root)/RADIO; \ cp $(t) $(zip_root)/RADIO/$(notdir $(t));) +ifdef INSTALLED_VENDOR_BOOTIMAGE_TARGET + mkdir -p $(zip_root)/VENDOR_BOOT + $(call package_files-copy-root, \ + $(TARGET_VENDOR_RAMDISK_OUT),$(zip_root)/VENDOR_BOOT/RAMDISK) +ifdef INSTALLED_DTBIMAGE_TARGET + cp $(INSTALLED_DTBIMAGE_TARGET) $(zip_root)/VENDOR_BOOT/dtb +endif +ifdef BOARD_KERNEL_BASE + echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/VENDOR_BOOT/base +endif +ifdef BOARD_KERNEL_PAGESIZE + echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/VENDOR_BOOT/pagesize +endif + echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/VENDOR_BOOT/vendor_cmdline +endif # INSTALLED_VENDOR_BOOTIMAGE_TARGET ifdef BUILDING_SYSTEM_IMAGE @# Contents of the system image $(hide) $(call package_files-copy-root, \ @@ -4256,6 +4365,9 @@ ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) @# BOOT/RAMDISK exists and contains the ramdisk for recovery if using BOARD_USES_RECOVERY_AS_BOOT. $(hide) $(call fs_config,$(zip_root)/BOOT/RAMDISK,) > $(zip_root)/META/boot_filesystem_config.txt endif +ifneq ($(INSTALLED_VENDOR_BOOTIMAGE_TARGET),) + $(call fs_config,$(zip_root)/VENDOR_BOOT/RAMDISK,) > $(zip_root)/META/vendor_boot_filesystem_config.txt +endif ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) @# BOOT/RAMDISK also exists and contains the first stage ramdisk if not using BOARD_BUILD_SYSTEM_ROOT_IMAGE. $(hide) $(call fs_config,$(zip_root)/BOOT/RAMDISK,) > $(zip_root)/META/boot_filesystem_config.txt diff --git a/core/board_config.mk b/core/board_config.mk index a6aef87e9..242012f24 100644 --- a/core/board_config.mk +++ b/core/board_config.mk @@ -336,6 +336,20 @@ else ifeq ($(PRODUCT_BUILD_RECOVERY_IMAGE),true) endif .KATI_READONLY := BUILDING_RECOVERY_IMAGE +# Are we building a vendor boot image +BUILDING_VENDOR_BOOT_IMAGE := +ifdef BOARD_BOOT_HEADER_VERSION + ifneq ($(call math_gt_or_eq,$(BOARD_BOOT_HEADER_VERSION),3),) + BUILDING_VENDOR_BOOT_IMAGE := true + ifdef BUILDING_RECOVERY_IMAGE + ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true) + $(error Boot header version >=3 requires recovery as boot) + endif + endif + endif +endif +.KATI_READONLY := BUILDING_VENDOR_BOOT_IMAGE + # Are we building a ramdisk image BUILDING_RAMDISK_IMAGE := true ifeq ($(PRODUCT_BUILD_RAMDISK_IMAGE),) diff --git a/core/envsetup.mk b/core/envsetup.mk index be22ff787..d06ba72e9 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -241,6 +241,7 @@ _product_path_placeholder := ||PRODUCT-PATH-PH|| _system_ext_path_placeholder := ||SYSTEM_EXT-PATH-PH|| _odm_path_placeholder := ||ODM-PATH-PH|| TARGET_COPY_OUT_VENDOR := $(_vendor_path_placeholder) +TARGET_COPY_OUT_VENDOR_RAMDISK := vendor-ramdisk TARGET_COPY_OUT_PRODUCT := $(_product_path_placeholder) # TODO(b/135957588) TARGET_COPY_OUT_PRODUCT_SERVICES will copy the target to # product @@ -849,6 +850,8 @@ TARGET_RAMDISK_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_RAMDISK) TARGET_RAMDISK_OUT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED) TARGET_DEBUG_RAMDISK_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_DEBUG_RAMDISK) +TARGET_VENDOR_RAMDISK_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR_RAMDISK) + TARGET_ROOT_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_ROOT) TARGET_ROOT_OUT_BIN := $(TARGET_ROOT_OUT)/bin TARGET_ROOT_OUT_ETC := $(TARGET_ROOT_OUT)/etc diff --git a/core/main.mk b/core/main.mk index 3cbff2d22..02ad11a39 100644 --- a/core/main.mk +++ b/core/main.mk @@ -1526,6 +1526,9 @@ bptimage: $(INSTALLED_BPTIMAGE_TARGET) .PHONY: vendorimage vendorimage: $(INSTALLED_VENDORIMAGE_TARGET) +.PHONY: vendorbootimage +vendorbootimage: $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) + .PHONY: productimage productimage: $(INSTALLED_PRODUCTIMAGE_TARGET) @@ -1568,6 +1571,7 @@ droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \ $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_BPTIMAGE_TARGET) \ $(INSTALLED_VENDORIMAGE_TARGET) \ + $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \ $(INSTALLED_ODMIMAGE_TARGET) \ $(INSTALLED_SUPERIMAGE_EMPTY_TARGET) \ $(INSTALLED_PRODUCTIMAGE_TARGET) \ diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py index 23ae29f9c..a5816bc17 100755 --- a/tools/releasetools/add_img_to_target_files.py +++ b/tools/releasetools/add_img_to_target_files.py @@ -673,6 +673,7 @@ def AddImagesToTargetFiles(filename): has_recovery = OPTIONS.info_dict.get("no_recovery") != "true" has_boot = OPTIONS.info_dict.get("no_boot") != "true" + has_vendor_boot = OPTIONS.info_dict.get("vendor_boot") == "true" # {vendor,odm,product,system_ext}.img are unlike system.img or # system_other.img. Because it could be built from source, or dropped into @@ -734,6 +735,19 @@ def AddImagesToTargetFiles(filename): if output_zip: boot_image.AddToZip(output_zip) + if has_vendor_boot: + banner("vendor_boot") + vendor_boot_image = common.GetVendorBootImage( + "IMAGES/vendor_boot.img", "vendor_boot.img", OPTIONS.input_tmp, + "VENDOR_BOOT") + if vendor_boot_image: + partitions['vendor_boot'] = os.path.join(OPTIONS.input_tmp, "IMAGES", + "vendor_boot.img") + if not os.path.exists(partitions['vendor_boot']): + vendor_boot_image.WriteToDir(OPTIONS.input_tmp) + if output_zip: + vendor_boot_image.AddToZip(output_zip) + recovery_image = None if has_recovery: banner("recovery") diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 2401e469c..384d1bff1 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -100,7 +100,7 @@ SPECIAL_CERT_STRINGS = ("PRESIGNED", "EXTERNAL") # that system_other is not in the list because we don't want to include its # descriptor into vbmeta.img. AVB_PARTITIONS = ('boot', 'dtbo', 'odm', 'product', 'recovery', 'system', - 'system_ext', 'vendor') + 'system_ext', 'vendor', 'vendor_boot') # Chained VBMeta partitions. AVB_VBMETA_PARTITIONS = ('vbmeta_system', 'vbmeta_vendor') @@ -733,6 +733,25 @@ def BuildVBMeta(image_path, partitions, name, needed_partitions): RunAndCheckOutput(cmd) +def _MakeRamdisk(sourcedir, fs_config_file=None): + ramdisk_img = tempfile.NamedTemporaryFile() + + if fs_config_file is not None and os.access(fs_config_file, os.F_OK): + cmd = ["mkbootfs", "-f", fs_config_file, + os.path.join(sourcedir, "RAMDISK")] + else: + cmd = ["mkbootfs", os.path.join(sourcedir, "RAMDISK")] + p1 = Run(cmd, stdout=subprocess.PIPE) + p2 = Run(["minigzip"], stdin=p1.stdout, stdout=ramdisk_img.file.fileno()) + + p2.wait() + p1.wait() + assert p1.returncode == 0, "mkbootfs of %s ramdisk failed" % (sourcedir,) + assert p2.returncode == 0, "minigzip of %s ramdisk failed" % (sourcedir,) + + return ramdisk_img + + def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None, has_ramdisk=False, two_step_image=False): """Build a bootable image from the specified sourcedir. @@ -746,24 +765,6 @@ def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None, for building the requested image. """ - def make_ramdisk(): - ramdisk_img = tempfile.NamedTemporaryFile() - - if os.access(fs_config_file, os.F_OK): - cmd = ["mkbootfs", "-f", fs_config_file, - os.path.join(sourcedir, "RAMDISK")] - else: - cmd = ["mkbootfs", os.path.join(sourcedir, "RAMDISK")] - p1 = Run(cmd, stdout=subprocess.PIPE) - p2 = Run(["minigzip"], stdin=p1.stdout, stdout=ramdisk_img.file.fileno()) - - p2.wait() - p1.wait() - assert p1.returncode == 0, "mkbootfs of %s ramdisk failed" % (sourcedir,) - assert p2.returncode == 0, "minigzip of %s ramdisk failed" % (sourcedir,) - - return ramdisk_img - if not os.access(os.path.join(sourcedir, "kernel"), os.F_OK): return None @@ -776,7 +777,7 @@ def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None, img = tempfile.NamedTemporaryFile() if has_ramdisk: - ramdisk_img = make_ramdisk() + ramdisk_img = _MakeRamdisk(sourcedir, fs_config_file) # use MKBOOTIMG from environ, or "mkbootimg" if empty or not set mkbootimg = os.getenv('MKBOOTIMG') or "mkbootimg" @@ -938,6 +939,105 @@ def GetBootableImage(name, prebuilt_name, unpack_dir, tree_subdir, return None +def _BuildVendorBootImage(sourcedir, info_dict=None): + """Build a vendor boot image from the specified sourcedir. + + Take a ramdisk, dtb, and vendor_cmdline from the input (in 'sourcedir'), and + turn them into a vendor boot image. + + Return the image data, or None if sourcedir does not appear to contains files + for building the requested image. + """ + + if info_dict is None: + info_dict = OPTIONS.info_dict + + img = tempfile.NamedTemporaryFile() + + ramdisk_img = _MakeRamdisk(sourcedir) + + # use MKBOOTIMG from environ, or "mkbootimg" if empty or not set + mkbootimg = os.getenv('MKBOOTIMG') or "mkbootimg" + + cmd = [mkbootimg] + + fn = os.path.join(sourcedir, "dtb") + if os.access(fn, os.F_OK): + cmd.append("--dtb") + cmd.append(fn) + + fn = os.path.join(sourcedir, "vendor_cmdline") + if os.access(fn, os.F_OK): + cmd.append("--vendor_cmdline") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "base") + if os.access(fn, os.F_OK): + cmd.append("--base") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "pagesize") + if os.access(fn, os.F_OK): + cmd.append("--pagesize") + cmd.append(open(fn).read().rstrip("\n")) + + args = info_dict.get("mkbootimg_args") + if args and args.strip(): + cmd.extend(shlex.split(args)) + + args = info_dict.get("mkbootimg_version_args") + if args and args.strip(): + cmd.extend(shlex.split(args)) + + cmd.extend(["--vendor_ramdisk", ramdisk_img.name]) + cmd.extend(["--vendor_boot", img.name]) + + RunAndCheckOutput(cmd) + + # AVB: if enabled, calculate and add hash. + if info_dict.get("avb_enable") == "true": + avbtool = info_dict["avb_avbtool"] + part_size = info_dict["vendor_boot_size"] + cmd = [avbtool, "add_hash_footer", "--image", img.name, + "--partition_size", str(part_size), "--partition_name vendor_boot"] + AppendAVBSigningArgs(cmd, "vendor_boot") + args = info_dict.get("avb_vendor_boot_add_hash_footer_args") + if args and args.strip(): + cmd.extend(shlex.split(args)) + RunAndCheckOutput(cmd) + + img.seek(os.SEEK_SET, 0) + data = img.read() + + ramdisk_img.close() + img.close() + + return data + + +def GetVendorBootImage(name, prebuilt_name, unpack_dir, tree_subdir, + info_dict=None): + """Return a File object with the desired vendor boot image. + + Look for it under 'unpack_dir'/IMAGES, otherwise construct it from + the source files in 'unpack_dir'/'tree_subdir'.""" + + prebuilt_path = os.path.join(unpack_dir, "IMAGES", prebuilt_name) + if os.path.exists(prebuilt_path): + logger.info("using prebuilt %s from IMAGES...", prebuilt_name) + return File.FromLocalFile(name, prebuilt_path) + + logger.info("building image from target_files %s...", tree_subdir) + + if info_dict is None: + info_dict = OPTIONS.info_dict + + data = _BuildVendorBootImage(os.path.join(unpack_dir, tree_subdir), info_dict) + if data: + return File(name, data) + return None + + def Gunzip(in_filename, out_filename): """Gunzips the given gzip compressed file to a given output file.""" with gzip.open(in_filename, "rb") as in_file, \