1// SPDX-License-Identifier: GPL-3.0-or-later
2#pragma once
3
4#include "mos/platform/platform.hpp"
5#include "mos/tasks/task_types.hpp"
6
7#include <mos/allocator.hpp>
8#include <mos/lib/structures/list.hpp>
9#include <mos/tasks/signal_types.h>
10
11#define ERESTARTSYS 512
12
13/**
14 * @defgroup kernel_tasks_signal kernel.tasks.signal
15 * @ingroup tasks
16 * @brief Signal handling.
17 * @{
18 */
19
20/**
21 * @brief A pending signal.
22 *
23 */
24struct sigpending_t : mos::NamedType<"SigPending">
25{
26 as_linked_list;
27 signal_t signal;
28};
29
30/**
31 * @brief Send a signal to a thread.
32 *
33 * @param target
34 * @param signal
35 */
36long signal_send_to_thread(Thread *target, signal_t signal);
37
38/**
39 * @brief Send a signal to a process, an arbitrary thread will be chosen to receive the signal.
40 *
41 * @param target
42 * @param signal
43 */
44long signal_send_to_process(Process *target, signal_t signal);
45
46/**
47 * @brief Prepare to exit to userspace.
48 *
49 * @param regs The registers of the thread.
50 * @returns register to use when returning to userspace
51 *
52 */
53ptr<platform_regs_t> signal_exit_to_user_prepare(platform_regs_t *regs);
54
55/**
56 * @brief Prepare to exit to userspace after a syscall.
57 *
58 * @param regs The registers of the thread.
59 * @param syscall_nr The syscall number, used in case the syscall should be restarted.
60 * @param syscall_ret The return value of the syscall, which may be -ERESTARTSYS,
61 * in which case the syscall should be restarted.
62 * @returns register to use when returning to userspace
63 */
64ptr<platform_regs_t> signal_exit_to_user_prepare(platform_regs_t *regs, reg_t syscall_nr, reg_t syscall_ret);
65
66typedef struct _sigreturn_data
67{
68 signal_t signal;
69 bool was_masked;
70} sigreturn_data_t;
71
72/**
73 * @brief Return from a signal handler.
74 *
75 */
76void signal_on_returned(sigreturn_data_t *supplimentary_data);
77
78/**
79 * @brief Return true if there's a pending signal.
80 *
81 */
82bool signal_has_pending(void);
83
84/** @} */
85