From 23fe2fb999a59ffb8596e1a42bd0ecd65773ff1e Mon Sep 17 00:00:00 2001 From: Simon Kuenzer Date: Thu, 30 Mar 2023 18:32:03 +0200 Subject: [PATCH] lib/syscall_shim: Utilize `SUBBUILD` feature within `Makefile.uk` This commit utilizes the recently added `SUBBUILD` feature of the build system to natively generate all dynamic headers of the library. This has several reasons: 1) The `Makefile.uk` of `syscall_shim` becomes more readable 2) No custom rule for creating the subdirectory structure is needed 3) No custom `awk`-rules are needed for generating the headers 4) The build system can take care of handling build order dependencies Signed-off-by: Simon Kuenzer Reviewed-by: Michalis Pappas Reviewed-by: Robert Kuban Approved-by: Razvan Deaconescu Tested-by: Unikraft CI GitHub-Closes: #938 --- lib/syscall_shim/Makefile.uk | 136 ++++++++---------- lib/syscall_shim/include/uk/syscall.h | 2 +- .../{gen_syscall_map.awk => syscall_map.awk} | 2 +- .../{gen_syscall_nrs.awk => syscall_nrs.awk} | 0 ...{gen_syscall_nrs2.awk => syscall_nrs2.awk} | 0 ...{gen_provided.awk => syscall_provided.awk} | 0 ...call_r_static.awk => syscall_r_static.awk} | 0 ..._syscall_static.awk => syscall_static.awk} | 0 .../{gen_stubs.awk => syscall_stubs.awk} | 0 9 files changed, 61 insertions(+), 79 deletions(-) rename lib/syscall_shim/{gen_syscall_map.awk => syscall_map.awk} (97%) rename lib/syscall_shim/{gen_syscall_nrs.awk => syscall_nrs.awk} (100%) rename lib/syscall_shim/{gen_syscall_nrs2.awk => syscall_nrs2.awk} (100%) rename lib/syscall_shim/{gen_provided.awk => syscall_provided.awk} (100%) rename lib/syscall_shim/{gen_syscall_r_static.awk => syscall_r_static.awk} (100%) rename lib/syscall_shim/{gen_syscall_static.awk => syscall_static.awk} (100%) rename lib/syscall_shim/{gen_stubs.awk => syscall_stubs.awk} (100%) diff --git a/lib/syscall_shim/Makefile.uk b/lib/syscall_shim/Makefile.uk index a93fae5dc..9df6cb2cf 100644 --- a/lib/syscall_shim/Makefile.uk +++ b/lib/syscall_shim/Makefile.uk @@ -1,106 +1,88 @@ $(eval $(call addlib_s,libsyscall_shim,$(CONFIG_LIBSYSCALL_SHIM))) -LIBSYSCALL_SHIM_CFLAGS-$(CONFIG_LIBSYSCALL_SHIM_DEBUG) += -DUK_DEBUG +CINCLUDES-$(CONFIG_LIBSYSCALL_SHIM) += -I$(LIBSYSCALL_SHIM_BUILD)/include +CXXINCLUDES-$(CONFIG_LIBSYSCALL_SHIM) += -I$(LIBSYSCALL_SHIM_BUILD)/include +CINCLUDES-y += -I$(LIBSYSCALL_SHIM_BASE)/include +CXXINCLUDES-y += -I$(LIBSYSCALL_SHIM_BASE)/include -LIBSYSCALL_SHIM_INCLUDES_PATH := $(LIBSYSCALL_SHIM_BUILD)/include/uk/bits - -LIBSYSCALL_SHIM_PHONY_SRC := syscall_map.h syscall_stubs.h syscall_nrs.h syscall_nrs2.h -LIBSYSCALL_SHIM_PHONY_SRC := $(addprefix $(LIBSYSCALL_SHIM_INCLUDES_PATH)/, $(LIBSYSCALL_SHIM_PHONY_SRC)) -LIBSYSCALL_SHIM_PHONY_SRC += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in -LIBSYSCALL_SHIM_PHONY_SRC_NEW := $(addsuffix .new, $(LIBSYSCALL_SHIM_PHONY_SRC)) - -LIBSYSCALL_SHIM_GEN_SRC := $(LIBSYSCALL_SHIM_INCLUDES_PATH)/provided_syscalls.h -LIBSYSCALL_SHIM_GEN_SRC += $(LIBSYSCALL_SHIM_INCLUDES_PATH)/syscall_static.h -LIBSYSCALL_SHIM_GEN_SRC += $(LIBSYSCALL_SHIM_INCLUDES_PATH)/syscall_r_static.h - -UK_PREPARE-$(CONFIG_LIBSYSCALL_SHIM) += $(LIBSYSCALL_SHIM_PHONY_SRC) $(LIBSYSCALL_SHIM_GEN_SRC) - -LIBSYSCALL_SHIM_TEMPL := $(LIBSYSCALL_SHIM_BASE)/arch/$(CONFIG_UK_ARCH)/syscall.h.in - -$(if $(shell mkdir -p $(LIBSYSCALL_SHIM_INCLUDES_PATH) && \ - cd $(LIBSYSCALL_SHIM_INCLUDES_PATH) >/dev/null && pwd),,\ - $(error could not create directory $1)) - -.PHONY: $(LIBSYSCALL_SHIM_PHONY_SRC_NEW) - -$(LIBSYSCALL_SHIM_PHONY_SRC): %: %.new - @cmp -s $^ $@; if [ $$? -ne 0 ]; then cp $^ $@; fi - -$(LIBSYSCALL_SHIM_INCLUDES_PATH)/syscall_nrs.h.new: $(LIBSYSCALL_SHIM_BASE)/gen_syscall_nrs.awk $(LIBSYSCALL_SHIM_TEMPL) - $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ - $(AWK) -f $(LIBSYSCALL_SHIM_BASE)/gen_syscall_nrs.awk \ - $(LIBSYSCALL_SHIM_TEMPL) > $@) - -$(LIBSYSCALL_SHIM_INCLUDES_PATH)/syscall_nrs2.h.new: $(LIBSYSCALL_SHIM_BASE)/gen_syscall_nrs2.awk $(LIBSYSCALL_SHIM_TEMPL) - $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ - $(AWK) -f $(LIBSYSCALL_SHIM_BASE)/gen_syscall_nrs2.awk \ - $(LIBSYSCALL_SHIM_TEMPL) > $@) - -$(LIBSYSCALL_SHIM_INCLUDES_PATH)/syscall_map.h.new: $(LIBSYSCALL_SHIM_BASE)/gen_syscall_map.awk $(LIBSYSCALL_SHIM_TEMPL) - $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ - $(AWK) -f $(LIBSYSCALL_SHIM_BASE)/gen_syscall_map.awk \ - $(LIBSYSCALL_SHIM_TEMPL) > $@) - -$(LIBSYSCALL_SHIM_INCLUDES_PATH)/provided_syscalls.h: $(LIBSYSCALL_SHIM_BASE)/gen_provided.awk $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in - $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ - $(AWK) -F '-' -f $(LIBSYSCALL_SHIM_BASE)/gen_provided.awk \ - $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in > $@) +LIBSYSCALL_SHIM_CINCLUDES += -I$(LIBSYSCALL_SHIM_BASE) +LIBSYSCALL_SHIM_COMPFLAGS-$(CONFIG_LIBSYSCALL_SHIM_DEBUG) += -DUK_DEBUG -$(LIBSYSCALL_SHIM_INCLUDES_PATH)/syscall_static.h: $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in $(LIBSYSCALL_SHIM_BASE)/gen_syscall_static.awk - $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ - $(AWK) -F '-' -f $(LIBSYSCALL_SHIM_BASE)/gen_syscall_static.awk $< > $@) +LIBSYSCALL_SHIM_INCLUDES_SUBBUILD := include/uk/bits +LIBSYSCALL_SHIM_ARCH_TEMPLATE := $(LIBSYSCALL_SHIM_BASE)/arch/$(CONFIG_UK_ARCH)/syscall.h.in -$(LIBSYSCALL_SHIM_INCLUDES_PATH)/syscall_r_static.h: $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in $(LIBSYSCALL_SHIM_BASE)/gen_syscall_r_static.awk - $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ - $(AWK) -F '-' -f $(LIBSYSCALL_SHIM_BASE)/gen_syscall_r_static.awk $< > $@) +################################################################################ +# Generate provided_syscalls.in from `UK_PROVIDED_SYSCALLS` variable +################################################################################ -$(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in.new: +$(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in.new: $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ echo $(UK_PROVIDED_SYSCALLS-y) $(UK_PROVIDED_SYSCALLS) | tr ' ' '\n' > $@) -$(LIBSYSCALL_SHIM_INCLUDES_PATH)/syscall_stubs.h.new: $(LIBSYSCALL_SHIM_BASE)/gen_stubs.awk $(LIBSYSCALL_SHIM_TEMPL) - $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ - $(AWK) -f $(LIBSYSCALL_SHIM_BASE)/gen_stubs.awk \ - $(LIBSYSCALL_SHIM_TEMPL) > $@) - -CINCLUDES-$(CONFIG_LIBSYSCALL_SHIM) += -I$(LIBSYSCALL_SHIM_BUILD)/include -CXXINCLUDES-$(CONFIG_LIBSYSCALL_SHIM) += -I$(LIBSYSCALL_SHIM_BUILD)/include -CINCLUDES-y += -I$(LIBSYSCALL_SHIM_BASE)/include -CXXINCLUDES-y += -I$(LIBSYSCALL_SHIM_BASE)/include - -LIBSYSCALL_SHIM_CINCLUDES += -I$(LIBSYSCALL_SHIM_BASE) -LIBSYSCALL_SHIM_COMPFLAGS-$(CONFIG_LIBSYSCALL_SHIM_DEBUG) += -DUK_DEBUG +# Enforce re-creation of provided_syscalls.in.new +.PHONY: $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in.new + +# Update only if we have changes in provided_syscalls.in.new +$(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in: $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in.new + $(call build_cmd,CP,libsyscall_shim,$(notdir $@), \ + cmp -s $^ $@; if [ $$? -ne 0 ]; then cp $^ $@; fi) + +LIBSYSCALL_SHIM_CLEAN += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in.new +LIBSYSCALL_SHIM_CLEAN += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in +################################################################################ + +LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/syscall_provided.awk>.h +LIBSYSCALL_SHIM_SYSCALL_PROVIDED_SUBBUILD = $(LIBSYSCALL_SHIM_INCLUDES_SUBBUILD) +LIBSYSCALL_SHIM_SYSCALL_PROVIDED_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in +LIBSYSCALL_SHIM_SYSCALL_PROVIDED_AWKFLAGS-y += -F '-' +LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/syscall_static.awk>.h +LIBSYSCALL_SHIM_SYSCALL_STATIC_SUBBUILD = $(LIBSYSCALL_SHIM_INCLUDES_SUBBUILD) +LIBSYSCALL_SHIM_SYSCALL_STATIC_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in +LIBSYSCALL_SHIM_SYSCALL_STATIC_AWKFLAGS-y += -F '-' +LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/syscall_r_static.awk>.h +LIBSYSCALL_SHIM_SYSCALL_R_STATIC_SUBBUILD = $(LIBSYSCALL_SHIM_INCLUDES_SUBBUILD) +LIBSYSCALL_SHIM_SYSCALL_R_STATIC_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in +LIBSYSCALL_SHIM_SYSCALL_R_STATIC_AWKFLAGS-y += -F '-' + +LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/syscall_nrs.awk>.h +LIBSYSCALL_SHIM_SYSCALL_NRS_SUBBUILD = $(LIBSYSCALL_SHIM_INCLUDES_SUBBUILD) +LIBSYSCALL_SHIM_SYSCALL_NRS_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_ARCH_TEMPLATE) +LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/syscall_nrs2.awk>.h +LIBSYSCALL_SHIM_SYSCALL_NRS2_SUBBUILD = $(LIBSYSCALL_SHIM_INCLUDES_SUBBUILD) +LIBSYSCALL_SHIM_SYSCALL_NRS2_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_ARCH_TEMPLATE) +LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/syscall_map.awk>.h +LIBSYSCALL_SHIM_SYSCALL_MAP_SUBBUILD = $(LIBSYSCALL_SHIM_INCLUDES_SUBBUILD) +LIBSYSCALL_SHIM_SYSCALL_MAP_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_ARCH_TEMPLATE) +LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/syscall_stubs.awk>.h +LIBSYSCALL_SHIM_SYSCALL_STUBS_SUBBUILD = $(LIBSYSCALL_SHIM_INCLUDES_SUBBUILD) +LIBSYSCALL_SHIM_SYSCALL_STUBS_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_ARCH_TEMPLATE) LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/uk_syscall.awk>.c -LIBSYSCALL_SHIM_UK_SYSCALL_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in +LIBSYSCALL_SHIM_UK_SYSCALL_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in LIBSYSCALL_SHIM_UK_SYSCALL_AWKFLAGS-y += -F '-' LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/uk_syscall_r.awk>.c -LIBSYSCALL_SHIM_UK_SYSCALL_R_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in +LIBSYSCALL_SHIM_UK_SYSCALL_R_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in LIBSYSCALL_SHIM_UK_SYSCALL_R_AWKFLAGS-y += -F '-' - LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/uk_syscall6.awk>.c -LIBSYSCALL_SHIM_UK_SYSCALL6_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in +LIBSYSCALL_SHIM_UK_SYSCALL6_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in LIBSYSCALL_SHIM_UK_SYSCALL6_AWKFLAGS-y += -F '-' LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/uk_syscall6_r.awk>.c -LIBSYSCALL_SHIM_UK_SYSCALL6_R_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in +LIBSYSCALL_SHIM_UK_SYSCALL6_R_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in LIBSYSCALL_SHIM_UK_SYSCALL6_R_AWKFLAGS-y += -F '-' - LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/uk_syscall_r_fn.awk>.c -LIBSYSCALL_SHIM_UK_SYSCALL_R_FN_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in +LIBSYSCALL_SHIM_UK_SYSCALL_R_FN_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.in LIBSYSCALL_SHIM_UK_SYSCALL_R_FN_AWKFLAGS-y += -F '-' -LIBSYSCALL_SHIM_UK_SYSCALL_R_FN_FLAGS-$(call gcc_version_ge,8,0) = -Wno-cast-function-type +LIBSYSCALL_SHIM_UK_SYSCALL_R_FN_FLAGS-$(call gcc_version_ge,8,0) += -Wno-cast-function-type LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/uk_syscall_name.awk>.c -LIBSYSCALL_SHIM_UK_SYSCALL_NAME_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_TEMPL) +LIBSYSCALL_SHIM_UK_SYSCALL_NAME_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_ARCH_TEMPLATE) LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/uk_syscall_name_p.awk>.c -LIBSYSCALL_SHIM_UK_SYSCALL_NAME_P_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_TEMPL) - +LIBSYSCALL_SHIM_UK_SYSCALL_NAME_P_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_ARCH_TEMPLATE) LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/libc_stubs.awk>.c -LIBSYSCALL_SHIM_LIBC_STUBS_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_TEMPL) +LIBSYSCALL_SHIM_LIBC_STUBS_AWKINCLUDES-y += $(LIBSYSCALL_SHIM_ARCH_TEMPLATE) LIBSYSCALL_SHIM_LIBC_STUBS_FLAGS += -fno-builtin LIBSYSCALL_SHIM_LIBC_STUBS_FLAGS-$(call have_gcc) += -Wno-builtin-declaration-mismatch LIBSYSCALL_SHIM_SRCS-$(CONFIG_LIBSYSCALL_SHIM_HANDLER) += $(LIBSYSCALL_SHIM_BASE)/uk_syscall_binary.c|isr + LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/uk_prsyscall.c LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BASE)/vars.c - -LIBSYSCALL_SHIM_CLEAN = $(LIBSYSCALL_SHIM_PHONY_SRC) $(LIBSYSCALL_SHIM_PHONY_SRC_NEW) $(LIBSYSCALL_SHIM_GEN_SRC) $(LIBSYSCALL_SHIM_GEN_SRC) diff --git a/lib/syscall_shim/include/uk/syscall.h b/lib/syscall_shim/include/uk/syscall.h index b5e300b1c..279c31ffd 100644 --- a/lib/syscall_shim/include/uk/syscall.h +++ b/lib/syscall_shim/include/uk/syscall.h @@ -424,7 +424,7 @@ typedef long uk_syscall_arg_t; #ifdef CONFIG_LIBSYSCALL_SHIM #include #include -#include +#include #include #include #include diff --git a/lib/syscall_shim/gen_syscall_map.awk b/lib/syscall_shim/syscall_map.awk similarity index 97% rename from lib/syscall_shim/gen_syscall_map.awk rename to lib/syscall_shim/syscall_map.awk index 5d2c3a0f1..828c5657e 100644 --- a/lib/syscall_shim/gen_syscall_map.awk +++ b/lib/syscall_shim/syscall_map.awk @@ -1,7 +1,7 @@ BEGIN { max_args = 6 print "/* Automatically generated file; DO NOT EDIT */\n" - print "#include \n" + print "#include \n" print "#define _uk_syscall_e_enosys() \\" print "\t({ errno = ENOSYS; (-1); })" print "#define _uk_syscall_r_enosys() \\" diff --git a/lib/syscall_shim/gen_syscall_nrs.awk b/lib/syscall_shim/syscall_nrs.awk similarity index 100% rename from lib/syscall_shim/gen_syscall_nrs.awk rename to lib/syscall_shim/syscall_nrs.awk diff --git a/lib/syscall_shim/gen_syscall_nrs2.awk b/lib/syscall_shim/syscall_nrs2.awk similarity index 100% rename from lib/syscall_shim/gen_syscall_nrs2.awk rename to lib/syscall_shim/syscall_nrs2.awk diff --git a/lib/syscall_shim/gen_provided.awk b/lib/syscall_shim/syscall_provided.awk similarity index 100% rename from lib/syscall_shim/gen_provided.awk rename to lib/syscall_shim/syscall_provided.awk diff --git a/lib/syscall_shim/gen_syscall_r_static.awk b/lib/syscall_shim/syscall_r_static.awk similarity index 100% rename from lib/syscall_shim/gen_syscall_r_static.awk rename to lib/syscall_shim/syscall_r_static.awk diff --git a/lib/syscall_shim/gen_syscall_static.awk b/lib/syscall_shim/syscall_static.awk similarity index 100% rename from lib/syscall_shim/gen_syscall_static.awk rename to lib/syscall_shim/syscall_static.awk diff --git a/lib/syscall_shim/gen_stubs.awk b/lib/syscall_shim/syscall_stubs.awk similarity index 100% rename from lib/syscall_shim/gen_stubs.awk rename to lib/syscall_shim/syscall_stubs.awk -- 2.39.5