1f08c3bdfSopenharmony_ci# SPDX-License-Identifier: GPL-2.0-or-later
2f08c3bdfSopenharmony_ci# Copyright (c) 2021 Linux Test Project
3f08c3bdfSopenharmony_ci
4f08c3bdfSopenharmony_citop_srcdir		?= ../../..
5f08c3bdfSopenharmony_ci
6f08c3bdfSopenharmony_ciinclude $(top_srcdir)/include/mk/testcases.mk
7f08c3bdfSopenharmony_ci
8f08c3bdfSopenharmony_ciASFLAGS =
9f08c3bdfSopenharmony_ciCPPFLAGS += -I$(abs_srcdir)/include
10f08c3bdfSopenharmony_ciGUEST_CPPFLAGS = $(CPPFLAGS) -DCOMPILE_PAYLOAD
11f08c3bdfSopenharmony_ciGUEST_CFLAGS = -ffreestanding -O2 -Wall -fno-asynchronous-unwind-tables -fno-stack-protector -mno-mmx -mno-sse
12f08c3bdfSopenharmony_ciGUEST_LDFLAGS = -nostdlib -Wl,--build-id=none -z noexecstack
13f08c3bdfSopenharmony_ciGUEST_LDLIBS =
14f08c3bdfSopenharmony_ciKVM_LD ?= $(LD)
15f08c3bdfSopenharmony_ci
16f08c3bdfSopenharmony_ciFILTER_OUT_MAKE_TARGETS := lib_guest lib_host lib_x86
17f08c3bdfSopenharmony_ci
18f08c3bdfSopenharmony_ciifeq ($(HOST_CPU),x86_64)
19f08c3bdfSopenharmony_ci	ifneq (,$(findstring m32,$(CFLAGS)))
20f08c3bdfSopenharmony_ci		HOST_CPU = x86
21f08c3bdfSopenharmony_ci	endif
22f08c3bdfSopenharmony_ciendif
23f08c3bdfSopenharmony_ci
24f08c3bdfSopenharmony_ciifeq ($(HOST_CPU),x86)
25f08c3bdfSopenharmony_ci	GUEST_CFLAGS += -m32
26f08c3bdfSopenharmony_ci	ASFLAGS += --32
27f08c3bdfSopenharmony_ciendif
28f08c3bdfSopenharmony_ci
29f08c3bdfSopenharmony_ci# Some distros enable -pie by default. That breaks KVM payload linking.
30f08c3bdfSopenharmony_ciifdef LTP_CFLAGS_NOPIE
31f08c3bdfSopenharmony_ci	GUEST_CFLAGS += -fno-pie
32f08c3bdfSopenharmony_ci	GUEST_LDFLAGS += -no-pie
33f08c3bdfSopenharmony_ciendif
34f08c3bdfSopenharmony_ci
35f08c3bdfSopenharmony_ciGUEST_LDFLAGS += -Wl,-T$(abs_srcdir)/linker/$(HOST_CPU).lds
36f08c3bdfSopenharmony_ciARCH_OBJ = bootstrap_$(HOST_CPU).o
37f08c3bdfSopenharmony_ci
38f08c3bdfSopenharmony_ciifeq ($(HOST_CPU),x86_64)
39f08c3bdfSopenharmony_ciARCH_OBJ += lib_x86.o
40f08c3bdfSopenharmony_ciBIN_FORMAT=elf64-x86-64
41f08c3bdfSopenharmony_cielse ifeq ($(HOST_CPU),x86)
42f08c3bdfSopenharmony_ciARCH_OBJ += lib_x86.o
43f08c3bdfSopenharmony_ciBIN_FORMAT=elf32-i386
44f08c3bdfSopenharmony_cielse
45f08c3bdfSopenharmony_ciMAKE_TARGETS =
46f08c3bdfSopenharmony_ciendif
47f08c3bdfSopenharmony_ci
48f08c3bdfSopenharmony_cilib_guest.o $(ARCH_OBJ): CPPFLAGS	:= $(GUEST_CPPFLAGS)
49f08c3bdfSopenharmony_cilib_guest.o $(ARCH_OBJ): CFLAGS		:= $(GUEST_CFLAGS)
50f08c3bdfSopenharmony_ci
51f08c3bdfSopenharmony_cikvm_svm03: CFLAGS += -pthread
52f08c3bdfSopenharmony_cikvm_svm03: LDLIBS += -pthread
53f08c3bdfSopenharmony_ci
54f08c3bdfSopenharmony_ciinclude $(top_srcdir)/include/mk/generic_leaf_target.mk
55f08c3bdfSopenharmony_ci
56f08c3bdfSopenharmony_ci%-payload.o: %.c lib_guest.o $(ARCH_OBJ)
57f08c3bdfSopenharmony_ciifdef VERBOSE
58f08c3bdfSopenharmony_ci	$(CC) $(GUEST_CPPFLAGS) $(GUEST_CFLAGS) $(GUEST_LDFLAGS) -o $*-payload.elf $^ $(GUEST_LDLIBS)
59f08c3bdfSopenharmony_ci	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
60f08c3bdfSopenharmony_ci	$(KVM_LD) -z noexecstack -r -T $(abs_srcdir)/linker/payload.lds --oformat=$(BIN_FORMAT) -o $@ $*-payload.bin
61f08c3bdfSopenharmony_cielse
62f08c3bdfSopenharmony_ci	@$(CC) $(GUEST_CPPFLAGS) $(GUEST_CFLAGS) $(GUEST_LDFLAGS) -o $*-payload.elf $^ $(GUEST_LDLIBS)
63f08c3bdfSopenharmony_ci	@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
64f08c3bdfSopenharmony_ci	@$(KVM_LD) -z noexecstack -r -T $(abs_srcdir)/linker/payload.lds --oformat=$(BIN_FORMAT) -o $@ $*-payload.bin
65f08c3bdfSopenharmony_ci	@echo KVM_CC $(target_rel_dir)$@
66f08c3bdfSopenharmony_ciendif
67f08c3bdfSopenharmony_ci	@rm $*-payload.elf $*-payload.bin
68f08c3bdfSopenharmony_ci
69f08c3bdfSopenharmony_ci$(MAKE_TARGETS): %: %-payload.o lib_host.o
70