|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [UNIKRAFT PATCH v2 2/3] lib/syscall_shim: handler: Take only required number of arguments
Reviewed-by: Gaulthier Gain <gaulthier.gain@xxxxxxxxx>
> On 21 Apr 2020, at 17:36, Simon Kuenzer <simon.kuenzer@xxxxxxxxx> wrote:
>
> Improves the `uk_syscall()`, `uk_syscall_r()`, `uk_vsyscall()`, and
> `uk_vsyscall_r()` implementations in a way that only the number of
> required arguments are taken from the stack.
>
> Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> ---
> lib/syscall_shim/gen_uk_syscall.awk | 16 ++++--------
> lib/syscall_shim/gen_uk_syscall_r.awk | 16 ++++--------
> lib/syscall_shim/include/uk/syscall.h | 8 +++---
> lib/syscall_shim/uk_syscall.c.in_end | 28 +++++----------------
> lib/syscall_shim/uk_syscall_r.c.in_end | 34 +++++++-------------------
> 5 files changed, 29 insertions(+), 73 deletions(-)
>
> diff --git a/lib/syscall_shim/gen_uk_syscall.awk
> b/lib/syscall_shim/gen_uk_syscall.awk
> index 2f2e1fa9..70c4df47 100644
> --- a/lib/syscall_shim/gen_uk_syscall.awk
> +++ b/lib/syscall_shim/gen_uk_syscall.awk
> @@ -5,15 +5,9 @@ BEGIN {
> print "#include <uk/syscall.h>"
> print "#include <uk/print.h>\n"
>
> - printf "static inline long __uk_syscall(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) {"
> + print "long uk_vsyscall(long nr, va_list arg)\n{"
> + print "\t(void) arg;\n"
> + print "\tswitch (nr) {"
> }
>
>
> @@ -24,9 +18,9 @@ BEGIN {
> 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)
> + printf("va_arg(arg, long), ")
> if (args_nr > 0)
> - printf("arg%d", args_nr)
> + printf("va_arg(arg, long)")
> printf(");\n")
> }
>
> diff --git a/lib/syscall_shim/gen_uk_syscall_r.awk
> b/lib/syscall_shim/gen_uk_syscall_r.awk
> index c591fc47..74d13241 100644
> --- a/lib/syscall_shim/gen_uk_syscall_r.awk
> +++ b/lib/syscall_shim/gen_uk_syscall_r.awk
> @@ -5,15 +5,9 @@ BEGIN {
> print "#include <uk/syscall.h>"
> print "#include <uk/print.h>\n"
>
> - printf "static inline long __uk_syscall_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) {"
> + print "long uk_vsyscall_r(long nr, va_list arg)\n{"
> + print "\t(void) arg;\n"
> + print "\tswitch (nr) {"
> }
>
>
> @@ -25,9 +19,9 @@ BEGIN {
> printf "\tcase %s:\n", sys_name;
> printf "\t\treturn %s(", uk_syscall_r;
> for (i = 1; i < args_nr; i++)
> - printf("arg%d, ", i)
> + printf("va_arg(arg, long), ")
> if (args_nr > 0)
> - printf("arg%d", args_nr)
> + printf("va_arg(arg, long)")
> printf(");\n")
> }
>
> diff --git a/lib/syscall_shim/include/uk/syscall.h
> b/lib/syscall_shim/include/uk/syscall.h
> index 078129e5..3d2e4e89 100644
> --- a/lib/syscall_shim/include/uk/syscall.h
> +++ b/lib/syscall_shim/include/uk/syscall.h
> @@ -288,8 +288,8 @@ typedef long uk_syscall_arg_t;
> #include <uk/bits/syscall_stubs.h>
>
> /* System call, returns -1 and sets errno on errors */
> -long uk_syscall(long n, ...);
> -long uk_vsyscall(long n, va_list arg);
> +long uk_syscall(long nr, ...);
> +long uk_vsyscall(long nr, va_list arg);
>
> /*
> * Use this variant instead of `uk_syscall()` whenever the system call number
> @@ -300,8 +300,8 @@ long uk_vsyscall(long n, va_list arg);
> UK_CONCAT(__uk_syscall, __UK_SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__)
>
> /* Raw system call, returns negative codes on errors */
> -long uk_syscall_r(long n, ...);
> -long uk_vsyscall_r(long n, va_list arg);
> +long uk_syscall_r(long nr, ...);
> +long uk_vsyscall_r(long nr, va_list arg);
>
> /*
> * Use this variant instead of `uk_syscall_r()` whenever the system call
> number
> diff --git a/lib/syscall_shim/uk_syscall.c.in_end
> b/lib/syscall_shim/uk_syscall.c.in_end
> index 8a5f8e0b..73e74dd0 100644
> --- a/lib/syscall_shim/uk_syscall.c.in_end
> +++ b/lib/syscall_shim/uk_syscall.c.in_end
> @@ -1,27 +1,11 @@
>
> -long uk_syscall(long n, ...)
> +long uk_syscall(long nr, ...)
> {
> + long ret;
> va_list ap;
> - long a,b,c,d,e,f;
> - va_start(ap, n);
> - a=va_arg(ap, long);
> - b=va_arg(ap, long);
> - c=va_arg(ap, long);
> - d=va_arg(ap, long);
> - e=va_arg(ap, long);
> - f=va_arg(ap, long);
> - va_end(ap);
> - return __uk_syscall(n,a,b,c,d,e,f);
> -}
>
> -long uk_vsyscall(long n, va_list arg)
> -{
> - long a,b,c,d,e,f;
> - a=va_arg(arg, long);
> - b=va_arg(arg, long);
> - c=va_arg(arg, long);
> - d=va_arg(arg, long);
> - e=va_arg(arg, long);
> - f=va_arg(arg, long);
> - return __uk_syscall(n,a,b,c,d,e,f);
> + va_start(ap, nr);
> + ret = uk_vsyscall(nr, ap);
> + va_end(ap);
> + return ret;
> }
> diff --git a/lib/syscall_shim/uk_syscall_r.c.in_end
> b/lib/syscall_shim/uk_syscall_r.c.in_end
> index ae74716e..73ff755c 100644
> --- a/lib/syscall_shim/uk_syscall_r.c.in_end
> +++ b/lib/syscall_shim/uk_syscall_r.c.in_end
> @@ -1,29 +1,13 @@
>
> -long uk_syscall_r(long n, ...)
> +long uk_syscall_r(long nr, ...)
> {
> + long ret;
> va_list ap;
> - long a,b,c,d,e,f;
> - va_start(ap, n);
> - a=va_arg(ap, long);
> - b=va_arg(ap, long);
> - c=va_arg(ap, long);
> - d=va_arg(ap, long);
> - e=va_arg(ap, long);
> - f=va_arg(ap, long);
> - va_end(ap);
> - return __uk_syscall_r(n,a,b,c,d,e,f);
> -}
>
> -long uk_vsyscall_r(long n, va_list arg)
> -{
> - long a,b,c,d,e,f;
> - a=va_arg(arg, long);
> - b=va_arg(arg, long);
> - c=va_arg(arg, long);
> - d=va_arg(arg, long);
> - e=va_arg(arg, long);
> - f=va_arg(arg, long);
> - return __uk_syscall_r(n,a,b,c,d,e,f);
> + va_start(ap, nr);
> + ret = uk_vsyscall_r(nr, ap);
> + va_end(ap);
> + return ret;
> }
>
> #if CONFIG_LIBSYSCALL_SHIM_HANDLER
> @@ -38,8 +22,8 @@ void ukplat_syscall_handler(struct __regs *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);
> + 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 |