[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v2 1/5] lib/syscall_shim: UK_LLSYSCALL_(R_)_DEFINE variants
Reviewed-by: Gaulthier Gain <gaulthier.gain@xxxxxxxxx> > On 3 Apr 2020, at 18:29, Simon Kuenzer <simon.kuenzer@xxxxxxxxx> wrote: > > Some system calls have different signatures and return types on the > libC API and the Linux system call ABI (e.g., brk, mount). In order > to support implementing such libc-style wrappers manually on top of > the syscall_shim library, we introduce so called low-level variants > for the UK_SYSCALL_(R_)_DEFINE macros that only provide the > uk_syscall_(e|r)_<syscall name> symbols: UK_LLSYSCALL_(R_)_DEFINE > > Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> > --- > doc/guides/developers-app.rst | 35 ++++++++++- > lib/syscall_shim/include/uk/syscall.h | 91 ++++++++++++++++++++------- > 2 files changed, 102 insertions(+), 24 deletions(-) > > diff --git a/doc/guides/developers-app.rst b/doc/guides/developers-app.rst > index 6438333c..a7242e60 100644 > --- a/doc/guides/developers-app.rst > +++ b/doc/guides/developers-app.rst > @@ -428,10 +428,39 @@ Both macros create the following three symbols: > <return_type> <syscall_name>(<arg1_type> <arg1_name>, > <arg2_type> <arg2_name>, ...); > > +For the case that the libc-style wrapper does not match the signature and > return > +type of the underlying system call, a so called low-level variant of these > two > +macros are available: ``UK_LLSYSCALL_DEFINE``, ``UK_LLSYSCALL_R_DEFINE``. > +These macros only generate the ``uk_syscall_e_<syscall_name>`` and > +``uk_syscall_r_<syscall_name>`` symbols. You can then provide the custom > +libc-style wrapper on top: > + > +.. code-block:: c > + > + #include <uk/syscall.h> > + > + UK_LLSYSCALL_R_DEFINE(ssize_t, write, int, fd, const void *, buf, > size_t, count) > + { > + long ret; > + > + ret = (long) vfs_do_write(fd, buf, count); > + if (ret < 0) { > + return -EFAULT; > + } > + return ret; > + } > + > + ssize_t write(int fd, const void *buf, size_t count) > + { > + return (ssize_t) uk_syscall_e_write((long) fd, > + (long) buf, (long) count); > + } > + > Note: When `syscall_shim` library is not enabled, the original design idea was > -that the macros provide the libc-style wrapper only. However, both macros > -provide always all three variants. This is done to support the case that a > -system call is implemented on top of another. > +that the macros provide the libc-style wrapper only. However, all the > +described macros are still available and populate the symbols as documented > +here. This is done to support the case that a system call is implemented by > +calling another. > > If your library uses an ``exportsyms.uk`` file, you need to add the three > symbols for making them public available: :: > diff --git a/lib/syscall_shim/include/uk/syscall.h > b/lib/syscall_shim/include/uk/syscall.h > index cd5c6e67..a219365b 100644 > --- a/lib/syscall_shim/include/uk/syscall.h > +++ b/lib/syscall_shim/include/uk/syscall.h > @@ -37,6 +37,7 @@ > #ifndef __UK_SYSCALL_H__ > #define __UK_SYSCALL_H__ > > +#include <uk/config.h> > #include <uk/essentials.h> > #include <errno.h> > #include <uk/print.h> > @@ -94,56 +95,83 @@ typedef long uk_syscall_arg_t; > /* TODO: `void` as return type is currently not supported. > * NOTE: Workaround is to use `int` instead. > */ > -#define __UK_SYSCALL_DEFINE(x, rtype, name, ename, rname, ...) > \ > - rtype name(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL, __VA_ARGS__)); \ > +/* > + * UK_LLSYSCALL_DEFINE() > + * Low-level variant, does not provide a libc-style wrapper > + */ > +#define __UK_LLSYSCALL_DEFINE(x, rtype, name, ename, rname, ...) \ > + long ename(UK_ARG_MAPx(x, UK_S_ARG_LONG, __VA_ARGS__)); \ > long rname(UK_ARG_MAPx(x, UK_S_ARG_LONG, __VA_ARGS__)) \ > { \ > int _errno = errno; \ > long ret; \ > \ > errno = 0; \ > - ret = (long) name( \ > - UK_ARG_MAPx(x, UK_S_ARG_CAST_ACTUAL, __VA_ARGS__)); \ > + ret = ename( \ > + UK_ARG_MAPx(x, UK_S_ARG_CAST_LONG, __VA_ARGS__)); \ > if (ret == -1) \ > ret = errno ? -errno : -EFAULT; \ > errno = _errno; \ > return ret; \ > } \ > + static inline rtype __##ename(UK_ARG_MAPx(x, \ > + UK_S_ARG_ACTUAL, __VA_ARGS__)); \ > long ename(UK_ARG_MAPx(x, UK_S_ARG_LONG, __VA_ARGS__)) \ > { \ > - return (long) name( \ > + return (long) __##ename( \ > UK_ARG_MAPx(x, UK_S_ARG_CAST_ACTUAL, __VA_ARGS__)); \ > } \ > - rtype name(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL, __VA_ARGS__)) > + static inline rtype __##ename(UK_ARG_MAPx(x, \ > + UK_S_ARG_ACTUAL, __VA_ARGS__)) > +#define _UK_LLSYSCALL_DEFINE(...) __UK_LLSYSCALL_DEFINE(__VA_ARGS__) > +#define UK_LLSYSCALL_DEFINE(rtype, name, ...) > \ > + _UK_LLSYSCALL_DEFINE(__UK_SYSCALL_DEF_NARGS(__VA_ARGS__), \ > + rtype, \ > + name, \ > + __UK_NAME2SCALLE_FN(name), \ > + __UK_NAME2SCALLR_FN(name), \ > + __VA_ARGS__) > + > +/* > + * UK_SYSCALL_DEFINE() > + * Based on UK_LLSYSCALL_DEFINE and provides a libc-style wrapper > + */ > +#define __UK_SYSCALL_DEFINE(x, rtype, name, ename, rname, ...) > \ > + long ename(UK_ARG_MAPx(x, UK_S_ARG_LONG, __VA_ARGS__)); \ > + rtype name(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL, __VA_ARGS__)) \ > + { \ > + return (rtype) ename( \ > + UK_ARG_MAPx(x, UK_S_ARG_CAST_LONG, __VA_ARGS__)); \ > + } \ > + __UK_LLSYSCALL_DEFINE(x, rtype, name, ename, rname, __VA_ARGS__) > #define _UK_SYSCALL_DEFINE(...) __UK_SYSCALL_DEFINE(__VA_ARGS__) > -#define UK_SYSCALL_DEFINE(rtype, name, ...) \ > - _UK_SYSCALL_DEFINE(__UK_SYSCALL_DEF_NARGS(__VA_ARGS__), \ > - rtype, \ > - name, \ > - __UK_NAME2SCALLE_FN(name), \ > - __UK_NAME2SCALLR_FN(name), \ > +#define UK_SYSCALL_DEFINE(rtype, name, ...) \ > + _UK_SYSCALL_DEFINE(__UK_SYSCALL_DEF_NARGS(__VA_ARGS__), \ > + rtype, \ > + name, \ > + __UK_NAME2SCALLE_FN(name), \ > + __UK_NAME2SCALLR_FN(name), \ > __VA_ARGS__) > > /* Raw system call implementation that is returning negative codes on errors > */ > /* TODO: `void` as return type is currently not supported. > * NOTE: Workaround is to use `int` instead. > */ > -#define __UK_SYSCALL_R_DEFINE(x, rtype, name, ename, rname, ...) \ > +/* > + * UK_LLSYSCALL_R_DEFINE() > + * Low-level variant, does not provide a libc-style wrapper > + */ > +#define __UK_LLSYSCALL_R_DEFINE(x, rtype, name, ename, rname, ...) \ > long rname(UK_ARG_MAPx(x, UK_S_ARG_LONG, __VA_ARGS__)); \ > - rtype name(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL, __VA_ARGS__)) \ > + long ename(UK_ARG_MAPx(x, UK_S_ARG_LONG, __VA_ARGS__)) \ > { \ > long ret = rname( \ > UK_ARG_MAPx(x, UK_S_ARG_CAST_LONG, __VA_ARGS__)); \ > if (ret < 0) { \ > errno = (int) -ret; \ > - return (rtype) -1; \ > + return -1; \ > } \ > - return (rtype) ret; \ > - } \ > - long ename(UK_ARG_MAPx(x, UK_S_ARG_LONG, __VA_ARGS__)) \ > - { \ > - return (long) name( \ > - UK_ARG_MAPx(x, UK_S_ARG_CAST_ACTUAL, __VA_ARGS__)); \ > + return ret; \ > } \ > static inline long __##rname(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL, \ > __VA_ARGS__)); \ > @@ -154,6 +182,27 @@ typedef long uk_syscall_arg_t; > } \ > static inline long __##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, ...) > \ > + _UK_LLSYSCALL_R_DEFINE(__UK_SYSCALL_DEF_NARGS(__VA_ARGS__), \ > + rtype, \ > + name, \ > + __UK_NAME2SCALLE_FN(name), \ > + __UK_NAME2SCALLR_FN(name), \ > + __VA_ARGS__) > + > +/* > + * UK_SYSCALL_R_DEFINE() > + * Based on UK_LLSYSCALL_R_DEFINE and provides a libc-style wrapper > + */ > +#define __UK_SYSCALL_R_DEFINE(x, rtype, name, ename, rname, ...) \ > + long ename(UK_ARG_MAPx(x, UK_S_ARG_LONG, __VA_ARGS__)); \ > + rtype name(UK_ARG_MAPx(x, UK_S_ARG_ACTUAL, __VA_ARGS__)) \ > + { \ > + return (rtype) ename( \ > + UK_ARG_MAPx(x, UK_S_ARG_CAST_LONG, __VA_ARGS__)); \ > + } \ > + __UK_LLSYSCALL_R_DEFINE(x, rtype, name, ename, rname, __VA_ARGS__) > #define _UK_SYSCALL_R_DEFINE(...) __UK_SYSCALL_R_DEFINE(__VA_ARGS__) > #define UK_SYSCALL_R_DEFINE(rtype, name, ...) \ > _UK_SYSCALL_R_DEFINE(__UK_SYSCALL_DEF_NARGS(__VA_ARGS__), \ > -- > 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |