Michalis Pappas [Fri, 7 Mar 2025 07:17:24 +0000 (08:17 +0100)]
lib/posix-process: Add exit() and exit_group()
exit() terminates the calling thread, and the process if it's the last /
only thread in the process. exitgroup() termintates the calling process
leaving it in the zombie state for wait() to reap. for more info see
exit(2) and exit_group(2).
Internally, exit() and exit_group() issue the POSIX_THREAD_EXIT_EVENT
and POSIX_PROCESS_EXIT_EVENT respectively, to notify libraries that have
registered event handlers to these events.
lib/posix-process: Ignore CLONE_VM when assigning tls parameter
The interpretation of the tls parameter of clone() is conditional to
passing CLONE_SETTLS in flags. Fix a bug where CLONE_VM would result
into assigning the tls parameter to child. Assigning the parent's tls
when CLONE_VFORK is set, is performed in clone_setup_child_ctx(),
conditionally that the child's tls is not already set, presumably due
to CLONE_SETTLS.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
Michalis Pappas [Sun, 30 Mar 2025 13:43:29 +0000 (15:43 +0200)]
lib/posix-process: Update semantics of vfork()'s return type
Although with the current implementation the returned value is identical,
vfork() returns the child's pid rather than tid. Updadte the naming of
identifiers to reflect that correctly.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
lib/posix-fdtab: Adapt to updated libposix-process config options
Following the consolidation of CONFIG_LIBPOSIX_PROCESS_PIDS and
CONFIG_LIBPOSIX_PROCESS_CLONE into LIBPOSIX_PROCESS_MULTITHREADING,
update to the new config.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
lib/uklock: Adapt to updated libposix-process config options
Following the consolidation of CONFIG_LIBPOSIX_PROCESS_PIDS and
CONFIG_LIBPOSIX_PROCESS_CLONE into LIBPOSIX_PROCESS_MULTITHREADING,
update to the new config.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
lib/nolibc: Adapt to updated libposix-process config options
Following the consolidation of CONFIG_LIBPOSIX_PROCESS_PIDS and
CONFIG_LIBPOSIX_PROCESS_CLONE into LIBPOSIX_PROCESS_MULTITHREADING,
update to the new config.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
lib/posix-futex: Adapt to updated libposix-process config options
Following the consolidation of CONFIG_LIBPOSIX_PROCESS_PIDS and
CONFIG_LIBPOSIX_PROCESS_CLONE into LIBPOSIX_PROCESS_MULTITHREADING,
update to the new config.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
lib/syscall-shim: Adapt to updated libposix-process config options
Following the consolidation of CONFIG_LIBPOSIX_PROCESS_PIDS and
CONFIG_LIBPOSIX_PROCESS_CLONE into LIBPOSIX_PROCESS_MULTITHREADING,
update to the new config.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
lib/vfscore: Adapt to updated libposix-process config options
Following the consolidation of CONFIG_LIBPOSIX_PROCESS_PIDS and
CONFIG_LIBPOSIX_PROCESS_CLONE into LIBPOSIX_PROCESS_MULTITHREADING,
update to the new config.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
lib/posix-process: Consolidate assignment of pthread parent and self
uk_posix_process_create() is missing the assignment of pthread_self.
Instead of having wrappers perform these assignments of parent and
self, move these assignments to the core functions that create and
release threads.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
lib/posix-process: Restrict pthread creation to clone()
The current implementation incorrectly creates a pthread in the current
process, for every new uk_thread created. This behavior is problematic
because during a syscall, libraries may create uk_threads that are
intended to act as kernel threads. Decouple pthread initializaiton from
uk_thread and limit it to clone().
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
Provide a function to attach a thread to the current process. This is
intended to be exclusively used by app-elfloader when configured with
initrd, in order to assign the container thread it creates to the init
process.
Move uk_process_kill() to the internal API, and rename to avoid using
the naming convention of public functions, and deprecate the unused
uk_posix_process_create().
Checkpatch-Ignore: REPEATED_WORD Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
Michalis Pappas [Wed, 19 Mar 2025 07:14:56 +0000 (08:14 +0100)]
lib/posix-process: Refactor Kconfig options
Replace CONFIG_LIBPOSIX_PROCESS_PIDS and CONFIG_LIBPOSIX_PROCESS_CLONE
with a single option, CONFIG_LIBPOSIX_PROCESS_MULTITHREADING. This
option enables clone(), _exit(), and exit_group() syscalls as well as
the core logic of libposix-process. Make options previously relevant
to CONFIG_LIBPOSIX_PROCESS_CLONE move to subselection of multithreading.
Without CONFIG_LIBPOSIX_PROCESS_MULTITHREADING the implementation falls
back into stubs. This provides an execution environment for simple
libc-based applications that don't require multithreading, but still
need to execute under a process-like environment. Under this state,
the syscalls involved in multithreading (or multiprocess) return an
error, while others are emulated. Notice that if Unikraft is not configured
to execute main() in a separate uk_thread (i.e. LIBUKBOOT_MAINTHREAD),
_exit() and exit_group() are not available.
Introduce a new config option to enable multiprocess support, namely
CONFIG_LIBPOSIX_PROCESS_MULTIPROCESS. This option replaces the config
option of vfork(), and enforces the selection of multithreading and
execve().
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1627
This change removes the assert on the buffer argument to the getrandom
syscall and replaces it with defined input validation, based on observed
behavior in Linux:
- if the requested number of bytes is 0, getrandom shortcuts to success
- if buffer is NULL and > 0 bytes requested, return -EFAULT instead of
crashing
Andrei Tatar [Tue, 29 Apr 2025 13:54:03 +0000 (15:54 +0200)]
lib/vfscore: Fix write const path in automount
Previously vfscore_mount_volume would pass a const path to
vfscore_ukopt_mkmp, which expects a mutable path, and indeed does modify
it in-place during execution. This is wrong and rightfully triggers a
compiler warning.
This change fixes this by having mkmp allocate a temporary writable path.
Sergiu Moga [Thu, 20 Mar 2025 18:51:06 +0000 (20:51 +0200)]
lib/posix-process: Notify process/thread signal files when possible
Whenever a signal shouldn't be dropped, meaning it is either not ignored by
the process or the process has signal files that are monitoring that
particular signal, notify the existing signal files in question
of the posix thread/process by setting the input event on said files.
Sergiu Moga [Thu, 20 Mar 2025 18:46:01 +0000 (20:46 +0200)]
lib/posix-process: Init signal files ctx on signal desc creation
We have two initialization places for the signal files context of a
signal files context:
- on vfork when a child process is born and its signal descriptor is
correspondingly inherited from the parent
- on signal descriptor initialization on regular process creation
For the former, at this time, we do not support proper open file
inheritance across vfork/execve for those that do not have the
O_CLOEXEC flag. Therefore, for now, simply just initialize child
process' signal descriptor signal file context as empty.
Sergiu Moga [Thu, 20 Mar 2025 17:54:14 +0000 (19:54 +0200)]
lib/posix-process: Add `signalfd`/`signalfd4` support
Add support for the `signalfd`/`signalfd4` syscalls which will
allow callers to add monitored signal files to the current process,
allowing them to be notified of pending signals.
Introduce the primitives required for supporting signalfd: signal files.
These embed the actual base file structure, the mask that shows what
signals are being monitored as well as other file data to properly
register with libukfile.
Each process' signal descriptor holds control over the signal files
context which tracks the combined mask of all of the open signal files
as well as a list of their references. Having a combined mask helps
to make checking to see whether a process has signal files monitoring
for a given signal faster as compared to iterating every time through
each signal file and checking their masks.
Thus, adding a new signal file entry means updating the combined mask.
Deleting one implies resetting the signal mask and reiterating
through all remaining signal files for a proper combined mask. However,
as an optimization, we don't do that. Instead, we defer mask
recalculation until we need to reiterate through the signal files
again, which is when we have to notify the registered signal files
against a signal number.
Sergiu Moga [Thu, 27 Mar 2025 17:30:49 +0000 (19:30 +0200)]
lib/posix-fdtab: Fix docstring of `uk_fdtab_open`
Commit 5050e9f11e57 ("lib/posix-fd: Move heap-alloc ofiles out of fdtab")
did `s/uk_fdtab_ret/uk_ofile_release` across the codebase but forgot to
update the comment for `uk_fdtab_open`. Do so now, indicating to use
`uk_ofile_release` instead.
Sergiu Moga [Wed, 26 Mar 2025 16:09:51 +0000 (18:09 +0200)]
lib/ukfile: Add `uk_iov_remaining` to help tell remaining iov space
Add a new routine `uk_iov_remaining` that simply checks how many bytes
the memory regions described by `iov[iovcnt]`, starting at `cur` offset
from the buffer at `iov[iovi]` can fit.
lib/posix-process/signal: Add stub for CLONE_SIGHAND
Provide stub for CLONE_SIGHAND when LIBPOSIX_PROCESS_SIGNAL
is not selected. This prevents clone() from returning -ENOTSUP
when signals are not selected.
lib/posix-process/signals: Fix conditional for sigsetops
The implementation of sigsetops was conditional to HAVE_LIBC instead of
CONFIG_HAVE_LIBC, causing a build error when musl is used, due to the
definiton of sigset_t to different types. Update the conditional to fix.
Notice that this works as each flavor of libc controls both the type
and the implementation of the functions that operate on it.
Signed-off-by: Michalis Pappas <michalis@unikraft.io> Reviewed-by: Sergiu Moga <sergiu@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1626
Michalis Pappas [Wed, 26 Mar 2025 04:47:09 +0000 (05:47 +0100)]
lib/posix-process: Create PID1 from the thread passed in init
Update the instantiation of INIT_PID to use the thread passed in the
init context. This allows excluding unikraft's init thread from the
process when libukboot creates a separate thread for main().
Michalis Pappas [Tue, 25 Mar 2025 08:09:50 +0000 (09:09 +0100)]
lib/ukboot: Pass tmain to init context
Populate the init context with the thread that executes main().
When LIBUKBOOT_MAINTHREAD is selected, this allows libposix-process
to create INIT_PID from the main thread while excluding Unikraft's
init thread from the process.
Move the initialization of the main() thread before executing inittab.
With that change, update the parameters main_thread() function to pass
a pointer to ictx, so that it's possible for args to be updated by
inittab.
Sergiu Moga [Mon, 24 Mar 2025 17:00:35 +0000 (19:00 +0200)]
lib/posix-process: Define `libc` wrappers for `vfork`
It is impossible to write the libc wrapper of the `vfork` system call
in C since the child might end up reusing and overwriting the parent's
return address when it pops it and then calls `execve`, leaving the
parent to return to an invalid state - typically would overwrite it
with the return address from execve, making it look as if the parent
returned from execve.
Userspace libc's solve this by writing the libc wrapper as something
among the lines of:
popq %<register that the syscall guarantees to preserve>
movq $SYS_vfork, %rax
syscall
pushq %<register we popped return address into 3 lines above>
ret
On ARM64 as well as others, clone() with the flags
`SIGCHLD | CLONE_VM | CLONE_VFORK` is called instead but let's just
still use our `vfork` implementation since it essentially also does
the same exact thing.
However, as a Unikernel with function calls for system calls we do
not need to care about any of that, as our execenv prologue can store
and restore everything without touching the stack. Thus, we can write
our native libc wrappers as a basic jump/branch to said prologue.
Sergiu Moga [Mon, 24 Mar 2025 16:52:48 +0000 (18:52 +0200)]
lib/posix-process: Add `libc` system call wrapper for `clone`
In order to successfully call the clone system call through a libc
wrapper we need to be able to have an assembly sequence that both
translates the arguments passed by the libc wrapper to those of the
underlying syscall, since their signatures differ, as well as redirect
the parent and child accordingly upon exit from said syscall: child
must run its requested function and argument and parent must return
to the clone caller with an unscathed register context.
Said assembly sequence must be aware of the signature differences
between architectures, e.g. ARM64 vs x86_64 signatures of the
clone system call.
Sergiu Moga [Mon, 24 Mar 2025 16:46:16 +0000 (18:46 +0200)]
lib/syscall_shim/arch/x86_64: Restore `RIP` from the auxiliary stack
Before this patch, we would simply rely on the original pushed RIP
following the call instruction that got to our assembly wrapper.
However this may not be the same in cases such as those of the clone
or vfork system calls if the child were to reuse the stack: the child
could pop the return address before the parent gets the chance to do it
and even call some other functions (like execve), overwriting whatever
previously was at the bottom of the stack that the parent had prior
to invoking the system call.
To solve this, simply use the RIP pushed at the beginning of the wrapper
instead of assuming the bottom of the stack is untouched.
Sergiu Moga [Mon, 24 Mar 2025 16:42:17 +0000 (18:42 +0200)]
lib/syscall_shim/arch/arm64: Store caller's link register
So far for storing LR and ELR_EL1 we have been using the current
link register for both instead. This does not reflect reality when
it comes to LR as we should instead store the LR that the caller
would know. To achieve this, do a brief level 1 stack unwinding and
fetch caller's LR from the top of its frame.
Sergiu Moga [Mon, 24 Mar 2025 16:34:28 +0000 (18:34 +0200)]
arch: Define regular function calling convention register arguments
Define the macros that one could use to access the registers within
`struct __regs` that represent the ABI/calling convention specific
that contain the arguments (and the return value).
Sergiu Moga [Mon, 24 Mar 2025 09:03:56 +0000 (11:03 +0200)]
lib/syscall_shim: Add `uk_syscall_do_` syms for execenv registrations
Because of the unnecessary conditional during syscall symbols
generation, execenv syscall registrations would not benefit from
having their `uk_syscall_do_` symbol generated automatically.
Fix this by removing this conditional.
Sergiu Moga [Wed, 19 Mar 2025 14:31:50 +0000 (16:31 +0200)]
lib/syscall_shim/arch/x86_64: Save proper rsp in execenv prologue
In the execenv prologue meant for native builds we try to mimic the
context save/restore that would happen following a syscall instruction
but in the case of a direct call instruction. This means that the rsp
on entry is actually 8 bytes less than the rsp we are supposed to show
to actual users of this execenv. To cope with this, after pushing the
original rsp do an addition of 8 so that children (e.g. vfork) that may
inherit this context have the proper rsp. Lastly, because of this, upon
exiting the execenv assembly wrapper we must ensure that the context
whose execenv we store/restore is using the proper rsp as well by
undoing aforementioned addition, since it actually returns like a normal
function through ret.
This bug hasn't been caught before because we've only been using this
in the context of the clone syscall for native builds. Unlike vfork,
in the case of clone, the children typically begin execution with a
brand new stack instead of reusing and mimicking that of the parent.
Sergiu Moga [Mon, 10 Mar 2025 16:24:54 +0000 (18:24 +0200)]
lib/syscall_shim: Use global scope inline asm for execenv prologue
Avoid having to use weird and unconventional function attributes by
writing the inline assembly in a global scope. This is especially
useful for ARM64 as it does not support the naked attribute on GCC.
Signed-off-by: Sergiu Moga <sergiu@unikraft.io> Approved-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Andrei Tatar <andrei@unikraft.io> Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #1598
Andrei Tatar [Tue, 18 Mar 2025 16:55:34 +0000 (17:55 +0100)]
lib/posix-fd: Move heap-alloc ofiles out of fdtab
This change moves the responsibility for allocating, managing the
lifetime of, and freeing heap-allocated open file descriptions out of
individual fdtab instances and into the main posix-fd API.
This allows libraries to create kernel-wide dynamic open file
descriptions independent of an fdtab.
Michalis Pappas [Tue, 18 Mar 2025 10:16:59 +0000 (11:16 +0100)]
lib/posix-process: Make header definitions conditional to PIDS
Make definitions in private process.h conditional to
CONFIG_LIBPOSIX_PROCESS_PIDS to prevent compile errors if that header
is if that header is included by files compiled unconditionally to
CONFIG_LIBPOSIX_PROCESS_PIDS.
Michalis Pappas [Fri, 26 Jan 2024 02:58:05 +0000 (03:58 +0100)]
lib/uksignal: Retire libuksignal
Retire libuksignal in favor of the new implementation introduced
in libposix-process. Stubs of equivalent functionality previously
provided in libuksignal are still available in libposix-process,
when CONFIG_POSIX_PROCESS_SIGNAL is not selected.
Michalis Pappas [Fri, 26 Jan 2024 02:53:09 +0000 (03:53 +0100)]
lib/posix-process/signal: Add rt_sigtimedwait()
rt_sigtimedwait() suspends the execution of the calling thread until a
signal in a caller-provided mask is pending, or a caller provided
timeout is reached. For more info see sigwaitinfo(2)
Michalis Pappas [Tue, 16 Jan 2024 11:49:36 +0000 (12:49 +0100)]
lib/posix-process/signal: Add sigsuspend()
sigsuspend() temporarily replaces the signal mask of the current
thread and suspends its execution until a signal is delivered.
For more info see sigsuspend(2)
Michalis Pappas [Wed, 3 Jan 2024 11:36:37 +0000 (12:36 +0100)]
lib/posix-process/signal: Add signal delivery
Implement signal delivery. Signals are delivered at syscall exit
by registering a handler to the syscall shim. The same handler
could be potentially register a handler to a preemptive scheduler's
context switch.
Notable differences from Linux:
- The Core disposition falls back to Term, as we don't support
application core dumps.
- The Stop and Cont dispositions are ignored, as these are normally
relevant to shells.
Michalis Pappas [Sun, 7 Jan 2024 10:56:16 +0000 (11:56 +0100)]
lib/posix-process/signal: Add kill() and sigqueueinfo()
Add syscalls for signalling. Internally these share common
abstractions.
The kill syscalls are used for sending signals to processes,
process groups, or threads:
* kill() allows sending a signal to a process group or process.
* tkill() allows sending a signal to a thread.
* tgkill() allows sending a signal to a thread in thread
group.
The siqeueueinfo syscalls are similar to kill but additionally
allow to accompany the signal with data:
* rt_sigqueueinfo() allows sending signal and data to a process.
* rt_tgsigqueueinfo() allows sending signal and data to a thread
in thread group.
For more info see kill(2), tkill(2), rt_sigqueueinfo(2)
Michalis Pappas [Fri, 29 Dec 2023 12:37:21 +0000 (13:37 +0100)]
lib/posix-process/signal: Add default signal actions
Add per-architecture default signal actions. These happen to be the
same for arm64 and x86_64, yet it's best to define them in separate
headers for forwards compatibility with future architectures.
Michalis Pappas [Sun, 7 Jan 2024 15:50:12 +0000 (16:50 +0100)]
lib/posix-process/signal: Add signal descriptors and primitives
Introduce signal descriptors into `struct posix_process` and
`struct posix_thread`. Introduce primitives for various signal
operations such as initialization, allocation, and queueing.
Initialize signal descriptors upon creating a new process or
a thread.
Michalis Pappas [Thu, 28 Dec 2023 09:55:29 +0000 (10:55 +0100)]
lib/posix-process: Fix formatting of Config.uk
Update the indentation of Config.uk to adhere to Unikraft's coding
conventions. Remove `default n` items being redundant as `bool`
symbols default to `n`.
Michalis Pappas [Tue, 19 Mar 2024 10:25:43 +0000 (11:25 +0100)]
lib/posix-process/signal: Add kernel definition of sigset_t
POSIX specifies that sigset_t can be defined either as integer
type or a structure type. Add kernel definition of sigset_t to
avoid compilation errors caused by flavors of libc that use the
struct definition.
Michalis Pappas [Tue, 9 Jan 2024 12:03:52 +0000 (13:03 +0100)]
lib/posix-process: Fix integer overflow in sigset operations
Fix an integer overflow caused by missing `UL` suffix on
shifted values that would result into incorrect evaluation
when signal numbers >= SIGRTMIN are passed to paremeters.
The philosophy is that each driver is meant to individually export
whatever symbols it sees fit. Therefore, delete the unnecessary
`exportsyms.uk` in the root of the interrupt controller drivers
subsystem.
Sergiu Moga [Tue, 16 Jan 2024 20:35:50 +0000 (22:35 +0200)]
drivers: Add `PS/2` subsystem with a dumbed down PS2 keyboard driver
Add a directory to represent what will be in the future the
subsystem for PS/2 controller drivers subsystem.
Implement a basic, dumbed down, driver stub for the PS/2 keyboard.
Write just enough functionality to register an IRQ handler for the
well known default legacy PIC routed PS/2 keyboard IRQ line and be
able to process 3 scan codes received in a burst manner:
CTRL + ALT + DEL
This functionality is bare minimum required to achieve shutdown with
Firecracker's `SendCtrlAltDel` command. It may not work on QEMU and
is obviously not the way the real driver should be implemented.
Additionally, introduce a new invisible config option:
`CONFIG_HAVE_SHUTDOWN_DISPATCHER`
Now, whenever a component implements the functionality of raising a
shutdown event, it must announce it system-wide by selecting this
config. That being said, make the keyboard driver do this.
(In the future, when we will be able to receive actual keystrokes,
we may be able to make this a separate config of the keyboard driver,
besides the actual functionality of processing keystrokes).
Andrei Tatar [Wed, 22 Jan 2025 22:16:37 +0000 (23:16 +0100)]
lib/posix-timerfd: Output correct old_value on set
Previously settime() would output the old timerfd setting verbatim, as
an absolute deadline; this contradicts timerfd_settime(2) which clearly
states that old_value should be output with the same semantics as
gettime() -- relative time remaining until the next expiration.
This change makes settime() calculate and output this time correctly.
Andrei Tatar [Wed, 22 Jan 2025 22:26:44 +0000 (23:26 +0100)]
lib/posix-timerfd: Fix counter on subsequent reads
The internal counter of a timerfd is returned on read() and reset to 0,
and should be increased by 1 for every subsequent expiration.
A logic error in the current code makes every update set the counter to
the total expirations rather than since last read, leading to subsequent
successful reads returning wrong counts.
This change fixes this error.
Andrei Tatar [Wed, 25 Sep 2024 15:38:05 +0000 (17:38 +0200)]
lib/posix-socket: Give name to opened sockets
This change names newly opened sockets as such:
- generic sockets: "socket"
- sockets opened by a call to accept(): "socket:accepted"
- sockets opened by socketpair(): "socket:pair"
Andrei Tatar [Wed, 25 Sep 2024 15:30:36 +0000 (17:30 +0200)]
lib/posix-fdtab: Allow named files & partial open
This change expands the fdtab API, separating the action of creating a
new open file description with that of associating it with an fd. This
allows callers to perform additional initialization on the open file
description before the fd goes live.
One notable such init is filling in the `name` field of the ofile,
which the API additions now support and take care to allocate space for.
It was a conscious decision to not mandate that the fdtab fill in the
name itself, as drivers may construct names in any manner of ways other
than having a string on hand. Thus, to prevent a redundant memcpy, a
driver can choose to fill in the field itself.
Andrei Tatar [Wed, 19 Feb 2025 11:54:31 +0000 (12:54 +0100)]
lib/posix-fdtab: Fix wrong return in exec handler
Previously fdtab_handle_execve would return 0 on success, as per common
convention. This is however wrong for event handlers, as these require
specific exit codes on success; in this case UK_EVENT_HANDLED_CONT.
This change fixes this oversight.
Andrei Tatar [Tue, 23 Jan 2024 18:44:06 +0000 (19:44 +0100)]
lib/posix-fdtab: Handle fdtab duplication on clone
This change adds logic to handle fdtab references on clone:
- if CLONE_FILES: child inherits a reference to parent's tab
- if !CLONE_FILES: child allocates new fdtab duplicate of parent's,
populated with new references to the same open file descriptions hosted
by the parent fdtab.
The initial duplication logic is rudimentary and does not provide any
ordering guarantees w.r.t. syscalls modifying the original table (open,
dup, close), under the assumption that it won't trigger race conditions
in the wild. Please revisit if this turns out to be overly optimistic.
Andrei Tatar [Tue, 23 Jan 2024 18:37:36 +0000 (19:37 +0100)]
lib/posix-fdtab: Add value assert in fmap_xchg
This change adds an assert to sanity-check the value to be exchanged
into the fmap. Exchanging in a NULL value is an invalid operation and
breaks the semantics of fmap, leaving the data structure in a
potentially unsound state.
Calling code should never normally do this; the assert serves as extra
precaution for future development.