[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 09/10] lib/syscall_shim: introduce uk_syscall_dynamic
Hey Yuri,thanks for this patch. As with the previous patches regarding Makefile.uk, can you apply the same changes here (build_cmd and variable name spacing)? See my other comments inline. On 04.06.19 18:28, Yuri Volchkov wrote: The macro layer is efficient, but the exact syscall must be known at the compilation stage. If a syscall number is kept in a variable macro layer will not be able to resolve it to the syscall function. For this case another file is generated - syscall_entry.c. Where syscalls are 'dynamically' resolved into a destination functions. Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx> --- lib/syscall_shim/Makefile.uk | 9 +++++- lib/syscall_shim/entry.c.in_end | 15 ++++++++++ lib/syscall_shim/gen_entry.awk | 40 +++++++++++++++++++++++++++ lib/syscall_shim/include/uk/syscall.h | 2 ++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 lib/syscall_shim/entry.c.in_end create mode 100644 lib/syscall_shim/gen_entry.awk diff --git a/lib/syscall_shim/Makefile.uk b/lib/syscall_shim/Makefile.uk index 67677fc6..5ea15963 100644 --- a/lib/syscall_shim/Makefile.uk +++ b/lib/syscall_shim/Makefile.uk @@ -7,7 +7,8 @@ __PHONY_GEN_SRC := $(addprefix $(__GEN_INCLUDES_PATH)/, $(__PHONY_GEN_SRC)) __PHONY_GEN_SRC += $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in __PHONY_GEN_SRC_NEW := $(addsuffix .new, $(__PHONY_GEN_SRC))-__GEN_SRC := $(__GEN_INCLUDES_PATH)/provided_syscalls.h+__GEN_SRC := $(__GEN_INCLUDES_PATH)/provided_syscalls.h \ + $(LIBSYSCALL_SHIM_BUILD)/syscall_entry.cUK_PREPARE-$(CONFIG_LIBSYSCALL_SHIM) += $(__PHONY_GEN_SRC) $(__GEN_SRC) @@ -43,6 +44,10 @@ $(__GEN_INCLUDES_PATH)/provided_syscalls.h: $(LIBSYSCALL_SHIM_BUILD)/provided_syprintf "\nUK_SYSCALL_PROTO(%s, %s);\n", $$2, $$1;}' \ $^ > $@+$(LIBSYSCALL_SHIM_BUILD)/syscall_entry.c: $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in $(LIBSYSCALL_SHIM_BASE)/gen_entry.awk+ $(Q) awk -F '-' -f $(LIBSYSCALL_SHIM_BASE)/gen_entry.awk $< > $@ + $(Q) cat $(LIBSYSCALL_SHIM_BASE)/entry.c.in_end >> $@ + $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in.new: $Q echo $(UK_PROVIDED_SYSCALLS-y) | tr ' ' '\n' > $@@@ -55,4 +60,6 @@ CXXINCLUDES-$(CONFIG_LIBSYSCALL_SHIM) += -I$(LIBSYSCALL_SHIM_BUILD)/includeCINCLUDES-y += -I$(LIBSYSCALL_SHIM_BASE)/include CXXINCLUDES-y += -I$(LIBSYSCALL_SHIM_BASE)/include+LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/syscall_entry.c+ LIBSYSCALL_SHIM_CLEAN = $(__PHONY_GEN_SRC) $(__PHONY_GEN_SRC_NEW) $(__GEN_SRC) diff --git a/lib/syscall_shim/entry.c.in_end b/lib/syscall_shim/entry.c.in_end new file mode 100644 index 00000000..58145bbc --- /dev/null +++ b/lib/syscall_shim/entry.c.in_end @@ -0,0 +1,15 @@ + Hum, I am not hundred percent happy with the name `dynamic`. What if you call this function just uk_syscall(long n, ...) instead? This would be more inline with what you know from Linux with long syscall(long numbner, ...) from <sys/syscall.h>. +long uk_syscall_dynamic(long n, ...) +{ + va_list ap; + syscall_arg_t a,b,c,d,e,f; + va_start(ap, n); + a=va_arg(ap, long); + b=va_arg(ap, long); + c=va_arg(ap, long); + d=va_arg(ap, long); + e=va_arg(ap, long); + f=va_arg(ap, long); + va_end(ap); + return __syscall_dynamic(n,a,b,c,d,e,f); +} diff --git a/lib/syscall_shim/gen_entry.awk b/lib/syscall_shim/gen_entry.awk new file mode 100644 index 00000000..92457089 --- /dev/null +++ b/lib/syscall_shim/gen_entry.awk @@ -0,0 +1,40 @@ +BEGIN { + max_args = 6 + print "/* Auto generated file. DO NOT EDIT */\n\n" + + print "#include <uk/syscall.h>" + print "#include <uk/print.h>\n" + + printf "static inline long __syscall_dynamic(long nr, " + for (i = 1; i < max_args; i++) + printf "long arg%d, ",i + printf "long arg%d)\n{\n", max_args + + for (i = 1; i <= max_args; i++) + printf "\t(void) arg%d;\n", i + + print "\n\tswitch (nr) {" +} + + +/[a-zA-Z0-9]+-[0-9]+/{ + name = $1 + sys_name = "SYS_" name + uk_name = "uk_syscall_" name + args_nr = $2 + 0 + printf "\tcase %s:\n", sys_name; + printf "\t\treturn %s(", uk_name; + for (i = 1; i < args_nr; i++) + printf("arg%d, ", i) + if (args_nr > 0) + printf("arg%d", args_nr) + printf(");\n") +} + +END { + printf "\tdefault:\n" + printf "\t\tuk_pr_debug(\"syscall nr %%ld is not implemented\", nr);\n" + printf "\t\terrno = -ENOSYS;\n" + printf "\t\treturn -1;\n" + printf "\t}\n}\n" +} diff --git a/lib/syscall_shim/include/uk/syscall.h b/lib/syscall_shim/include/uk/syscall.h index 19161e5e..13913bab 100644 --- a/lib/syscall_shim/include/uk/syscall.h +++ b/lib/syscall_shim/include/uk/syscall.h @@ -93,6 +93,8 @@ typedef long syscall_arg_t; #include <uk/bits/provided_syscalls.h> #include <uk/bits/syscall_stubs.h>+long uk_syscall_dynamic(long n, ...);+ #define syscall(...) \ UK_CONCAT(__uk_syscall, __SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__) #endif Thanks, Simon _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |