1# SPDX-License-Identifier: GPL-2.0-or-later 2# Copyright (c) 2021 Linux Test Project 3 4top_srcdir ?= ../../.. 5 6include $(top_srcdir)/include/mk/testcases.mk 7 8ASFLAGS = 9CPPFLAGS += -I$(abs_srcdir)/include 10GUEST_CPPFLAGS = $(CPPFLAGS) -DCOMPILE_PAYLOAD 11GUEST_CFLAGS = -ffreestanding -O2 -Wall -fno-asynchronous-unwind-tables -fno-stack-protector -mno-mmx -mno-sse 12GUEST_LDFLAGS = -nostdlib -Wl,--build-id=none -z noexecstack 13GUEST_LDLIBS = 14KVM_LD ?= $(LD) 15 16FILTER_OUT_MAKE_TARGETS := lib_guest lib_host lib_x86 17 18ifeq ($(HOST_CPU),x86_64) 19 ifneq (,$(findstring m32,$(CFLAGS))) 20 HOST_CPU = x86 21 endif 22endif 23 24ifeq ($(HOST_CPU),x86) 25 GUEST_CFLAGS += -m32 26 ASFLAGS += --32 27 28 ifdef LTP_CFLAGS_FFIXED_EBP 29 GUEST_CFLAGS += -ffixed-ebp 30 endif 31endif 32 33# Some distros enable -pie by default. That breaks KVM payload linking. 34ifdef LTP_CFLAGS_NOPIE 35 GUEST_CFLAGS += -fno-pie 36 GUEST_LDFLAGS += -no-pie 37endif 38 39GUEST_LDFLAGS += -Wl,-T$(abs_srcdir)/linker/$(HOST_CPU).lds 40ARCH_OBJ = bootstrap_$(HOST_CPU).o 41 42ifeq ($(HOST_CPU),x86_64) 43ARCH_OBJ += lib_x86.o 44BIN_FORMAT=elf64-x86-64 45else ifeq ($(HOST_CPU),x86) 46ARCH_OBJ += lib_x86.o 47BIN_FORMAT=elf32-i386 48else 49MAKE_TARGETS = 50endif 51 52lib_guest.o $(ARCH_OBJ): CPPFLAGS := $(GUEST_CPPFLAGS) 53lib_guest.o $(ARCH_OBJ): CFLAGS := $(GUEST_CFLAGS) 54 55kvm_svm03: CFLAGS += -pthread 56kvm_svm03: LDLIBS += -pthread 57 58include $(top_srcdir)/include/mk/generic_leaf_target.mk 59 60%-payload.o: %.c lib_guest.o $(ARCH_OBJ) 61ifdef VERBOSE 62 $(CC) $(GUEST_CPPFLAGS) $(GUEST_CFLAGS) $(GUEST_LDFLAGS) -o $*-payload.elf $^ $(GUEST_LDLIBS) 63 objcopy -O binary -j .init.boot -j .text -j .data -j .init -j .preinit_array -j .init_array --gap-fill=0 $*-payload.elf $*-payload.bin 64 $(KVM_LD) -z noexecstack -r -T $(abs_srcdir)/linker/payload.lds --oformat=$(BIN_FORMAT) -o $@ $*-payload.bin 65else 66 @$(CC) $(GUEST_CPPFLAGS) $(GUEST_CFLAGS) $(GUEST_LDFLAGS) -o $*-payload.elf $^ $(GUEST_LDLIBS) 67 @objcopy -O binary -j .init.boot -j .text -j .data -j .init -j .preinit_array -j .init_array --gap-fill=0 $*-payload.elf $*-payload.bin 68 @$(KVM_LD) -z noexecstack -r -T $(abs_srcdir)/linker/payload.lds --oformat=$(BIN_FORMAT) -o $@ $*-payload.bin 69 @echo KVM_CC $(target_rel_dir)$@ 70endif 71 @rm $*-payload.elf $*-payload.bin 72 73$(MAKE_TARGETS): %: %-payload.o lib_host.o 74