|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 6/6] lib/syscall_shim: Binary system call handler
Reviewed-by: Gaulthier Gain <gaulthier.gain@xxxxxxxxx>
> On 11 Dec 2019, at 15:19, Simon Kuenzer <simon.kuenzer@xxxxxxxxx> wrote:
>
> 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 |