# # ACRN Hypervisor # include ../VERSION FULL_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)$(EXTRA_VERSION) API_MAJOR_VERSION=1 API_MINOR_VERSION=0 GCC_MAJOR=$(shell echo __GNUC__ | $(CC) -E -x c - | tail -n 1) GCC_MINOR=$(shell echo __GNUC_MINOR__ | $(CC) -E -x c - | tail -n 1) #enable stack overflow check STACK_PROTECTOR := 1 BASEDIR := $(shell pwd) HV_OBJDIR ?= $(CURDIR)/build HV_FILE := acrn # initialize the flags we used CFLAGS := ASFLAGS := LDFLAGS := ARCH_CFLAGS := ARCH_ASFLAGS := ARCH_ARFLAGS := ARCH_LDFLAGS := .PHONY: default default: all include $(BASEDIR)/../scripts/deps.mk include scripts/kconfig/kconfig.mk CFLAGS += -Wall -W CFLAGS += -ffunction-sections -fdata-sections CFLAGS += -fshort-wchar -ffreestanding CFLAGS += -fsigned-char CFLAGS += -m64 -mno-mmx -mno-sse -mno-sse2 -mno-80387 -mno-fp-ret-in-387 CFLAGS += -mno-red-zone CFLAGS += -nostdinc -nostdlib -fno-common CFLAGS += -O2 -D_FORTIFY_SOURCE=2 CFLAGS += -Wformat -Wformat-security ifeq (y, $(CONFIG_RELOC)) CFLAGS += -fpie else CFLAGS += -static endif ifdef STACK_PROTECTOR ifeq (true, $(shell [ $(GCC_MAJOR) -gt 4 ] && echo true)) CFLAGS += -fstack-protector-strong else ifeq (true, $(shell [ $(GCC_MAJOR) -eq 4 ] && [ $(GCC_MINOR) -ge 9 ] && echo true)) CFLAGS += -fstack-protector-strong else CFLAGS += -fstack-protector endif endif CFLAGS += -DSTACK_PROTECTOR endif ASFLAGS += -m64 -nostdinc -nostdlib LDFLAGS += -Wl,--gc-sections -nostartfiles -nostdlib LDFLAGS += -Wl,-n,-z,max-page-size=0x1000 LDFLAGS += -Wl,-z,noexecstack ifeq (y, $(CONFIG_RELOC)) # on X86_64, when build with "-pie", GCC fails on linking R_X86_64_32 # relocations with "recompile with fPIC" error, because it may cause # run-time relocation overflow if it runs at address above 4GB. # We know it's safe because Hypervisor runs under 4GB. "noreloc-overflow" # is used to avoid the compile error LDFLAGS += -pie -z noreloc-overflow else LDFLAGS += -static endif ARCH_CFLAGS += -gdwarf-2 ARCH_ASFLAGS += -gdwarf-2 -DASSEMBLER=1 ARCH_ARFLAGS += ARCH_LDFLAGS += ARCH_LDSCRIPT = $(HV_OBJDIR)/link_ram.ld ARCH_LDSCRIPT_IN = bsp/ld/link_ram.ld.in INCLUDE_PATH += include INCLUDE_PATH += include/lib INCLUDE_PATH += include/lib/crypto INCLUDE_PATH += include/common INCLUDE_PATH += include/arch/x86 INCLUDE_PATH += include/arch/x86/guest INCLUDE_PATH += include/debug INCLUDE_PATH += include/public ifeq ($(CONFIG_PARTITION_MODE),y) INCLUDE_PATH += include/dm/vpci endif INCLUDE_PATH += bsp/include INCLUDE_PATH += bsp/$(CONFIG_PLATFORM)/include/bsp INCLUDE_PATH += boot/include INCLUDE_PATH += $(HV_OBJDIR)/include CC ?= gcc AS ?= as AR ?= ar LD ?= ld OBJCOPY ?= objcopy D_SRCS += $(wildcard debug/*.c) C_SRCS += boot/acpi.c C_SRCS += boot/dmar_parse.c C_SRCS += boot/reloc.c C_SRCS += arch/x86/ioapic.c C_SRCS += arch/x86/lapic.c S_SRCS += arch/x86/trampoline.S C_SRCS += arch/x86/cpu.c C_SRCS += arch/x86/cpuid.c C_SRCS += arch/x86/mmu.c C_SRCS += arch/x86/pagetable.c C_SRCS += arch/x86/notify.c C_SRCS += arch/x86/vtd.c C_SRCS += arch/x86/gdt.c S_SRCS += arch/x86/cpu_primary.S S_SRCS += arch/x86/cpu_save_boot_ctx.S S_SRCS += arch/x86/idt.S C_SRCS += arch/x86/irq.c C_SRCS += arch/x86/timer.c C_SRCS += arch/x86/ept.c S_SRCS += arch/x86/vmx_asm.S C_SRCS += arch/x86/io.c C_SRCS += arch/x86/virq.c C_SRCS += arch/x86/vmexit.c C_SRCS += arch/x86/vmx.c C_SRCS += arch/x86/assign.c C_SRCS += arch/x86/trusty.c C_SRCS += arch/x86/cpu_state_tbl.c C_SRCS += arch/x86/mtrr.c C_SRCS += arch/x86/pm.c S_SRCS += arch/x86/wakeup.S C_SRCS += arch/x86/static_checks.c C_SRCS += arch/x86/guest/vcpu.c C_SRCS += arch/x86/guest/vm.c C_SRCS += arch/x86/guest/vlapic.c C_SRCS += arch/x86/guest/guest.c C_SRCS += arch/x86/guest/vmcall.c C_SRCS += arch/x86/guest/vmsr.c C_SRCS += arch/x86/guest/instr_emul.c C_SRCS += arch/x86/guest/ucode.c C_SRCS += arch/x86/guest/pm.c C_SRCS += lib/misc.c C_SRCS += lib/string.c C_SRCS += lib/memory.c C_SRCS += lib/crypto/hkdf_wrap.c C_SRCS += lib/crypto/mbedtls/hkdf.c C_SRCS += lib/crypto/mbedtls/sha256.c C_SRCS += lib/crypto/mbedtls/md.c C_SRCS += lib/crypto/mbedtls/md_wrap.c C_SRCS += lib/sprintf.c C_SRCS += common/softirq.c C_SRCS += common/hv_main.c C_SRCS += common/hypercall.c C_SRCS += common/trusty_hypercall.c C_SRCS += common/schedule.c C_SRCS += common/vm_load.c C_SRCS += common/io_request.c C_SRCS += common/ptdev.c C_SRCS += common/static_checks.c ifdef STACK_PROTECTOR C_SRCS += common/stack_protector.c endif C_SRCS += dm/vpic.c C_SRCS += dm/vioapic.c ifeq ($(CONFIG_PARTITION_MODE),y) C_SRCS += $(wildcard dm/vpci/*.c) C_SRCS += $(wildcard partition/*.c) C_SRCS += dm/vrtc.c endif C_SRCS += bsp/$(CONFIG_PLATFORM)/vm_description.c C_SRCS += bsp/$(CONFIG_PLATFORM)/$(CONFIG_PLATFORM).c C_SRCS += bsp/$(CONFIG_PLATFORM)/platform_acpi_info.c ifeq ($(CONFIG_PLATFORM),uefi) C_SRCS += bsp/$(CONFIG_PLATFORM)/cmdline.c else ifeq ($(CONFIG_PLATFORM), sbl) C_SRCS += boot/sbl/multiboot.c C_SRCS += boot/sbl/hob_parse.c endif endif ifeq ($(CONFIG_PARTITION_MODE), y) C_SRCS += arch/x86/guest/mptable.c endif # retpoline support ifeq (true, $(shell [ $(GCC_MAJOR) -eq 7 ] && [ $(GCC_MINOR) -ge 3 ] && echo true)) CFLAGS += -mindirect-branch=thunk-extern -mindirect-branch-register CFLAGS += -DCONFIG_RETPOLINE S_SRCS += arch/x86/retpoline-thunk.S else ifeq (true, $(shell [ $(GCC_MAJOR) -ge 8 ] && echo true)) CFLAGS += -mindirect-branch=thunk-extern -mindirect-branch-register CFLAGS += -DCONFIG_RETPOLINE S_SRCS += arch/x86/retpoline-thunk.S endif endif C_OBJS := $(patsubst %.c,$(HV_OBJDIR)/%.o,$(C_SRCS)) ifneq ($(CONFIG_RELEASE),y) C_OBJS += $(patsubst %.c,$(HV_OBJDIR)/%.o,$(D_SRCS)) CFLAGS += -DHV_DEBUG endif S_OBJS := $(patsubst %.S,$(HV_OBJDIR)/%.o,$(S_SRCS)) DISTCLEAN_OBJS := $(shell find $(BASEDIR) -name '*.o') VERSION := $(HV_OBJDIR)/include/version.h .PHONY: all all: $(VERSION) $(HV_OBJDIR)/$(HV_FILE).32.out $(HV_OBJDIR)/$(HV_FILE).bin rm -f $(VERSION) ifeq ($(CONFIG_PLATFORM), uefi) all: efi .PHONY: efi efi: $(HV_OBJDIR)/$(HV_FILE).bin echo "building hypervisor as EFI executable..." make -C bsp/uefi/efi HV_OBJDIR=$(HV_OBJDIR) install: efi make -C bsp/uefi/efi HV_OBJDIR=$(HV_OBJDIR) install endif ifeq ($(CONFIG_PLATFORM), sbl) install: $(VERSION) $(HV_OBJDIR)/$(HV_FILE).32.out install -D $(HV_OBJDIR)/$(HV_FILE).32.out $(DESTDIR)/usr/lib/acrn/$(HV_FILE).sbl endif $(HV_OBJDIR)/$(HV_FILE).32.out: $(HV_OBJDIR)/$(HV_FILE).out $(OBJCOPY) -S --section-alignment=0x1000 -O elf32-i386 $< $@ $(HV_OBJDIR)/$(HV_FILE).bin: $(HV_OBJDIR)/$(HV_FILE).out $(OBJCOPY) -O binary $< $(HV_OBJDIR)/$(HV_FILE).bin $(HV_OBJDIR)/$(HV_FILE).out: $(C_OBJS) $(S_OBJS) $(CC) -E -x c $(patsubst %, -I%, $(INCLUDE_PATH)) $(ARCH_LDSCRIPT_IN) | grep -v '^#' > $(ARCH_LDSCRIPT) $(CC) -Wl,-Map=$(HV_OBJDIR)/$(HV_FILE).map -o $@ $(LDFLAGS) $(ARCH_LDFLAGS) -T$(ARCH_LDSCRIPT) $^ .PHONY: clean clean: rm -f $(C_OBJS) rm -f $(S_OBJS) rm -f $(VERSION) rm -rf $(HV_OBJDIR) .PHONY: distclean distclean: rm -f $(DISTCLEAN_OBJS) rm -f $(C_OBJS) rm -f $(S_OBJS) rm -f $(VERSION) rm -rf $(HV_OBJDIR) rm -f tags TAGS cscope.files cscope.in.out cscope.out cscope.po.out GTAGS GPATH GRTAGS GSYMS PHONY: (VERSION) $(VERSION): touch $(VERSION) @COMMIT=`git rev-parse --verify --short HEAD 2>/dev/null`;\ DIRTY=`git diff-index --name-only HEAD`;\ if [ -n "$$DIRTY" ];then PATCH="$$COMMIT-dirty";else PATCH="$$COMMIT";fi;\ DAILY_TAG=`git tag --merged HEAD|grep "acrn"|tail -n 1`;\ TIME=`date "+%F %T"`;\ USER=`id -u -n`; \ if [ x$(CONFIG_RELEASE) = "xy" ];then BUILD_TYPE="REL";else BUILD_TYPE="DBG";fi;\ echo "/*" > $(VERSION); \ sed 's/^/ * /' ../LICENSE >> $(VERSION); \ echo " */" >> $(VERSION); \ echo "" >> $(VERSION); \ echo "#define HV_MAJOR_VERSION $(MAJOR_VERSION)" >> $(VERSION);\ echo "#define HV_MINOR_VERSION $(MINOR_VERSION)" >> $(VERSION);\ echo "#define HV_EXTRA_VERSION "\"$(EXTRA_VERSION)\""" >> $(VERSION);\ echo "#define HV_FULL_VERSION "\"$(FULL_VERSION)\""" >> $(VERSION);\ echo "#define HV_API_MAJOR_VERSION $(API_MAJOR_VERSION)U" >> $(VERSION);\ echo "#define HV_API_MINOR_VERSION $(API_MINOR_VERSION)U" >> $(VERSION);\ echo "#define HV_DAILY_TAG "\""$$DAILY_TAG"\""" >> $(VERSION);\ echo "#define HV_BUILD_VERSION "\""$$PATCH"\""" >> $(VERSION);\ echo "#define HV_BUILD_TYPE "\""$$BUILD_TYPE"\""" >> $(VERSION);\ echo "#define HV_BUILD_TIME "\""$$TIME"\""" >> $(VERSION);\ echo "#define HV_BUILD_USER "\""$$USER"\""" >> $(VERSION) -include $(C_OBJS:.o=.d) -include $(S_OBJS:.o=.d) $(HV_OBJDIR)/%.o: %.c $(HV_OBJDIR)/$(HV_CONFIG_H) [ ! -e $@ ] && mkdir -p $(dir $@); \ $(CC) $(patsubst %, -I%, $(INCLUDE_PATH)) -I. -c $(CFLAGS) $(ARCH_CFLAGS) $< -o $@ -MMD -MT $@ $(HV_OBJDIR)/%.o: %.S $(HV_OBJDIR)/$(HV_CONFIG_H) [ ! -e $@ ] && mkdir -p $(dir $@); \ $(CC) $(patsubst %, -I%, $(INCLUDE_PATH)) -I. $(ASFLAGS) $(ARCH_ASFLAGS) -c $< -o $@ -MMD -MT $@