blob: 7a0b08fd2059b548044219ee24d163b855547307 [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
Andrew Scull7ae61652018-07-12 16:14:14 +010036TARGET := aarch64-linux-gnu
37CROSS_PREFIX := $(TARGET)-
38
39ifeq ($(CLANG),1)
40 CC := clang -target $(TARGET)
41else
42 CC := $(CROSS_PREFIX)gcc
43endif
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010044
45#
46# Rules to build C files.
47#
48COPTS = -mcpu=cortex-a57+nofp
49COPTS += -fno-stack-protector
50COPTS += -fno-builtin -ffreestanding
51COPTS += -g
52COPTS += -O2
53COPTS += -fpic
54COPTS += -std=c11
55COPTS += -Wall -Wpedantic -Werror
56COPTS += -DDEBUG=$(DEBUG)
57COPTS += -MMD -MP -MF $$(patsubst %,%.d,$$@)
58COPTS += -DMAX_CPUS=8
Wedson Almeida Filho87009642018-07-02 10:20:07 +010059COPTS += -DMAX_VMS=16
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010060COPTS += -DSTACK_SIZE=4096
61COPTS += -I$(ROOT_DIR)inc
62COPTS += -I$(ROOT_DIR)src/arch/$(ARCH)/inc
63COPTS += -I$(OUT)/arch/$(ARCH)/inc
64COPTS += -DGICD_BASE=$(GICD_BASE)
65COPTS += -DGICC_BASE=$(GICC_BASE)
66COPTS += -DGICR_BASE=$(GICR_BASE)
67COPTS += -DTIMER_IRQ=$(TIMER_IRQ)
68
69ifeq ($(PL011),1)
70 COPTS += -DPL011_BASE=$(PL011_BASE)
71endif
72
73ifeq ($(DEBUG),1)
74 COPTS += -DDEBUG
75endif
76
77define build_c
78 TGT := $(patsubst %.c,%.o,$(OUT)/$(patsubst src/%,%,$(1)))
79 GLOBAL_OBJS += $$(TGT)
80 REMAIN_SRCS := $$(filter-out $(1),$$(REMAIN_SRCS))
81$$(TGT): $(ROOT_DIR)$(1) | $$(dir $$(TGT))
82 $$(info CC $(ROOT_DIR)$1)
Andrew Scull7ae61652018-07-12 16:14:14 +010083 @$(CC) $(COPTS) -c $(ROOT_DIR)$(1) -o $$@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010084endef
85
86#
87# Rules to generate offsets.
88#
89define gen_offsets
90 TMP := $(patsubst src/%,%,$(1))
91 TMP := $$(dir $$(TMP))inc/$$(notdir $$(TMP))
92 TGT := $$(patsubst %.c,%.h,$(OUT)/$$(TMP))
93 GLOBAL_OFFSETS += $$(TGT)
94$$(TGT): $(ROOT_DIR)$(1) | $$(dir $$(TGT))
95 $$(info GENOFFSET $(ROOT_DIR)$1)
Andrew Scull7ae61652018-07-12 16:14:14 +010096 @$(CC) $(COPTS) -MT $$@ -S -c $(ROOT_DIR)$(1) -o - | grep DEFINE_OFFSET | sed 's/\tDEFINE_OFFSET/#define/g' > $$@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010097endef
98
99#
100# Rules to build S files.
101#
102define build_S
103 TGT := $(patsubst %.S,%.o,$(OUT)/$(patsubst src/%,%,$(1)))
104 GLOBAL_OBJS += $$(TGT)
105 REMAIN_SRCS := $$(filter-out $(1),$$(REMAIN_SRCS))
106$$(TGT): $(ROOT_DIR)$(1) $(GLOBAL_OFFSETS) | $$(dir $$(TGT))
107 $$(info AS $(ROOT_DIR)$1)
Andrew Scull7ae61652018-07-12 16:14:14 +0100108 @$(CC) $(COPTS) -c $(ROOT_DIR)$(1) -o $$@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +0100109endef
110
111#
112# Generate the build rules for all .c and .S files.
113#
114GLOBAL_OBJS :=
115GLOBAL_OFFSETS :=
116REMAIN_SRCS := $(GLOBAL_SRCS)
117$(foreach file,$(filter %.c,$(GLOBAL_OFFSET_SRCS)),$(eval $(call gen_offsets,$(file))))
118$(foreach file,$(filter %.c,$(GLOBAL_SRCS)),$(eval $(call build_c,$(file))))
119$(foreach file,$(filter %.S,$(GLOBAL_SRCS)),$(eval $(call build_S,$(file))))
120
121#
122# Check if there are any source files which we don't know to handle.
123#
124ifneq ($(REMAIN_SRCS),)
125 $(error Don't know how to handle $(REMAIN_SRCS))
126endif
127
128#
129# Rule to create all output directories.
130#
131define create_dir
132$1:
133 @mkdir -p $1
134endef
135$(foreach name,$(sort $(dir $(GLOBAL_OBJS))),$(eval $(call create_dir,$(name))))
136$(foreach name,$(sort $(dir $(GLOBAL_OFFSETS))),$(eval $(call create_dir,$(name))))
137
138#
139# Rules to build the hypervisor.
140#
141$(OUT)/$(NAME): $(GLOBAL_OBJS) $(ROOT_DIR)src/$(NAME).ld
142 $(info LD $(ROOT_DIR)src/$(NAME).ld)
143 @$(CROSS_PREFIX)ld -g -pie $(GLOBAL_OBJS) -T$(ROOT_DIR)src/$(NAME).ld --defsym PREFERRED_LOAD_ADDRESS=$(LOAD_ADDRESS) -o $@
144
145$(OUT)/$(NAME).bin: $(OUT)/$(NAME)
146 $(info OBJCOPY $@)
147 @$(CROSS_PREFIX)objcopy -O binary $< $@
148
149clean:
150 rm -rf $(ROOT_DIR)out
151
152-include $(patsubst %,%.d,$(GLOBAL_OBJS),$(GLOBAL_OFFSETS))