support/scripts: Change the SECINFO_EXP regex to be more permissive
Currently, the regex for matching the .uk_bootinfo section does
not consider the case of the section having a number bigger than
99 as a result for objdump -h. This PR changes the regex to consider that case.
Signed-off-by: Florin Postolache <florin.postolache80@gmail.com> Reviewed-by: Dragos Petre <dragos.petre27@gmail.com> Approved-by: Marco Schlumpp <marco@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #792
As clone3 currently does not work, and glibc falls
back to clone if clone3 is not available (tested on 2.35),
the syscall can be removed until a working implementation is
available.
Signed-off-by: Ioan-Teodor Teugea <teodor.teugea@gmail.com> Reviewed-by: Florin Postolache <florin.postolache.of@gmail.com> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #847
Andrei Tatar [Fri, 21 Apr 2023 14:42:48 +0000 (16:42 +0200)]
arch/x86: Add compiler flags for auto host CPU
Previously the `CONFIG_MARCH_X86_64_NATIVE` variable did not add
`-march=native` to CFLAGS, the compiler then defaulting to generic
x86_64. This implements the expected functionality.
Signed-off-by: Andrei Tatar <andrei.ttr@gmail.com> Reviewed-by: Sergiu Moga <sergiu.moga@protonmail.com> Reviewed-by: Maria Sfiraiala <maria.sfiraiala@gmail.com> Approved-by: Simon Kuenzer <simon@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #861
Marc Rittinghaus [Thu, 20 Apr 2023 15:06:37 +0000 (17:06 +0200)]
lib/ukswrand: Adapt (u)random to new device_create
The signature and requirements of device_create() changed.
This commit adapts the implementations of /dev/random and
/dev/urandom to use the new definition.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #855
Marc Rittinghaus [Thu, 20 Apr 2023 15:03:57 +0000 (17:03 +0200)]
lib/devfs: Adapt null/zero to new device_create
The signature and requirements of device_create() changed.
This commit adapts the implementations of /dev/null and
/dev/zero to use the new definition.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #855
Marc Rittinghaus [Thu, 20 Apr 2023 14:59:25 +0000 (16:59 +0200)]
lib/devfs: Merge device_register and create
This commit merges the device_register() and device_create() functions
to safe a malloc() operation. The function is also changed to return
a proper error code instead of crashing. Furthermore, users of the
function are expected to provide a handler function for all device
operations. The early check via asserts ensures that missing handlers
are easily detected in debug builds without having to explicitly call
all device operations.
Checkpatch-Ignore: USE_NEGATIVE_ERRNO Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #855
Marc Rittinghaus [Thu, 20 Apr 2023 14:47:45 +0000 (16:47 +0200)]
lib/devfs: Remove unused fields and functions
The definition for device objects contain numerous fields which are not
used. In addition, there are various function definitions and
declarations which are not used or not even related to generic devices
(e.g., partition table). This commit removes all of these definitions.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #855
Marc Rittinghaus [Thu, 20 Apr 2023 14:39:25 +0000 (16:39 +0200)]
lib/devfs: Remove unused devops
This commit removes unused operations from the device operations
structure and updates the no-op macros and functions to be usable
for seldomly set operations (also externally).
Marc Rittinghaus [Mon, 24 Apr 2023 15:21:15 +0000 (17:21 +0200)]
lib/vfscore: Fix leak in sys_futimens
Previously, sys_futimens() retrieved a reference to the file
descriptor to get a value for the pathname argument. The reference
was not freed afterwards. Since sys_utimensat() has been changed
to accept NULL as pathname and work on dirfd instead, the code
can be removed altogether.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Rares Miculescu <miculescur@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #865
Marc Rittinghaus [Mon, 24 Apr 2023 15:12:07 +0000 (17:12 +0200)]
lib/vfscore: Exit sys_utimensat on all UTIME_OMIT
This commit restructures the sanity checks of the input timespecs
to come before all other checks and to include an early exit of
both times are UTIME_OMIT. This is inline with the behavior on
Linux.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Rares Miculescu <miculescur@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #865
Marc Rittinghaus [Mon, 24 Apr 2023 14:57:21 +0000 (16:57 +0200)]
lib/vfscore: Remove surplus check and fix leak
The dedicated check for a readonly filesystem can be removed
in sys_utimensat(), because it is part of vn_access(). The commit
also fixes a leak of reference to the dentry in case of an error.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Rares Miculescu <miculescur@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #865
Marc Rittinghaus [Mon, 24 Apr 2023 14:54:37 +0000 (16:54 +0200)]
lib/vfscore: Linux compatibility for sys_utimensat
Previously, if pathname is either NULL or a relative path, and
dirfd is not AT_FDCWD, dirfd needed to refer to a directory.
However, in Linux there is a non-conformant behavior that
if pathname is NULL, the timestamps are applied to whatever
file dirfd refers to. For improved Linux compatibility, we
adopt this behavior.
This commit also fixes various leaks of the file descriptor
reference that is received via the call to vfscore_get_file().
Github-Fixes: #858 Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Rares Miculescu <miculescur@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #865
Marc Rittinghaus [Mon, 24 Apr 2023 14:19:25 +0000 (16:19 +0200)]
lib/vfscore: Fix error checks in sys_utimensat
If successful, asprintf() returns the number of characters written. Due
to the format strings this will always be >0. On error, asprintf()
returns -1, which means the return value will in any case be non-zero,
always leading to a (false) ENOMEM.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Rares Miculescu <miculescur@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #865
Marc Rittinghaus [Mon, 24 Apr 2023 14:13:06 +0000 (16:13 +0200)]
lib/vfscore: Remove VAPPEND mode
vfscore defines a VAPPEND mode bit which is only used in
sys_utimensat() and which erroneously overlaps with VEXEC permission
for the group. While VAPPEND is a useful feature, it needs a proper
definition and support in all vfscore APIs. We thus remove the
broken definition for now.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Rares Miculescu <miculescur@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #865
Marc Rittinghaus [Mon, 24 Apr 2023 06:59:28 +0000 (08:59 +0200)]
lib/vfscore: Check for EBADF in dup2
In contrast to dup3(), dup2() returns the oldfd if oldfd and newfd
are equal. However, the fd still needs to be valid. Otherwise, EBADF
has to be returned.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Rares Miculescu <miculescur@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #865
Marc Rittinghaus [Mon, 24 Apr 2023 06:54:18 +0000 (08:54 +0200)]
lib/vfscore: Fix multiple issues with dup3
dup3() is broken in multiple ways:
1) the fget() for newfd leaks the the file reference before the close
2) the error code from close() is -1 instead of the errno value
3) the old file descriptor is duplicated to a new fd slot. However, its
reference is not incremented due to the fdrop().
4) there is a race condition between the close() of newfd and its
reservation for the to-be-duplicated file description
This commit fixes all these issues except the race condition, which
needs new functionality to atomically replace a file description in
the fd tab.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Rares Miculescu <miculescur@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #865
This attribute is useful for memory-mapped devices and can reduce the
amount of transactions necessary when communicating with the device.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Approved-by: Alexander Jung <alex@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #788
Marc Rittinghaus [Thu, 27 Apr 2023 10:38:16 +0000 (12:38 +0200)]
plat/common/x86: Add PAT MSR
This commit adds the definition of the page attribute table (PAT)
configuration MSR.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Approved-by: Alexander Jung <alex@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #788
Marc Rittinghaus [Thu, 27 Apr 2023 10:36:54 +0000 (12:36 +0200)]
include/arch/x86_64: Add PAT bits
This commit adds definitions for configuration of the page attribute
table on x86.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Approved-by: Alexander Jung <alex@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #788
Radu Nichita [Mon, 6 Mar 2023 14:06:14 +0000 (16:06 +0200)]
lib/vfscore: Add README.md file
Provides information about how to interact with the vfscore library,
including details about hierarchy, core components and registration
of a new filesystem in Unikraft.
Signed-off-by: Radu Nichita <radunichita99@gmail.com> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #780
Marco Schlumpp [Tue, 14 Feb 2023 14:02:17 +0000 (15:02 +0100)]
drivers/virtio: Fix interrupt flag check
The check used a bit-OR instead of a bit-AND to check whether the flag
is set.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Cezar Craciunoiu <cezar.craciunoiu@unikraft.io> Approved-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #761
i.Pear [Wed, 29 Mar 2023 18:12:51 +0000 (02:12 +0800)]
build/Makefile: Force update UK_CONFIG
The builder uses $(UK_CONFIG) to generate files such as
$(KCONFIG_AUTOHEADER) in the build directory. When $(UK_CONFIG) changes,
these newly generated files will also be regenerated.
However, $(UK_CONFIG) may not remain consistent across multiple builds.
For example, in the following command sequence:
> make C=.config_kvm-x86_64
> make C=.config_linuxu-x86_64
> make C=.config_kvm-x86_64
During the first two builds, the configuration files in the build
directory will be regenerated. But when using the same configuration file
as the first time in the third build, because .config_kvm-x86_64 is not a
new version, the configuration files in the build directory will remain
the version of linuxu, which will cause the build to fail.
When using kraftkit, similar issues can also be reproduced. Executing
"kraft build --arch x86_64" twice, each time is in the order of linuxu,
kvm, and xen. When building linuxu for the second time, the configuration
files in the build directory are still the configuration of xen, which
also causes the build to fail.
This patch forces $(UK_CONFIG) to be recognized as updated, so that the
configuration files in the build directory are always updated. It has been
tested and can fix this issue.
Signed-off-by: Tianyi Liu <i.pear@outlook.com> Reviewed-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@upb.ro> Approved-by: Simon Kuenzer <simon@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #817
Marc Rittinghaus [Fri, 14 Apr 2023 14:14:00 +0000 (16:14 +0200)]
lib/syscall_shim: Add struct printing
This commit adds macros for printing selected members of
struct types in the prsyscall output just like strace. The PT_STRUCT
macro takes the struct's name to form a new parameter type name.
The PR_STRUCT macro prints the fields specified in the var args. Nested
printing of struct fields members is supported for structs pointers as
well as for embedded structs. Whenever fields that are usually pointers
(e.g., PT_CHARP or PT_STRUCT) are embedded, the `PT_SVAL` flag must
be specified.
Checkpatch-Ignore: DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Reviewed-by: Cezar Craciunoiu <cezar.craciunoiu@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #836
Marc Rittinghaus [Fri, 14 Apr 2023 16:22:32 +0000 (18:22 +0200)]
lib/syscall_shim: Add 0x prefix to PT_HEX
Currently, it is hard to know if a value is a hexadecimal or decimal
number if there are no letters in the output. This commit adds the
hex prefix 0x to avoid the confusion.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Reviewed-by: Cezar Craciunoiu <cezar.craciunoiu@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #836
Marc Rittinghaus [Fri, 14 Apr 2023 15:47:19 +0000 (17:47 +0200)]
lib/syscall_shim: Print PT_OUT only on success
Previously, we are printing buffers and output strings also when the
call fails. However, in that case it will usually contain no meaningful
value so we reduce trace output by just printing the buffer's target
address.
Checkpatch-Ignore: COMPLEX_MACRO
Checkpatch-Ignore: TRAILING_SEMICOLON
Checkpatch-Ignore: DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON
Checkpatch-Ignore: MULTISTATEMENT_MACRO_USE_DO_WHILE Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Reviewed-by: Cezar Craciunoiu <cezar.craciunoiu@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #836
Marco Schlumpp [Wed, 1 Feb 2023 13:42:17 +0000 (14:42 +0100)]
lib/posix-event: Add an empty implementation of ioctl to eventfd
The fcntl function will forward fcntl(O_NONBLOCK), to the
underlying vnode `ioctl` op function, when a definition of FIONBIO and
FIOASYNC is present. This effectively makes `ioctl` a required function
for the vnops structure.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Maria Sfiraiala <maria.sfiraiala@gmail.com> Reviewed-by: Eduard Vintilă <eduard.vintila47@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #756
Eduard Vintilă [Sat, 11 Mar 2023 18:29:59 +0000 (20:29 +0200)]
lib/posix-event: Update `uio_offset` and `uio_resid` on successful reads
This commit updates (on a sucessful read) the `uio_offset` and
`uio_resid` members of the `uio` structure passed to the
`eventfd_vfscore_read` function. Without updating those members, the
`read` function from the vfscore layer will always report that no bytes
have been read at all.
Signed-off-by: Eduard Vintilă <eduard.vintila47@gmail.com> Reviewed-by: Cezar Craciunoiu <cezar.craciunoiu@unikraft.io> Reviewed-by: Delia Pavel <delia_maria.pavel@stud.acs.upb.ro> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #798
Marc Rittinghaus [Wed, 12 Apr 2023 13:22:54 +0000 (15:22 +0200)]
lib/9pfs: Add truncate to 9P_PROTO_2000U
When providing a length in the stat structure the 9pfs server on the
host will truncate the file to the specified size. We use this to also
enable truncation for the 2000U protocol version. Since uk_9pfs_setattr
checks for the protocol to use, the check can be completely dropped in
uk_9pfs_truncate.
Marc Rittinghaus [Wed, 12 Apr 2023 13:14:56 +0000 (15:14 +0200)]
lib/9pfs: Fix I/O error with chmod on directories
When we perform a chmod on a directory with the 9P_PROTO_2000U
protocol, the TWSTAT command is used with a previously received and
modified stat structure as parameter. There are two bugs in this.
First, updating the mode will remove the type information stored in the
high bits of the mode field. The call to the 9pfs device thus fails because
the 9pfs server thinks we want to change the directory to a regular
file.
Fixing this, will reveal another issue. The update should use a
specifically initialized "dont-touch" stat structure instead of
receiving the current structure. The 9pfs server will only update
the properties that divert from this "dont-touch" structure. This
is important because otherwise the length field of the stat
structure is set and the server tries to truncate the directory
object on the host, which fails and eventually will be reported
as failed chmod to the guest application.
Marc Rittinghaus [Wed, 12 Apr 2023 12:55:03 +0000 (14:55 +0200)]
lib/uksglist: Make sure buffers are mapped
With ukvmem and demand-paging enabled it can happen that buffers
supplied to the sglist are not fully backed by physical memory. In that
case the call to ukplat_virt_to_phys() fails, which expects a valid
mapping.
This commit adds a call to uk_vma_advise() to make sure the entire
buffer is backed by physical memory.
A future optimization should integrate the address translation and
backing with physical memory in a visitor pattern that traverses the
page tables only once instead of doing it one time for the advise and
then an extra time for each page of the buffer.
Marco Schlumpp [Thu, 9 Feb 2023 11:28:50 +0000 (12:28 +0100)]
plat/x86: Enable NX bit when initializing paging
There are a few reasons to enable the NX bit in the paging init routine:
* Setting the bit before checking for actual support is risky.
Currently, the check happens in the paging initialization routine.
* The bit is not used, when the Unikraft paging support is not enabled.
* Every boot entry point (32-bit/64-bit) would have a duplicated enable.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Florin Postolache <florin.postolache80@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #752
The issue #821 was caused by defining the feature macro `_BSD_SOURCE` in
a header file `include/vfscore/mount.h`. This commit moves the macro
from the header to its source files, resolving the issue.
Marco Schlumpp [Thu, 9 Feb 2023 14:46:02 +0000 (15:46 +0100)]
lib/ukalloc: Ensure the ifpages metadata does not break any alignments
By using the rounded version of the metadata size, we can ensure that
the resulting alignments are suitable for any C scalar type. This is a
requirement for any malloc implementation.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Andra Paraschiv <andra@unikraft.io> Reviewed-by: Razvan Virtan <virtanrazvan@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #757
Marc Rittinghaus [Thu, 20 Apr 2023 07:49:02 +0000 (09:49 +0200)]
lib/vfscore: Enable FIONBIO in fcntl(F_SETFL)
Currently, we are synching FIONBIO to the underlying file
implementation via an ioctl only if FIONBIO is defined in
vfscore. Since this is not the case, setting O_NONBLOCK on
a file descriptor does not have any effect. This commit
includes the necessary header and also fixes the
fcntl(F_SETFL) and ioctl() to make sure that the state of
the file stays in sync with its flags.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Andra Paraschiv <andra@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #850
Marc Rittinghaus [Thu, 20 Apr 2023 07:12:35 +0000 (09:12 +0200)]
lib/nolibc: Fix ioctl signature
The signature of ioctl imported from musl uses a signed int as second
argument. This, however, differs from the definition in Linux, glibc,
and our own implementation, which use an unsigned long. Since using
int has lead to all sorts of problems also for musl (e.g., overflow into
sign bit), this commit adopts unsigned long also for the musl imported
header.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Andra Paraschiv <andra@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #850
Stefan Jumarea [Thu, 20 Apr 2023 10:29:49 +0000 (13:29 +0300)]
lib/vfscore: Fix error return on symlink syscall
The `sys_symlink()` function returns `ENOENT` if the lookup failed,
instead of the actual error code `lookup()` exited with.
This may not always be right, since `lookup()` can return other error
codes (for example `ELOOP`).
Fix that by not setting the error code and just jump to the end of the
function.
Signed-off-by: Stefan Jumarea <stefanjumarea02@gmail.com>
GitHub-Closes: #849 Reviewed-by: Andra Paraschiv <andra@unikraft.io> Approved-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #851
Andra Paraschiv [Wed, 12 Apr 2023 05:12:52 +0000 (05:12 +0000)]
lib/vfscore: Initialize the fp variable to an empty string
Sometimes the fp local string variable includes data that was
used before e.g. previous file paths. Thus, fp can contain characters
that are not part of the currently processed file path and different
errors can appear e.g. ENOENT (No such file or directory), when trying
to open a file.
Initialize the fp variable to an empty string before using it.
Andra Paraschiv [Mon, 10 Apr 2023 09:11:32 +0000 (09:11 +0000)]
lib/vfscore: Fix the mountpoint length for the symlink support
Opening a symlink file doesn't successfully complete. The mountpoint
length provided to the function that resolves a symlink needs to be
adjusted.
Update the mountpoint length to be the difference in size between the
full path of the symlink file and the relative path of the symlink file
to the mountpoint.
Non-writable shared file mappings are treated as anonymous read-only file
mappings. Note that any writes made to the underlying file will not be
reflected in memory.
Signed-off-by: Cosmin Vancea <csvancea@gmail.com> Reviewed-by: Andra Paraschiv <andra@unikraft.io> Approved-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #832
Hugo Lefeuvre [Sun, 16 Apr 2023 15:14:19 +0000 (17:14 +0200)]
lib/uk9p: Fix cast to invalid type
req is cast to void*, which is somewhat confusing since the function
returns a struct uk_9pfid *.
This patch was generated by the following Coccinelle semantic patch:
@@
expression E;
type T;
type R;
function f;
@@
T* f(...) {
<... when any
- return (R*)E;
+ return (T*)E;
...>
}
@@
type T;
identifier X;
function f;
@@
f(...) {
...
T* X;
<... when any
- return (T*)X;
+ return X;
...>
}
Signed-off-by: Hugo Lefeuvre <hugo.lefeuvre@manchester.ac.uk> Reviewed-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Approved-by: Marco Schlumpp <marco@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #844
Marco Schlumpp [Thu, 9 Feb 2023 12:04:57 +0000 (13:04 +0100)]
lib/ukvmem: Compile all source files for ISR context
The main and individual pagefault handlers are executed in an ISR
context. Not marking the files as `isr`, will cause the usual trouble
(clobbered vector registers).
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Radu Nichita <radunichita99@gmail.com> Approved-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #751
Marco Schlumpp [Mon, 13 Mar 2023 10:03:33 +0000 (11:03 +0100)]
lib/ukdebug: Handle a full tracing buffer correctly
The `__uk_trace_save_arg` function sets the `uk_trace_buffer_free` to
zero. The code previously subtracted the size from the
`uk_trace_buffer_free` variable even in this case causing an integer
underflow. Further trace-point emissions would then happily write past
the tracing buffer.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Razvan Virtan <virtanrazvan@gmail.com> Reviewed-by: Cezar Craciunoiu <cezar.craciunoiu@unikraft.io> Approved-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #810
Marco Schlumpp [Thu, 2 Mar 2023 14:16:40 +0000 (15:16 +0100)]
plat/common: Ensure the `.eh_frame` section stays
Using the `CONFIG_OPTIMIZE_DEADELIM` KConfig option adds the
`--gc-sections` command-line flag to the linker. Because the `.eh_frame`
section is not really referenced anywhere the linker will happily throw
it away. The solution is to mark it with `KEEP` in the linker scripts.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Cezar Craciunoiu <cezar.craciunoiu@unikraft.io> Reviewed-by: Sergiu Moga <sergiu.moga@protonmail.com> Approved-by: Alexander Jung <alex@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #776
Simon Kuenzer [Thu, 16 Mar 2023 10:51:22 +0000 (11:51 +0100)]
build: Detect if `gawk` can be used instead of `awk`
This commit lets the build system pick preferably `gawk` as drop-in
replacement for `awk`. GNU AWK has the advantage that it emits
understandable error messages on AWK script errors. This simplifies
developing or editing awk files.
Signed-off-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Maria Sfiraiala <maria.sfiraiala@gmail.com> Reviewed-by: Florin Postolache <florin.postolache.of@gmail.com> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #803
Marco Schlumpp [Mon, 20 Feb 2023 14:11:32 +0000 (15:11 +0100)]
plat/kvm: Change unhandled irq message to a tracepoint
It's not possible to call a print function in an interrupt context,
because these are not ISR safe and will mess up the interrupted context.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Andra Paraschiv <andra@unikraft.io> Approved-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #768
The currently used syscall shim macro handles a return value of -1
by setting the return value to the value of errno, which results in
incorrect behaviour with mmap, which returns a MAP_FAILED (-1) address
as an indicator of failure. The result is that in case of mmap error,
the syscall will return the value of errno as the address, rather
than returning -1 and setting errno.
This commit fixes the issue by setting errno to the correct value
in case of mmap error.
Co-authored-by: Razvan Deaconescu <razvand@unikraft.io> Co-authored-by: Stefan Jumarea <stefanjumarea02@gmail.com> Signed-off-by: Ioan-Teodor Teugea <ioan_teodor.teugea@stud.acs.upb.ro> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Approved-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #799
Marc Rittinghaus [Fri, 10 Mar 2023 10:03:32 +0000 (11:03 +0100)]
lib/posix-mmap: Fix MAP_SHARED_VALIDATE
MAP_SHARED_VALIDATE is defined as 3, while MAP_PRIVATE is defined
as 2. A MAP_PRIVATE will thus also evaluate to true for the
MAP_SHARED_VALIDATE test. This commit fixes the flag test.
Co-authored-by: Cosmin Vancea <csvancea@gmail.com> Co-authored-by: Ioan-Teodor Teugea <ioan_teodor.teugea@stud.acs.upb.ro> Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #790
Although using IST does not allow nested exceptions we go back to
a dedicated stack for regular traps and use IST to switch to it. This
prevents an issue with ukvmem, where a stack is allocated from pageable
heap and pushing to a non-present stack page leads to a double fault.
With this change the stack is switched to the dedicated trap stack and
the page fault for the original stack can be resolved.
A solution to allow nested exceptions would be to reconfigure the trap
to not use IST before executing code that can potentially fail and
restoring IST configuration on afterwards.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Stefan Jumarea <stefanjumarea02@gmail.com> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #790
Simon Kuenzer [Tue, 7 Feb 2023 10:03:58 +0000 (11:03 +0100)]
lib/syscall_shim: uk_prsyscall: Fix typecast for PT_BUFP
PT_BUFP prints binary buffer content human readable but had one
particular problem: Due to incomplete typecasting, printing of a
negative byte (__s8) caused printing a 4-byte hex sequence instead
of just one byte with the format: `\0xHH`.
This commit fixes this with proper typecasting.
Signed-off-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #750
Currently, the user stack is used as kernel stack. This can be
a problem if the stack is not aligned on syscall entry. However, it
may be aligned for some calls. We thus cannot just push a fixed
amount of words. Instead, we store the original stack pointer and
align it using an and operation, which guarantees correct alignment
in any case.
Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Reviewed-by: Simon Kuenzer <simon@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #748
Simon Kuenzer [Sat, 4 Feb 2023 13:17:05 +0000 (14:17 +0100)]
lib/uksched: Align allocated stacks to arch requirement
This commits introduces aligns stack allocation that are done by
`lib/uksched` to the requirement of the target architecture. Without
aligned stacks, random crashed may occur because the compiler is assuming
such an alignment. An incorrect stack alignment can cause crashes because
the compiler may placed instructions in the code that will fail when
accessing values on the stack if not properly aligned.
Signed-off-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Marco Schlumpp <marco@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #747
support/scripts: Allow overlapping bootinfo region
Preliminary fix: Unikraft expects memory regions in the boot info
to not overlap and be page aligned. This is, however, not
compatible with having the .tdata section being assigned its
dedicated segment. This commit removes the sanity checks for
now as Unikraft can handle this specific case.
Signed-off-by: Marco Schlumpp <marco@unikraft.io> Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Michalis Pappas <michalis.pappas@opensynergy.com> Reviewed-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #746
When building Unikraft a warning might pop up stating that
the allocated section .tdata is not assigned to a loadable
segment. This commit puts the section into a segment which
is added to the PT_LOAD program headers.
Checkpatch-Ignore: SPACING Signed-off-by: Marco Schlumpp <marco@unikraft.io> Signed-off-by: Marc Rittinghaus <marc.rittinghaus@unikraft.io> Reviewed-by: Michalis Pappas <michalis.pappas@opensynergy.com> Reviewed-by: Marco Schlumpp <marco@unikraft.io> Reviewed-by: Razvan Deaconescu <razvand@unikraft.io> Approved-by: Simon Kuenzer <simon@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #746
This commit introduces initial print format and decoding definitions for
the following system calls: `SYS_socket`, `SYS_bind`, `SYS_sendto`,
`SYS_recvmsg`
Signed-off-by: Simon Kuenzer <simon@unikraft.io> Reviewed-by: Eduard Vintilă <eduard.vintila47@gmail.com> Reviewed-by: Andra Paraschiv <andra@unikraft.io> Approved-by: Razvan Deaconescu <razvand@unikraft.io> Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #737