• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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