|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |