:p
atchew
Login
This is a follow-on mini-series based on the original feedback in [1]. Patch 1 addresses the remaining feedback from [1]. Patch 2 adds a new fragment for auto-generating test harness dependencies. [1] https://lore.kernel.org/xen-devel/aLmZLm2_G48yfPWR@l14/ [2] CI: https://gitlab.com/xen-project/people/dmukhin/xen/-/pipelines/2195624771 Denis Mukhin (2): tests: fixup domid test harness dependencies tests: introduce Tests.mk fragment tools/Tests.mk | 34 ++++++++++++++++++++++++++++++++++ tools/tests/domid/Makefile | 28 +--------------------------- 2 files changed, 35 insertions(+), 27 deletions(-) create mode 100644 tools/Tests.mk -- 2.52.0
From: Denis Mukhin <dmukhin@ford.com> There can be multiple test harnesses per one test target. Fix that by iterating over all prerequisites in emit-harness-nested-rule(). Signed-off-by: Denis Mukhin <dmukhin@ford.com> --- tools/tests/domid/Makefile | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/tests/domid/Makefile b/tools/tests/domid/Makefile index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/domid/Makefile +++ b/tools/tests/domid/Makefile @@ -XXX,XX +XXX,XX @@ $(shell sed -n \ 's/^[ \t]*# *include[ \t]*[<"]\([^">]*\)[">].*/\1/p' $(1) 2>/dev/null) endef -# NB: $1 cannot be a list +# $1 target +# $2 list of test harnesses define emit-harness-nested-rule -$(1): $(CURDIR)/harness.h - mkdir -p $$(@D); - ln -sf $$< $$@; +$(1): $(2) + mkdir -p $$(@D); \ + for i in $$<; do ln -sf $$$$i $$@; done endef define emit-harness-rules -$(foreach x,$(2),$(call emit-harness-nested-rule,$(CURDIR)/generated/$(x))) +$(foreach x,$(2),$(call \ + emit-harness-nested-rule,$(CURDIR)/generated/$(x),$(CURDIR)/harness.h)) $(1:.c=.o): $(addprefix $(CURDIR)/generated/,$(2)) endef -- 2.52.0
From: Denis Mukhin <dmukhin@ford.com> Add new make fragment for unit tests with auto-generated test harness dependencies. Signed-off-by: Denis Mukhin <dmukhin@ford.com> --- tools/Tests.mk | 34 ++++++++++++++++++++++++++++++++++ tools/tests/domid/Makefile | 30 +----------------------------- 2 files changed, 35 insertions(+), 29 deletions(-) create mode 100644 tools/Tests.mk diff --git a/tools/Tests.mk b/tools/Tests.mk new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/tools/Tests.mk @@ -XXX,XX +XXX,XX @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Unit test fragment. +# +# Copyright 2025 Ford Motor Company + +define list-c-headers +$(shell sed -n \ + 's/^[ \t]*# *include[ \t]*[<"]\([^">]*\)[">].*/\1/p' $(1) 2>/dev/null) +endef + +# $1 target +# $2 list of test harnesses +define emit-harness-nested-rule +$(1): $(2) + mkdir -p $$(@D); \ + for i in $$<; do ln -sf $$$$i $$@; done + +endef + +define emit-harness-rules +$(foreach x,$(2),$(call \ + emit-harness-nested-rule,$(CURDIR)/generated/$(x),$(CURDIR)/harness.h)) +$(1:.c=.o): $(addprefix $(CURDIR)/generated/,$(2)) +endef + +define emit-harness-deps +$(if $(strip $(2)),$(call emit-harness-rules,$1,$2),) +endef + +define vpath-with-harness-deps +vpath $(1) $(2) +$(call emit-harness-deps,$(1),$(call list-c-headers,$(2)$(1))) +endef diff --git a/tools/tests/domid/Makefile b/tools/tests/domid/Makefile index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/domid/Makefile +++ b/tools/tests/domid/Makefile @@ -XXX,XX +XXX,XX @@ XEN_ROOT=$(CURDIR)/../../.. include $(XEN_ROOT)/tools/Rules.mk +include $(XEN_ROOT)/tools/Tests.mk TESTS := test-domid -define list-c-headers -$(shell sed -n \ - 's/^[ \t]*# *include[ \t]*[<"]\([^">]*\)[">].*/\1/p' $(1) 2>/dev/null) -endef - -# $1 target -# $2 list of test harnesses -define emit-harness-nested-rule -$(1): $(2) - mkdir -p $$(@D); \ - for i in $$<; do ln -sf $$$$i $$@; done - -endef - -define emit-harness-rules -$(foreach x,$(2),$(call \ - emit-harness-nested-rule,$(CURDIR)/generated/$(x),$(CURDIR)/harness.h)) -$(1:.c=.o): $(addprefix $(CURDIR)/generated/,$(2)) -endef - -define emit-harness-deps -$(if $(strip $(2)),$(call emit-harness-rules,$1,$2),) -endef - -define vpath-with-harness-deps -vpath $(1) $(2) -$(call emit-harness-deps,$(1),$(call list-c-headers,$(2)$(1))) -endef - .PHONY: all all: $(TESTS) -- 2.52.0
This series introduces the use of a new common unit test fragment across several existing unit tests. Patch 1 contains assorted fixups for the domid Makefile. Patch 2 adds a new fragment for auto-generating test harness dependencies. Patch 3 adds some prerequisite changes for vPCI test (patch 4). Patch 4 switches the vPCI unit test to the new common fragment. Patch 5 switches the PDX unit test to the new common fragment. [1] Link to v2: https://lore.kernel.org/xen-devel/20260111041145.553673-1-dmukhin@ford.com/ [2] CI: https://gitlab.com/xen-project/people/dmukhin/xen/-/pipelines/2323352235 Denis Mukhin (5): tests: fixup domid make fragment tests: use unit test fragment in domid test xen/include: customize headers for host builds tests: use unit test fragment in vPCI test tests: use unit test fragment in PDX test tools/tests/Rules.mk | 106 ++++++++++++++++++++++++++++++++++++ tools/tests/domid/Makefile | 68 ++--------------------- tools/tests/pdx/.gitignore | 2 +- tools/tests/pdx/Makefile | 59 ++++++-------------- tools/tests/pdx/harness.h | 2 +- tools/tests/pdx/test-pdx.c | 2 - tools/tests/vpci/.gitignore | 2 + tools/tests/vpci/Makefile | 52 ++++++------------ tools/tests/vpci/emul.h | 50 ++++++----------- tools/tests/vpci/main.c | 2 - xen/common/pdx.c | 3 +- xen/include/xen/irq.h | 2 + xen/include/xen/list.h | 2 + xen/include/xen/numa.h | 2 + xen/include/xen/pci.h | 2 + xen/include/xen/pdx.h | 2 + xen/include/xen/pfn.h | 2 + xen/include/xen/spinlock.h | 2 + xen/include/xen/types.h | 4 ++ 19 files changed, 185 insertions(+), 181 deletions(-) create mode 100644 tools/tests/Rules.mk create mode 100644 tools/tests/vpci/.gitignore -- 2.52.0
From: Denis Mukhin <dmukhin@ford.com> Add guard against HOSTCC != CC (similarly to how its done in PDX unit test). Account for multiple test targets in install and uninstall make targets. Honor mocked hypervisor header over tools/include/xen symlinks. Finally, add some clarifications for the functions and do some cleanup. Amends: 2d5065060710 ("xen/domain: unify domain ID allocation") Signed-off-by: Denis Mukhin <dmukhin@ford.com> --- Changes since v2: - fixed emit-harness-nested-rule - honor LDFLAGS_APPEND --- tools/tests/domid/Makefile | 59 +++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/tools/tests/domid/Makefile b/tools/tests/domid/Makefile index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/domid/Makefile +++ b/tools/tests/domid/Makefile @@ -XXX,XX +XXX,XX @@ $(shell sed -n \ 's/^[ \t]*# *include[ \t]*[<"]\([^">]*\)[">].*/\1/p' $(1) 2>/dev/null) endef -# NB: $1 cannot be a list +# Generate mock environment by replicating header file hierarchy; +# each mock header file will point to a harness header. +# +# $1 Hypervisor header. +# $2 Test harness header. define emit-harness-nested-rule -$(1): $(CURDIR)/harness.h - mkdir -p $$(@D); - ln -sf $$< $$@; +$(1): $(2) + set -e; \ + mkdir -p $$(@D); \ + [ -e $$@ ] || ln -s $(2) $$@ endef -define emit-harness-rules -$(foreach x,$(2),$(call emit-harness-nested-rule,$(CURDIR)/generated/$(x))) -$(1:.c=.o): $(addprefix $(CURDIR)/generated/,$(2)) -endef - +# Helper function to emit mock hypervisor code dependencies. +# +# $1 Hypervisor filename. +# $2 Harness filename. define emit-harness-deps -$(if $(strip $(2)),$(call emit-harness-rules,$1,$2),) +$(eval c-file := $(abspath $(1))) +$(eval c-name := $(notdir $(c-file))) +$(eval c-headers := $(call list-c-headers,$(c-file))) +$(eval c-deps := $(addprefix $(CURDIR)/generated/,$(c-headers))) +$(foreach x,$(c-headers),$(call emit-harness-nested-rule,\ + $(addprefix $(CURDIR)/generated/,$(x)),\ + $(2))) +$(c-name:%.c=%.o): $(c-file) $(c-deps) + $(CC) $(CFLAGS) -o $$@ -c $$(firstword $$^) + endef +# Emit dependencies for mock hypervisor code. +# +# $1 Hypervisor filename. +# $2 Hypervisor source path. define vpath-with-harness-deps vpath $(1) $(2) -$(call emit-harness-deps,$(1),$(call list-c-headers,$(2)$(1))) +$(call emit-harness-deps,$(addprefix $(2),$(1)),\ + $(CURDIR)/harness.h) endef .PHONY: all @@ -XXX,XX +XXX,XX @@ all: $(TESTS) .PHONY: run run: $(TESTS) +ifeq ($(CC),$(HOSTCC)) set -e; $(foreach t,$(TESTS),./$(t);) +else + $(warning HOSTCC != CC, will not run test) +endif .PHONY: clean clean: @@ -XXX,XX +XXX,XX @@ distclean: clean .PHONY: install install: all $(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests - $(INSTALL_PROG) test-domid $(DESTDIR)$(LIBEXEC)/tests + set -e; $(foreach t,$(TESTS),$(INSTALL_PROG) $t $(DESTDIR)$(LIBEXEC)/tests;) .PHONY: uninstall uninstall: - $(RM) -- $(DESTDIR)$(LIBEXEC)/tests/test-domid + set -e; $(foreach t,$(TESTS),$(RM) -- $(DESTDIR)$(LIBEXEC)/tests/$t;) -CFLAGS += -D__XEN_TOOLS__ # find-next-bit.c CFLAGS += '-DEXPORT_SYMBOL(x)=' \ -Dfind_first_bit \ @@ -XXX,XX +XXX,XX @@ CFLAGS += '-DEXPORT_SYMBOL(x)=' \ -Dfind_next_bit \ -Dfind_next_bit_le \ -Dfind_next_zero_bit_le -CFLAGS += $(APPEND_CFLAGS) + +CFLAGS += -D__XEN_TOOLS__ + +# Honor mock hypervisor headers over tools/include/xen +CFLAGS += -I$(CURDIR)/generated/ CFLAGS += $(CFLAGS_xeninclude) -CFLAGS += -I./generated/ +CFLAGS += $(APPEND_CFLAGS) LDFLAGS += $(APPEND_LDFLAGS) @@ -XXX,XX +XXX,XX @@ $(eval $(call vpath-with-harness-deps,domid.c,$(XEN_ROOT)/xen/common/)) test-domid: domid.o find-next-bit.o test-domid.o $(CC) $^ -o $@ $(LDFLAGS) +ifeq ($(filter clean distclean,$(MAKECMDGOALS)),) -include $(DEPS_INCLUDE) +endif -- 2.52.0
From: Denis Mukhin <dmukhin@ford.com> Introduce common fragment for unit tests to minimize some code duplication. Use the new make fragment to generate test harness code for the domain ID allocator unit test. Introduce CFLAGS dedicated for find-next-bit.c only to avoid contaminating global CFLAGS. Signed-off-by: Denis Mukhin <dmukhin@ford.com> --- Changes since v2: - honor LDFLAGS --- tools/tests/Rules.mk | 93 +++++++++++++++++++++++++++++++++++++ tools/tests/domid/Makefile | 95 ++------------------------------------ 2 files changed, 98 insertions(+), 90 deletions(-) create mode 100644 tools/tests/Rules.mk diff --git a/tools/tests/Rules.mk b/tools/tests/Rules.mk new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/tools/tests/Rules.mk @@ -XXX,XX +XXX,XX @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Common unit test fragment. +# + +include $(XEN_ROOT)/tools/Rules.mk + +define list-c-headers +$(shell sed -n \ + 's/^[ \t]*# *include[ \t]*[<"]\([^">]*\)[">].*/\1/p' $(1) 2>/dev/null) +endef + +# Generate mock environment by replicating header file hierarchy; +# each mock header file will point to a harness header. +# +# $1 Hypervisor header. +# $2 Test harness header. +define emit-harness-nested-rule +$(1): $(2) + set -e; \ + mkdir -p $$(@D); \ + [ -e $$@ ] || ln -s $(2) $$@ + +endef + +# Helper function to emit mock hypervisor code dependencies. +# +# $1 Hypervisor filename. +# $2 Harness filename. +define emit-harness-deps +$(eval c-file := $(abspath $(1))) +$(eval c-name := $(notdir $(c-file))) +$(eval c-headers := $(call list-c-headers,$(c-file))) +$(eval c-deps := $(addprefix $(CURDIR)/generated/,$(c-headers))) +$(foreach x,$(c-headers),$(call emit-harness-nested-rule,\ + $(addprefix $(CURDIR)/generated/,$(x)),\ + $(2))) +$(c-name:%.c=%.o): $(c-file) $(c-deps) + $(CC) $(CFLAGS) -o $$@ -c $$(firstword $$^) + +endef + +# Emit dependencies for mock hypervisor code. +# +# $1 Hypervisor filename. +# $2 Hypervisor source path. +define vpath-with-harness-deps +vpath $(1) $(2) +$(call emit-harness-deps,$(addprefix $(2),$(1)),\ + $(CURDIR)/harness.h) +endef + +.PHONY: all +all: $(TESTS) + +.PHONY: run +run: $(TESTS) +ifeq ($(CC),$(HOSTCC)) + set -e; $(foreach t,$(TESTS),./$(t);) +else + $(warning HOSTCC != CC, will not run test) +endif + +.PHONY: clean +clean: + $(RM) -r generated + $(RM) -- *.o $(TESTS) $(DEPS_RM) + +.PHONY: distclean +distclean: clean + $(RM) -- *~ + +.PHONY: install +install: all + $(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests + set -e; $(foreach t,$(TESTS),$(INSTALL_PROG) $t $(DESTDIR)$(LIBEXEC)/tests;) + +.PHONY: uninstall +uninstall: + set -e; $(foreach t,$(TESTS),$(RM) -- $(DESTDIR)$(LIBEXEC)/tests/$t;) + +CFLAGS += -D__XEN_TOOLS__ + +# Honor mock hypervisor headers over tools/include/xen +CFLAGS += -I$(CURDIR)/generated/ +CFLAGS += $(CFLAGS_xeninclude) +CFLAGS += $(APPEND_CFLAGS) + +LDFLAGS += $(APPEND_LDFLAGS) + +ifeq ($(filter clean distclean,$(MAKECMDGOALS)),) +-include $(DEPS_INCLUDE) +endif diff --git a/tools/tests/domid/Makefile b/tools/tests/domid/Makefile index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/domid/Makefile +++ b/tools/tests/domid/Makefile @@ -XXX,XX +XXX,XX @@ # # Copyright 2025 Ford Motor Company -XEN_ROOT=$(CURDIR)/../../.. -include $(XEN_ROOT)/tools/Rules.mk - TESTS := test-domid -define list-c-headers -$(shell sed -n \ - 's/^[ \t]*# *include[ \t]*[<"]\([^">]*\)[">].*/\1/p' $(1) 2>/dev/null) -endef - -# Generate mock environment by replicating header file hierarchy; -# each mock header file will point to a harness header. -# -# $1 Hypervisor header. -# $2 Test harness header. -define emit-harness-nested-rule -$(1): $(2) - set -e; \ - mkdir -p $$(@D); \ - [ -e $$@ ] || ln -s $(2) $$@ - -endef - -# Helper function to emit mock hypervisor code dependencies. -# -# $1 Hypervisor filename. -# $2 Harness filename. -define emit-harness-deps -$(eval c-file := $(abspath $(1))) -$(eval c-name := $(notdir $(c-file))) -$(eval c-headers := $(call list-c-headers,$(c-file))) -$(eval c-deps := $(addprefix $(CURDIR)/generated/,$(c-headers))) -$(foreach x,$(c-headers),$(call emit-harness-nested-rule,\ - $(addprefix $(CURDIR)/generated/,$(x)),\ - $(2))) -$(c-name:%.c=%.o): $(c-file) $(c-deps) - $(CC) $(CFLAGS) -o $$@ -c $$(firstword $$^) - -endef - -# Emit dependencies for mock hypervisor code. -# -# $1 Hypervisor filename. -# $2 Hypervisor source path. -define vpath-with-harness-deps -vpath $(1) $(2) -$(call emit-harness-deps,$(addprefix $(2),$(1)),\ - $(CURDIR)/harness.h) -endef - -.PHONY: all -all: $(TESTS) - -.PHONY: run -run: $(TESTS) -ifeq ($(CC),$(HOSTCC)) - set -e; $(foreach t,$(TESTS),./$(t);) -else - $(warning HOSTCC != CC, will not run test) -endif - -.PHONY: clean -clean: - $(RM) -r generated - $(RM) -- *.o $(TESTS) $(DEPS_RM) - -.PHONY: distclean -distclean: clean - $(RM) -- *~ - -.PHONY: install -install: all - $(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests - set -e; $(foreach t,$(TESTS),$(INSTALL_PROG) $t $(DESTDIR)$(LIBEXEC)/tests;) - -.PHONY: uninstall -uninstall: - set -e; $(foreach t,$(TESTS),$(RM) -- $(DESTDIR)$(LIBEXEC)/tests/$t;) +XEN_ROOT = $(CURDIR)/../../.. +include $(XEN_ROOT)/tools/tests/Rules.mk # find-next-bit.c -CFLAGS += '-DEXPORT_SYMBOL(x)=' \ +CFLAGS-find-next-bit.c += '-DEXPORT_SYMBOL(x)=' \ -Dfind_first_bit \ -Dfind_first_zero_bit \ -Dfind_next_bit \ -Dfind_next_bit_le \ -Dfind_next_zero_bit_le -CFLAGS += -D__XEN_TOOLS__ - -# Honor mock hypervisor headers over tools/include/xen -CFLAGS += -I$(CURDIR)/generated/ -CFLAGS += $(CFLAGS_xeninclude) -CFLAGS += $(APPEND_CFLAGS) - -LDFLAGS += $(APPEND_LDFLAGS) +find-next-bit.o: CFLAGS += $(CFLAGS-find-next-bit.c) vpath find-next-bit.c $(XEN_ROOT)/xen/lib/ @@ -XXX,XX +XXX,XX @@ vpath find-next-bit.c $(XEN_ROOT)/xen/lib/ $(eval $(call vpath-with-harness-deps,domid.c,$(XEN_ROOT)/xen/common/)) test-domid: domid.o find-next-bit.o test-domid.o - $(CC) $^ -o $@ $(LDFLAGS) - -ifeq ($(filter clean distclean,$(MAKECMDGOALS)),) --include $(DEPS_INCLUDE) -endif + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -- 2.52.0
From: Denis Mukhin <dmukhin@ford.com> Update hypervisor headers to allow vpci.c to compile in a host build environment, as required for the vPCI unit test. Signed-off-by: Denis Mukhin <dmukhin@ford.com> --- Changes since v2: - new patch --- xen/include/xen/irq.h | 2 ++ xen/include/xen/list.h | 2 ++ xen/include/xen/numa.h | 2 ++ xen/include/xen/pci.h | 2 ++ xen/include/xen/pfn.h | 2 ++ xen/include/xen/spinlock.h | 2 ++ xen/include/xen/types.h | 4 ++++ 7 files changed, 16 insertions(+) diff --git a/xen/include/xen/irq.h b/xen/include/xen/irq.h index XXXXXXX..XXXXXXX 100644 --- a/xen/include/xen/irq.h +++ b/xen/include/xen/irq.h @@ -XXX,XX +XXX,XX @@ #ifndef __XEN_IRQ_H__ #define __XEN_IRQ_H__ +#ifdef __XEN__ #include <xen/cpumask.h> #include <xen/rcupdate.h> @@ -XXX,XX +XXX,XX @@ unsigned int arch_hwdom_irqs(const struct domain *d); void arch_evtchn_bind_pirq(struct domain *d, int pirq); #endif +#endif /* __XEN__ */ #endif /* __XEN_IRQ_H__ */ diff --git a/xen/include/xen/list.h b/xen/include/xen/list.h index XXXXXXX..XXXXXXX 100644 --- a/xen/include/xen/list.h +++ b/xen/include/xen/list.h @@ -XXX,XX +XXX,XX @@ #ifndef __XEN_LIST_H__ #define __XEN_LIST_H__ +#ifdef __XEN__ #include <xen/bug.h> #include <asm/system.h> +#endif /* * These are non-NULL pointers that will result in faults under normal diff --git a/xen/include/xen/numa.h b/xen/include/xen/numa.h index XXXXXXX..XXXXXXX 100644 --- a/xen/include/xen/numa.h +++ b/xen/include/xen/numa.h @@ -XXX,XX +XXX,XX @@ #ifndef _XEN_NUMA_H #define _XEN_NUMA_H +#ifdef __XEN__ #include <xen/mm-frame.h> @@ -XXX,XX +XXX,XX @@ static inline nodeid_t mfn_to_nid(mfn_t mfn) #define page_to_nid(pg) mfn_to_nid(page_to_mfn(pg)) +#endif /* __XEN__ */ #endif /* _XEN_NUMA_H */ diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index XXXXXXX..XXXXXXX 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -XXX,XX +XXX,XX @@ #include <xen/numa.h> #include <xen/pci_regs.h> #include <xen/pfn.h> +#ifdef __XEN__ #include <asm/device.h> +#endif /* * The PCI interface treats multi-function devices as independent diff --git a/xen/include/xen/pfn.h b/xen/include/xen/pfn.h index XXXXXXX..XXXXXXX 100644 --- a/xen/include/xen/pfn.h +++ b/xen/include/xen/pfn.h @@ -XXX,XX +XXX,XX @@ #ifndef __XEN_PFN_H__ #define __XEN_PFN_H__ +#ifdef __XEN__ #include <xen/page-size.h> +#endif #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) diff --git a/xen/include/xen/spinlock.h b/xen/include/xen/spinlock.h index XXXXXXX..XXXXXXX 100644 --- a/xen/include/xen/spinlock.h +++ b/xen/include/xen/spinlock.h @@ -XXX,XX +XXX,XX @@ #ifndef __SPINLOCK_H__ #define __SPINLOCK_H__ +#ifdef __XEN__ #include <xen/nospec.h> #include <xen/time.h> @@ -XXX,XX +XXX,XX @@ static always_inline void nrspin_lock_irq(rspinlock_t *l) #define nrspin_unlock_irqrestore(l, f) _nrspin_unlock_irqrestore(l, f) #define nrspin_unlock_irq(l) _nrspin_unlock_irq(l) +#endif /* __XEN__ */ #endif /* __SPINLOCK_H__ */ diff --git a/xen/include/xen/types.h b/xen/include/xen/types.h index XXXXXXX..XXXXXXX 100644 --- a/xen/include/xen/types.h +++ b/xen/include/xen/types.h @@ -XXX,XX +XXX,XX @@ #include <xen/stdbool.h> #include <xen/stdint.h> +#ifdef __XEN__ /* Linux inherited types which are being phased out */ typedef uint8_t u8; typedef uint16_t u16; @@ -XXX,XX +XXX,XX @@ typedef uint64_t u64; typedef __SIZE_TYPE__ size_t; typedef signed long ssize_t; +#endif /* __XEN__ */ typedef __PTRDIFF_TYPE__ ptrdiff_t; typedef __UINTPTR_TYPE__ uintptr_t; @@ -XXX,XX +XXX,XX @@ typedef __UINTPTR_TYPE__ uintptr_t; #define NULL ((void*)0) #endif +#ifdef __XEN__ #define INT8_MIN (-127-1) #define INT16_MIN (-32767-1) #define INT32_MIN (-2147483647-1) @@ -XXX,XX +XXX,XX @@ typedef __UINTPTR_TYPE__ uintptr_t; #define LONG_MAX ((long)(~0UL>>1)) #define LONG_MIN (-LONG_MAX - 1) #define ULONG_MAX (~0UL) +#endif /* __XEN__ */ typedef uint16_t __le16; typedef uint16_t __be16; -- 2.52.0
From: Denis Mukhin <dmukhin@ford.com> Use the new make fragment to generate test harness code for the vPCI unit test. Add new prepare-harness target to tests/Rules.mk as an optional step for setting up mocked environment for building a test. Add ability to override the test harness header file. Fix hypervisor headers used to compile vpci.c against host environment where necessary. Fixup emul.h by adding missing mocks to account for new unit test infra. Update .gitignore to exclude generated test build-time dependencies. Signed-off-by: Denis Mukhin <dmukhin@ford.com> --- Changes since v2: - moved hypervisor headers changes to a separate patch --- tools/tests/Rules.mk | 8 ++++-- tools/tests/vpci/.gitignore | 2 ++ tools/tests/vpci/Makefile | 52 ++++++++++++------------------------- tools/tests/vpci/emul.h | 50 +++++++++++++---------------------- tools/tests/vpci/main.c | 2 -- 5 files changed, 42 insertions(+), 72 deletions(-) create mode 100644 tools/tests/vpci/.gitignore diff --git a/tools/tests/Rules.mk b/tools/tests/Rules.mk index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/Rules.mk +++ b/tools/tests/Rules.mk @@ -XXX,XX +XXX,XX @@ $(shell sed -n \ 's/^[ \t]*# *include[ \t]*[<"]\([^">]*\)[">].*/\1/p' $(1) 2>/dev/null) endef +.PHONY: prepare-harness +prepare-harness: + # Generate mock environment by replicating header file hierarchy; # each mock header file will point to a harness header. # # $1 Hypervisor header. # $2 Test harness header. define emit-harness-nested-rule -$(1): $(2) +$(1): prepare-harness $(2) set -e; \ mkdir -p $$(@D); \ [ -e $$@ ] || ln -s $(2) $$@ @@ -XXX,XX +XXX,XX @@ endef # # $1 Hypervisor filename. # $2 Hypervisor source path. +# $3 Harness header filename (optional). define vpath-with-harness-deps vpath $(1) $(2) $(call emit-harness-deps,$(addprefix $(2),$(1)),\ - $(CURDIR)/harness.h) + $(strip $(or $(3),$(CURDIR)/harness.h))) endef .PHONY: all diff --git a/tools/tests/vpci/.gitignore b/tools/tests/vpci/.gitignore new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/tools/tests/vpci/.gitignore @@ -XXX,XX +XXX,XX @@ +/generated +test-vpci diff --git a/tools/tests/vpci/Makefile b/tools/tests/vpci/Makefile index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/vpci/Makefile +++ b/tools/tests/vpci/Makefile @@ -XXX,XX +XXX,XX @@ -XEN_ROOT=$(CURDIR)/../../.. -include $(XEN_ROOT)/tools/Rules.mk +# SPDX-License-Identifier: GPL-2.0-only +# +# Unit tests for vPCI. +# -TARGET := test_vpci +TESTS := test-vpci -.PHONY: all -all: $(TARGET) +XEN_ROOT = $(CURDIR)/../../.. +CFLAGS += -DCONFIG_HAS_VPCI -.PHONY: run -run: $(TARGET) -ifeq ($(CC),$(HOSTCC)) - ./$(TARGET) -else - $(warning HOSTCC != CC, will not run test) -endif +include $(XEN_ROOT)/tools/tests/Rules.mk -$(TARGET): vpci.c vpci.h list.h main.c emul.h - $(CC) $(CFLAGS_xeninclude) -g -o $@ vpci.c main.c +# Do not mock xen/vpci.h header for the test +prepare-harness: + set -e; mkdir -p $(CURDIR)/generated/xen; \ + ln -sf $(XEN_ROOT)/xen/include/xen/vpci.h $(CURDIR)/generated/xen -.PHONY: clean -clean: - rm -rf $(TARGET) *.o *~ vpci.h vpci.c list.h +CFLAGS += -I $(XEN_ROOT)/xen/include/ -.PHONY: distclean -distclean: clean +$(eval $(call vpath-with-harness-deps,vpci.c,$(XEN_ROOT)/xen/drivers/vpci/,$(CURDIR)/emul.h)) -.PHONY: install -install: all - $(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests - $(INSTALL_PROG) $(TARGET) $(DESTDIR)$(LIBEXEC)/tests - -.PHONY: uninstall -uninstall: - $(RM) -- $(DESTDIR)$(LIBEXEC)/tests/$(TARGET) - -vpci.c: $(XEN_ROOT)/xen/drivers/vpci/vpci.c - # Remove includes and add the test harness header - sed -e '/#include/d' -e '1s/^/#include "emul.h"/' <$< >$@ - -list.h: $(XEN_ROOT)/xen/include/xen/list.h -vpci.h: $(XEN_ROOT)/xen/include/xen/vpci.h -list.h vpci.h: - sed -e '/#include/d' <$< >$@ +test-vpci: vpci.o main.o + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ diff --git a/tools/tests/vpci/emul.h b/tools/tests/vpci/emul.h index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/vpci/emul.h +++ b/tools/tests/vpci/emul.h @@ -XXX,XX +XXX,XX @@ #define ASSERT(x) assert(x) #define __must_check __attribute__((__warn_unused_result__)) #define cf_check +#define always_inline inline -#include "list.h" +typedef int64_t s_time_t; +typedef uint8_t nodeid_t; +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +#include <xen/list.h> typedef bool rwlock_t; @@ -XXX,XX +XXX,XX @@ struct domain { rwlock_t pci_lock; }; -struct pci_dev { - struct vpci *vpci; -}; - struct vcpu { struct domain *domain; @@ -XXX,XX +XXX,XX @@ extern const struct pci_dev test_pdev; typedef bool spinlock_t; #define spin_lock_init(l) (*(l) = false) -#define spin_lock(l) (*(l) = true) -#define spin_unlock(l) (*(l) = false) -#define read_lock(l) (*(l) = true) -#define read_unlock(l) (*(l) = false) -#define write_lock(l) (*(l) = true) -#define write_unlock(l) (*(l) = false) +#define spin_lock(l) (assert(!*(l)), *(l) = true) +#define spin_unlock(l) (assert(*(l)), *(l) = false) +#define read_lock(l) (assert(!*(l)), *(l) = true) +#define read_unlock(l) (assert(*(l)), *(l) = false) +#define write_lock(l) (assert(!*(l)), *(l) = true) +#define write_unlock(l) (assert(*(l)), *(l) = false) -typedef union { - uint32_t sbdf; - struct { - union { - uint16_t bdf; - struct { - union { - struct { - uint8_t func : 3, - dev : 5; - }; - uint8_t extfunc; - }; - uint8_t bus; - }; - }; - uint16_t seg; - }; -} pci_sbdf_t; +#define lock_evaluate_nospec(l) (l) +#define block_lock_speculation() -#define CONFIG_HAS_VPCI -#include "vpci.h" +#include <xen/vpci.h> #define __hwdom_init diff --git a/tools/tests/vpci/main.c b/tools/tests/vpci/main.c index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/vpci/main.c +++ b/tools/tests/vpci/main.c @@ -XXX,XX +XXX,XX @@ main(int argc, char **argv) uint32_t r24 = 0; uint8_t r28, r30; struct mask_data r32; - unsigned int i; - int rc; INIT_LIST_HEAD(&vpci.handlers); spin_lock_init(&vpci.lock); -- 2.52.0
From: Denis Mukhin <dmukhin@ford.com> Use the new make fragment to generate test harness code for the PDX unit test. Add ability to pass custom CFLAGS for mock code and object file suffix. Move <xen/bitops.h> earlier in xen/common/pdx.c to ensure harness.h is included before triggering the #ifndef MAX_PFN_RANGES check when building a unit test. Additionally, use real <xen/pdx.h> in harness.h instead of a locally copied version. Update .gitignore to exclude generated test build-time dependencies. Signed-off-by: Denis Mukhin <dmukhin@ford.com> --- Changes since v2: - added lost -DCONFIG_PDX_OFFSET_COMPRESSION test --- tools/tests/Rules.mk | 19 ++++++++---- tools/tests/pdx/.gitignore | 2 +- tools/tests/pdx/Makefile | 59 +++++++++++--------------------------- tools/tests/pdx/harness.h | 2 +- tools/tests/pdx/test-pdx.c | 2 -- xen/common/pdx.c | 3 +- xen/include/xen/pdx.h | 2 ++ 7 files changed, 36 insertions(+), 53 deletions(-) diff --git a/tools/tests/Rules.mk b/tools/tests/Rules.mk index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/Rules.mk +++ b/tools/tests/Rules.mk @@ -XXX,XX +XXX,XX @@ prepare-harness: # Generate mock environment by replicating header file hierarchy; # each mock header file will point to a harness header. # +# NB: double-colon rule for mocking environment for multiple tests. +# # $1 Hypervisor header. # $2 Test harness header. define emit-harness-nested-rule -$(1): prepare-harness $(2) - set -e; \ +$(1):: prepare-harness $(2) + @set -e; \ mkdir -p $$(@D); \ [ -e $$@ ] || ln -s $(2) $$@ @@ -XXX,XX +XXX,XX @@ endef # # $1 Hypervisor filename. # $2 Harness filename. +# $3 Extra CFLAGS. +# $4 Object file suffix. define emit-harness-deps $(eval c-file := $(abspath $(1))) $(eval c-name := $(notdir $(c-file))) $(eval c-headers := $(call list-c-headers,$(c-file))) $(eval c-deps := $(addprefix $(CURDIR)/generated/,$(c-headers))) +$(eval c-obj := $(if $(strip $(4)),-$(strip $(4)),)) $(foreach x,$(c-headers),$(call emit-harness-nested-rule,\ $(addprefix $(CURDIR)/generated/,$(x)),\ $(2))) -$(c-name:%.c=%.o): $(c-file) $(c-deps) - $(CC) $(CFLAGS) -o $$@ -c $$(firstword $$^) +$(c-name:%.c=%$(c-obj).o): $(c-file) $(c-deps) + $(CC) $(3) $(CFLAGS) -o $$@ -c $$(firstword $$^) endef @@ -XXX,XX +XXX,XX @@ endef # $1 Hypervisor filename. # $2 Hypervisor source path. # $3 Harness header filename (optional). +# $4 Extra CFLAGS (optional). +# $5 Object file suffix (optional). define vpath-with-harness-deps vpath $(1) $(2) $(call emit-harness-deps,$(addprefix $(2),$(1)),\ - $(strip $(or $(3),$(CURDIR)/harness.h))) + $(strip $(or $(3),$(CURDIR)/harness.h)),\ + $(4),\ + $(5)) endef .PHONY: all diff --git a/tools/tests/pdx/.gitignore b/tools/tests/pdx/.gitignore index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/pdx/.gitignore +++ b/tools/tests/pdx/.gitignore @@ -XXX,XX +XXX,XX @@ -/pdx.h +/generated /test-pdx-mask /test-pdx-offset diff --git a/tools/tests/pdx/Makefile b/tools/tests/pdx/Makefile index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/pdx/Makefile +++ b/tools/tests/pdx/Makefile @@ -XXX,XX +XXX,XX @@ -XEN_ROOT=$(CURDIR)/../../.. -include $(XEN_ROOT)/tools/Rules.mk +# SPDX-License-Identifier: GPL-2.0-only +# +# Unit tests for PDX (Page inDeX). +# -TARGETS := test-pdx-mask test-pdx-offset +TESTS := test-pdx-mask test-pdx-offset -.PHONY: all -all: $(TARGETS) +XEN_ROOT = $(CURDIR)/../../.. -.PHONY: run -run: $(TARGETS) -ifeq ($(CC),$(HOSTCC)) - set -e; \ - for test in $? ; do \ - ./$$test ; \ - done -else - $(warning HOSTCC != CC, will not run test) -endif +include $(XEN_ROOT)/tools/tests/Rules.mk -.PHONY: clean -clean: - $(RM) -- *.o $(TARGETS) $(DEPS_RM) pdx.h +CFLAGS += -I $(XEN_ROOT)/xen/include/ -.PHONY: distclean -distclean: clean - $(RM) -- *~ +$(eval $(call vpath-with-harness-deps,pdx.c,$(XEN_ROOT)/xen/common/,,-DCONFIG_PDX_MASK_COMPRESSION,mask)) +test-pdx-mask.o: test-pdx.c + $(CC) -DCONFIG_PDX_MASK_COMPRESSION $(CFLAGS) -o $@ -c $^ -.PHONY: install -install: all - $(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests - $(INSTALL_PROG) $(TARGETS) $(DESTDIR)$(LIBEXEC)/tests +$(eval $(call vpath-with-harness-deps,pdx.c,$(XEN_ROOT)/xen/common/,,-DCONFIG_PDX_OFFSET_COMPRESSION,offset)) +test-pdx-offset.o: test-pdx.c + $(CC) -DCONFIG_PDX_OFFSET_COMPRESSION $(CFLAGS) -o $@ -c $^ -.PHONY: uninstall -uninstall: - $(RM) -- $(patsubst %,$(DESTDIR)$(LIBEXEC)/tests/%,$(TARGETS)) - -pdx.h: $(XEN_ROOT)/xen/include/xen/pdx.h - sed -e '/^#[[:space:]]*include/d' <$< >$@ - -CFLAGS += -D__XEN_TOOLS__ -CFLAGS += $(APPEND_CFLAGS) -CFLAGS += $(CFLAGS_xeninclude) - -test-pdx-mask: CFLAGS += -DCONFIG_PDX_MASK_COMPRESSION -test-pdx-offset: CFLAGS += -DCONFIG_PDX_OFFSET_COMPRESSION - -test-pdx-%: test-pdx.c pdx.h - $(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_$*.o) -o $@ $< $(APPEND_CFLAGS) - --include $(DEPS_INCLUDE) +test-pdx-%: test-pdx-%.o pdx-%.o + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) diff --git a/tools/tests/pdx/harness.h b/tools/tests/pdx/harness.h index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/pdx/harness.h +++ b/tools/tests/pdx/harness.h @@ -XXX,XX +XXX,XX @@ typedef uint64_t paddr_t; qsort(elem, nr, size, cmp); \ }) -#include "pdx.h" +#include <xen/pdx.h> #endif diff --git a/tools/tests/pdx/test-pdx.c b/tools/tests/pdx/test-pdx.c index XXXXXXX..XXXXXXX 100644 --- a/tools/tests/pdx/test-pdx.c +++ b/tools/tests/pdx/test-pdx.c @@ -XXX,XX +XXX,XX @@ #include "harness.h" -#include "../../xen/common/pdx.c" - struct range { /* Ranges are defined as [start, end). */ unsigned long start, end; diff --git a/xen/common/pdx.c b/xen/common/pdx.c index XXXXXXX..XXXXXXX 100644 --- a/xen/common/pdx.c +++ b/xen/common/pdx.c @@ -XXX,XX +XXX,XX @@ * along with this program; If not, see <http://www.gnu.org/licenses/>. */ +#include <xen/bitops.h> + /* Trim content when built for the test harness. */ #ifdef __XEN__ #include <xen/init.h> #include <xen/mm.h> -#include <xen/bitops.h> #include <xen/nospec.h> #include <xen/param.h> #include <xen/pfn.h> diff --git a/xen/include/xen/pdx.h b/xen/include/xen/pdx.h index XXXXXXX..XXXXXXX 100644 --- a/xen/include/xen/pdx.h +++ b/xen/include/xen/pdx.h @@ -XXX,XX +XXX,XX @@ static inline paddr_t directmapoff_to_maddr_xlate(unsigned long offset) #elif defined(CONFIG_PDX_OFFSET_COMPRESSION) /* CONFIG_PDX_MASK_COMPRESSION */ +#ifdef __XEN__ #include <xen/page-size.h> +#endif #define CONFIG_PDX_NR_LOOKUP (1UL << CONFIG_PDX_OFFSET_TBL_ORDER) #define PDX_TBL_MASK (CONFIG_PDX_NR_LOOKUP - 1) -- 2.52.0