|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 5/6] doc: Raw system calls with syscall_shim
Reviewed-by: Gaulthier Gain <gaulthier.gain@xxxxxxxxx>
> On 11 Dec 2019, at 15:19, Simon Kuenzer <simon.kuenzer@xxxxxxxxx> wrote:
>
> Update the documentation to reflect the differentiation of raw and
> libc-style system call implementations.
>
> Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> ---
> doc/guides/developers-app.rst | 135 ++++++++++++++++++++++++++--------
> 1 file changed, 106 insertions(+), 29 deletions(-)
>
> diff --git a/doc/guides/developers-app.rst b/doc/guides/developers-app.rst
> index d288bb61..5b5f0918 100644
> --- a/doc/guides/developers-app.rst
> +++ b/doc/guides/developers-app.rst
> @@ -324,50 +324,127 @@ This will add the section .uk_fs_list after the .text
> Syscall shim layer
> ============================
>
> -If you library provides a syscall, you need to inform Unikraft that it
> -can use your implementation. Add a line in you Makefile.uk: ::
> +The system call shim layer (``lib/syscall_shim``) provides Linux-style
> mappings
> +of system call numbers to actual system call handler functions. You can
> +implement a system call handler by using one of the definition macros
> +(``UK_SYSCALL_DEFINE``, ``UK_SYSCALL_R_DEFINE``) and register the system
> +call by adding it to ``UK_PROVIDED_SYSCALLS-y`` within your ``Makefile.uk``.
>
> - UK_PROVIDED_SYSCALLS-$(CONFIG_LIBYOURLIBNAME) +=
> <syscall_name>-<number_of_arguments>
> +The shim layer library supports two implementation variants for system call
> +handlers:
>
> -Where `<number_of_arguments>` is how many arguments your syscall accepts.
> +(1) libc-style: The function implementation returns ``-1`` and sets ``errno``
> + in case of errors
>
> -For example: ::
> +(2) and raw: The function implementation returns a negative error value in
> case
> + of errors. ``errno`` is not used at all.
> +
> +Because of library internals, each system call implementation needs to be
> +provided with both variants. The build option `Drop unused functions and
> data`
> +is making sure that only the variants are compiled-in that are actually in
> use.
>
> - UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += writev-3
> +You can use helper macros in order to implement the call just once. The first
> +variant can be implemented with the ``UK_SYSCALL_DEFINE`` macro:
>
> -.. note:: Please consult corresponding man page in order to keep API
> - matching to the equivalent linux syscall
> +.. code-block:: c
> +
> + UK_SYSCALL_DEFINE(return_type, syscall_name, arg1_type, arg1_name,
> + arg2_type, arg2_name, ..)
> + {
> + /* ... */
> + }
>
> -For the implementation of you syscall use the following template:
> +Example:
>
> .. code-block:: c
>
> - UK_SYSCALL_DEFINE(syscall_name, arg1_type, arg1_name, arg2_type,
> arg2_name, ..)
> - {
> - ret = do_cool_stuff();
> - if (ret) {
> - errno = ERROR_CODE;
> - return -1;
> - }
> - return 0;
> - }
> + #include <uk/syscall.h>
> +
> + UK_SYSCALL_DEFINE(ssize_t, write, int, fd, const void *, buf, size_t,
> count)
> + {
> + ssize_t ret;
>
> -For example:
> + ret = vfs_do_write(fd, buf, count);
> + if (ret < 0) {
> + errno = EFAULT;
> + return -1;
> + }
> + return ret;
> + }
> +
> +
> +Raw implementations should use the ``UK_SYSCALL_R_DEFINE`` macro:
>
> .. code-block:: c
>
> - UK_SYSCALL_DEFINE(writev, unsigned long, fd, const struct iovec *, vec,
> - unsigned long, vlen)
> - {
> - return pwritev(fd, vec, vlen, -1);
> - }
> + UK_SYSCALL_R_DEFINE(return_type, syscall_name, arg1_type, arg1_name,
> + arg2_type, arg2_name, ..)
> + {
> + /* ... */
> + }
> +
> +Example:
> +
> +.. code-block:: c
> +
> + #include <uk/syscall.h>
> +
> + UK_SYSCALL_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;
> + }
> +
> +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.
> +
> +Both macros create the following three symbols:
> +
> +.. code-block:: c
> +
> + /* libc-style system call that returns -1 and sets errno on errors */
> + long uk_syscall_e_<syscall_name>(long <arg1_name>, long <arg2_name>,
> ...);
> +
> + /* Raw system call that returns negative error codes on errors */
> + long uk_syscall_r_<syscall_name>(long <arg1_name>, long <arg2_name>,
> ...);
> +
> + /* libc-style wrapper (the same as uk_syscall_e_<syscall_name> but with
> actual types) */
> + <return_type> <syscall_name>(<arg1_type> <arg1_name>,
> + <arg2_type> <arg2_name>, ...);
> +
> +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.
> +
> +If your library uses an ``exportsyms.uk`` file, you need to add the three
> +symbols for making them public available: ::
> +
> + uk_syscall_e_<syscallname>
> + uk_syscall_r_<syscallname>
> + <syscallname>
> +
> +In our example: ::
> +
> + uk_syscall_e_write
> + uk_syscall_r_write
> + write
> +
> +In order to register the system call to `syscall_shim`, add it to
> +``UK_PROVIDED_SYSCALLS-y`` with the library ``Makefile.uk``: ::
> +
> + UK_PROVIDED_SYSCALLS-$(CONFIG_<YOURLIB>) +=
> <syscall_name>-<number_of_arguments>
>
> -Please note, that syscall_shim expects behavior as described in ``man 2
> -syscall``. Namely: ::
> +The ``Makefile.uk`` snippet for our example: ::
>
> - The return value is defined by the system call being invoked. In
> - general, a 0 return value indicates success. A -1 return value
> - indicates an error, and an error code is stored in errno.
> + UK_PROVIDED_SYSCALLS-$(CONFIG_LIBWRITESYS) += write-3
>
> ==================================
> Command line arguments in Unikraft
> --
> 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 |