1#
2# acrn-hypervisor/hypervisor/Makefile
3#
4
5API_MAJOR_VERSION=1
6API_MINOR_VERSION=0
7
8GCC_MAJOR=$(shell echo __GNUC__ | $(CC) -E -x c - | tail -n 1)
9GCC_MINOR=$(shell echo __GNUC_MINOR__ | $(CC) -E -x c - | tail -n 1)
10
11#enable stack overflow check
12STACK_PROTECTOR := 1
13
14ASL_COMPILER ?= $(shell which iasl)
15IASL_MIN_VER ?= "20190703"
16BASEDIR := $(shell pwd)
17HV_OBJDIR ?= $(CURDIR)/build
18HV_MODDIR ?= $(HV_OBJDIR)/modules
19HV_FILE := acrn
20
21LIB_MOD = $(HV_MODDIR)/lib_mod.a
22BOOT_MOD = $(HV_MODDIR)/boot_mod.a
23HW_MOD = $(HV_MODDIR)/hw_mod.a
24VP_BASE_MOD = $(HV_MODDIR)/vp_base_mod.a
25VP_DM_MOD = $(HV_MODDIR)/vp_dm_mod.a
26VP_TRUSTY_MOD = $(HV_MODDIR)/vp_trusty_mod.a
27VP_X86_TEE_MOD = $(HV_MODDIR)/vp_x86_tee_mod.a
28VP_HCALL_MOD = $(HV_MODDIR)/vp_hcall_mod.a
29LIB_DEBUG = $(HV_MODDIR)/libdebug.a
30LIB_RELEASE = $(HV_MODDIR)/librelease.a
31SYS_INIT_MOD = $(HV_MODDIR)/sys_init_mod.a
32
33# initialize the flags we used
34CFLAGS :=
35ASFLAGS :=
36LDFLAGS :=
37ARFLAGS :=
38ARCH_CFLAGS :=
39ARCH_ASFLAGS :=
40ARCH_ARFLAGS :=
41ARCH_LDFLAGS :=
42
43include scripts/makefile/config.mk
44
45BOARD_INFO_DIR := $(HV_CONFIG_DIR)/boards
46SCENARIO_CFG_DIR := $(HV_CONFIG_DIR)/scenarios/$(SCENARIO)
47BOARD_CFG_DIR := $(SCENARIO_CFG_DIR)
48
49include ../paths.make
50
51LD_IN_TOOL = scripts/genld.sh
52BASH = $(shell which bash)
53
54ARFLAGS += crs
55
56CFLAGS += -Wall -W
57CFLAGS += -ffunction-sections -fdata-sections
58CFLAGS += -fshort-wchar -ffreestanding
59CFLAGS += -fsigned-char
60CFLAGS += -m64 -mno-mmx -mno-sse -mno-sse2 -mno-80387 -mno-fp-ret-in-387
61CFLAGS += -mno-red-zone -mpopcnt
62CFLAGS += -nostdinc -nostdlib -fno-common
63CFLAGS += -Werror
64
65# ACRN depends on zero length array. Silence the gcc if Warrary-bounds is default option
66CFLAGS += -Wno-array-bounds
67CFLAGS += -O2
68ifeq (y, $(CONFIG_RELOC))
69CFLAGS += -fpie
70else
71CFLAGS += -static
72endif
73
74
75ifdef STACK_PROTECTOR
76ifeq (true, $(shell [ $(GCC_MAJOR) -gt 4 ] && echo true))
77CFLAGS += -fstack-protector-strong
78else
79ifeq (true, $(shell [ $(GCC_MAJOR) -eq 4 ] && [ $(GCC_MINOR) -ge 9 ] && echo true))
80CFLAGS += -fstack-protector-strong
81else
82CFLAGS += -fstack-protector
83endif
84endif
85CFLAGS += -DSTACK_PROTECTOR
86endif
87
88# In case using Ubuntu 19.10 as build environment, its gcc has -fcf-protection enabled
89# by default. But this option is not compatible with -mindirect-branch:
90#   https://bugs.launchpad.net/ubuntu/+source/gcc-9/+bug/1830961
91#
92# We disable the -fcf-protection in ACRN build.
93ifeq (true, $(shell [ $(GCC_MAJOR) -gt 8 ] && echo true))
94CFLAGS += -fcf-protection=none
95endif
96
97ASFLAGS += -m64 -nostdinc -nostdlib
98ifeq (y, $(CONFIG_MULTIBOOT2))
99ASFLAGS += -DCONFIG_MULTIBOOT2
100endif
101
102ifeq (y, $(CONFIG_RELOC))
103ASFLAGS += -DCONFIG_RELOC
104endif
105
106LDFLAGS += -Wl,--gc-sections -nostartfiles -nostdlib
107LDFLAGS += -Wl,-n,-z,max-page-size=0x1000
108LDFLAGS += -Wl,--no-dynamic-linker
109
110ifeq (y, $(CONFIG_RELOC))
111# on X86_64, when build with "-pie", GCC fails on linking R_X86_64_32
112# relocations with "recompile with fPIC" error, because it may cause
113# run-time relocation overflow if it runs at address above 4GB.
114# We know it's safe because Hypervisor runs under 4GB. "noreloc-overflow"
115# is used to avoid the compile error
116LDFLAGS += -pie -z noreloc-overflow
117else
118LDFLAGS += -static
119endif
120
121ifeq (y, $(CONFIG_RELEASE))
122LDFLAGS += -s
123endif
124
125ARCH_CFLAGS += -gdwarf-2
126ARCH_ASFLAGS += -gdwarf-2 -DASSEMBLER=1
127ARCH_ARFLAGS +=
128ARCH_LDFLAGS +=
129
130ARCH_LDSCRIPT = $(HV_OBJDIR)/link_ram.ld
131ARCH_LDSCRIPT_IN = bsp/ld/link_ram.ld.in
132
133REL_INCLUDE_PATH += include
134REL_INCLUDE_PATH += include/lib
135REL_INCLUDE_PATH += include/lib/crypto
136REL_INCLUDE_PATH += include/common
137REL_INCLUDE_PATH += include/debug
138REL_INCLUDE_PATH += include/public
139REL_INCLUDE_PATH += include/dm
140REL_INCLUDE_PATH += include/hw
141REL_INCLUDE_PATH += boot/include
142REL_INCLUDE_PATH += boot/include/guest
143
144# TODO: ARCH name should come from generated config.mk.
145# Fixed to x86 for now.
146ARCH := x86
147REL_INCLUDE_PATH += include/arch/$(ARCH)
148
149INCLUDE_PATH := $(realpath $(REL_INCLUDE_PATH))
150INCLUDE_PATH += $(HV_OBJDIR)/include
151INCLUDE_PATH += $(BOARD_INFO_DIR)
152INCLUDE_PATH += $(BOARD_CFG_DIR)
153INCLUDE_PATH += $(SCENARIO_CFG_DIR)
154
155CC ?= gcc
156AS ?= as
157AR ?= ar
158LD ?= ld
159OBJCOPY ?= objcopy
160
161export CC AS AR LD OBJCOPY
162export CFLAGS ASFLAGS ARFLAGS LDFLAGS ARCH_CFLAGS ARCH_ASFLAGS ARCH_ARFLAGS ARCH_LDFLAGS
163export HV_OBJDIR HV_MODDIR CONFIG_RELEASE INCLUDE_PATH
164export LIB_DEBUG LIB_RELEASE
165
166# library componment
167LIB_C_SRCS += lib/string.c
168LIB_C_SRCS += lib/crypto/crypto_api.c
169LIB_C_SRCS += lib/crypto/mbedtls/hkdf.c
170LIB_C_SRCS += lib/crypto/mbedtls/sha256.c
171LIB_C_SRCS += lib/crypto/mbedtls/md.c
172LIB_C_SRCS += lib/crypto/mbedtls/md_wrap.c
173LIB_C_SRCS += lib/sprintf.c
174LIB_C_SRCS += arch/x86/lib/memory.c
175ifdef STACK_PROTECTOR
176LIB_C_SRCS += lib/stack_protector.c
177endif
178# retpoline support
179ifeq (true, $(shell [ $(GCC_MAJOR) -eq 7 ] && [ $(GCC_MINOR) -ge 3 ] && echo true))
180CFLAGS += -mindirect-branch=thunk-extern -mindirect-branch-register
181CFLAGS += -DCONFIG_RETPOLINE
182LIB_S_SRCS += arch/x86/lib/retpoline-thunk.S
183else
184ifeq (true, $(shell [ $(GCC_MAJOR) -ge 8 ] && echo true))
185CFLAGS += -mindirect-branch=thunk-extern -mindirect-branch-register
186CFLAGS += -DCONFIG_RETPOLINE
187LIB_S_SRCS += arch/x86/lib/retpoline-thunk.S
188endif
189endif
190
191# platform boot component
192BOOT_S_SRCS += arch/x86/boot/cpu_primary.S
193BOOT_S_SRCS += arch/x86/boot/trampoline.S
194BOOT_C_SRCS += boot/boot.c
195BOOT_C_SRCS += boot/multiboot/multiboot.c
196ifeq ($(CONFIG_MULTIBOOT2),y)
197BOOT_C_SRCS += boot/multiboot/multiboot2.c
198endif
199BOOT_C_SRCS += boot/reloc.c
200BOOT_C_SRCS += arch/x86/rtcm.c
201
202# hardware management component
203HW_S_SRCS += arch/x86/idt.S
204HW_C_SRCS += arch/x86/ioapic.c
205HW_C_SRCS += arch/x86/lapic.c
206HW_C_SRCS += arch/x86/cpu.c
207HW_C_SRCS += arch/x86/cpu_caps.c
208HW_C_SRCS += arch/x86/platform_caps.c
209HW_C_SRCS += arch/x86/security.c
210HW_C_SRCS += arch/x86/mmu.c
211HW_C_SRCS += arch/x86/e820.c
212HW_C_SRCS += arch/x86/pagetable.c
213HW_C_SRCS += arch/x86/page.c
214HW_C_SRCS += arch/x86/notify.c
215HW_C_SRCS += arch/x86/vtd.c
216HW_C_SRCS += arch/x86/gdt.c
217HW_C_SRCS += arch/x86/nmi.c
218HW_C_SRCS += arch/x86/exception.c
219HW_C_SRCS += arch/x86/irq.c
220HW_C_SRCS += arch/x86/tsc.c
221HW_C_SRCS += arch/x86/tsc_deadline_timer.c
222HW_C_SRCS += arch/x86/hw_thermal.c
223HW_C_SRCS += arch/x86/vmx.c
224HW_C_SRCS += arch/x86/cpu_state_tbl.c
225HW_C_SRCS += arch/x86/pm.c
226HW_S_SRCS += arch/x86/wakeup.S
227HW_C_SRCS += arch/x86/trampoline.c
228HW_S_SRCS += arch/x86/sched.S
229HW_C_SRCS += arch/x86/rdt.c
230HW_C_SRCS += arch/x86/sgx.c
231HW_C_SRCS += common/ticks.c
232HW_C_SRCS += common/delay.c
233HW_C_SRCS += common/timer.c
234HW_C_SRCS += common/thermal.c
235HW_C_SRCS += common/irq.c
236HW_C_SRCS += common/softirq.c
237HW_C_SRCS += common/schedule.c
238HW_C_SRCS += common/event.c
239HW_C_SRCS += common/efi_mmap.c
240HW_C_SRCS += common/sbuf.c
241HW_C_SRCS += common/vm_event.c
242ifeq ($(CONFIG_SCHED_NOOP),y)
243HW_C_SRCS += common/sched_noop.c
244endif
245ifeq ($(CONFIG_SCHED_IORR),y)
246HW_C_SRCS += common/sched_iorr.c
247endif
248ifeq ($(CONFIG_SCHED_BVT),y)
249HW_C_SRCS += common/sched_bvt.c
250endif
251ifeq ($(CONFIG_SCHED_PRIO),y)
252HW_C_SRCS += common/sched_prio.c
253endif
254HW_C_SRCS += hw/pci.c
255HW_C_SRCS += arch/x86/configs/vm_config.c
256HW_C_SRCS += boot/acpi_base.c
257# ACPI parsing component
258# This part should be isolated from FuSa Cert
259ifeq ($(CONFIG_ACPI_PARSE_ENABLED),y)
260HW_C_SRCS += acpi_parser/dmar_parse.c
261HW_C_SRCS += acpi_parser/acpi_ext.c
262endif
263
264# VM Configuration
265VM_CFG_C_SRCS += $(BOARD_INFO_DIR)/board.c
266VM_CFG_C_SRCS += $(SCENARIO_CFG_DIR)/vm_configurations.c
267VM_CFG_C_SRCS += $(BOARD_CFG_DIR)/pt_intx.c
268VM_CFG_C_SRCS += $(BOARD_CFG_DIR)/pci_dev.c
269
270# virtual platform base component
271VP_BASE_C_SRCS += arch/x86/guest/vcpuid.c
272VP_BASE_C_SRCS += arch/x86/guest/vcpu.c
273VP_BASE_C_SRCS += arch/x86/guest/vm.c
274VP_BASE_C_SRCS += arch/x86/guest/vmtrr.c
275VP_BASE_C_SRCS += arch/x86/guest/guest_memory.c
276VP_BASE_C_SRCS += arch/x86/guest/vmsr.c
277VP_BASE_S_SRCS += arch/x86/guest/vmx_asm.S
278VP_BASE_C_SRCS += arch/x86/guest/vmcs.c
279VP_BASE_C_SRCS += arch/x86/guest/virq.c
280VP_BASE_C_SRCS += arch/x86/guest/virtual_cr.c
281VP_BASE_C_SRCS += arch/x86/guest/vmexit.c
282VP_BASE_C_SRCS += arch/x86/guest/ept.c
283VP_BASE_C_SRCS += arch/x86/guest/ve820.c
284VP_BASE_C_SRCS += arch/x86/guest/ucode.c
285ifeq ($(CONFIG_HYPERV_ENABLED),y)
286VP_BASE_C_SRCS += arch/x86/guest/hyperv.c
287endif
288ifeq ($(CONFIG_NVMX_ENABLED),y)
289VP_BASE_C_SRCS += arch/x86/guest/nested.c
290VP_BASE_C_SRCS += arch/x86/guest/vept.c
291endif
292VP_BASE_C_SRCS += boot/guest/vboot_info.c
293ifeq ($(CONFIG_GUEST_KERNEL_BZIMAGE),y)
294VP_BASE_C_SRCS += boot/guest/bzimage_loader.c
295endif
296ifeq ($(CONFIG_GUEST_KERNEL_RAWIMAGE),y)
297VP_BASE_C_SRCS += boot/guest/rawimage_loader.c
298endif
299ifeq ($(CONFIG_GUEST_KERNEL_ELF),y)
300VP_BASE_C_SRCS += boot/guest/elf_loader.c
301endif
302VP_BASE_C_SRCS += common/hv_main.c
303VP_BASE_C_SRCS += common/vm_load.c
304VP_BASE_C_SRCS += arch/x86/configs/pci_dev.c
305VP_BASE_C_SRCS += arch/x86/configs/vacpi.c
306ifeq ($(CONFIG_SECURITY_VM_FIXUP),y)
307VP_BASE_C_SRCS += quirks/security_vm_fixup.c
308endif
309
310# virtual platform device model
311VP_DM_C_SRCS += dm/vpic.c
312VP_DM_C_SRCS += dm/vrtc.c
313VP_DM_C_SRCS += dm/vioapic.c
314VP_DM_C_SRCS += dm/vuart.c
315VP_DM_C_SRCS += dm/io_req.c
316VP_DM_C_SRCS += dm/vpci/vdev.c
317VP_DM_C_SRCS += dm/vpci/vpci.c
318VP_DM_C_SRCS += dm/vpci/vhostbridge.c
319VP_DM_C_SRCS += dm/vpci/vroot_port.c
320VP_DM_C_SRCS += dm/vpci/vpci_bridge.c
321VP_DM_C_SRCS += dm/vpci/vpci_mf_dev.c
322VP_DM_C_SRCS += dm/vpci/ivshmem.c
323VP_DM_C_SRCS += dm/vpci/pci_pt.c
324VP_DM_C_SRCS += dm/vpci/vmsi.c
325VP_DM_C_SRCS += dm/vpci/vmsix.c
326VP_DM_C_SRCS += dm/vpci/vmsix_on_msi.c
327VP_DM_C_SRCS += dm/vpci/vsriov.c
328VP_DM_C_SRCS += dm/vpci/vmcs9900.c
329VP_DM_C_SRCS += dm/mmio_dev.c
330VP_DM_C_SRCS += dm/vgpio.c
331VP_DM_C_SRCS += arch/x86/guest/vlapic.c
332VP_DM_C_SRCS += arch/x86/guest/pm.c
333VP_DM_C_SRCS += arch/x86/guest/assign.c
334VP_DM_C_SRCS += arch/x86/guest/vmx_io.c
335VP_DM_C_SRCS += arch/x86/guest/instr_emul.c
336VP_DM_C_SRCS += arch/x86/guest/lock_instr_emul.c
337VP_DM_C_SRCS += arch/x86/guest/vm_reset.c
338ifeq ($(CONFIG_VCAT_ENABLED),y)
339VP_DM_C_SRCS += arch/x86/guest/vcat.c
340endif
341VP_DM_C_SRCS += common/ptdev.c
342
343# virtual platform trusty
344VP_TRUSTY_C_SRCS += arch/x86/guest/trusty.c
345VP_TRUSTY_C_SRCS += common/trusty_hypercall.c
346VP_TRUSTY_C_SRCS += arch/x86/seed/seed.c
347VP_TRUSTY_C_SRCS += arch/x86/seed/seed_abl.c
348VP_TRUSTY_C_SRCS += arch/x86/seed/seed_sbl.c
349
350# x86 tee support
351VP_X86_TEE_C_SRCS += arch/x86/guest/optee.c
352
353# virtual platform hypercall
354VP_HCALL_C_SRCS += arch/x86/guest/vmcall.c
355VP_HCALL_C_SRCS += common/hypercall.c
356
357# system initialization
358SYS_INIT_C_SRCS += arch/x86/init.c
359
360LIB_C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(LIB_C_SRCS))
361LIB_S_OBJS := $(patsubst %.S,$(HV_OBJDIR)/%.o,$(LIB_S_SRCS))
362BOOT_C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(BOOT_C_SRCS))
363BOOT_S_OBJS := $(patsubst %.S,$(HV_OBJDIR)/%.o,$(BOOT_S_SRCS))
364HW_C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(HW_C_SRCS))
365HW_S_OBJS := $(patsubst %.S,$(HV_OBJDIR)/%.o,$(HW_S_SRCS))
366VM_CFG_C_OBJS := $(patsubst %.c,%.o,$(VM_CFG_C_SRCS))
367VP_BASE_C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(VP_BASE_C_SRCS))
368VP_BASE_S_OBJS := $(patsubst %.S,$(HV_OBJDIR)/%.o,$(VP_BASE_S_SRCS))
369VP_DM_C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(VP_DM_C_SRCS))
370VP_TRUSTY_C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(VP_TRUSTY_C_SRCS))
371VP_X86_TEE_C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(VP_X86_TEE_C_SRCS))
372VP_HCALL_C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(VP_HCALL_C_SRCS))
373SYS_INIT_C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(SYS_INIT_C_SRCS))
374
375ifneq ($(CONFIG_RELEASE),y)
376CFLAGS += -DHV_DEBUG -DPROFILING_ON -fno-omit-frame-pointer
377endif
378
379MODULES += $(LIB_MOD)
380MODULES += $(BOOT_MOD)
381MODULES += $(HW_MOD)
382MODULES += $(VP_BASE_MOD)
383MODULES += $(VP_DM_MOD)
384MODULES += $(VP_TRUSTY_MOD)
385MODULES += $(VP_X86_TEE_MOD)
386MODULES += $(VP_HCALL_MOD)
387ifeq ($(CONFIG_RELEASE),y)
388MODULES += $(LIB_RELEASE)
389LIB_BUILD = $(LIB_RELEASE)
390LIB_MK = release/Makefile
391else
392MODULES += $(LIB_DEBUG)
393LIB_BUILD = $(LIB_DEBUG)
394LIB_MK = debug/Makefile
395endif
396MODULES += $(SYS_INIT_MOD)
397
398DISTCLEAN_OBJS := $(shell find $(BASEDIR) -name '*.o')
399VERSION := $(HV_OBJDIR)/include/version.h
400HEADERS := $(VERSION) $(HV_CONFIG_H) $(HV_CONFIG_TIMESTAMP)
401
402PRE_BUILD_DIR := ../misc/hv_prebuild
403PRE_BUILD_CHECKER := $(HV_OBJDIR)/hv_prebuild_check.out
404HV_ACPI_TABLE_TIMESTAMP := $(HV_OBJDIR)/acpi.timestamp
405SERIAL_CONF = $(HV_OBJDIR)/serial.conf
406
407.PHONY: all
408all: env_check $(HV_ACPI_TABLE_TIMESTAMP) $(SERIAL_CONF) $(HV_OBJDIR)/$(HV_FILE).32.out $(HV_OBJDIR)/$(HV_FILE).bin
409
410install: $(HV_OBJDIR)/$(HV_FILE).32.out $(HV_OBJDIR)/$(HV_FILE).bin
411	install -D $(HV_OBJDIR)/$(HV_FILE).32.out $(DESTDIR)$(libdir)/acrn/$(HV_FILE).$(BOARD).$(SCENARIO).32.out
412	install -D $(HV_OBJDIR)/$(HV_FILE).bin $(DESTDIR)$(libdir)/acrn/$(HV_FILE).$(BOARD).$(SCENARIO).bin
413	@if [ -e "$(HV_OBJDIR)/acpi" ];then \
414		install -D $(HV_OBJDIR)/acpi/*.bin -t $(DESTDIR)$(libdir)/acrn/acpi/; \
415	fi
416	@if [ -e "$(HV_OBJDIR)/serial.conf" ];then \
417		install -D -b -m 0644 $(HV_OBJDIR)/serial.conf -t $(DESTDIR)$(sysconfdir)/; \
418	fi
419
420install-debug: $(HV_OBJDIR)/$(HV_FILE).map $(HV_OBJDIR)/$(HV_FILE).out
421	install -D $(HV_OBJDIR)/$(HV_FILE).out $(DESTDIR)$(libdir)/acrn/$(HV_FILE).$(BOARD).$(SCENARIO).out
422	install -D $(HV_OBJDIR)/$(HV_FILE).map $(DESTDIR)$(libdir)/acrn/$(HV_FILE).$(BOARD).$(SCENARIO).map
423
424.PHONY: env_check
425env_check:
426ifndef ASL_COMPILER
427$(error Please either install "iasl" or provide the path to "iasl" by using the ASL_COMPILER variable)
428endif
429
430$(PRE_BUILD_CHECKER): $(HV_CONFIG_H) $(HV_CONFIG_TIMESTAMP)
431	@echo "Start pre-build static check ..."
432	$(MAKE) -C $(PRE_BUILD_DIR) BOARD=$(BOARD) SCENARIO=$(SCENARIO) CHECKER_OUT=$(PRE_BUILD_CHECKER)
433	@$(PRE_BUILD_CHECKER)
434
435$(HV_ACPI_TABLE_TIMESTAMP): $(HV_CONFIG_TIMESTAMP)
436	@echo "generate the binary of ACPI tables for pre-launched VMs ..."
437	python3 ../misc/config_tools/acpi_gen/bin_gen.py --board $(HV_BOARD_XML) --scenario $(HV_SCENARIO_XML) --asl $(HV_CONFIG_DIR) --out $(HV_OBJDIR) --iasl_path $(ASL_COMPILER) --iasl_min_ver $(IASL_MIN_VER)
438	@touch $(HV_ACPI_TABLE_TIMESTAMP)
439
440$(SERIAL_CONF): $(HV_CONFIG_TIMESTAMP) $(HV_ALLOCATION_XML)
441	@echo "generate the serial configuration file for service VM ..."
442	python3 ../misc/config_tools/service_vm_config/serial_config.py --allocation $(HV_ALLOCATION_XML) --scenario $(HV_SCENARIO_XML) --out $(SERIAL_CONF)
443
444.PHONY: lib-mod boot-mod hw-mod vp-base-mod vp-dm-mod vp-trusty-mod vp-x86tee-mod vp-hcall-mod sys-init-mod
445$(LIB_MOD): $(LIB_C_OBJS) $(LIB_S_OBJS)
446	$(AR) $(ARFLAGS) $(LIB_MOD) $(LIB_C_OBJS) $(LIB_S_OBJS)
447
448lib-mod: $(LIB_MOD)
449
450$(BOOT_MOD): $(BOOT_S_OBJS) $(BOOT_C_OBJS)
451	$(AR) $(ARFLAGS) $(BOOT_MOD) $(BOOT_S_OBJS) $(BOOT_C_OBJS)
452
453boot-mod: $(BOOT_MOD)
454
455$(HW_MOD): $(HW_S_OBJS) $(HW_C_OBJS) $(VM_CFG_C_OBJS)
456	$(AR) $(ARFLAGS) $(HW_MOD) $(HW_S_OBJS) $(HW_C_OBJS) $(VM_CFG_C_OBJS)
457
458hw-mod: $(HW_MOD)
459
460$(VP_BASE_MOD): $(VP_BASE_S_OBJS) $(VP_BASE_C_OBJS)
461	$(AR) $(ARFLAGS) $(VP_BASE_MOD) $(VP_BASE_S_OBJS) $(VP_BASE_C_OBJS)
462
463vp-base-mod: $(VP_BASE_MOD)
464
465$(VP_DM_MOD): $(VP_DM_C_OBJS)
466	$(AR) $(ARFLAGS) $(VP_DM_MOD) $(VP_DM_C_OBJS)
467
468vp-dm-mod: $(VP_DM_MOD)
469
470$(VP_TRUSTY_MOD): $(VP_TRUSTY_C_OBJS)
471	$(AR) $(ARFLAGS) $(VP_TRUSTY_MOD) $(VP_TRUSTY_C_OBJS)
472
473vp-trusty-mod: $(VP_TRUSTY_MOD)
474
475$(VP_X86_TEE_MOD): $(VP_X86_TEE_C_OBJS)
476	$(AR) $(ARFLAGS) $(VP_X86_TEE_MOD) $(VP_X86_TEE_C_OBJS)
477
478vp-x86tee-mod: $(VP_X86_TEE_MOD)
479
480$(VP_HCALL_MOD): $(VP_HCALL_C_OBJS)
481	$(AR) $(ARFLAGS) $(VP_HCALL_MOD) $(VP_HCALL_C_OBJS)
482
483vp-hcall-mod: $(VP_HCALL_MOD)
484
485$(SYS_INIT_MOD): $(SYS_INIT_C_OBJS)
486	$(AR) $(ARFLAGS) $(SYS_INIT_MOD) $(SYS_INIT_C_OBJS)
487
488sys-init-mod: $(SYS_INIT_MOD)
489
490.PHONY: lib
491
492$(LIB_BUILD): $(HEADERS)
493	$(MAKE) -f $(LIB_MK) MKFL_NAME=$(LIB_MK)
494
495lib: $(LIB_BUILD)
496
497$(HV_OBJDIR)/$(HV_FILE).32.out: $(HV_OBJDIR)/$(HV_FILE).out
498	$(OBJCOPY) -S --section-alignment=0x1000 -O elf32-i386 $< $@
499
500$(HV_OBJDIR)/$(HV_FILE).bin: $(HV_OBJDIR)/$(HV_FILE).out
501	$(OBJCOPY) -O binary $< $(HV_OBJDIR)/$(HV_FILE).bin
502	rm -f $(UPDATE_RESULT)
503
504$(HV_OBJDIR)/$(HV_FILE).out: $(MODULES)
505	${BASH} ${LD_IN_TOOL} $(ARCH_LDSCRIPT_IN) $(ARCH_LDSCRIPT) ${HV_CONFIG_MK}
506	$(CC) -Wl,-Map=$(HV_OBJDIR)/$(HV_FILE).map -o $@ $(LDFLAGS) $(ARCH_LDFLAGS) -T$(ARCH_LDSCRIPT) \
507		-Wl,--start-group $^ -Wl,--end-group
508
509.PHONY: clean
510clean:
511	rm -f $(VERSION)
512	rm -rf $(HV_OBJDIR)
513
514.PHONY: distclean
515distclean:
516	rm -f $(DISTCLEAN_OBJS)
517	rm -f $(VERSION)
518	rm -rf $(HV_OBJDIR)
519	rm -f tags TAGS cscope.files cscope.in.out cscope.out cscope.po.out GTAGS GPATH GRTAGS GSYMS
520
521PHONY: (VERSION)
522$(VERSION): $(HV_CONFIG_H)
523	touch $(VERSION)
524	@if [ "$(BUILD_VERSION)"x = x ];then \
525		COMMIT=`git rev-parse --verify --short HEAD 2>/dev/null`;\
526		DIRTY=`git diff-index --name-only HEAD`;\
527		if [ -n "$$DIRTY" ];then PATCH="$$COMMIT-dirty";else PATCH="$$COMMIT";fi;\
528	else \
529		PATCH="$(BUILD_VERSION)"; \
530	fi; \
531	COMMIT_TAGS=$$(git tag --points-at HEAD|tr -s "\n" " "); \
532	COMMIT_TAGS=$$(eval echo $$COMMIT_TAGS);\
533	COMMIT_TIME=$$(git log -1 --date=format:"%Y-%m-%d-%T" --format=%cd); \
534	TIME=$$(date -u -d "@$${SOURCE_DATE_EPOCH:-$$(date +%s)}" "+%F %T"); \
535	USER="$${USER:-$$(id -u -n)}"; \
536	if [ x$(CONFIG_RELEASE) = "xy" ];then BUILD_TYPE="REL";else BUILD_TYPE="DBG";fi;\
537	echo "/*" > $(VERSION); \
538	sed 's/^/ * /' ../LICENSE >> $(VERSION); \
539	echo " */" >> $(VERSION); \
540	echo "" >> $(VERSION); \
541	echo "#ifndef VERSION_H" >> $(VERSION); \
542	echo "#define VERSION_H" >> $(VERSION); \
543	echo "#define HV_API_MAJOR_VERSION $(API_MAJOR_VERSION)U" >> $(VERSION);\
544	echo "#define HV_API_MINOR_VERSION $(API_MINOR_VERSION)U" >> $(VERSION);\
545	echo "#define HV_BRANCH_VERSION "\"$(BRANCH_VERSION)\""" >> $(VERSION);\
546	echo "#define HV_COMMIT_DIRTY "\""$$PATCH"\""" >> $(VERSION);\
547	echo "#define HV_COMMIT_TAGS "\"$$COMMIT_TAGS\""" >> $(VERSION);\
548	echo "#define HV_COMMIT_TIME "\"$$COMMIT_TIME\""" >> $(VERSION);\
549	echo "#define HV_BUILD_TYPE "\""$$BUILD_TYPE"\""" >> $(VERSION);\
550	echo "#define HV_BUILD_TIME "\""$$TIME"\""" >> $(VERSION);\
551	echo "#define HV_BUILD_USER "\""$$USER"\""" >> $(VERSION);\
552	echo "#define HV_BUILD_SCENARIO "\"$(SCENARIO)\""" >> $(VERSION);\
553	echo "#define HV_BUILD_BOARD "\"$(BOARD)\""" >> $(VERSION);\
554	echo "#endif" >> $(VERSION)
555
556-include $(C_OBJS:.o=.d)
557-include $(S_OBJS:.o=.d)
558
559$(HV_OBJDIR)/%.o: %.c $(HEADERS) $(PRE_BUILD_CHECKER)
560	[ ! -e $@ ] && mkdir -p $(dir $@) && mkdir -p $(HV_MODDIR); \
561	$(CC) $(patsubst %, -I%, $(INCLUDE_PATH)) -I. -c $(CFLAGS) $(ARCH_CFLAGS) $< -o $@ -MMD -MT $@
562
563$(VM_CFG_C_SRCS): %.c: $(HV_CONFIG_TIMESTAMP)
564
565$(VM_CFG_C_OBJS): %.o: %.c $(HEADERS) $(PRE_BUILD_CHECKER)
566	[ ! -e $@ ] && mkdir -p $(dir $@) && mkdir -p $(HV_MODDIR); \
567	$(CC) $(patsubst %, -I%, $(INCLUDE_PATH)) -I. -c $(CFLAGS) $(ARCH_CFLAGS) $< -o $@ -MMD -MT $@
568
569$(HV_OBJDIR)/%.o: %.S $(HEADERS) $(PRE_BUILD_CHECKER)
570	[ ! -e $@ ] && mkdir -p $(dir $@) && mkdir -p $(HV_MODDIR); \
571	$(CC) $(patsubst %, -I%, $(INCLUDE_PATH)) -I. $(ASFLAGS) $(ARCH_ASFLAGS) -c $< -o $@ -MMD -MT $@
572
573.DEFAULT_GOAL := all
574