build: fix x86 out-of-tree build without EFI

We can't have a source file with the same name that exist in both the
common code and in the arch specific code for efi/. This can lead to
confusion in make and it can pick up the wrong source file. This issue
lead to a failure to build a pv-shim for x86 out-of-tree, as this is
one example of an x86 build using the efi/stub.c.

The issue is that in out-of-tree, make might find x86/efi/stub.c via
VPATH, but as the target needs to be rebuilt due to FORCE, make
actually avoid changing the source tree and rebuilt the target with
VPATH ignored, so $@ lead to the build tree where "stub.c" doesn't
exist yet so a link is made to "common/stub.c".

Rework the new common/stub.c file to have a different name than the
already existing one, by renaming the existing one. We can hide the
compat aliases that x86 uses behind CONFIG_COMPAT so a Arm build will
not have them.

Also revert the change to the rule that creates symbolic links it's
better to just recreate the link in cases where an existing file exist
or the link goes to the wrong file.

Avoid using $(EFIOBJ-y) as an alias for $(clean-files), add
"stub.c" directly to $(clean-files).

Also update .gitignore as this was also missing from the original
patch.

Fixes: 7f96859b0d ("xen: reuse x86 EFI stub functions for Arm")
Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
Anthony PERARD authored and Jan Beulich committed 2022-09-26 11:16:04 +02:00
1 parent 6cecffc7a6
commit bfd3e9945d
6 files changed
+15 -15

No files matched your search

+1
View File
@@ -275,6 +275,7 @@ xen/arch/x86/efi/mkreloc
xen/arch/x86/include/asm/asm-macros.h xen/arch/x86/include/asm/asm-macros.h
xen/arch/*/xen.lds xen/arch/*/xen.lds
xen/arch/*/efi/boot.c xen/arch/*/efi/boot.c
xen/arch/*/efi/common-stub.c
xen/arch/*/efi/compat.c xen/arch/*/efi/compat.c
xen/arch/*/efi/ebmalloc.c xen/arch/*/efi/ebmalloc.c
xen/arch/*/efi/efi.h xen/arch/*/efi/efi.h
+1 -5
View File
@@ -4,11 +4,7 @@ ifeq ($(CONFIG_ARM_EFI),y)
obj-y += $(EFIOBJ-y) obj-y += $(EFIOBJ-y)
obj-$(CONFIG_ACPI) += efi-dom0.init.o obj-$(CONFIG_ACPI) += efi-dom0.init.o
else else
# Add stub.o to EFIOBJ-y to re-use the clean-files in obj-y += common-stub.o
# efi-common.mk. Otherwise the link of stub.c in arm/efi
# will not be cleaned in "make clean".
EFIOBJ-y += stub.o
obj-y += stub.o
$(obj)/stub.o: CFLAGS-y += -fno-short-wchar $(obj)/stub.o: CFLAGS-y += -fno-short-wchar
+1 -1
View File
@@ -11,7 +11,7 @@ $(obj)/boot.init.o: $(obj)/buildid.o
$(call cc-option-add,cflags-stack-boundary,CC,-mpreferred-stack-boundary=4) $(call cc-option-add,cflags-stack-boundary,CC,-mpreferred-stack-boundary=4)
$(addprefix $(obj)/,$(EFIOBJ-y)): CFLAGS_stack_boundary := $(cflags-stack-boundary) $(addprefix $(obj)/,$(EFIOBJ-y)): CFLAGS_stack_boundary := $(cflags-stack-boundary)
obj-y := stub.o obj-y := common-stub.o stub.o
obj-$(XEN_BUILD_EFI) := $(filter-out %.init.o,$(EFIOBJ-y)) obj-$(XEN_BUILD_EFI) := $(filter-out %.init.o,$(EFIOBJ-y))
obj-bin-$(XEN_BUILD_EFI) := $(filter %.init.o,$(EFIOBJ-y)) obj-bin-$(XEN_BUILD_EFI) := $(filter %.init.o,$(EFIOBJ-y))
extra-$(XEN_BUILD_EFI) += buildid.o relocs-dummy.o extra-$(XEN_BUILD_EFI) += buildid.o relocs-dummy.o
-7
View File
@@ -8,7 +8,6 @@
#include <efi/eficon.h> #include <efi/eficon.h>
#include <efi/efidevp.h> #include <efi/efidevp.h>
#include <efi/efiapi.h> #include <efi/efiapi.h>
#include "../../../common/efi/stub.c"
/* /*
* Here we are in EFI stub. EFI calls are not supported due to lack * Here we are in EFI stub. EFI calls are not supported due to lack
@@ -55,9 +54,3 @@ bool efi_boot_mem_unused(unsigned long *start, unsigned long *end)
} }
void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t l4e) { } void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t l4e) { }
int efi_compat_get_info(uint32_t idx, union compat_pf_efi_info *)
__attribute__((__alias__("efi_get_info")));
int efi_compat_runtime_call(struct compat_pf_efi_runtime_call *)
__attribute__((__alias__("efi_runtime_call")));
@@ -30,3 +30,13 @@ int efi_runtime_call(struct xenpf_efi_runtime_call *op)
{ {
return -ENOSYS; return -ENOSYS;
} }
#ifdef CONFIG_COMPAT
int efi_compat_get_info(uint32_t idx, union compat_pf_efi_info *)
__attribute__((__alias__("efi_get_info")));
int efi_compat_runtime_call(struct compat_pf_efi_runtime_call *)
__attribute__((__alias__("efi_runtime_call")));
#endif
+2 -2
View File
@@ -9,9 +9,9 @@ CFLAGS-y += -iquote $(srcdir)
# e.g.: It transforms "dir/foo/bar" into successively # e.g.: It transforms "dir/foo/bar" into successively
# "dir foo bar", ".. .. ..", "../../.." # "dir foo bar", ".. .. ..", "../../.."
$(obj)/%.c: $(srctree)/common/efi/%.c FORCE $(obj)/%.c: $(srctree)/common/efi/%.c FORCE
$(Q)test -f $@ || \ $(Q)ln -nfs $(subst $(space),/,$(patsubst %,..,$(subst /, ,$(obj))))/source/common/efi/$(<F) $@
ln -nfs $(subst $(space),/,$(patsubst %,..,$(subst /, ,$(obj))))/source/common/efi/$(<F) $@
clean-files += $(patsubst %.o, %.c, $(EFIOBJ-y:.init.o=.o) $(EFIOBJ-)) clean-files += $(patsubst %.o, %.c, $(EFIOBJ-y:.init.o=.o) $(EFIOBJ-))
clean-files += common-stub.c
.PRECIOUS: $(obj)/%.c .PRECIOUS: $(obj)/%.c
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.