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