1LOCAL_DIR := $(GET_LOCAL_DIR) 2 3MODULE := $(LOCAL_DIR) 4 5GLOBAL_DEFINES += \ 6 ARM64_CPU_$(ARM_CPU)=1 \ 7 ARM_ISA_ARMV8=1 \ 8 IS_64BIT=1 9 10MODULE_SRCS += \ 11 $(LOCAL_DIR)/arch.c \ 12 $(LOCAL_DIR)/asm.S \ 13 $(LOCAL_DIR)/exceptions.S \ 14 $(LOCAL_DIR)/exceptions_c.c \ 15 $(LOCAL_DIR)/fpu.c \ 16 $(LOCAL_DIR)/memtag.c \ 17 $(LOCAL_DIR)/thread.c \ 18 $(LOCAL_DIR)/spinlock.S \ 19 $(LOCAL_DIR)/start.S \ 20 $(LOCAL_DIR)/cache-ops.S \ 21 $(LOCAL_DIR)/usercopy.S \ 22 $(LOCAL_DIR)/safecopy.S \ 23 $(LOCAL_DIR)/pan.c \ 24 $(LOCAL_DIR)/bti.c \ 25 $(LOCAL_DIR)/pac.c \ 26 $(LOCAL_DIR)/sve.c \ 27# $(LOCAL_DIR)/arm/start.S \ 28 $(LOCAL_DIR)/arm/cache.c \ 29 $(LOCAL_DIR)/arm/ops.S \ 30 $(LOCAL_DIR)/arm/faults.c \ 31 $(LOCAL_DIR)/arm/dcc.S 32 33MODULE_DEPS += \ 34 trusty/kernel/lib/trusty \ 35 36GLOBAL_DEFINES += \ 37 ARCH_DEFAULT_STACK_SIZE=4096 38 39ARCH_DEFAULT_SHADOW_STACK_SIZE := 4096 40ifeq (true,$(call TOBOOL,$(KERNEL_SCS_ENABLED))) 41GLOBAL_DEFINES += \ 42 ARCH_DEFAULT_SHADOW_STACK_SIZE=$(ARCH_DEFAULT_SHADOW_STACK_SIZE) 43endif 44 45# if its requested we build with SMP, arm generically supports 4 cpus 46ifeq ($(WITH_SMP),1) 47SMP_MAX_CPUS ?= 4 48SMP_CPU_CLUSTER_SHIFT ?= 8 49SMP_CPU_ID_BITS ?= 24 # Ignore aff3 bits for now since they are not next to aff2 50 51GLOBAL_DEFINES += \ 52 WITH_SMP=1 \ 53 SMP_MAX_CPUS=$(SMP_MAX_CPUS) \ 54 SMP_CPU_CLUSTER_SHIFT=$(SMP_CPU_CLUSTER_SHIFT) \ 55 SMP_CPU_ID_BITS=$(SMP_CPU_ID_BITS) 56 57MODULE_SRCS += \ 58 $(LOCAL_DIR)/mp.c 59else 60GLOBAL_DEFINES += \ 61 SMP_MAX_CPUS=1 62endif 63 64ifeq (false,$(call TOBOOL,$(ARM_WITHOUT_VFP_NEON))) 65# Enable optional instructions unless platform already disabled them 66USE_ARM_V7_NEON ?= true 67USE_ARM_V8_AES ?= true 68USE_ARM_V8_PMULL ?= true 69USE_ARM_V8_SHA1 ?= true 70USE_ARM_V8_SHA2 ?= true 71endif 72 73ARCH_OPTFLAGS := -O2 74 75# Set ARM64_BOOT_PROTOCOL to X0_MEMSIZE for platforms that pass the memory 76# size in x0 or to X0_DTB for platforms that pass a device tree in x0. 77ARM64_BOOT_PROTOCOL ?= X0_MEMSIZE 78GLOBAL_DEFINES += ARM64_BOOT_PROTOCOL_$(ARM64_BOOT_PROTOCOL)=1 79ARM64_BOOT_PROTOCOLS = X0_MEMSIZE X0_DTB 80 81ifneq ($(filter-out $(ARM64_BOOT_PROTOCOLS),$(ARM64_BOOT_PROTOCOL)),) 82$(error unrecognized ARM64_BOOT_PROTOCOL, $(ARM64_BOOT_PROTOCOL), not in [$(ARM64_BOOT_PROTOCOLS)]) 83endif 84 85ifeq (X0_DTB,$(ARM64_BOOT_PROTOCOL)) 86MODULE_DEPS += \ 87 $(LKROOT)/lib/device_tree \ 88 89endif 90 91# Set ARM_MERGE_FIQ_IRQ to remove separation between IRQs and FIQs. This is 92# for GICv3 or GICv4 when running in trustzone as the non-secure interrupts 93# will be delivered as FIQs instead of IRQs. 94ARM_MERGE_FIQ_IRQ ?= false 95 96ifeq (true,$(call TOBOOL,$(ARM_MERGE_FIQ_IRQ))) 97GLOBAL_DEFINES += ARM_MERGE_FIQ_IRQ=1 98endif 99 100 101# Declare ARM64 architecture has FIQ 102GLOBAL_DEFINES += ARCH_HAS_FIQ=1 103 104# we have a mmu and want the vmm/pmm 105WITH_KERNEL_VM ?= 1 106 107ifeq ($(WITH_KERNEL_VM),1) 108 109MODULE_SRCS += \ 110 $(LOCAL_DIR)/early_mmu.c \ 111 $(LOCAL_DIR)/mmu.c 112 113KERNEL_ASPACE_BASE ?= 0xffff000000000000 114KERNEL_ASPACE_SIZE ?= 0x0001000000000000 115USER_ASPACE_BASE ?= 0x0000000001000000 116USER_ASPACE_SIZE ?= 0x0000fffffe000000 117 118GLOBAL_DEFINES += \ 119 KERNEL_ASPACE_BASE=$(KERNEL_ASPACE_BASE) \ 120 KERNEL_ASPACE_SIZE=$(KERNEL_ASPACE_SIZE) \ 121 USER_ASPACE_BASE=$(USER_ASPACE_BASE) \ 122 USER_ASPACE_SIZE=$(USER_ASPACE_SIZE) 123 124KERNEL_BASE ?= $(KERNEL_ASPACE_BASE) 125KERNEL_LOAD_OFFSET ?= 0 126 127GLOBAL_DEFINES += \ 128 KERNEL_BASE=$(KERNEL_BASE) \ 129 KERNEL_LOAD_OFFSET=$(KERNEL_LOAD_OFFSET) 130 131# we need the kernel to be PIE since we're relocating it 132PIE_KERNEL ?= true 133 134else 135 136KERNEL_BASE ?= $(MEMBASE) 137KERNEL_LOAD_OFFSET ?= 0 138 139endif 140 141GLOBAL_DEFINES += \ 142 MEMBASE=$(MEMBASE) \ 143 MEMSIZE=$(MEMSIZE) 144 145# try to find the toolchain 146include $(LOCAL_DIR)/toolchain.mk 147TOOLCHAIN_PREFIX := $(ARCH_$(ARCH)_TOOLCHAIN_PREFIX) 148$(info TOOLCHAIN_PREFIX = $(TOOLCHAIN_PREFIX)) 149 150ARCH_COMPILEFLAGS += $(ARCH_$(ARCH)_COMPILEFLAGS) 151 152GLOBAL_LDFLAGS += -z max-page-size=4096 153 154 155# make sure some bits were set up 156MEMVARS_SET := 0 157ifneq ($(MEMBASE),) 158MEMVARS_SET := 1 159endif 160ifneq ($(MEMSIZE),) 161MEMVARS_SET := 1 162endif 163ifeq ($(MEMVARS_SET),0) 164$(error missing MEMBASE or MEMSIZE variable, please set in target rules.mk) 165endif 166 167# potentially generated files that should be cleaned out with clean make rule 168GENERATED += \ 169 $(BUILDDIR)/system-onesegment.ld 170 171# rules for generating the linker script 172$(BUILDDIR)/system-onesegment.ld: $(LOCAL_DIR)/system-onesegment.ld $(wildcard arch/*.ld) linkerscript.phony 173 @echo generating $@ 174 @$(MKDIR) 175 $(NOECHO)sed "s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/;s/%KERNEL_BASE%/$(KERNEL_BASE)/;s/%KERNEL_LOAD_OFFSET%/$(KERNEL_LOAD_OFFSET)/" < $< > $@.tmp 176 @$(call TESTANDREPLACEFILE,$@.tmp,$@) 177 178linkerscript.phony: 179.PHONY: linkerscript.phony 180 181include make/module.mk 182