diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index af495d99..0c0137fc 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -94,6 +94,7 @@ KERNEL_CONFIG := $(KERNEL_OUT)/.config KERNEL_RELEASE := $(KERNEL_OUT)/include/config/kernel.release RECOVERY_KERNEL_CONFIG := $(RECOVERY_KERNEL_OUT)/.config RECOVERY_KERNEL_RELEASE := $(RECOVERY_KERNEL_OUT)/include/config/kernel.release +GKI_SUFFIX := $(shell echo android$(PLATFORM_VERSION)-$(TARGET_KERNEL_VERSION)) ifeq ($(KERNEL_ARCH),x86_64) KERNEL_DEFCONFIG_ARCH := x86 @@ -347,20 +348,21 @@ endef # $(3): mount point # $(4): staging dir # $(5): module load list +# $(6): suffix for output dir, needed for GKI modules usecase, empty otherwise # Depmod requires a well-formed kernel version so 0.0 is used as a placeholder. define build-image-kernel-modules-lineage - mkdir -p $(2)/lib/modules - cp $(1) $(2)/lib/modules/ + mkdir -p $(2)/lib/modules$(6) + cp $(1) $(2)/lib/modules$(6) rm -rf $(4) - mkdir -p $(4)/lib/modules/0.0/$(3)lib/modules - cp $(1) $(4)/lib/modules/0.0/$(3)lib/modules + mkdir -p $(4)/lib/modules/0.0/$(3)lib/modules$(6) + cp $(1) $(4)/lib/modules/0.0/$(3)lib/modules$(6) $(DEPMOD) -b $(4) 0.0 - sed -e 's/\(.*modules.*\):/\/\1:/g' -e 's/ \([^ ]*modules[^ ]*\)/ \/\1/g' $(4)/lib/modules/0.0/modules.dep > $(2)/lib/modules/modules.dep - cp $(4)/lib/modules/0.0/modules.softdep $(2)/lib/modules - cp $(4)/lib/modules/0.0/modules.alias $(2)/lib/modules - rm -f $(2)/lib/modules/modules.load + sed -e 's/\(.*modules.*\):/\/\1:/g' -e 's/ \([^ ]*modules[^ ]*\)/ \/\1/g' $(4)/lib/modules/0.0/modules.dep > $(2)/lib/modules$(6)/modules.dep + cp $(4)/lib/modules/0.0/modules.softdep $(2)/lib/modules$(6) + cp $(4)/lib/modules/0.0/modules.alias $(2)/lib/modules$(6) + rm -f $(2)/lib/modules$(6)/modules.load for MODULE in $(5); do \ - basename $$MODULE >> $(2)/lib/modules/modules.load; \ + basename $$MODULE >> $(2)/lib/modules$(6)/modules.load; \ done endef @@ -393,6 +395,12 @@ KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir- KERNEL_MODULE_MOUNTPOINT := vendor $(INSTALLED_VENDORIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) endif +ifeq ($(BOARD_USES_SYSTEM_DLKMIMAGE),true) +SYSTEM_KERNEL_MODULES_OUT := $(TARGET_OUT_SYSTEM_DLKM) +SYSTEM_KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_system_dlkm) +SYSTEM_KERNEL_MODULE_MOUNTPOINT := system_dlkm +$(INSTALLED_SYSTEM_DLKMIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +endif MODULES_INTERMEDIATES := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,kernel_modules) ifneq (,$(filter dlkm,$(BOARD_VENDOR_RAMDISK_FRAGMENTS))) @@ -447,15 +455,30 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(PAHOLE) $(foreach s, $(TARGET_MODULE_ALIASES),\ $(eval p := $(subst :,$(space),$(s))) \ ; mv $$(find $$kernel_modules_dir -name $(word 1,$(p))) $$kernel_modules_dir/$(word 2,$(p))); \ - modules=$$(find $$kernel_modules_dir -type f -name '*.ko'); \ - ($(call build-image-kernel-modules-lineage,$$modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD))); \ + all_modules=$$(find $$kernel_modules_dir -type f -name '*.ko'); \ + filtered_modules=""; \ + $(if $(BOARD_SYSTEM_KERNEL_MODULES),\ + gki_modules=$$(for m in $(BOARD_SYSTEM_KERNEL_MODULES); do \ + p=$$(find $$kernel_modules_dir -type f -name $$m); \ + if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from BOARD_SYSTEM_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ + done); \ + [ $$? -ne 0 ] && exit 1; \ + ($(call build-image-kernel-modules-lineage,$$gki_modules,$(SYSTEM_KERNEL_MODULES_OUT),$(SYSTEM_KERNEL_MODULE_MOUNTPOINT)/,$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR),$(BOARD_SYSTEM_KERNEL_MODULES_LOAD),/$(GKI_SUFFIX))); \ + filtered_modules=$$(for n in $$all_modules; do \ + module_name=$$(basename $$n); \ + if [[ ! "$(BOARD_SYSTEM_KERNEL_MODULES)" =~ "$$module_name" ]]; then echo $$n; fi; \ + done); \ + ($(call build-image-kernel-modules-lineage,$$filtered_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),/)); \ + ,\ + ($(call build-image-kernel-modules-lineage,$$all_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),/)); \ + ) \ $(if $(BOOT_KERNEL_MODULES),\ vendor_boot_modules=$$(for m in $(BOOT_KERNEL_MODULES); do \ p=$$(find $$kernel_modules_dir -type f -name $$m); \ if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from BOOT_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ - ($(call build-image-kernel-modules-lineage,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD))); \ + ($(call build-image-kernel-modules-lineage,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),/)); \ ) \ $(if $(RECOVERY_KERNEL_MODULES),\ recovery_modules=$$(for m in $(RECOVERY_KERNEL_MODULES); do \ @@ -463,7 +486,7 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(PAHOLE) if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from RECOVERY_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ - ($(call build-image-kernel-modules-lineage,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),/,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_RAMDISK_KERNEL_MODULES_LOAD))); \ + ($(call build-image-kernel-modules-lineage,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),/,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_RAMDISK_KERNEL_MODULES_LOAD),/)); \ ) \ fi