1LOCAL_DIR := $(GET_LOCAL_DIR) 2 3MODULE := $(LOCAL_DIR) 4 5# can override this in local.mk 6ENABLE_THUMB?=true 7 8# default to the regular arm subarch 9SUBARCH := arm 10 11GLOBAL_DEFINES += \ 12 ARM_CPU_$(ARM_CPU)=1 13 14# do set some options based on the cpu core 15HANDLED_CORE := false 16ifeq ($(ARM_CPU),cortex-a7) 17GLOBAL_DEFINES += \ 18 ARM_WITH_CP15=1 \ 19 ARM_WITH_MMU=1 \ 20 ARM_ISA_ARMv7=1 \ 21 ARM_ISA_ARMv7A=1 \ 22 ARM_WITH_VFP=1 \ 23 ARM_WITH_NEON=1 \ 24 ARM_WITH_THUMB=1 \ 25 ARM_WITH_THUMB2=1 \ 26 ARM_WITH_CACHE=1 27HANDLED_CORE := true 28endif 29ifeq ($(ARM_CPU),cortex-a15) 30GLOBAL_DEFINES += \ 31 ARM_WITH_CP15=1 \ 32 ARM_WITH_MMU=1 \ 33 ARM_ISA_ARMv7=1 \ 34 ARM_ISA_ARMv7A=1 \ 35 ARM_WITH_THUMB=1 \ 36 ARM_WITH_THUMB2=1 \ 37 ARM_WITH_CACHE=1 \ 38 ARM_WITH_L2=1 39ifneq ($(ARM_WITHOUT_VFP_NEON),true) 40GLOBAL_DEFINES += \ 41 ARM_WITH_VFP=1 \ 42 ARM_WITH_NEON=1 43endif 44HANDLED_CORE := true 45endif 46ifeq ($(ARM_CPU),armv8-a) 47GLOBAL_DEFINES += \ 48 ARM_CPU_CORTEX_ARMV8_A=1 \ 49 ARM_WITH_CP15=1 \ 50 ARM_WITH_MMU=1 \ 51 ARM_ISA_ARMv7=1 \ 52 ARM_ISA_ARMv7A=1 \ 53 ARM_WITH_THUMB=1 \ 54 ARM_WITH_THUMB2=1 \ 55 ARM_WITH_CACHE=1 \ 56 ARM_WITH_L2=1 57ifneq ($(ARM_WITHOUT_VFP_NEON),true) 58GLOBAL_DEFINES += \ 59 ARM_WITH_VFP=1 \ 60 ARM_WITH_NEON=1 61 62# Enable optional instructions unless platform already disabled them 63USE_ARM_V7_NEON ?= true 64USE_ARM_V8_AES ?= true 65USE_ARM_V8_PMULL ?= true 66USE_ARM_V8_SHA1 ?= true 67USE_ARM_V8_SHA2 ?= true 68endif 69HANDLED_CORE := true 70endif 71 72ifneq ($(HANDLED_CORE),true) 73$(error $(LOCAL_DIR)/rules.mk doesnt have logic for arm core $(ARM_CPU)) 74endif 75 76THUMBCFLAGS := 77THUMBINTERWORK := 78ifeq ($(ENABLE_THUMB),true) 79THUMBCFLAGS := -mthumb -D__thumb__ 80endif 81 82GLOBAL_INCLUDES += \ 83 $(LOCAL_DIR)/$(SUBARCH)/include 84 85ifeq ($(SUBARCH),arm) 86MODULE_SRCS += \ 87 $(LOCAL_DIR)/arm/start.S \ 88 $(LOCAL_DIR)/arm/asm.S \ 89 $(LOCAL_DIR)/arm/cache-ops.S \ 90 $(LOCAL_DIR)/arm/cache.c \ 91 $(LOCAL_DIR)/arm/debug.c \ 92 $(LOCAL_DIR)/arm/ops.S \ 93 $(LOCAL_DIR)/arm/exceptions.S \ 94 $(LOCAL_DIR)/arm/usercopy.S \ 95 $(LOCAL_DIR)/arm/faults.c \ 96 $(LOCAL_DIR)/arm/fpu.c \ 97 $(LOCAL_DIR)/arm/mmu.c \ 98 $(LOCAL_DIR)/arm/thread.c 99 100MODULE_ARM_OVERRIDE_SRCS := \ 101 $(LOCAL_DIR)/arm/arch.c 102 103GLOBAL_DEFINES += \ 104 ARCH_DEFAULT_STACK_SIZE=4096 105 106MODULE_DEPS += \ 107 trusty/kernel/lib/trusty \ 108 109ARCH_OPTFLAGS := -O2 110WITH_LINKER_GC ?= 1 111 112# Set ARM_MERGE_FIQ_IRQ to remove separation between IRQs and FIQs. This is 113# for GICv3 or GICv4 when running in trustzone as the non-secure interrupts 114# will be delivered as FIQs instead of IRQs. 115ARM_MERGE_FIQ_IRQ ?= false 116 117ifeq (true,$(call TOBOOL,$(ARM_MERGE_FIQ_IRQ))) 118GLOBAL_DEFINES += ARM_MERGE_FIQ_IRQ=1 119endif 120 121# Declare ARM architecture has FIQ 122GLOBAL_DEFINES += ARCH_HAS_FIQ=1 123 124# we have a mmu and want the vmm/pmm 125WITH_KERNEL_VM ?= 1 126 127KERNEL_ASPACE_BASE ?= 0x40000000 128KERNEL_ASPACE_SIZE ?= 0xc0000000 129USER_ASPACE_BASE ?= 0x00001000 130USER_ASPACE_SIZE ?= 0x3fffe000 131 132# for arm, have the kernel occupy the entire top 3GB of virtual space, 133# but put the kernel itself at 0x80000000. 134# this leaves 0x40000000 - 0x80000000 open for kernel space to use. 135GLOBAL_DEFINES += \ 136 KERNEL_ASPACE_BASE=$(KERNEL_ASPACE_BASE) \ 137 KERNEL_ASPACE_SIZE=$(KERNEL_ASPACE_SIZE) \ 138 USER_ASPACE_BASE=$(USER_ASPACE_BASE) \ 139 USER_ASPACE_SIZE=$(USER_ASPACE_SIZE) 140 141KERNEL_BASE ?= 0x80000000 142KERNEL_LOAD_OFFSET ?= 0 143 144GLOBAL_DEFINES += \ 145 KERNEL_BASE=$(KERNEL_BASE) \ 146 KERNEL_LOAD_OFFSET=$(KERNEL_LOAD_OFFSET) 147 148# if its requested we build with SMP, arm generically supports 4 cpus 149ifeq ($(WITH_SMP),1) 150SMP_MAX_CPUS ?= 4 151SMP_CPU_CLUSTER_SHIFT ?= 8 152SMP_CPU_ID_BITS ?= 24 153 154GLOBAL_DEFINES += \ 155 WITH_SMP=1 \ 156 SMP_MAX_CPUS=$(SMP_MAX_CPUS) \ 157 SMP_CPU_CLUSTER_SHIFT=$(SMP_CPU_CLUSTER_SHIFT) \ 158 SMP_CPU_ID_BITS=$(SMP_CPU_ID_BITS) 159 160MODULE_SRCS += \ 161 $(LOCAL_DIR)/arm/mp.c 162else 163GLOBAL_DEFINES += \ 164 SMP_MAX_CPUS=1 165endif 166 167ifeq (true,$(call TOBOOL,$(WITH_NS_MAPPING))) 168GLOBAL_DEFINES += \ 169 WITH_ARCH_MMU_PICK_SPOT=1 170endif 171 172endif 173ifeq ($(SUBARCH),arm-m) 174MODULE_SRCS += \ 175 $(LOCAL_DIR)/arm-m/arch.c \ 176 $(LOCAL_DIR)/arm-m/cache.c \ 177 $(LOCAL_DIR)/arm-m/exceptions.c \ 178 $(LOCAL_DIR)/arm-m/start.c \ 179 $(LOCAL_DIR)/arm-m/spin_cycles.c \ 180 $(LOCAL_DIR)/arm-m/thread.c \ 181 $(LOCAL_DIR)/arm-m/vectab.c 182 183# we're building for small binaries 184GLOBAL_DEFINES += \ 185 ARM_ONLY_THUMB=1 \ 186 ARCH_DEFAULT_STACK_SIZE=1024 \ 187 SMP_MAX_CPUS=1 188 189MODULE_DEPS += \ 190 arch/arm/arm-m/CMSIS 191 192ARCH_OPTFLAGS := -Os 193WITH_LINKER_GC ?= 1 194endif 195 196# try to find toolchain 197include $(LOCAL_DIR)/toolchain.mk 198TOOLCHAIN_PREFIX := $(ARCH_$(ARCH)_TOOLCHAIN_PREFIX) 199$(info TOOLCHAIN_PREFIX = $(TOOLCHAIN_PREFIX)) 200 201ARCH_COMPILEFLAGS += $(ARCH_$(ARCH)_COMPILEFLAGS) 202 203 204# set the max page size to something more reasonables (defaults to 64K or above) 205GLOBAL_LDFLAGS += -z max-page-size=4096 206 207$(info GLOBAL_COMPILEFLAGS = $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) $(THUMBCFLAGS)) 208 209# make sure some bits were set up 210MEMVARS_SET := 0 211ifneq ($(MEMBASE),) 212MEMVARS_SET := 1 213endif 214ifneq ($(MEMSIZE),) 215MEMVARS_SET := 1 216endif 217ifeq ($(MEMVARS_SET),0) 218$(error missing MEMBASE or MEMSIZE variable, please set in target rules.mk) 219endif 220 221GLOBAL_DEFINES += \ 222 MEMBASE=$(MEMBASE) \ 223 MEMSIZE=$(MEMSIZE) 224 225# potentially generated files that should be cleaned out with clean make rule 226GENERATED += \ 227 $(BUILDDIR)/system-onesegment.ld \ 228 $(BUILDDIR)/system-twosegment.ld 229 230# rules for generating the linker scripts 231$(BUILDDIR)/system-onesegment.ld: $(LOCAL_DIR)/system-onesegment.ld $(wildcard arch/*.ld) linkerscript.phony 232 @echo generating $@ 233 @$(MKDIR) 234 $(NOECHO)sed "s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/;s/%KERNEL_BASE%/$(KERNEL_BASE)/;s/%KERNEL_LOAD_OFFSET%/$(KERNEL_LOAD_OFFSET)/" < $< > $@.tmp 235 @$(call TESTANDREPLACEFILE,$@.tmp,$@) 236 237$(BUILDDIR)/system-twosegment.ld: $(LOCAL_DIR)/system-twosegment.ld $(wildcard arch/*.ld) linkerscript.phony 238 @echo generating $@ 239 @$(MKDIR) 240 $(NOECHO)sed "s/%ROMBASE%/$(ROMBASE)/;s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/" < $< > $@.tmp 241 @$(call TESTANDREPLACEFILE,$@.tmp,$@) 242 243linkerscript.phony: 244.PHONY: linkerscript.phony 245 246# arm specific script to try to guess stack usage 247$(OUTELF).stack: LOCAL_DIR:=$(LOCAL_DIR) 248$(OUTELF).stack: $(OUTELF) 249 $(NOECHO)echo generating stack usage $@ 250 $(NOECHO)$(OBJDUMP) -Mreg-names-raw -d $< | $(LOCAL_DIR)/stackusage | $(CPPFILT) | sort -n -k 1 -r > $@ 251 252EXTRA_BUILDDEPS += $(OUTELF).stack 253GENERATED += $(OUTELF).stack 254 255include make/module.mk 256