|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH v2 3/3] lib/syscall_shim: Provide `uk_syscall6()`, `uk_syscall6_r()`
`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 |