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

Re: [Minios-devel] [UNIKRAFT PATCH v2 3/5] lib/syscall_shim: `UK_(LL)SYSCALL_R_DEFINE()`: Use given return type



Reviewed-by: Gaulthier Gain <gaulthier.gain@xxxxxxxxx>

> On 3 Apr 2020, at 18:29, Simon Kuenzer <simon.kuenzer@xxxxxxxxx> wrote:
> 
> Instead of declaring the return type for `UK_(LL)SYSCALL_R_DEFINE()`
> functions as `long`, the user-given return type is used. In general,
> this is done for convenience. Whenever a system call implementation
> uses pointers as return type, the helpers defined in `<uk/errptr.h>`
> can be used to encapsulate error codes.
> 
> Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> ---
> doc/guides/developers-app.rst         | 15 +++++++--------
> lib/syscall_shim/include/uk/syscall.h | 11 ++++++-----
> 2 files changed, 13 insertions(+), 13 deletions(-)
> 
> diff --git a/doc/guides/developers-app.rst b/doc/guides/developers-app.rst
> index ce2f0153..d413aace 100644
> --- a/doc/guides/developers-app.rst
> +++ b/doc/guides/developers-app.rst
> @@ -400,19 +400,18 @@ Example:
> 
>     UK_SYSCALL_R_DEFINE(ssize_t, write, int, fd, const void *, buf, size_t, 
> count)
>     {
> -        long ret;
> +        ssize_t ret;
> 
> -        ret = (long) vfs_do_write(fd, buf, count);
> +        ret = vfs_do_write(fd, buf, count);
>         if (ret < 0) {
>             return -EFAULT;
>         }
>         return ret;
>     }
> 
> -Please note that in the raw case (``UK_SYSCALL_R_DEFINE``), the return type
> -within your code block is always ``long``. The specified return type as
> -parameter to the macro will be used for the libc-style wrapper. However, the
> -input parameters are defined with the actual type for your code block.
> +Please note that in the raw case (``UK_SYSCALL_R_DEFINE``), errors are always
> +returned as negative value. Whenever the return type is a pointer value, the
> +helpers defined in `<uk/errptr.h>` can be used to forward error codes.
> 
> Both macros create the following three symbols:
> 
> @@ -441,9 +440,9 @@ libc-style wrapper on top:
> 
>     UK_LLSYSCALL_R_DEFINE(ssize_t, write, int, fd, const void *, buf, size_t, 
> count)
>     {
> -        long ret;
> +        ssize_t ret;
> 
> -        ret = (long) vfs_do_write(fd, buf, count);
> +        ret = vfs_do_write(fd, buf, count);
>         if (ret < 0) {
>             return -EFAULT;
>         }
> diff --git a/lib/syscall_shim/include/uk/syscall.h 
> b/lib/syscall_shim/include/uk/syscall.h
> index 6ee139fa..aafe20a7 100644
> --- a/lib/syscall_shim/include/uk/syscall.h
> +++ b/lib/syscall_shim/include/uk/syscall.h
> @@ -39,6 +39,7 @@
> 
> #include <uk/config.h>
> #include <uk/essentials.h>
> +#include <uk/errptr.h>
> #include <errno.h>
> #include <uk/print.h>
> 
> @@ -192,20 +193,20 @@ typedef long uk_syscall_arg_t;
>       {                                                               \
>               long ret = rname(                                       \
>                       UK_ARG_MAPx(x, UK_S_ARG_CAST_LONG, __VA_ARGS__)); \
> -             if (ret < 0) {                                          \
> -                     errno = (int) -ret;                             \
> +             if (ret < 0 && PTRISERR(ret)) {                         \
> +                     errno = (int) PTR2ERR(ret);                     \
>                       return -1;                                      \
>               }                                                       \
>               return ret;                                             \
>       }                                                               \
> -     static inline long __##rname(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL,    \
> +     static inline rtype __##rname(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL,   \
>                                                __VA_ARGS__));         \
>       long rname(UK_ARG_MAPx(x, UK_S_ARG_LONG, __VA_ARGS__))          \
>       {                                                               \
> -             return __##rname(                                       \
> +             return (long) __##rname(                                \
>                       UK_ARG_MAPx(x, UK_S_ARG_CAST_ACTUAL, __VA_ARGS__)); \
>       }                                                               \
> -     static inline long __##rname(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL,    \
> +     static inline rtype __##rname(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL,   \
>                                                __VA_ARGS__))
> #define _UK_LLSYSCALL_R_DEFINE(...) __UK_LLSYSCALL_R_DEFINE(__VA_ARGS__)
> #define UK_LLSYSCALL_R_DEFINE(rtype, name, ...)                               
> \
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> Minios-devel mailing list
> Minios-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/minios-devel


_______________________________________________
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®.