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