[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH 6/6] lib/syscall_shim: Binary system call handler



Provide the option to handle binary system call requests with
libsyscall_shim. Linux-style ABI is implemented. System calls are
handled with the raw variant `uk_syscall_r()`.

Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
---
 lib/syscall_shim/Config.uk             | 15 ++++++++-
 lib/syscall_shim/Makefile.uk           |  2 ++
 lib/syscall_shim/regmap_linuxabi.h     | 46 ++++++++++++++++++++++++++
 lib/syscall_shim/uk_syscall_r.c.in_end | 18 ++++++++++
 4 files changed, 80 insertions(+), 1 deletion(-)
 create mode 100644 lib/syscall_shim/regmap_linuxabi.h

diff --git a/lib/syscall_shim/Config.uk b/lib/syscall_shim/Config.uk
index 7bf4ca8c..20962590 100644
--- a/lib/syscall_shim/Config.uk
+++ b/lib/syscall_shim/Config.uk
@@ -1,3 +1,16 @@
-config LIBSYSCALL_SHIM
+menuconfig LIBSYSCALL_SHIM
        bool "syscall_shim: Syscall shim layer"
        default n
+
+if LIBSYSCALL_SHIM
+       config LIBSYSCALL_SHIM_HANDLER
+               bool "Binary system call handler (Linux ABI)"
+               default n
+               depends on ARCH_X86_64
+               select HAVE_SYSCALL
+               help
+                       Enables a system call handler for binary system call
+                       requests (e.g., sysenter/sysexit). The handler maps
+                       register values accordingly to the Linux ABI standard
+                       (see: man syscalls[2]).
+endif
diff --git a/lib/syscall_shim/Makefile.uk b/lib/syscall_shim/Makefile.uk
index 7afa2014..17de49cd 100644
--- a/lib/syscall_shim/Makefile.uk
+++ b/lib/syscall_shim/Makefile.uk
@@ -74,6 +74,8 @@ 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_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall.c
 LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_r.c
 LIBSYSCALL_SHIM_SRCS-y += $(LIBSYSCALL_SHIM_BUILD)/uk_syscall_name.c
diff --git a/lib/syscall_shim/regmap_linuxabi.h 
b/lib/syscall_shim/regmap_linuxabi.h
new file mode 100644
index 00000000..1bface67
--- /dev/null
+++ b/lib/syscall_shim/regmap_linuxabi.h
@@ -0,0 +1,46 @@
+#ifndef _REGMAP_LINUXABI_H_
+
+#include <uk/arch/lcpu.h>
+
+/*
+ * Mappings of `struct __reg` register fields
+ * according to Linux ABI definition for system calls
+ * (see: man syscall(2))
+ *  rip      - Instruction pointer
+ *  rsyscall - Syscall number
+ *  rargX    - Arguments 0..5
+ *  rretX    - System call return values 0..1
+ */
+
+#if (defined __X86_64__)
+#define rip            rcx
+#define rsyscall       orig_rax
+#define rarg0          rdi
+#define rarg1          rsi
+#define rarg2          rdx
+#define rarg3          r10
+#define rarg4          r8
+#define rarg5          r9
+
+#define rret0          rax
+#define rret1          rdx
+
+#elif (defined __ARM64__)
+#define rip            x[15] /* TODO: Is this correct? */
+#define rsyscall       x[8]
+#define rarg0          x[0]
+#define rarg1          x[1]
+#define rarg2          x[2]
+#define rarg3          x[3]
+#define rarg4          x[4]
+#define rarg5          x[5]
+
+#define rret0          x[0]
+#define rret1          x[1]
+
+#else
+#error "Missing register mappings for selected target architecture"
+
+#endif
+
+#endif /* _REGMAP_LINUXABI_H_ */
diff --git a/lib/syscall_shim/uk_syscall_r.c.in_end 
b/lib/syscall_shim/uk_syscall_r.c.in_end
index f2b9fc8e..ee8a5689 100644
--- a/lib/syscall_shim/uk_syscall_r.c.in_end
+++ b/lib/syscall_shim/uk_syscall_r.c.in_end
@@ -13,3 +13,21 @@ long uk_syscall_r(long n, ...)
        va_end(ap);
        return __uk_syscall_r(n,a,b,c,d,e,f);
 }
+
+#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


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.