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