1# 2# Copyright (c) 2019, Google, Inc. All rights reserved 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16 17# Inputs: 18# LINUX_ARCH contains the architecture to build for (Global) 19# Outputs: 20# LINUX_BUILD_DIR contains the path to the built linux kernel sources 21# LINUX_IMAGE path of the final linux image target 22 23# This Makefile will build the Linux kernel with our configuration. 24 25LINUX_PREBUILTS_VERSION := 6.12 26LINUX_PREBUILTS_IMAGE := \ 27 kernel/prebuilts/${LINUX_PREBUILTS_VERSION}/${LINUX_ARCH}/kernel-${LINUX_PREBUILTS_VERSION} 28 29LINUX_BUILD_DIR := $(abspath $(BUILDDIR)/linux-build) 30ifndef LINUX_ARCH 31 $(error LINUX_ARCH must be specified) 32endif 33 34LINUX_IMAGE := $(LINUX_BUILD_DIR)/arch/$(LINUX_ARCH)/boot/Image 35LINUX_RAMDISK_IMAGE := 36 37ifeq (,$(wildcard $(LINUX_PREBUILTS_IMAGE))) 38ifeq ($(LINUX_ARCH),arm) 39LINUX_CLANG_TRIPLE := $(LINUX_ARCH)-linux-gnueabi- 40else 41LINUX_CLANG_TRIPLE := $(LINUX_ARCH)-linux-gnu- 42endif 43 44LINUX_SRC := $(call FIND_EXTERNAL,linux) 45LINUX_CONFIG_DIR = $(LINUX_SRC)/arch/$(LINUX_ARCH)/configs 46LINUX_TMP_DEFCONFIG := $(LINUX_CONFIG_DIR)/tmp_defconfig 47 48# Check if the Linux sources have the Trusty drivers in-tree 49LINUX_TRUSTY_INTREE := $(wildcard $(LINUX_SRC)/drivers/trusty) 50 51# Preserve compatibility with architectures without GKI 52ifeq (,$(wildcard $(LINUX_CONFIG_DIR)/gki_defconfig)) 53LINUX_DEFCONFIG_FRAGMENTS := \ 54 $(LINUX_CONFIG_DIR)/trusty_qemu_defconfig \ 55 56else 57LINUX_DEFCONFIG_FRAGMENTS := \ 58 $(LINUX_CONFIG_DIR)/gki_defconfig \ 59 $(if $(LINUX_TRUSTY_INTREE),$(LINUX_CONFIG_DIR)/trusty_qemu_defconfig.fragment) \ 60 trusty/device/arm/generic-arm64/project/linux/disable_sig_protect.fragment 61 62endif 63 64ifeq (,$(LINUX_TRUSTY_INTREE)) 65LINUX_DEFCONFIG_FRAGMENTS += \ 66 linux/common-modules/trusty/system_heap.fragment \ 67 linux/common-modules/trusty/trusty_defconfig.fragment \ 68 linux/common-modules/trusty/trusty_virtio_poll_vqueues.fragment \ 69 linux/common-modules/virtual-device/aarch64.fragment \ 70 linux/common-modules/virtual-device/virtual_device_core.fragment \ 71 72ifeq (true,$(call TOBOOL,$(LIB_SM_WITH_FFA_LOOP))) 73LINUX_ENABLE_FFA_TRANSPORT ?= true 74LINUX_ENABLE_SMC_TRANSPORT ?= false 75else 76LINUX_ENABLE_FFA_TRANSPORT ?= false 77LINUX_ENABLE_SMC_TRANSPORT ?= true 78endif 79 80ifeq (true,$(call TOBOOL,$(LINUX_ENABLE_FFA_TRANSPORT))) 81LINUX_DEFCONFIG_FRAGMENTS += \ 82 linux/common-modules/trusty/arm_ffa.fragment \ 83 84endif 85ifeq (false,$(call TOBOOL,$(LINUX_ENABLE_SMC_TRANSPORT))) 86LINUX_DEFCONFIG_FRAGMENTS += \ 87 linux/common-modules/trusty/disable_smc_transport.fragment \ 88 89endif 90endif 91 92$(LINUX_TMP_DEFCONFIG): LINUX_SRC := $(LINUX_SRC) 93$(LINUX_TMP_DEFCONFIG): $(LINUX_DEFCONFIG_FRAGMENTS) 94 KCONFIG_CONFIG="$@" $(LINUX_SRC)/scripts/kconfig/merge_config.sh -m -r $^ 95 96# tmp_defconfig lives in the source tree, 97# so we should delete it after we're done 98.INTERMEDIATE: $(LINUX_TMP_DEFCONFIG) 99 100LINUX_MODULES_LOAD := $(TRUSTY_TOP)/trusty/device/arm/generic-arm64/project/linux/modules.load 101 102ifeq (,$(LINUX_TRUSTY_INTREE)) 103# Make a copy of common-modules/trusty because the kernel build system 104# creates files directly in the directory passed to M= 105LINUX_TRUSTY_MODULES_SRC_DIR := linux/common-modules/trusty 106LINUX_TRUSTY_MODULES_COPY_DIR := $(abspath $(BUILDDIR)/linux-trusty-modules) 107LINUX_TRUSTY_MODULES_SRC_FILES := $(shell find $(LINUX_TRUSTY_MODULES_SRC_DIR) -type f) 108LINUX_TRUSTY_MODULES_COPY_FILES := $(patsubst $(LINUX_TRUSTY_MODULES_SRC_DIR)/%,$(LINUX_TRUSTY_MODULES_COPY_DIR)/%,$(LINUX_TRUSTY_MODULES_SRC_FILES)) 109$(LINUX_TRUSTY_MODULES_COPY_FILES): $(LINUX_TRUSTY_MODULES_COPY_DIR)/%: $(LINUX_TRUSTY_MODULES_SRC_DIR)/% 110 @$(MKDIR) 111 @cp $< $@ 112 113# For now, symlink the Trusty module Kconfig into Kconfig.ext 114# The kernel will import the latter into its build. 115LINUX_KCONFIG_EXT_PREFIX := $(LINUX_TRUSTY_MODULES_COPY_DIR)/ 116LINUX_TRUSTY_MODULES_KCONFIG_EXT := $(LINUX_TRUSTY_MODULES_COPY_DIR)/Kconfig.ext 117$(LINUX_TRUSTY_MODULES_KCONFIG_EXT): $(LINUX_TRUSTY_MODULES_COPY_DIR)/drivers/trusty/Kconfig 118 @ln -srf $< $@ 119 120LINUX_MODULES_STAGING_DIR := $(abspath $(BUILDDIR)/linux-modules-staging) 121LINUX_RAMDISK_IMAGE := $(abspath $(BUILDDIR)/ramdisk.img) 122endif # LINUX_TRUSTY_INTREE 123 124$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_TMP_DEFCONFIG := $(LINUX_TMP_DEFCONFIG) 125$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS := -C $(LINUX_SRC) 126$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += O=$(LINUX_BUILD_DIR) 127$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += ARCH=$(LINUX_ARCH) 128 129# Preserve compatibility with older linux kernel 130ifeq (,$(wildcard $(LINUX_SRC)/Documentation/kbuild/llvm.rst)) 131$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): CLANG_BINDIR := $(CLANG_BINDIR) 132$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += CROSS_COMPILE=$(ARCH_$(LINUX_ARCH)_TOOLCHAIN_PREFIX) 133$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += CC=$(CLANG_BINDIR)/clang 134$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += LD=$(CLANG_BINDIR)/ld.lld 135$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += CLANG_TRIPLE=$(LINUX_CLANG_TRIPLE) 136else 137# Newer linux kernel versions need a newer toolchain (optionally specified in 138# LINUX_CLANG_BINDIR) than the older linux kernel needs or supports. 139LINUX_CLANG_BINDIR ?= $(CLANG_BINDIR) 140$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): CLANG_BINDIR := $(LINUX_CLANG_BINDIR) 141$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += CROSS_COMPILE=$(LINUX_CLANG_TRIPLE) 142$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += LLVM=1 143$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += LLVM_IAS=1 144endif 145 146$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += LEX=$(BUILDTOOLS_BINDIR)/flex 147$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += YACC=$(BUILDTOOLS_BINDIR)/bison 148$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += BISON_PKGDATADIR=$(BUILDTOOLS_COMMON)/bison 149$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += HOSTCFLAGS="-isystem$(LINUX_BUILD_TOOLS)/include -B$(CLANG_BINDIR) -B$(CLANG_HOST_SEARCHDIR) --sysroot=$(CLANG_HOST_SYSROOT)" 150$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += HOSTLDFLAGS="-L$(LINUX_BUILD_TOOLS)/lib64 -rpath $(LINUX_BUILD_TOOLS)/lib64 $(addprefix -L,$(CLANG_HOST_LDDIRS)) -B$(CLANG_BINDIR) -B$(CLANG_HOST_SEARCHDIR) --sysroot=$(CLANG_HOST_SYSROOT)" 151$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += LIBCLANG_PATH=$(LINUX_CLANG_BINDIR)/../lib/libclang.so 152 153# Put all the paths prepended to $PATH in one variable 154$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): EXTRA_PATHS := $(CLANG_BINDIR):$(PATH_TOOLS_BINDIR):$(BUILDTOOLS_BINDIR):$(LINUX_BUILD_TOOLS)/bin 155 156$(LINUX_IMAGE): $(LINUX_TMP_DEFCONFIG) 157 PATH=$(EXTRA_PATHS):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) $(notdir $(LINUX_TMP_DEFCONFIG)) 158 PATH=$(EXTRA_PATHS):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) 159 160ifneq (,$(LINUX_RAMDISK_IMAGE)) 161$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += INSTALL_MOD_PATH=$(LINUX_MODULES_STAGING_DIR) 162$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += INSTALL_MOD_DIR=trusty 163$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += KCONFIG_EXT_PREFIX=$(LINUX_KCONFIG_EXT_PREFIX) 164 165$(LINUX_RAMDISK_IMAGE): LINUX_MODULES_STAGING_DIR := $(LINUX_MODULES_STAGING_DIR) 166$(LINUX_RAMDISK_IMAGE): LINUX_TRUSTY_MODULES_MAKEFILE_DIR := $(LINUX_TRUSTY_MODULES_COPY_DIR)/drivers/trusty 167$(LINUX_RAMDISK_IMAGE): TRUSTY_MODULES_ORDER_HASH := $(shell echo "${LINUX_TRUSTY_MODULES_MAKEFILE_DIR}" | $(PATH_TOOLS_BINDIR)/md5sum -b) 168$(LINUX_RAMDISK_IMAGE): REPLACE_RAMDISK_MODULES := $(PY3) trusty/host/common/scripts/replace_ramdisk_modules/replace_ramdisk_modules.py 169$(LINUX_RAMDISK_IMAGE): ANDROID_RAMDISK := trusty/prebuilts/aosp/android/out/target/product/trusty/ramdisk.img 170$(LINUX_RAMDISK_IMAGE): LINUX_MODULES_LOAD := $(LINUX_MODULES_LOAD) 171$(LINUX_RAMDISK_IMAGE): $(LINUX_IMAGE) $(LINUX_TRUSTY_MODULES_COPY_FILES) $(LINUX_TRUSTY_MODULES_KCONFIG_EXT) $(LINUX_MODULES_LOAD) 172 @echo building Linux ramdisk 173 @rm -rf $(LINUX_MODULES_STAGING_DIR) 174 PATH=$(EXTRA_PATHS):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) modules_install 175 PATH=$(EXTRA_PATHS):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) M=$(LINUX_TRUSTY_MODULES_MAKEFILE_DIR) modules 176 PATH=$(EXTRA_PATHS):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) M=$(LINUX_TRUSTY_MODULES_MAKEFILE_DIR) modules_install 177 PATH=$(EXTRA_PATHS):$(PATH) $(REPLACE_RAMDISK_MODULES) --android-ramdisk $(ANDROID_RAMDISK) --kernel-ramdisk $(LINUX_MODULES_STAGING_DIR) --output-ramdisk $@ --override-modules-load $(LINUX_MODULES_LOAD) --check-modules-order --extra-modules-order "modules.order.$(TRUSTY_MODULES_ORDER_HASH)" 178 179endif # LINUX_RAMDISK_IMAGE 180else 181$(LINUX_BUILD_DIR): $(LINUX_PREBUILTS_IMAGE) 182 @echo copying Linux prebuilts 183 @rm -rf $@ 184 @$(MKDIR) 185 186$(LINUX_IMAGE): $(LINUX_BUILD_DIR) 187 @mkdir -p $(@D) 188 @cp -r ${LINUX_PREBUILTS_IMAGE} $@ 189 190endif 191 192# Add LINUX_IMAGE to the list of project dependencies 193EXTRA_BUILDDEPS += $(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE) 194 195LINUX_DEFCONFIG_FRAGMENTS := 196LINUX_TMP_DEFCONFIG := 197LINUX_CONFIG_DIR := 198LINUX_SRC := 199LINUX_CLANG_TRIPLE := 200LINUX_TRUSTY_INTREE := 201LINUX_TRUSTY_MODULES_SRC_DIR := 202LINUX_TRUSTY_MODULES_COPY_DIR := 203LINUX_TRUSTY_MODULES_SRC_FILES := 204LINUX_TRUSTY_MODULES_COPY_FILES := 205LINUX_KCONFIG_EXT_PREFIX := 206LINUX_TRUSTY_MODULES_KCONFIG_EXT := 207LINUX_MODULES_STAGING_DIR := 208LINUX_MODULES_LOAD := 209LINUX_ENABLE_FFA_TRANSPORT := 210LINUX_ENABLE_SMC_TRANSPORT := 211