blob: a41e0c83615579fe6faf2300b335953d43bbd98a [file] [log] [blame]
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01001ROOT_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
2ifeq ($(ROOT_DIR),./)
3 ROOT_DIR :=
4endif
5
Andrew Scull5e96ef72018-07-18 10:46:26 +01006#
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01007# Defaults.
Andrew Scull5e96ef72018-07-18 10:46:26 +01008#
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01009ARCH ?= aarch64
10PLAT ?= qemu
11DEBUG ?= 1
12NAME := hafnium
13
Andrew Scull5e96ef72018-07-18 10:46:26 +010014# Toolchain
15CROSS_COMPILE ?= aarch64-linux-gnu-
Andrew Scull7364a8e2018-07-19 15:39:29 +010016TARGET := $(patsubst %-,%,$(CROSS_COMPILE))
Andrew Scull5e96ef72018-07-18 10:46:26 +010017
18ifeq ($(CLANG),1)
19 CLANG := clang
20endif
21GCC ?= gcc
22
23ifdef CLANG
Andrew Scull7364a8e2018-07-19 15:39:29 +010024 CC := $(CLANG) -target $(TARGET)
Andrew Scull5e96ef72018-07-18 10:46:26 +010025else
26 CC := $(CROSS_COMPILE)$(GCC)
27endif
28
29# Output
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010030OUT := $(ROOT_DIR)out/$(ARCH)/$(PLAT)
31
32all: $(OUT)/$(NAME).bin
33
34# Include platform-specific constants.
35include $(ROOT_DIR)src/arch/$(ARCH)/$(PLAT).mk
36
37define include_module
38 SRCS :=
39 OFFSET_SRCS :=
40 include $(ROOT_DIR)$(1)/rules.mk
41 GLOBAL_SRCS += $$(addprefix $(1)/,$$(SRCS))
42 GLOBAL_OFFSET_SRCS += $$(addprefix $(1)/,$$(OFFSET_SRCS))
43endef
44
45#
46# Include each module.
47#
48MODULES := src
49MODULES += src/arch/$(ARCH)
50GLOBAL_SRCS :=
51GLOBAL_OFFSET_SRCS :=
52$(foreach mod,$(MODULES),$(eval $(call include_module,$(mod))))
53
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010054#
55# Rules to build C files.
56#
57COPTS = -mcpu=cortex-a57+nofp
58COPTS += -fno-stack-protector
59COPTS += -fno-builtin -ffreestanding
60COPTS += -g
61COPTS += -O2
62COPTS += -fpic
63COPTS += -std=c11
64COPTS += -Wall -Wpedantic -Werror
Andrew Scull87425072018-07-19 11:44:35 +010065COPTS += -Wno-extended-offsetof
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010066COPTS += -DDEBUG=$(DEBUG)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010067COPTS += -DMAX_CPUS=8
Wedson Almeida Filho87009642018-07-02 10:20:07 +010068COPTS += -DMAX_VMS=16
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010069COPTS += -DSTACK_SIZE=4096
70COPTS += -I$(ROOT_DIR)inc
71COPTS += -I$(ROOT_DIR)src/arch/$(ARCH)/inc
72COPTS += -I$(OUT)/arch/$(ARCH)/inc
73COPTS += -DGICD_BASE=$(GICD_BASE)
74COPTS += -DGICC_BASE=$(GICC_BASE)
75COPTS += -DGICR_BASE=$(GICR_BASE)
76COPTS += -DTIMER_IRQ=$(TIMER_IRQ)
77
78ifeq ($(PL011),1)
79 COPTS += -DPL011_BASE=$(PL011_BASE)
80endif
81
Andrew Scull7364a8e2018-07-19 15:39:29 +010082DEP_GEN = -MMD -MP -MF $$(patsubst %,%.d,$$@)
83
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010084define build_c
85 TGT := $(patsubst %.c,%.o,$(OUT)/$(patsubst src/%,%,$(1)))
86 GLOBAL_OBJS += $$(TGT)
87 REMAIN_SRCS := $$(filter-out $(1),$$(REMAIN_SRCS))
88$$(TGT): $(ROOT_DIR)$(1) | $$(dir $$(TGT))
89 $$(info CC $(ROOT_DIR)$1)
Andrew Scull7364a8e2018-07-19 15:39:29 +010090 @$(CC) $(COPTS) $(DEP_GEN) -c $(ROOT_DIR)$(1) -o $$@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010091endef
92
93#
94# Rules to generate offsets.
95#
96define gen_offsets
97 TMP := $(patsubst src/%,%,$(1))
98 TMP := $$(dir $$(TMP))inc/$$(notdir $$(TMP))
99 TGT := $$(patsubst %.c,%.h,$(OUT)/$$(TMP))
100 GLOBAL_OFFSETS += $$(TGT)
101$$(TGT): $(ROOT_DIR)$(1) | $$(dir $$(TGT))
102 $$(info GENOFFSET $(ROOT_DIR)$1)
Andrew Scull7364a8e2018-07-19 15:39:29 +0100103 @$(CC) $(COPTS) $(DEP_GEN) -MT $$@ -S -c $(ROOT_DIR)$(1) -o - | \
Andrew Scull87425072018-07-19 11:44:35 +0100104 grep ^DEFINE_OFFSET -A1 | \
105 grep -v ^--$ | \
Andrew Scull7364a8e2018-07-19 15:39:29 +0100106 sed 's/^DEFINE_OFFSET__\([^:]*\):/#define \1 \\/g' | \
107 sed 's/\.xword//g' > $$@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +0100108endef
109
110#
111# Rules to build S files.
112#
113define build_S
114 TGT := $(patsubst %.S,%.o,$(OUT)/$(patsubst src/%,%,$(1)))
115 GLOBAL_OBJS += $$(TGT)
116 REMAIN_SRCS := $$(filter-out $(1),$$(REMAIN_SRCS))
117$$(TGT): $(ROOT_DIR)$(1) $(GLOBAL_OFFSETS) | $$(dir $$(TGT))
118 $$(info AS $(ROOT_DIR)$1)
Andrew Scull7364a8e2018-07-19 15:39:29 +0100119 @$(CC) $(COPTS) $(DEP_GEN) -c $(ROOT_DIR)$(1) -o $$@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +0100120endef
121
122#
123# Generate the build rules for all .c and .S files.
124#
125GLOBAL_OBJS :=
126GLOBAL_OFFSETS :=
127REMAIN_SRCS := $(GLOBAL_SRCS)
128$(foreach file,$(filter %.c,$(GLOBAL_OFFSET_SRCS)),$(eval $(call gen_offsets,$(file))))
129$(foreach file,$(filter %.c,$(GLOBAL_SRCS)),$(eval $(call build_c,$(file))))
130$(foreach file,$(filter %.S,$(GLOBAL_SRCS)),$(eval $(call build_S,$(file))))
131
132#
133# Check if there are any source files which we don't know to handle.
134#
135ifneq ($(REMAIN_SRCS),)
136 $(error Don't know how to handle $(REMAIN_SRCS))
137endif
138
139#
140# Rule to create all output directories.
141#
142define create_dir
143$1:
144 @mkdir -p $1
145endef
146$(foreach name,$(sort $(dir $(GLOBAL_OBJS))),$(eval $(call create_dir,$(name))))
147$(foreach name,$(sort $(dir $(GLOBAL_OFFSETS))),$(eval $(call create_dir,$(name))))
148
149#
150# Rules to build the hypervisor.
151#
152$(OUT)/$(NAME): $(GLOBAL_OBJS) $(ROOT_DIR)src/$(NAME).ld
153 $(info LD $(ROOT_DIR)src/$(NAME).ld)
Wedson Almeida Filho049f1412018-07-17 23:54:51 +0100154 @$(CROSS_COMPILE)ld -g -pie $(GLOBAL_OBJS) -T$(ROOT_DIR)src/$(NAME).ld --defsym PREFERRED_LOAD_ADDRESS=$(LOAD_ADDRESS) -o $@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +0100155
156$(OUT)/$(NAME).bin: $(OUT)/$(NAME)
157 $(info OBJCOPY $@)
Wedson Almeida Filho049f1412018-07-17 23:54:51 +0100158 @$(CROSS_COMPILE)objcopy -O binary $< $@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +0100159
160clean:
161 rm -rf $(ROOT_DIR)out
162
Andrew Scull7364a8e2018-07-19 15:39:29 +0100163#
164# Rules for code health
165#
166
167# see .clang-format
Andrew Scull4f170f52018-07-19 12:58:20 +0100168format:
169 find $(ROOT_DIR)src/ -name *.c -o -name *.h | xargs clang-format -style file -i
170 find $(ROOT_DIR)inc/ -name *.c -o -name *.h | xargs clang-format -style file -i
171
Andrew Scull7364a8e2018-07-19 15:39:29 +0100172# see .clang-tidy
173tidy:
174 find $(ROOT_DIR)src/ -name *.c -exec clang-tidy {} -fix -- -target $(TARGET) $(COPTS) \;
175
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +0100176-include $(patsubst %,%.d,$(GLOBAL_OBJS),$(GLOBAL_OFFSETS))