[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v2 2/5] lib/syscall_shim: Option to disable libc-style wrapper functions
Reviewed-by: Gaulthier Gain <gaulthier.gain@xxxxxxxxx> > On 3 Apr 2020, at 18:29, Simon Kuenzer <simon.kuenzer@xxxxxxxxx> wrote: > > Introduces the hidden Config.uk option `LIBSYSCALL_SHIM_NOWRAPPER` to > disable the generation of libc-style syscall wrapper functions. The > idea is that libC libraries (e.g., musl) that provide own > wrappers (e.g., based on `uk_syscall()` and `uk_syscall_static()`) > would set this option through their Config.uk. In such a case, the > syscall_shim library will then only generate the low-level system call > implementations. > > Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> > --- > doc/guides/developers-app.rst | 9 +++++++ > lib/syscall_shim/Config.uk | 6 +++++ > lib/syscall_shim/include/uk/syscall.h | 35 +++++++++++++++++++++++++++ > 3 files changed, 50 insertions(+) > > diff --git a/doc/guides/developers-app.rst b/doc/guides/developers-app.rst > index a7242e60..ce2f0153 100644 > --- a/doc/guides/developers-app.rst > +++ b/doc/guides/developers-app.rst > @@ -450,11 +450,20 @@ libc-style wrapper on top: > return ret; > } > > + #if UK_LIBC_SYSCALL > ssize_t write(int fd, const void *buf, size_t count) > { > return (ssize_t) uk_syscall_e_write((long) fd, > (long) buf, (long) count); > } > + #endif /* UK_LIBC_SYSCALL */ > + > +Note: Please note that the implementation of custom libc-style wrappers have > to > +be guarded with ``#if UK_LIBC_SYSCALL``. This macro is provided by the > +``<uk/syscall.h>`` header. Some libC ports (e.g., musl) deactivate this > option > +whenever their provide own wrapper functions. For such cases, the > syscall_shim > +library will only provide the ``uk_syscall_e_<syscall_name>`` and > +``uk_syscall_r_<syscall_name>`` symbols. > > Note: When `syscall_shim` library is not enabled, the original design idea was > that the macros provide the libc-style wrapper only. However, all the > diff --git a/lib/syscall_shim/Config.uk b/lib/syscall_shim/Config.uk > index 20962590..c3369463 100644 > --- a/lib/syscall_shim/Config.uk > +++ b/lib/syscall_shim/Config.uk > @@ -3,6 +3,12 @@ menuconfig LIBSYSCALL_SHIM > default n > > if LIBSYSCALL_SHIM > + # Hidden configuration option that can be set by libc's in order to > + # switch off the generation of libc-style wrapper symbols > + config LIBSYSCALL_SHIM_NOWRAPPER > + bool > + default n > + > config LIBSYSCALL_SHIM_HANDLER > bool "Binary system call handler (Linux ABI)" > default n > diff --git a/lib/syscall_shim/include/uk/syscall.h > b/lib/syscall_shim/include/uk/syscall.h > index a219365b..6ee139fa 100644 > --- a/lib/syscall_shim/include/uk/syscall.h > +++ b/lib/syscall_shim/include/uk/syscall.h > @@ -42,6 +42,20 @@ > #include <errno.h> > #include <uk/print.h> > > +/* > + * Whenever the hidden Config.uk option LIBSYSCALL_SHIM_NOWRAPPER > + * is set, the creation of libc-style wrappers are disable by the > + * UK_SYSCALL_DEFINE() and UK_SYSCALL_R_DEFINE() macros. Alternatively, > + * UK_LIBC_SYSCALLS can be set to 0 through compilation flags. > + */ > +#ifndef UK_LIBC_SYSCALLS > +#if CONFIG_LIBSYSCALL_SHIM_NOWRAPPER > +#define UK_LIBC_SYSCALLS (0) > +#else > +#define UK_LIBC_SYSCALLS (1) > +#endif /* CONFIG_LIBSYSCALL_SHIM_NOWRAPPER */ > +#endif /* UK_LIBC_SYSCALLS */ > + > #define __uk_scc(X) ((long) (X)) > typedef long uk_syscall_arg_t; > > @@ -135,7 +149,9 @@ typedef long uk_syscall_arg_t; > /* > * UK_SYSCALL_DEFINE() > * Based on UK_LLSYSCALL_DEFINE and provides a libc-style wrapper > + * in case UK_LIBC_SYSCALLS is enabled > */ > +#if UK_LIBC_SYSCALLS > #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__)) \ > @@ -152,6 +168,15 @@ typedef long uk_syscall_arg_t; > __UK_NAME2SCALLE_FN(name), \ > __UK_NAME2SCALLR_FN(name), \ > __VA_ARGS__) > +#else > +#define UK_SYSCALL_DEFINE(rtype, name, ...) \ > + _UK_LLSYSCALL_DEFINE(__UK_SYSCALL_DEF_NARGS(__VA_ARGS__), \ > + rtype, \ > + name, \ > + __UK_NAME2SCALLE_FN(name), \ > + __UK_NAME2SCALLR_FN(name), \ > + __VA_ARGS__) > +#endif /* UK_LIBC_SYSCALLS */ > > /* Raw system call implementation that is returning negative codes on errors > */ > /* TODO: `void` as return type is currently not supported. > @@ -194,7 +219,9 @@ typedef long uk_syscall_arg_t; > /* > * UK_SYSCALL_R_DEFINE() > * Based on UK_LLSYSCALL_R_DEFINE and provides a libc-style wrapper > + * in case UK_LIBC_SYSCALLS is enabled > */ > +#if UK_LIBC_SYSCALLS > #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__)) \ > @@ -211,6 +238,14 @@ typedef long uk_syscall_arg_t; > __UK_NAME2SCALLE_FN(name), \ > __UK_NAME2SCALLR_FN(name), \ > __VA_ARGS__) > +#else > +#define UK_SYSCALL_R_DEFINE(rtype, name, ...) > \ > + _UK_LLSYSCALL_R_DEFINE(__UK_SYSCALL_DEF_NARGS(__VA_ARGS__), \ > + name, \ > + __UK_NAME2SCALLE_FN(name), \ > + __UK_NAME2SCALLR_FN(name), \ > + __VA_ARGS__) > +#endif /* UK_LIBC_SYSCALLS */ > > > #define __UK_SPROTO_ARGS_TYPE long > -- > 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 |