[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [UNIKRAFT PATCH v2 3/3] lib/syscall_shim: Provide `uk_syscall6()`, `uk_syscall6_r()`
Reviewed-by: Gaulthier Gain <gaulthier.gain@xxxxxxxxx> > On 21 Apr 2020, at 17:49, Simon Kuenzer <simon.kuenzer@xxxxxxxxx> wrote: > > `uk_syscall6()` and `uk_syscall6_r()` are a variant of `uk_syscall()` and > `uk_syscall_r()` that are not variadic. > > Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> > --- > lib/syscall_shim/Makefile.uk | 13 +++++++ > lib/syscall_shim/{ => arch}/regmap_linuxabi.h | 0 > lib/syscall_shim/gen_uk_syscall6.awk | 39 +++++++++++++++++++ > lib/syscall_shim/gen_uk_syscall6_r.awk | 39 +++++++++++++++++++ > lib/syscall_shim/include/uk/syscall.h | 4 ++ > lib/syscall_shim/uk_syscall6_r.c.in_end | 18 +++++++++ > lib/syscall_shim/uk_syscall_r.c.in_end | 18 --------- > 7 files changed, 113 insertions(+), 18 deletions(-) > rename lib/syscall_shim/{ => arch}/regmap_linuxabi.h (100%) > create mode 100644 lib/syscall_shim/gen_uk_syscall6.awk > create mode 100644 lib/syscall_shim/gen_uk_syscall6_r.awk > create mode 100644 lib/syscall_shim/uk_syscall6_r.c.in_end > > diff --git a/lib/syscall_shim/Makefile.uk b/lib/syscall_shim/Makefile.uk > index ad4c8188..b758f830 100644 > --- a/lib/syscall_shim/Makefile.uk > +++ b/lib/syscall_shim/Makefile.uk > @@ -9,7 +9,9 @@ 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_BUILD)/uk_syscall.c > +LIBSYSCALL_SHIM_GEN_SRC += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall6.c > LIBSYSCALL_SHIM_GEN_SRC += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_r.c > +LIBSYSCALL_SHIM_GEN_SRC += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall6_r.c > LIBSYSCALL_SHIM_GEN_SRC += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_r_fn.c > LIBSYSCALL_SHIM_GEN_SRC += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_name.c > LIBSYSCALL_SHIM_GEN_SRC += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_name_p.c > @@ -48,6 +50,10 @@ $(LIBSYSCALL_SHIM_INCLUDES_PATH)/provided_syscalls.h: > $(LIBSYSCALL_SHIM_BASE)/ge > $(AWK) -F '-' -f $(LIBSYSCALL_SHIM_BASE)/gen_provided.awk \ > $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in > $@) > > +$(LIBSYSCALL_SHIM_BUILD)/uk_syscall6.c: > $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in > $(LIBSYSCALL_SHIM_BASE)/gen_uk_syscall6.awk > + $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ > + $(AWK) -F '-' -f $(LIBSYSCALL_SHIM_BASE)/gen_uk_syscall6.awk $< > > $@) > + > $(LIBSYSCALL_SHIM_BUILD)/uk_syscall.c: > $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in > $(LIBSYSCALL_SHIM_BASE)/gen_uk_syscall.awk > $(LIBSYSCALL_SHIM_BASE)/uk_syscall.c.in_end > $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ > $(AWK) -F '-' -f $(LIBSYSCALL_SHIM_BASE)/gen_uk_syscall.awk $< > > $@ && \ > @@ -58,6 +64,11 @@ $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_r.c: > $(LIBSYSCALL_SHIM_BUILD)/provided_sysca > $(AWK) -F '-' -f $(LIBSYSCALL_SHIM_BASE)/gen_uk_syscall_r.awk > $< > $@ && \ > cat $(LIBSYSCALL_SHIM_BASE)/uk_syscall_r.c.in_end >> $@) > > +$(LIBSYSCALL_SHIM_BUILD)/uk_syscall6_r.c: > $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in > $(LIBSYSCALL_SHIM_BASE)/gen_uk_syscall6_r.awk > $(LIBSYSCALL_SHIM_BASE)/uk_syscall6_r.c.in_end > + $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ > + $(AWK) -F '-' -f $(LIBSYSCALL_SHIM_BASE)/gen_uk_syscall6_r.awk > $< > $@ && \ > + cat $(LIBSYSCALL_SHIM_BASE)/uk_syscall6_r.c.in_end >> $@) > + > $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_r_fn.c: > $(LIBSYSCALL_SHIM_BUILD)/provided_syscalls.h.in > $(LIBSYSCALL_SHIM_BASE)/gen_uk_syscall_r_fn.awk > $(call build_cmd,GEN,libsyscall_shim,$(notdir $@), \ > $(AWK) -F '-' -f > $(LIBSYSCALL_SHIM_BASE)/gen_uk_syscall_r_fn.awk $< > $@) > @@ -93,7 +104,9 @@ CXXINCLUDES-y += -I$(LIBSYSCALL_SHIM_BASE)/include > LIBSYSCALL_SHIM_CINCLUDES += -I$(LIBSYSCALL_SHIM_BASE) > > LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall.c > +LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall6.c > LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_r.c > +LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall6_r.c > LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_r_fn.c > LIBSYSCALL_SHIM_UK_SYSCALL_R_FN_FLAGS+=-Wno-cast-function-type > LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_name.c > diff --git a/lib/syscall_shim/regmap_linuxabi.h > b/lib/syscall_shim/arch/regmap_linuxabi.h > similarity index 100% > rename from lib/syscall_shim/regmap_linuxabi.h > rename to lib/syscall_shim/arch/regmap_linuxabi.h > diff --git a/lib/syscall_shim/gen_uk_syscall6.awk > b/lib/syscall_shim/gen_uk_syscall6.awk > new file mode 100644 > index 00000000..d6eae04e > --- /dev/null > +++ b/lib/syscall_shim/gen_uk_syscall6.awk > @@ -0,0 +1,39 @@ > +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 "long uk_syscall6(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 > + args_nr = $2 + 0 > + printf "\tcase %s:\n", sys_name; > + printf "\t\treturn uk_syscall_e_%s(", 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 \\\"%%s\\\" is not available\\n\", > uk_syscall_name(nr));\n" > + printf "\t\terrno = -ENOSYS;\n" > + printf "\t\treturn -1;\n" > + printf "\t}\n}\n" > +} > diff --git a/lib/syscall_shim/gen_uk_syscall6_r.awk > b/lib/syscall_shim/gen_uk_syscall6_r.awk > new file mode 100644 > index 00000000..d5f8c8ba > --- /dev/null > +++ b/lib/syscall_shim/gen_uk_syscall6_r.awk > @@ -0,0 +1,39 @@ > +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 "long uk_syscall6_r(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_syscall_r = "uk_syscall_r_" name > + args_nr = $2 + 0 > + printf "\tcase %s:\n", sys_name; > + printf "\t\treturn %s(", uk_syscall_r; > + 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 \\\"%%s\\\" is not available\\n\", > uk_syscall_name(nr));\n" > + printf "\t\treturn -ENOSYS;\n" > + printf "\t}\n}\n" > +} > diff --git a/lib/syscall_shim/include/uk/syscall.h > b/lib/syscall_shim/include/uk/syscall.h > index 3d2e4e89..a3b79d41 100644 > --- a/lib/syscall_shim/include/uk/syscall.h > +++ b/lib/syscall_shim/include/uk/syscall.h > @@ -290,6 +290,8 @@ typedef long uk_syscall_arg_t; > /* System call, returns -1 and sets errno on errors */ > long uk_syscall(long nr, ...); > long uk_vsyscall(long nr, va_list arg); > +long uk_syscall6(long nr, long arg1, long arg2, long arg3, > + long arg4, long arg5, long arg6); > > /* > * Use this variant instead of `uk_syscall()` whenever the system call number > @@ -302,6 +304,8 @@ long uk_vsyscall(long nr, va_list arg); > /* Raw system call, returns negative codes on errors */ > long uk_syscall_r(long nr, ...); > long uk_vsyscall_r(long nr, va_list arg); > +long uk_syscall6_r(long nr, long arg1, long arg2, long arg3, > + long arg4, long arg5, long arg6); > > /* > * Use this variant instead of `uk_syscall_r()` whenever the system call > number > diff --git a/lib/syscall_shim/uk_syscall6_r.c.in_end > b/lib/syscall_shim/uk_syscall6_r.c.in_end > new file mode 100644 > index 00000000..daa75d95 > --- /dev/null > +++ b/lib/syscall_shim/uk_syscall6_r.c.in_end > @@ -0,0 +1,18 @@ > + > +#if CONFIG_LIBSYSCALL_SHIM_HANDLER > +#include <uk/plat/syscall.h> > +#include <uk/assert.h> > +#include <arch/regmap_linuxabi.h> > + > +void ukplat_syscall_handler(struct __regs *r) > +{ > + UK_ASSERT(r); > + > + uk_pr_debug("Binary system call request \"%s\" (%lu) at ip:%p > (arg0=0x%lx, arg1=0x%lx, ...)\n", > + uk_syscall_name(r->rsyscall), r->rsyscall, > + (void *) r->rip, r->rarg0, r->rarg1); > + r->rret0 = uk_syscall6_r(r->rsyscall, > + r->rarg0, r->rarg1, r->rarg2, > + r->rarg3, r->rarg4, r->rarg5); > +} > +#endif /* CONFIG_LIBSYSCALL_SHIM_HANDLER */ > diff --git a/lib/syscall_shim/uk_syscall_r.c.in_end > b/lib/syscall_shim/uk_syscall_r.c.in_end > index 73ff755c..a09c473c 100644 > --- a/lib/syscall_shim/uk_syscall_r.c.in_end > +++ b/lib/syscall_shim/uk_syscall_r.c.in_end > @@ -9,21 +9,3 @@ long uk_syscall_r(long nr, ...) > va_end(ap); > return ret; > } > - > -#if CONFIG_LIBSYSCALL_SHIM_HANDLER > -#include <uk/plat/syscall.h> > -#include <uk/assert.h> > -#include <regmap_linuxabi.h> > - > -void ukplat_syscall_handler(struct __regs *r) > -{ > - UK_ASSERT(r); > - > - uk_pr_debug("Binary system call request \"%s\" (%lu) at ip:%p > (arg0=0x%lx, arg1=0x%lx, ...)\n", > - uk_syscall_name(r->rsyscall), r->rsyscall, > - (void *) r->rip, r->rarg0, r->rarg1); > - r->rret0 = uk_syscall_r(r->rsyscall, > - r->rarg0, r->rarg1, r->rarg2, > - r->rarg3, r->rarg4, r->rarg5); > -} > -#endif /* CONFIG_LIBSYSCALL_SHIM_HANDLER */ > -- > 2.20.1 > > |
Lists.xenproject.org is hosted with RackSpace, monitoring our |