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

[Minios-devel] [UNIKRAFT PATCH 5/6] doc: Raw system calls with syscall_shim



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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.