blob: a094afde9b808e5d6f54e40945438b0cf8a49c43 [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
6# Defaults.
7ARCH ?= aarch64
8PLAT ?= qemu
9DEBUG ?= 1
10NAME := hafnium
11
12OUT := $(ROOT_DIR)out/$(ARCH)/$(PLAT)
13
14all: $(OUT)/$(NAME).bin
15
16# Include platform-specific constants.
17include $(ROOT_DIR)src/arch/$(ARCH)/$(PLAT).mk
18
19define include_module
20 SRCS :=
21 OFFSET_SRCS :=
22 include $(ROOT_DIR)$(1)/rules.mk
23 GLOBAL_SRCS += $$(addprefix $(1)/,$$(SRCS))
24 GLOBAL_OFFSET_SRCS += $$(addprefix $(1)/,$$(OFFSET_SRCS))
25endef
26
27#
28# Include each module.
29#
30MODULES := src
31MODULES += src/arch/$(ARCH)
32GLOBAL_SRCS :=
33GLOBAL_OFFSET_SRCS :=
34$(foreach mod,$(MODULES),$(eval $(call include_module,$(mod))))
35
36CROSS_PREFIX := aarch64-linux-gnu-
37
38#
39# Rules to build C files.
40#
41COPTS = -mcpu=cortex-a57+nofp
42COPTS += -fno-stack-protector
43COPTS += -fno-builtin -ffreestanding
44COPTS += -g
45COPTS += -O2
46COPTS += -fpic
47COPTS += -std=c11
48COPTS += -Wall -Wpedantic -Werror
49COPTS += -DDEBUG=$(DEBUG)
50COPTS += -MMD -MP -MF $$(patsubst %,%.d,$$@)
51COPTS += -DMAX_CPUS=8
Wedson Almeida Filho87009642018-07-02 10:20:07 +010052COPTS += -DMAX_VMS=16
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010053COPTS += -DSTACK_SIZE=4096
54COPTS += -I$(ROOT_DIR)inc
55COPTS += -I$(ROOT_DIR)src/arch/$(ARCH)/inc
56COPTS += -I$(OUT)/arch/$(ARCH)/inc
57COPTS += -DGICD_BASE=$(GICD_BASE)
58COPTS += -DGICC_BASE=$(GICC_BASE)
59COPTS += -DGICR_BASE=$(GICR_BASE)
60COPTS += -DTIMER_IRQ=$(TIMER_IRQ)
61
62ifeq ($(PL011),1)
63 COPTS += -DPL011_BASE=$(PL011_BASE)
64endif
65
66ifeq ($(DEBUG),1)
67 COPTS += -DDEBUG
68endif
69
70define build_c
71 TGT := $(patsubst %.c,%.o,$(OUT)/$(patsubst src/%,%,$(1)))
72 GLOBAL_OBJS += $$(TGT)
73 REMAIN_SRCS := $$(filter-out $(1),$$(REMAIN_SRCS))
74$$(TGT): $(ROOT_DIR)$(1) | $$(dir $$(TGT))
75 $$(info CC $(ROOT_DIR)$1)
76 @$(CROSS_PREFIX)gcc $(COPTS) -c $(ROOT_DIR)$(1) -o $$@
77endef
78
79#
80# Rules to generate offsets.
81#
82define gen_offsets
83 TMP := $(patsubst src/%,%,$(1))
84 TMP := $$(dir $$(TMP))inc/$$(notdir $$(TMP))
85 TGT := $$(patsubst %.c,%.h,$(OUT)/$$(TMP))
86 GLOBAL_OFFSETS += $$(TGT)
87$$(TGT): $(ROOT_DIR)$(1) | $$(dir $$(TGT))
88 $$(info GENOFFSET $(ROOT_DIR)$1)
89 @$(CROSS_PREFIX)gcc $(COPTS) -MT $$@ -S -c $(ROOT_DIR)$(1) -o - | grep DEFINE_OFFSET | sed 's/\tDEFINE_OFFSET/#define/g' > $$@
90endef
91
92#
93# Rules to build S files.
94#
95define build_S
96 TGT := $(patsubst %.S,%.o,$(OUT)/$(patsubst src/%,%,$(1)))
97 GLOBAL_OBJS += $$(TGT)
98 REMAIN_SRCS := $$(filter-out $(1),$$(REMAIN_SRCS))
99$$(TGT): $(ROOT_DIR)$(1) $(GLOBAL_OFFSETS) | $$(dir $$(TGT))
100 $$(info AS $(ROOT_DIR)$1)
101 @$(CROSS_PREFIX)gcc $(COPTS) -c $(ROOT_DIR)$(1) -o $$@
102endef
103
104#
105# Generate the build rules for all .c and .S files.
106#
107GLOBAL_OBJS :=
108GLOBAL_OFFSETS :=
109REMAIN_SRCS := $(GLOBAL_SRCS)
110$(foreach file,$(filter %.c,$(GLOBAL_OFFSET_SRCS)),$(eval $(call gen_offsets,$(file))))
111$(foreach file,$(filter %.c,$(GLOBAL_SRCS)),$(eval $(call build_c,$(file))))
112$(foreach file,$(filter %.S,$(GLOBAL_SRCS)),$(eval $(call build_S,$(file))))
113
114#
115# Check if there are any source files which we don't know to handle.
116#
117ifneq ($(REMAIN_SRCS),)
118 $(error Don't know how to handle $(REMAIN_SRCS))
119endif
120
121#
122# Rule to create all output directories.
123#
124define create_dir
125$1:
126 @mkdir -p $1
127endef
128$(foreach name,$(sort $(dir $(GLOBAL_OBJS))),$(eval $(call create_dir,$(name))))
129$(foreach name,$(sort $(dir $(GLOBAL_OFFSETS))),$(eval $(call create_dir,$(name))))
130
131#
132# Rules to build the hypervisor.
133#
134$(OUT)/$(NAME): $(GLOBAL_OBJS) $(ROOT_DIR)src/$(NAME).ld
135 $(info LD $(ROOT_DIR)src/$(NAME).ld)
136 @$(CROSS_PREFIX)ld -g -pie $(GLOBAL_OBJS) -T$(ROOT_DIR)src/$(NAME).ld --defsym PREFERRED_LOAD_ADDRESS=$(LOAD_ADDRESS) -o $@
137
138$(OUT)/$(NAME).bin: $(OUT)/$(NAME)
139 $(info OBJCOPY $@)
140 @$(CROSS_PREFIX)objcopy -O binary $< $@
141
142clean:
143 rm -rf $(ROOT_DIR)out
144
145-include $(patsubst %,%.d,$(GLOBAL_OBJS),$(GLOBAL_OFFSETS))