Add Broadcom's code for bcm63xx support
[project/bcm63xx/atf.git] / Makefile
1 #
2 # Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
3 #
4 # SPDX-License-Identifier: BSD-3-Clause
5 #
6
7 #
8 # Trusted Firmware Version
9 #
10 VERSION_MAJOR := 2
11 VERSION_MINOR := 2
12
13 # Default goal is build all images
14 .DEFAULT_GOAL := all
15
16 # Avoid any implicit propagation of command line variable definitions to
17 # sub-Makefiles, like CFLAGS that we reserved for the firmware images'
18 # usage. Other command line options like "-s" are still propagated as usual.
19 MAKEOVERRIDES =
20
21 MAKE_HELPERS_DIRECTORY := make_helpers/
22 include ${MAKE_HELPERS_DIRECTORY}build_macros.mk
23 include ${MAKE_HELPERS_DIRECTORY}build_env.mk
24
25 ################################################################################
26 # Default values for build configurations, and their dependencies
27 ################################################################################
28
29 include ${MAKE_HELPERS_DIRECTORY}defaults.mk
30
31 # Assertions enabled for DEBUG builds by default
32 ENABLE_ASSERTIONS := ${DEBUG}
33 ENABLE_PMF := ${ENABLE_RUNTIME_INSTRUMENTATION}
34 PLAT := ${DEFAULT_PLAT}
35
36 ################################################################################
37 # Checkpatch script options
38 ################################################################################
39
40 CHECKCODE_ARGS := --no-patch
41 # Do not check the coding style on imported library files or documentation files
42 INC_LIB_DIRS_TO_CHECK := $(sort $(filter-out \
43 include/lib/libfdt \
44 include/lib/libc, \
45 $(wildcard include/lib/*)))
46 INC_DIRS_TO_CHECK := $(sort $(filter-out \
47 include/lib, \
48 $(wildcard include/*)))
49 LIB_DIRS_TO_CHECK := $(sort $(filter-out \
50 lib/compiler-rt \
51 lib/libfdt% \
52 lib/libc, \
53 $(wildcard lib/*)))
54 ROOT_DIRS_TO_CHECK := $(sort $(filter-out \
55 lib \
56 include \
57 docs \
58 %.rst, \
59 $(wildcard *)))
60 CHECK_PATHS := ${ROOT_DIRS_TO_CHECK} \
61 ${INC_DIRS_TO_CHECK} \
62 ${INC_LIB_DIRS_TO_CHECK} \
63 ${LIB_DIRS_TO_CHECK}
64
65
66 ################################################################################
67 # Process build options
68 ################################################################################
69
70 # Verbose flag
71 ifeq (${V},0)
72 Q:=@
73 ECHO:=@echo
74 CHECKCODE_ARGS += --no-summary --terse
75 else
76 Q:=
77 ECHO:=$(ECHO_QUIET)
78 endif
79
80 ifneq ($(findstring s,$(filter-out --%,$(MAKEFLAGS))),)
81 Q:=@
82 ECHO:=$(ECHO_QUIET)
83 endif
84
85 export Q ECHO
86
87 # Process Debug flag
88 $(eval $(call add_define,DEBUG))
89 ifneq (${DEBUG}, 0)
90 BUILD_TYPE := debug
91 TF_CFLAGS += -g
92
93 ifneq ($(findstring clang,$(notdir $(CC))),)
94 ASFLAGS += -g
95 else
96 ASFLAGS += -g -Wa,--gdwarf-2
97 endif
98
99 # Use LOG_LEVEL_INFO by default for debug builds
100 LOG_LEVEL := 40
101 else
102 BUILD_TYPE := release
103 # Use LOG_LEVEL_NOTICE by default for release builds
104 LOG_LEVEL := 20
105 endif
106
107 # Default build string (git branch and commit)
108 ifeq (${BUILD_STRING},)
109 BUILD_STRING := $(shell git describe --always --dirty --tags 2> /dev/null)
110 endif
111 VERSION_STRING := v${VERSION_MAJOR}.${VERSION_MINOR}(${BUILD_TYPE}):${BUILD_STRING}
112
113 # The cert_create tool cannot generate certificates individually, so we use the
114 # target 'certificates' to create them all
115 ifneq (${GENERATE_COT},0)
116 FIP_DEPS += certificates
117 FWU_FIP_DEPS += fwu_certificates
118 endif
119
120 # Process BRANCH_PROTECTION value and set
121 # Pointer Authentication and Branch Target Identification flags
122 ifeq (${BRANCH_PROTECTION},0)
123 # Default value turns off all types of branch protection
124 BP_OPTION := none
125 else ifneq (${ARCH},aarch64)
126 $(error BRANCH_PROTECTION requires AArch64)
127 else ifeq (${BRANCH_PROTECTION},1)
128 # Enables all types of branch protection features
129 BP_OPTION := standard
130 ENABLE_BTI := 1
131 ENABLE_PAUTH := 1
132 else ifeq (${BRANCH_PROTECTION},2)
133 # Return address signing to its standard level
134 BP_OPTION := pac-ret
135 ENABLE_PAUTH := 1
136 else ifeq (${BRANCH_PROTECTION},3)
137 # Extend the signing to include leaf functions
138 BP_OPTION := pac-ret+leaf
139 ENABLE_PAUTH := 1
140 else
141 $(error Unknown BRANCH_PROTECTION value ${BRANCH_PROTECTION})
142 endif
143
144 # USE_SPINLOCK_CAS requires AArch64 build
145 ifeq (${USE_SPINLOCK_CAS},1)
146 ifneq (${ARCH},aarch64)
147 $(error USE_SPINLOCK_CAS requires AArch64)
148 else
149 $(info USE_SPINLOCK_CAS is an experimental feature)
150 endif
151 endif
152
153 ################################################################################
154 # Toolchain
155 ################################################################################
156
157 HOSTCC := gcc
158 export HOSTCC
159
160 CC := ${CROSS_COMPILE}gcc
161 CPP := ${CROSS_COMPILE}cpp
162 AS := ${CROSS_COMPILE}gcc
163 AR := ${CROSS_COMPILE}ar
164 LINKER := ${CROSS_COMPILE}ld
165 OC := ${CROSS_COMPILE}objcopy
166 OD := ${CROSS_COMPILE}objdump
167 NM := ${CROSS_COMPILE}nm
168 PP := ${CROSS_COMPILE}gcc -E
169 DTC := dtc
170
171 # Use ${LD}.bfd instead if it exists (as absolute path or together with $PATH).
172 ifneq ($(strip $(wildcard ${LD}.bfd) \
173 $(foreach dir,$(subst :, ,${PATH}),$(wildcard ${dir}/${LINKER}.bfd))),)
174 LINKER := ${LINKER}.bfd
175 endif
176
177 ifeq (${ARM_ARCH_MAJOR},7)
178 target32-directive = -target arm-none-eabi
179 # Will set march32-directive from platform configuration
180 else
181 target32-directive = -target armv8a-none-eabi
182
183 # Set the compiler's target architecture profile based on ARM_ARCH_MINOR option
184 ifeq (${ARM_ARCH_MINOR},0)
185 march32-directive = -march=armv8-a
186 march64-directive = -march=armv8-a
187 else
188 march32-directive = -march=armv8.${ARM_ARCH_MINOR}-a
189 march64-directive = -march=armv8.${ARM_ARCH_MINOR}-a
190 endif
191 endif
192
193 ifneq ($(findstring armclang,$(notdir $(CC))),)
194 TF_CFLAGS_aarch32 = -target arm-arm-none-eabi $(march32-directive)
195 TF_CFLAGS_aarch64 = -target aarch64-arm-none-eabi $(march64-directive)
196 LD = $(LINKER)
197 AS = $(CC) -c -x assembler-with-cpp $(TF_CFLAGS_$(ARCH))
198 CPP = $(CC) -E $(TF_CFLAGS_$(ARCH))
199 PP = $(CC) -E $(TF_CFLAGS_$(ARCH))
200 else ifneq ($(findstring clang,$(notdir $(CC))),)
201 TF_CFLAGS_aarch32 = $(target32-directive) $(march32-directive)
202 TF_CFLAGS_aarch64 = -target aarch64-elf $(march64-directive)
203 LD = $(LINKER)
204 AS = $(CC) -c -x assembler-with-cpp $(TF_CFLAGS_$(ARCH))
205 CPP = $(CC) -E
206 PP = $(CC) -E
207 else
208 TF_CFLAGS_aarch32 = $(march32-directive)
209 TF_CFLAGS_aarch64 = $(march64-directive)
210 LD = $(LINKER)
211 endif
212
213 ifeq (${AARCH32_INSTRUCTION_SET},A32)
214 TF_CFLAGS_aarch32 += -marm
215 else ifeq (${AARCH32_INSTRUCTION_SET},T32)
216 TF_CFLAGS_aarch32 += -mthumb
217 else
218 $(error Error: Unknown AArch32 instruction set ${AARCH32_INSTRUCTION_SET})
219 endif
220
221 TF_CFLAGS_aarch32 += -mno-unaligned-access
222 TF_CFLAGS_aarch64 += -mgeneral-regs-only -mstrict-align
223
224 ifneq (${BP_OPTION},none)
225 TF_CFLAGS_aarch64 += -mbranch-protection=${BP_OPTION}
226 endif
227
228 ASFLAGS_aarch32 = $(march32-directive)
229 ASFLAGS_aarch64 = $(march64-directive)
230
231 WARNING1 := -Wextra
232 WARNING1 += -Wmissing-declarations
233 WARNING1 += -Wmissing-format-attribute
234 WARNING1 += -Wmissing-prototypes
235 WARNING1 += -Wold-style-definition
236 WARNING1 += -Wunused-const-variable
237
238 WARNING2 := -Waggregate-return
239 WARNING2 += -Wcast-align
240 WARNING2 += -Wnested-externs
241 WARNING2 += -Wshadow
242 WARNING2 += -Wlogical-op
243 WARNING2 += -Wmissing-field-initializers
244 WARNING2 += -Wsign-compare
245
246 WARNING3 := -Wbad-function-cast
247 WARNING3 += -Wcast-qual
248 WARNING3 += -Wconversion
249 WARNING3 += -Wpacked
250 WARNING3 += -Wpadded
251 WARNING3 += -Wpointer-arith
252 WARNING3 += -Wredundant-decls
253 WARNING3 += -Wswitch-default
254
255 ifeq (${W},1)
256 WARNINGS := $(WARNING1)
257 else ifeq (${W},2)
258 WARNINGS := $(WARNING1) $(WARNING2)
259 else ifeq (${W},3)
260 WARNINGS := $(WARNING1) $(WARNING2) $(WARNING3)
261 endif
262
263 WARNINGS += -Wunused -Wno-unused-parameter \
264 -Wdisabled-optimization \
265 -Wvla
266
267 ifeq ($(findstring clang,$(notdir $(CC))),)
268 # not using clang
269 WARNINGS += -Wunused-but-set-variable \
270 -Wmaybe-uninitialized \
271 -Wpacked-bitfield-compat
272 # BRCM_PATCH: Conflicts with toolchain
273 # -Wshift-overflow=2
274 else
275 # using clang
276 WARNINGS += -Wshift-overflow -Wshift-sign-overflow
277 endif
278
279 ifneq (${E},0)
280 ERRORS := -Werror
281 endif
282
283 CPPFLAGS = ${DEFINES} ${INCLUDES} ${MBEDTLS_INC} -nostdinc \
284 -Wmissing-include-dirs $(ERRORS) $(WARNINGS)
285 ASFLAGS += $(CPPFLAGS) $(ASFLAGS_$(ARCH)) \
286 -ffreestanding -Wa,--fatal-warnings
287 # BRCM_PATCH: Code optimization for Cortex-A9 brings instability
288 ifeq ($(strip $(BRCM_CHIP)),63138)
289 TF_CFLAGS += $(CPPFLAGS) $(TF_CFLAGS_$(ARCH)) \
290 -ffreestanding -fno-builtin -Wall -std=gnu99 \
291 -O0 -ffunction-sections -fdata-sections
292 else
293 TF_CFLAGS += $(CPPFLAGS) $(TF_CFLAGS_$(ARCH)) \
294 -ffreestanding -fno-builtin -Wall -std=gnu99 \
295 -Os -ffunction-sections -fdata-sections
296 endif
297 ifeq (${SANITIZE_UB},on)
298 TF_CFLAGS += -fsanitize=undefined -fno-sanitize-recover
299 endif
300 ifeq (${SANITIZE_UB},trap)
301 TF_CFLAGS += -fsanitize=undefined -fno-sanitize-recover \
302 -fsanitize-undefined-trap-on-error
303 endif
304
305 GCC_V_OUTPUT := $(shell $(CC) -v 2>&1)
306
307 ifneq ($(findstring armlink,$(notdir $(LD))),)
308 TF_LDFLAGS += --diag_error=warning --lto_level=O1
309 TF_LDFLAGS += --remove --info=unused,unusedsymbols
310 else
311 TF_LDFLAGS += --fatal-warnings -O1
312 TF_LDFLAGS += --gc-sections
313 endif
314 TF_LDFLAGS += $(TF_LDFLAGS_$(ARCH))
315
316 DTC_FLAGS += -I dts -O dtb
317 DTC_CPPFLAGS += -nostdinc -Iinclude -undef -x assembler-with-cpp
318
319 ################################################################################
320 # Common sources and include directories
321 ################################################################################
322 include lib/compiler-rt/compiler-rt.mk
323
324 BL_COMMON_SOURCES += common/bl_common.c \
325 common/tf_log.c \
326 common/${ARCH}/debug.S \
327 drivers/console/multi_console.c \
328 lib/${ARCH}/cache_helpers.S \
329 lib/${ARCH}/misc_helpers.S \
330 plat/common/plat_bl_common.c \
331 plat/common/plat_log_common.c \
332 plat/common/${ARCH}/plat_common.c \
333 plat/common/${ARCH}/platform_helpers.S \
334 ${COMPILER_RT_SRCS}
335
336 ifeq ($(notdir $(CC)),armclang)
337 BL_COMMON_SOURCES += lib/${ARCH}/armclang_printf.S
338 endif
339
340 ifeq (${SANITIZE_UB},on)
341 BL_COMMON_SOURCES += plat/common/ubsan.c
342 endif
343
344 INCLUDES += -Iinclude \
345 -Iinclude/arch/${ARCH} \
346 -Iinclude/lib/cpus/${ARCH} \
347 -Iinclude/lib/el3_runtime/${ARCH} \
348 ${PLAT_INCLUDES} \
349 ${SPD_INCLUDES}
350
351 include common/backtrace/backtrace.mk
352
353 ################################################################################
354 # Generic definitions
355 ################################################################################
356
357 include ${MAKE_HELPERS_DIRECTORY}plat_helpers.mk
358
359 BUILD_BASE := ./build
360 BUILD_PLAT := ${BUILD_BASE}/${PLAT}/${BUILD_TYPE}
361
362 SPDS := $(sort $(filter-out none, $(patsubst services/spd/%,%,$(wildcard services/spd/*))))
363
364 # Platforms providing their own TBB makefile may override this value
365 INCLUDE_TBBR_MK := 1
366
367
368 ################################################################################
369 # Include SPD Makefile if one has been specified
370 ################################################################################
371
372 ifneq (${SPD},none)
373 ifeq (${ARCH},aarch32)
374 # $(error "Error: SPD is incompatible with AArch32.")
375 endif
376 ifdef EL3_PAYLOAD_BASE
377 $(warning "SPD and EL3_PAYLOAD_BASE are incompatible build options.")
378 $(warning "The SPD and its BL32 companion will be present but ignored.")
379 endif
380 # We expect to locate an spd.mk under the specified SPD directory
381 SPD_MAKE := $(wildcard services/spd/${SPD}/${SPD}.mk)
382
383 ifeq (${SPD_MAKE},)
384 $(error Error: No services/spd/${SPD}/${SPD}.mk located)
385 endif
386 $(info Including ${SPD_MAKE})
387 include ${SPD_MAKE}
388
389 # If there's BL32 companion for the chosen SPD, we expect that the SPD's
390 # Makefile would set NEED_BL32 to "yes". In this case, the build system
391 # supports two mutually exclusive options:
392 # * BL32 is built from source: then BL32_SOURCES must contain the list
393 # of source files to build BL32
394 # * BL32 is a prebuilt binary: then BL32 must point to the image file
395 # that will be included in the FIP
396 # If both BL32_SOURCES and BL32 are defined, the binary takes precedence
397 # over the sources.
398 endif
399
400 ################################################################################
401 # Include the platform specific Makefile after the SPD Makefile (the platform
402 # makefile may use all previous definitions in this file)
403 ################################################################################
404
405 include ${PLAT_MAKEFILE_FULL}
406
407 $(eval $(call MAKE_PREREQ_DIR,${BUILD_PLAT}))
408
409 ifeq (${ARM_ARCH_MAJOR},7)
410 include make_helpers/armv7-a-cpus.mk
411 endif
412
413 ifeq ($(ENABLE_PIE),1)
414 TF_CFLAGS += -fpie
415 TF_LDFLAGS += -pie --no-dynamic-linker
416 else
417 PIE_FOUND := $(findstring --enable-default-pie,${GCC_V_OUTPUT})
418 ifneq ($(PIE_FOUND),)
419 TF_CFLAGS += -fno-PIE
420 endif
421 endif
422
423 # Include the CPU specific operations makefile, which provides default
424 # values for all CPU errata workarounds and CPU specific optimisations.
425 # This can be overridden by the platform.
426 include lib/cpus/cpu-ops.mk
427
428 ifeq (${ARCH},aarch32)
429 NEED_BL32 := yes
430
431 ################################################################################
432 # Build `AARCH32_SP` as BL32 image for AArch32
433 ################################################################################
434 ifneq (${AARCH32_SP},none)
435 # We expect to locate an sp.mk under the specified AARCH32_SP directory
436 AARCH32_SP_MAKE := $(wildcard bl32/${AARCH32_SP}/${AARCH32_SP}.mk)
437
438 ifeq (${AARCH32_SP_MAKE},)
439 $(error Error: No bl32/${AARCH32_SP}/${AARCH32_SP}.mk located)
440 endif
441
442 $(info Including ${AARCH32_SP_MAKE})
443 include ${AARCH32_SP_MAKE}
444 endif
445
446 endif
447
448 ################################################################################
449 # Include libc if not overridden
450 ################################################################################
451 ifeq (${OVERRIDE_LIBC},0)
452 include lib/libc/libc.mk
453 endif
454
455 ################################################################################
456 # Check incompatible options
457 ################################################################################
458
459 ifdef EL3_PAYLOAD_BASE
460 ifdef PRELOADED_BL33_BASE
461 $(warning "PRELOADED_BL33_BASE and EL3_PAYLOAD_BASE are \
462 incompatible build options. EL3_PAYLOAD_BASE has priority.")
463 endif
464 ifneq (${GENERATE_COT},0)
465 $(error "GENERATE_COT and EL3_PAYLOAD_BASE are incompatible build options.")
466 endif
467 ifneq (${TRUSTED_BOARD_BOOT},0)
468 $(error "TRUSTED_BOARD_BOOT and EL3_PAYLOAD_BASE are incompatible build options.")
469 endif
470 endif
471
472 ifeq (${NEED_BL33},yes)
473 ifdef EL3_PAYLOAD_BASE
474 $(warning "BL33 image is not needed when option \
475 BL33_PAYLOAD_BASE is used and won't be added to the FIP file.")
476 endif
477 ifdef PRELOADED_BL33_BASE
478 $(warning "BL33 image is not needed when option \
479 PRELOADED_BL33_BASE is used and won't be added to the FIP \
480 file.")
481 endif
482 endif
483
484 # When building for systems with hardware-assisted coherency, there's no need to
485 # use USE_COHERENT_MEM. Require that USE_COHERENT_MEM must be set to 0 too.
486 ifeq ($(HW_ASSISTED_COHERENCY)-$(USE_COHERENT_MEM),1-1)
487 $(error USE_COHERENT_MEM cannot be enabled with HW_ASSISTED_COHERENCY)
488 endif
489
490 #For now, BL2_IN_XIP_MEM is only supported when BL2_AT_EL3 is 1.
491 ifeq ($(BL2_AT_EL3)-$(BL2_IN_XIP_MEM),0-1)
492 $(error "BL2_IN_XIP_MEM is only supported when BL2_AT_EL3 is enabled")
493 endif
494
495 # For RAS_EXTENSION, require that EAs are handled in EL3 first
496 ifeq ($(RAS_EXTENSION),1)
497 ifneq ($(HANDLE_EA_EL3_FIRST),1)
498 $(error For RAS_EXTENSION, HANDLE_EA_EL3_FIRST must also be 1)
499 endif
500 endif
501
502 # When FAULT_INJECTION_SUPPORT is used, require that RAS_EXTENSION is enabled
503 ifeq ($(FAULT_INJECTION_SUPPORT),1)
504 ifneq ($(RAS_EXTENSION),1)
505 $(error For FAULT_INJECTION_SUPPORT, RAS_EXTENSION must also be 1)
506 endif
507 endif
508
509 # DYN_DISABLE_AUTH can be set only when TRUSTED_BOARD_BOOT=1
510 ifeq ($(DYN_DISABLE_AUTH), 1)
511 ifeq (${TRUSTED_BOARD_BOOT}, 0)
512 $(error "TRUSTED_BOARD_BOOT must be enabled for DYN_DISABLE_AUTH to be set.")
513 endif
514 endif
515
516 # If pointer authentication is used in the firmware, make sure that all the
517 # registers associated to it are also saved and restored.
518 # Not doing it would leak the value of the keys used by EL3 to EL1 and S-EL1.
519 ifeq ($(ENABLE_PAUTH),1)
520 ifeq ($(CTX_INCLUDE_PAUTH_REGS),0)
521 $(error Pointer Authentication requires CTX_INCLUDE_PAUTH_REGS=1)
522 endif
523 endif
524
525 ifeq ($(CTX_INCLUDE_PAUTH_REGS),1)
526 ifneq (${ARCH},aarch64)
527 $(error CTX_INCLUDE_PAUTH_REGS requires AArch64)
528 else
529 $(info CTX_INCLUDE_PAUTH_REGS is an experimental feature)
530 endif
531 endif
532
533 ifeq ($(ENABLE_PAUTH),1)
534 $(info Pointer Authentication is an experimental feature)
535 endif
536
537 ifeq ($(ENABLE_BTI),1)
538 $(info Branch Protection is an experimental feature)
539 endif
540
541 ifeq ($(CTX_INCLUDE_MTE_REGS),1)
542 ifneq (${ARCH},aarch64)
543 $(error CTX_INCLUDE_MTE_REGS requires AArch64)
544 else
545 $(info CTX_INCLUDE_MTE_REGS is an experimental feature)
546 endif
547 endif
548
549 ################################################################################
550 # Process platform overrideable behaviour
551 ################################################################################
552
553 # Using BL2 implies that a BL33 image also needs to be supplied for the FIP and
554 # Certificate generation tools. This flag can be overridden by the platform.
555 ifdef BL2_SOURCES
556 ifdef EL3_PAYLOAD_BASE
557 # If booting an EL3 payload there is no need for a BL33 image
558 # in the FIP file.
559 NEED_BL33 := no
560 else
561 ifdef PRELOADED_BL33_BASE
562 # If booting a BL33 preloaded image there is no need of
563 # another one in the FIP file.
564 NEED_BL33 := no
565 else
566 NEED_BL33 ?= yes
567 endif
568 endif
569 endif
570
571 # If SCP_BL2 is given, we always want FIP to include it.
572 ifdef SCP_BL2
573 NEED_SCP_BL2 := yes
574 endif
575
576 # For AArch32, BL31 is not currently supported.
577 ifneq (${ARCH},aarch32)
578 ifdef BL31_SOURCES
579 # When booting an EL3 payload, there is no need to compile the BL31 image nor
580 # put it in the FIP.
581 ifndef EL3_PAYLOAD_BASE
582 NEED_BL31 := yes
583 endif
584 endif
585 endif
586
587 # Process TBB related flags
588 ifneq (${GENERATE_COT},0)
589 # Common cert_create options
590 ifneq (${CREATE_KEYS},0)
591 $(eval CRT_ARGS += -n)
592 $(eval FWU_CRT_ARGS += -n)
593 ifneq (${SAVE_KEYS},0)
594 $(eval CRT_ARGS += -k)
595 $(eval FWU_CRT_ARGS += -k)
596 endif
597 endif
598 # Include TBBR makefile (unless the platform indicates otherwise)
599 ifeq (${INCLUDE_TBBR_MK},1)
600 include make_helpers/tbbr/tbbr_tools.mk
601 endif
602 endif
603
604 ifneq (${FIP_ALIGN},0)
605 FIP_ARGS += --align ${FIP_ALIGN}
606 endif
607
608 ################################################################################
609 # Include libraries' Makefile that are used in all BL
610 ################################################################################
611
612 include lib/stack_protector/stack_protector.mk
613
614 ################################################################################
615 # Auxiliary tools (fiptool, cert_create, etc)
616 ################################################################################
617
618 # Variables for use with Certificate Generation Tool
619 CRTTOOLPATH ?= tools/cert_create
620 CRTTOOL ?= ${CRTTOOLPATH}/cert_create${BIN_EXT}
621
622 # Variables for use with Firmware Image Package
623 FIPTOOLPATH ?= tools/fiptool
624 FIPTOOL ?= ${FIPTOOLPATH}/fiptool${BIN_EXT}
625
626 # Variables for use with sptool
627 SPTOOLPATH ?= tools/sptool
628 SPTOOL ?= ${SPTOOLPATH}/sptool${BIN_EXT}
629
630 # Variables for use with ROMLIB
631 ROMLIBPATH ?= lib/romlib
632
633 ################################################################################
634 # Include BL specific makefiles
635 ################################################################################
636 ifdef BL1_SOURCES
637 NEED_BL1 := yes
638 include bl1/bl1.mk
639 endif
640
641 ifdef BL2_SOURCES
642 NEED_BL2 := yes
643 include bl2/bl2.mk
644 endif
645
646 ifdef BL2U_SOURCES
647 NEED_BL2U := yes
648 include bl2u/bl2u.mk
649 endif
650
651 ifeq (${NEED_BL31},yes)
652 ifdef BL31_SOURCES
653 include bl31/bl31.mk
654 endif
655 endif
656
657 ifdef FDT_SOURCES
658 NEED_FDT := yes
659 endif
660
661 ################################################################################
662 # Build options checks
663 ################################################################################
664
665 $(eval $(call assert_boolean,COLD_BOOT_SINGLE_CPU))
666 $(eval $(call assert_boolean,CREATE_KEYS))
667 $(eval $(call assert_boolean,CTX_INCLUDE_AARCH32_REGS))
668 $(eval $(call assert_boolean,CTX_INCLUDE_FPREGS))
669 $(eval $(call assert_boolean,CTX_INCLUDE_PAUTH_REGS))
670 $(eval $(call assert_boolean,CTX_INCLUDE_MTE_REGS))
671 $(eval $(call assert_boolean,DEBUG))
672 $(eval $(call assert_boolean,DYN_DISABLE_AUTH))
673 $(eval $(call assert_boolean,EL3_EXCEPTION_HANDLING))
674 $(eval $(call assert_boolean,ENABLE_AMU))
675 $(eval $(call assert_boolean,ENABLE_ASSERTIONS))
676 $(eval $(call assert_boolean,ENABLE_MPAM_FOR_LOWER_ELS))
677 $(eval $(call assert_boolean,ENABLE_PIE))
678 $(eval $(call assert_boolean,ENABLE_PMF))
679 $(eval $(call assert_boolean,ENABLE_PSCI_STAT))
680 $(eval $(call assert_boolean,ENABLE_RUNTIME_INSTRUMENTATION))
681 $(eval $(call assert_boolean,ENABLE_SPE_FOR_LOWER_ELS))
682 $(eval $(call assert_boolean,ENABLE_SPM))
683 $(eval $(call assert_boolean,ENABLE_SVE_FOR_NS))
684 $(eval $(call assert_boolean,ERROR_DEPRECATED))
685 $(eval $(call assert_boolean,FAULT_INJECTION_SUPPORT))
686 $(eval $(call assert_boolean,GENERATE_COT))
687 $(eval $(call assert_boolean,GICV2_G0_FOR_EL3))
688 $(eval $(call assert_boolean,HANDLE_EA_EL3_FIRST))
689 $(eval $(call assert_boolean,HW_ASSISTED_COHERENCY))
690 $(eval $(call assert_boolean,NS_TIMER_SWITCH))
691 $(eval $(call assert_boolean,OVERRIDE_LIBC))
692 $(eval $(call assert_boolean,PL011_GENERIC_UART))
693 $(eval $(call assert_boolean,PROGRAMMABLE_RESET_ADDRESS))
694 $(eval $(call assert_boolean,PSCI_EXTENDED_STATE_ID))
695 $(eval $(call assert_boolean,RAS_EXTENSION))
696 $(eval $(call assert_boolean,RESET_TO_BL31))
697 $(eval $(call assert_boolean,SAVE_KEYS))
698 $(eval $(call assert_boolean,SEPARATE_CODE_AND_RODATA))
699 $(eval $(call assert_boolean,SPIN_ON_BL1_EXIT))
700 $(eval $(call assert_boolean,SPM_MM))
701 $(eval $(call assert_boolean,TRUSTED_BOARD_BOOT))
702 $(eval $(call assert_boolean,USE_COHERENT_MEM))
703 $(eval $(call assert_boolean,USE_ROMLIB))
704 $(eval $(call assert_boolean,USE_TBBR_DEFS))
705 $(eval $(call assert_boolean,WARMBOOT_ENABLE_DCACHE_EARLY))
706 $(eval $(call assert_boolean,BL2_AT_EL3))
707 $(eval $(call assert_boolean,BL2_IN_XIP_MEM))
708 $(eval $(call assert_boolean,BL2_INV_DCACHE))
709 $(eval $(call assert_boolean,USE_SPINLOCK_CAS))
710
711 $(eval $(call assert_numeric,ARM_ARCH_MAJOR))
712 $(eval $(call assert_numeric,ARM_ARCH_MINOR))
713 $(eval $(call assert_numeric,BRANCH_PROTECTION))
714
715 ifdef KEY_SIZE
716 $(eval $(call assert_numeric,KEY_SIZE))
717 endif
718
719 ifeq ($(filter $(SANITIZE_UB), on off trap),)
720 $(error "Invalid value for SANITIZE_UB: can be one of on, off, trap")
721 endif
722
723 ################################################################################
724 # Add definitions to the cpp preprocessor based on the current build options.
725 # This is done after including the platform specific makefile to allow the
726 # platform to overwrite the default options
727 ################################################################################
728 # BRCM_PATCH: Need to add Broadcom SoC specific platform profiles
729 $(eval $(call add_define,PLATFORM_FLAVOR_${BRCM_CHIP}))
730 $(eval $(call add_define,_BCM9${BRCM_CHIP}_))
731 $(eval $(call add_define,ARM_ARCH_MAJOR))
732 $(eval $(call add_define,ARM_ARCH_MINOR))
733 $(eval $(call add_define,COLD_BOOT_SINGLE_CPU))
734 $(eval $(call add_define,CTX_INCLUDE_AARCH32_REGS))
735 $(eval $(call add_define,CTX_INCLUDE_FPREGS))
736 $(eval $(call add_define,CTX_INCLUDE_PAUTH_REGS))
737 $(eval $(call add_define,EL3_EXCEPTION_HANDLING))
738 $(eval $(call add_define,CTX_INCLUDE_MTE_REGS))
739 $(eval $(call add_define,ENABLE_AMU))
740 $(eval $(call add_define,ENABLE_ASSERTIONS))
741 $(eval $(call add_define,ENABLE_BTI))
742 $(eval $(call add_define,ENABLE_MPAM_FOR_LOWER_ELS))
743 $(eval $(call add_define,ENABLE_PAUTH))
744 $(eval $(call add_define,ENABLE_PIE))
745 $(eval $(call add_define,ENABLE_PMF))
746 $(eval $(call add_define,ENABLE_PSCI_STAT))
747 $(eval $(call add_define,ENABLE_RUNTIME_INSTRUMENTATION))
748 $(eval $(call add_define,ENABLE_SPE_FOR_LOWER_ELS))
749 $(eval $(call add_define,ENABLE_SPM))
750 $(eval $(call add_define,ENABLE_SVE_FOR_NS))
751 $(eval $(call add_define,ERROR_DEPRECATED))
752 $(eval $(call add_define,FAULT_INJECTION_SUPPORT))
753 $(eval $(call add_define,GICV2_G0_FOR_EL3))
754 $(eval $(call add_define,HANDLE_EA_EL3_FIRST))
755 $(eval $(call add_define,HW_ASSISTED_COHERENCY))
756 $(eval $(call add_define,LOG_LEVEL))
757 $(eval $(call add_define,NS_TIMER_SWITCH))
758 $(eval $(call add_define,PL011_GENERIC_UART))
759 $(eval $(call add_define,PLAT_${PLAT}))
760 $(eval $(call add_define,PROGRAMMABLE_RESET_ADDRESS))
761 $(eval $(call add_define,PSCI_EXTENDED_STATE_ID))
762 $(eval $(call add_define,RAS_EXTENSION))
763 $(eval $(call add_define,RESET_TO_BL31))
764 $(eval $(call add_define,SEPARATE_CODE_AND_RODATA))
765 $(eval $(call add_define,RECLAIM_INIT_CODE))
766 $(eval $(call add_define,SPD_${SPD}))
767 $(eval $(call add_define,SPIN_ON_BL1_EXIT))
768 $(eval $(call add_define,SPM_MM))
769 $(eval $(call add_define,TRUSTED_BOARD_BOOT))
770 $(eval $(call add_define,USE_COHERENT_MEM))
771 $(eval $(call add_define,USE_ROMLIB))
772 $(eval $(call add_define,USE_TBBR_DEFS))
773 $(eval $(call add_define,WARMBOOT_ENABLE_DCACHE_EARLY))
774 $(eval $(call add_define,BL2_AT_EL3))
775 $(eval $(call add_define,BL2_IN_XIP_MEM))
776 $(eval $(call add_define,BL2_INV_DCACHE))
777 $(eval $(call add_define,USE_SPINLOCK_CAS))
778
779 ifeq (${SANITIZE_UB},trap)
780 $(eval $(call add_define,MONITOR_TRAPS))
781 endif
782
783 # Define the EL3_PAYLOAD_BASE flag only if it is provided.
784 ifdef EL3_PAYLOAD_BASE
785 $(eval $(call add_define,EL3_PAYLOAD_BASE))
786 else
787 # Define the PRELOADED_BL33_BASE flag only if it is provided and
788 # EL3_PAYLOAD_BASE is not defined, as it has priority.
789 ifdef PRELOADED_BL33_BASE
790 $(eval $(call add_define,PRELOADED_BL33_BASE))
791 endif
792 endif
793
794 # Define the DYN_DISABLE_AUTH flag only if set.
795 ifeq (${DYN_DISABLE_AUTH},1)
796 $(eval $(call add_define,DYN_DISABLE_AUTH))
797 endif
798
799 ifneq ($(findstring armlink,$(notdir $(LD))),)
800 $(eval $(call add_define,USE_ARM_LINK))
801 endif
802
803 ################################################################################
804 # Build targets
805 ################################################################################
806
807 .PHONY: all msg_start clean realclean distclean cscope locate-checkpatch checkcodebase checkpatch fiptool sptool fip fwu_fip certtool dtbs
808 .SUFFIXES:
809
810 all: msg_start
811
812 msg_start:
813 @echo "Building ${PLAT}"
814
815 ifeq (${ERROR_DEPRECATED},0)
816 # Check if deprecated declarations and cpp warnings should be treated as error or not.
817 ifneq ($(findstring clang,$(notdir $(CC))),)
818 CPPFLAGS += -Wno-error=deprecated-declarations
819 else
820 CPPFLAGS += -Wno-error=deprecated-declarations -Wno-error=cpp
821 endif
822 # __ASSEMBLY__ is deprecated in favor of the compiler-builtin __ASSEMBLER__.
823 ASFLAGS += -D__ASSEMBLY__
824 # AARCH32/AARCH64 macros are deprecated in favor of the compiler-builtin __aarch64__.
825 ifeq (${ARCH},aarch32)
826 $(eval $(call add_define,AARCH32))
827 else
828 $(eval $(call add_define,AARCH64))
829 endif
830 endif # !ERROR_DEPRECATED
831
832 $(eval $(call MAKE_LIB_DIRS))
833 $(eval $(call MAKE_LIB,c))
834
835 # Expand build macros for the different images
836 ifeq (${NEED_BL1},yes)
837 $(eval $(call MAKE_BL,1))
838 endif
839
840 ifeq (${NEED_BL2},yes)
841 ifeq (${BL2_AT_EL3}, 0)
842 FIP_BL2_ARGS := tb-fw
843 endif
844
845 $(if ${BL2}, $(eval $(call TOOL_ADD_IMG,bl2,--${FIP_BL2_ARGS})),\
846 $(eval $(call MAKE_BL,2,${FIP_BL2_ARGS})))
847 endif
848
849 ifeq (${NEED_SCP_BL2},yes)
850 $(eval $(call TOOL_ADD_IMG,scp_bl2,--scp-fw))
851 endif
852
853 ifeq (${NEED_BL31},yes)
854 BL31_SOURCES += ${SPD_SOURCES}
855 $(if ${BL31}, $(eval $(call TOOL_ADD_IMG,bl31,--soc-fw)),\
856 $(eval $(call MAKE_BL,31,soc-fw)))
857 endif
858
859 # If a BL32 image is needed but neither BL32 nor BL32_SOURCES is defined, the
860 # build system will call TOOL_ADD_IMG to print a warning message and abort the
861 # process. Note that the dependency on BL32 applies to the FIP only.
862 ifeq (${NEED_BL32},yes)
863
864 BUILD_BL32 := $(if $(BL32),,$(if $(BL32_SOURCES),1))
865
866 $(if ${BUILD_BL32}, $(eval $(call MAKE_BL,32,tos-fw)),\
867 $(eval $(call TOOL_ADD_IMG,bl32,--tos-fw)))
868 endif
869
870 # Add the BL33 image if required by the platform
871 ifeq (${NEED_BL33},yes)
872 $(eval $(call TOOL_ADD_IMG,bl33,--nt-fw))
873 endif
874
875 ifeq (${NEED_BL2U},yes)
876 $(if ${BL2U}, $(eval $(call TOOL_ADD_IMG,bl2u,--ap-fwu-cfg,FWU_)),\
877 $(eval $(call MAKE_BL,2u,ap-fwu-cfg,FWU_)))
878 endif
879
880 # Expand build macros for the different images
881 ifeq (${NEED_FDT},yes)
882 $(eval $(call MAKE_DTBS,$(BUILD_PLAT)/fdts,$(FDT_SOURCES)))
883 endif
884
885 locate-checkpatch:
886 ifndef CHECKPATCH
887 $(error "Please set CHECKPATCH to point to the Linux checkpatch.pl file, eg: CHECKPATCH=../linux/scripts/checkpatch.pl")
888 else
889 ifeq (,$(wildcard ${CHECKPATCH}))
890 $(error "The file CHECKPATCH points to cannot be found, use eg: CHECKPATCH=../linux/scripts/checkpatch.pl")
891 endif
892 endif
893
894 clean:
895 @echo " CLEAN"
896 $(call SHELL_REMOVE_DIR,${BUILD_PLAT})
897 ${Q}${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean
898 ${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${CRTTOOLPATH} clean
899 ${Q}${MAKE} --no-print-directory -C ${ROMLIBPATH} clean
900
901 realclean distclean:
902 @echo " REALCLEAN"
903 $(call SHELL_REMOVE_DIR,${BUILD_BASE})
904 $(call SHELL_DELETE_ALL, ${CURDIR}/cscope.*)
905 ${Q}${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean
906 ${Q}${MAKE} --no-print-directory -C ${SPTOOLPATH} clean
907 ${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${CRTTOOLPATH} clean
908 ${Q}${MAKE} --no-print-directory -C ${ROMLIBPATH} clean
909
910 checkcodebase: locate-checkpatch
911 @echo " CHECKING STYLE"
912 @if test -d .git ; then \
913 git ls-files | grep -E -v 'libfdt|libc|docs|\.rst' | \
914 while read GIT_FILE ; \
915 do ${CHECKPATCH} ${CHECKCODE_ARGS} -f $$GIT_FILE ; \
916 done ; \
917 else \
918 find . -type f -not -iwholename "*.git*" \
919 -not -iwholename "*build*" \
920 -not -iwholename "*libfdt*" \
921 -not -iwholename "*libc*" \
922 -not -iwholename "*docs*" \
923 -not -iwholename "*.rst" \
924 -exec ${CHECKPATCH} ${CHECKCODE_ARGS} -f {} \; ; \
925 fi
926
927 checkpatch: locate-checkpatch
928 @echo " CHECKING STYLE"
929 @if test -n "${CHECKPATCH_OPTS}"; then \
930 echo " with ${CHECKPATCH_OPTS} option(s)"; \
931 fi
932 ${Q}COMMON_COMMIT=$$(git merge-base HEAD ${BASE_COMMIT}); \
933 for commit in `git rev-list $$COMMON_COMMIT..HEAD`; do \
934 printf "\n[*] Checking style of '$$commit'\n\n"; \
935 git log --format=email "$$commit~..$$commit" \
936 -- ${CHECK_PATHS} | \
937 ${CHECKPATCH} ${CHECKPATCH_OPTS} - || true; \
938 git diff --format=email "$$commit~..$$commit" \
939 -- ${CHECK_PATHS} | \
940 ${CHECKPATCH} ${CHECKPATCH_OPTS} - || true; \
941 done
942
943 certtool: ${CRTTOOL}
944
945 .PHONY: ${CRTTOOL}
946 ${CRTTOOL}:
947 ${Q}${MAKE} PLAT=${PLAT} USE_TBBR_DEFS=${USE_TBBR_DEFS} --no-print-directory -C ${CRTTOOLPATH}
948 @${ECHO_BLANK_LINE}
949 @echo "Built $@ successfully"
950 @${ECHO_BLANK_LINE}
951
952 ifneq (${GENERATE_COT},0)
953 certificates: ${CRT_DEPS} ${CRTTOOL}
954 ${Q}${CRTTOOL} ${CRT_ARGS}
955 @${ECHO_BLANK_LINE}
956 @echo "Built $@ successfully"
957 @echo "Certificates can be found in ${BUILD_PLAT}"
958 @${ECHO_BLANK_LINE}
959 endif
960
961 ${BUILD_PLAT}/${FIP_NAME}: ${FIP_DEPS} ${FIPTOOL}
962 ${Q}${FIPTOOL} create ${FIP_ARGS} $@
963 ${Q}${FIPTOOL} info $@
964 @${ECHO_BLANK_LINE}
965 @echo "Built $@ successfully"
966 @${ECHO_BLANK_LINE}
967
968 ifneq (${GENERATE_COT},0)
969 fwu_certificates: ${FWU_CRT_DEPS} ${CRTTOOL}
970 ${Q}${CRTTOOL} ${FWU_CRT_ARGS}
971 @${ECHO_BLANK_LINE}
972 @echo "Built $@ successfully"
973 @echo "FWU certificates can be found in ${BUILD_PLAT}"
974 @${ECHO_BLANK_LINE}
975 endif
976
977 ${BUILD_PLAT}/${FWU_FIP_NAME}: ${FWU_FIP_DEPS} ${FIPTOOL}
978 ${Q}${FIPTOOL} create ${FWU_FIP_ARGS} $@
979 ${Q}${FIPTOOL} info $@
980 @${ECHO_BLANK_LINE}
981 @echo "Built $@ successfully"
982 @${ECHO_BLANK_LINE}
983
984 fiptool: ${FIPTOOL}
985 fip: ${BUILD_PLAT}/${FIP_NAME}
986 fwu_fip: ${BUILD_PLAT}/${FWU_FIP_NAME}
987
988 .PHONY: ${FIPTOOL}
989 ${FIPTOOL}:
990 ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${FIPTOOLPATH}
991
992 sptool: ${SPTOOL}
993 .PHONY: ${SPTOOL}
994 ${SPTOOL}:
995 ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${SPTOOLPATH}
996
997 .PHONY: libraries
998 romlib.bin: libraries
999 ${Q}${MAKE} PLAT_DIR=${PLAT_DIR} BUILD_PLAT=${BUILD_PLAT} ENABLE_BTI=${ENABLE_BTI} ARM_ARCH_MINOR=${ARM_ARCH_MINOR} INCLUDES='${INCLUDES}' DEFINES='${DEFINES}' --no-print-directory -C ${ROMLIBPATH} all
1000
1001 cscope:
1002 @echo " CSCOPE"
1003 ${Q}find ${CURDIR} -name "*.[chsS]" > cscope.files
1004 ${Q}cscope -b -q -k
1005
1006 help:
1007 @echo "usage: ${MAKE} [PLAT=<platform>] [OPTIONS] [TARGET]"
1008 @echo ""
1009 @echo "PLAT is used to specify which platform you wish to build."
1010 @echo "If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}"
1011 @echo ""
1012 @echo "platform = ${PLATFORM_LIST}"
1013 @echo ""
1014 @echo "Please refer to the User Guide for a list of all supported options."
1015 @echo "Note that the build system doesn't track dependencies for build "
1016 @echo "options. Therefore, if any of the build options are changed "
1017 @echo "from a previous build, a clean build must be performed."
1018 @echo ""
1019 @echo "Supported Targets:"
1020 @echo " all Build all individual bootloader binaries"
1021 @echo " bl1 Build the BL1 binary"
1022 @echo " bl2 Build the BL2 binary"
1023 @echo " bl2u Build the BL2U binary"
1024 @echo " bl31 Build the BL31 binary"
1025 @echo " bl32 Build the BL32 binary. If ARCH=aarch32, then "
1026 @echo " this builds secure payload specified by AARCH32_SP"
1027 @echo " certificates Build the certificates (requires 'GENERATE_COT=1')"
1028 @echo " fip Build the Firmware Image Package (FIP)"
1029 @echo " fwu_fip Build the FWU Firmware Image Package (FIP)"
1030 @echo " checkcodebase Check the coding style of the entire source tree"
1031 @echo " checkpatch Check the coding style on changes in the current"
1032 @echo " branch against BASE_COMMIT (default origin/master)"
1033 @echo " clean Clean the build for the selected platform"
1034 @echo " cscope Generate cscope index"
1035 @echo " distclean Remove all build artifacts for all platforms"
1036 @echo " certtool Build the Certificate generation tool"
1037 @echo " fiptool Build the Firmware Image Package (FIP) creation tool"
1038 @echo " sptool Build the Secure Partition Package creation tool"
1039 @echo " dtbs Build the Device Tree Blobs (if required for the platform)"
1040 @echo ""
1041 @echo "Note: most build targets require PLAT to be set to a specific platform."
1042 @echo ""
1043 @echo "example: build all targets for the FVP platform:"
1044 @echo " CROSS_COMPILE=aarch64-none-elf- make PLAT=fvp all"