[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |