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)/thread.c \
17	$(LOCAL_DIR)/spinlock.S \
18	$(LOCAL_DIR)/start.S \
19	$(LOCAL_DIR)/cache-ops.S \
20
21#	$(LOCAL_DIR)/arm/start.S \
22	$(LOCAL_DIR)/arm/cache.c \
23	$(LOCAL_DIR)/arm/ops.S \
24	$(LOCAL_DIR)/arm/faults.c \
25	$(LOCAL_DIR)/arm/dcc.S
26
27GLOBAL_DEFINES += \
28	ARCH_DEFAULT_STACK_SIZE=4096
29
30# if its requested we build with SMP, arm generically supports 4 cpus
31ifeq ($(WITH_SMP),1)
32SMP_MAX_CPUS ?= 4
33SMP_CPU_CLUSTER_SHIFT ?= 8
34SMP_CPU_ID_BITS ?= 24 # Ignore aff3 bits for now since they are not next to aff2
35
36GLOBAL_DEFINES += \
37    WITH_SMP=1 \
38    SMP_MAX_CPUS=$(SMP_MAX_CPUS) \
39    SMP_CPU_CLUSTER_SHIFT=$(SMP_CPU_CLUSTER_SHIFT) \
40    SMP_CPU_ID_BITS=$(SMP_CPU_ID_BITS)
41
42MODULE_SRCS += \
43    $(LOCAL_DIR)/mp.c
44else
45GLOBAL_DEFINES += \
46    SMP_MAX_CPUS=1
47endif
48
49ARCH_OPTFLAGS := -O2
50
51# we have a mmu and want the vmm/pmm
52WITH_KERNEL_VM ?= 1
53
54ifeq ($(WITH_KERNEL_VM),1)
55
56MODULE_SRCS += \
57	$(LOCAL_DIR)/mmu.c
58
59KERNEL_ASPACE_BASE ?= 0xffff000000000000
60KERNEL_ASPACE_SIZE ?= 0x0001000000000000
61USER_ASPACE_BASE   ?= 0x0000000001000000
62USER_ASPACE_SIZE   ?= 0x0000fffffe000000
63
64GLOBAL_DEFINES += \
65    KERNEL_ASPACE_BASE=$(KERNEL_ASPACE_BASE) \
66    KERNEL_ASPACE_SIZE=$(KERNEL_ASPACE_SIZE) \
67    USER_ASPACE_BASE=$(USER_ASPACE_BASE) \
68    USER_ASPACE_SIZE=$(USER_ASPACE_SIZE) \
69    ARCH_HAS_MMU=1
70
71KERNEL_BASE ?= $(KERNEL_ASPACE_BASE)
72KERNEL_LOAD_OFFSET ?= 0
73
74GLOBAL_DEFINES += \
75    KERNEL_BASE=$(KERNEL_BASE) \
76    KERNEL_LOAD_OFFSET=$(KERNEL_LOAD_OFFSET)
77
78else
79
80KERNEL_BASE ?= $(MEMBASE)
81KERNEL_LOAD_OFFSET ?= 0
82
83endif
84
85GLOBAL_DEFINES += \
86	MEMBASE=$(MEMBASE) \
87	MEMSIZE=$(MEMSIZE)
88
89# try to find the toolchain
90include $(LOCAL_DIR)/toolchain.mk
91TOOLCHAIN_PREFIX := $(ARCH_$(ARCH)_TOOLCHAIN_PREFIX)
92$(info TOOLCHAIN_PREFIX = $(TOOLCHAIN_PREFIX))
93
94ARCH_COMPILEFLAGS += $(ARCH_$(ARCH)_COMPILEFLAGS)
95ARCH_COMPILEFLAGS += -fno-omit-frame-pointer
96
97ARCH_LDFLAGS += -z max-page-size=4096
98
99LIBGCC := $(shell $(TOOLCHAIN_PREFIX)gcc $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) -print-libgcc-file-name)
100
101# make sure some bits were set up
102MEMVARS_SET := 0
103ifneq ($(MEMBASE),)
104MEMVARS_SET := 1
105endif
106ifneq ($(MEMSIZE),)
107MEMVARS_SET := 1
108endif
109ifeq ($(MEMVARS_SET),0)
110$(error missing MEMBASE or MEMSIZE variable, please set in target rules.mk)
111endif
112
113# potentially generated files that should be cleaned out with clean make rule
114GENERATED += \
115	$(BUILDDIR)/system-onesegment.ld
116
117# rules for generating the linker script
118$(BUILDDIR)/system-onesegment.ld: $(LOCAL_DIR)/system-onesegment.ld $(wildcard arch/*.ld) linkerscript.phony
119	@echo generating $@
120	@$(MKDIR)
121	$(NOECHO)sed "s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/;s/%KERNEL_BASE%/$(KERNEL_BASE)/;s/%KERNEL_LOAD_OFFSET%/$(KERNEL_LOAD_OFFSET)/" < $< > $@.tmp
122	@$(call TESTANDREPLACEFILE,$@.tmp,$@)
123
124linkerscript.phony:
125.PHONY: linkerscript.phony
126
127include make/module.mk
128