From: Michalis Pappas Date: Mon, 15 Jan 2024 06:13:31 +0000 (+0100) Subject: lib/posix-process/signal: Add pause() X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=3419263befb759a0e9a1596810ffe025f98a6445;p=unikraft%2Funikraft.git lib/posix-process/signal: Add pause() pause() causes the calling thread to sleep until a signal is delivered. For more info see pause(2) Signed-off-by: Michalis Pappas Reviewed-by: Ioan-Teodor Teugea Reviewed-by: Sergiu Moga Reviewed-by: Andrei Tatar Approved-by: Andrei Tatar GitHub-Closes: #1248 --- diff --git a/lib/posix-process/Makefile.uk b/lib/posix-process/Makefile.uk index 15e6b05f1..a174a4a30 100644 --- a/lib/posix-process/Makefile.uk +++ b/lib/posix-process/Makefile.uk @@ -22,6 +22,7 @@ LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BA LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BASE)/arch/$(CONFIG_UK_ARCH)/ucontext.c LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BASE)/arch/$(CONFIG_UK_ARCH)/signal.S|arch LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BASE)/signal/deliver.c +LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/pause.c LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/sigaltstack.c LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigpending.c LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigprocmask.c @@ -48,6 +49,7 @@ LIBPOSIX_PROCESS_CXXINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_CLONE) += clone-5e UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_EXECVE) += execve-3e +UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += pause-0 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += sigaltstack-2 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigpending-2 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigprocmask-4 diff --git a/lib/posix-process/exportsyms.uk b/lib/posix-process/exportsyms.uk index 414d9bf4b..2ddf9d81c 100644 --- a/lib/posix-process/exportsyms.uk +++ b/lib/posix-process/exportsyms.uk @@ -43,6 +43,7 @@ uk_posix_process_kill clone vfork kill +pause sigaltstack sigprocmask tgkill diff --git a/lib/posix-process/signal/pause.c b/lib/posix-process/signal/pause.c new file mode 100644 index 000000000..169c27749 --- /dev/null +++ b/lib/posix-process/signal/pause.c @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* Copyright (c) 2024, Unikraft GmbH and The Unikraft Authors. + * Licensed under the BSD-3-Clause License (the "License"). + * You may not use this file except in compliance with the License. + */ + +#include +#include +#include + +#include "process.h" +#include "signal.h" + +#if CONFIG_LIBPOSIX_PROCESS_SIGNAL +UK_SYSCALL_R_DEFINE(int, pause) +{ + struct posix_thread *pthread; + + pthread = uk_pthread_current(); + UK_ASSERT(pthread); + + /* Return as soon as a signal is queued. The signal will + * be delivered at syscall exit. + */ + pthread->state = POSIX_THREAD_BLOCKED_SIGNAL; + uk_semaphore_down(&pthread->signal->deliver_semaphore); + + return -EINTR; +} +#else /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */ +UK_SYSCALL_R_DEFINE(int, pause) +{ + UK_WARN_STUBBED(); + return 0; +} +#endif /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */