23 const int signo = sig - 1;
24 char *
const ptr = (
char *) sigset;
33 const int signo = sig - 1;
34 char *
const ptr = (
char *) sigset;
43 const int signo = sig - 1;
44 const char *
ptr = (
const char *) sigset;
76 case SIGSEGV:
return true;
81 case SIGPIPE:
return false;
91 pr_emerg(
"signal_send_to_thread(%pt, %d): cannot send non-fatal signal to kernel thread", target, signal);
97 bool has_pending =
false;
100 has_pending |= pending->signal == signal;
123 if (target->
pid == 1 && signal == SIGKILL)
125 pr_emerg(
"signal_send_to_process(%pp, %d): cannot send SIGKILL to init", target, signal);
129 if (target->
pid == 2)
131 pr_emerg(
"signal_send_to_process(%pp, %d): cannot send signal to kthreadd", target, signal);
140 target_thread = thread;
151 target_thread = thread;
159 pr_emerg(
"signal_send_to_process(%pp, %d): no thread to send signal to", target, signal);
180 pr_emerg(
"thread %pt received fatal signal %d but it was masked, terminating",
current_thread, pending->signal);
187 signal = pending->signal;
197 if (action->
handler == SIG_DFL)
222 if (action->
handler == SIG_IGN)
233 .signal = next_signal,
234 .was_masked = was_masked,
266 reg_t real_ret = syscall_ret;
274 pr_dinfo2(signal,
"thread %pt will restart syscall %lu after signal %d",
current_thread, syscall_nr, next_signal);
298 bool has_pending =
false;
#define MOS_UNREACHABLE_X(msg,...)
#define MOS_UNREACHABLE()
long signal_send_to_process(Process *target, signal_t signal)
Send a signal to a process, an arbitrary thread will be chosen to receive the signal.
void signal_exit_to_user_prepare_syscall(platform_regs_t *regs, reg_t syscall_nr, reg_t syscall_ret)
Prepare to exit to userspace after a syscall.
void signal_on_returned(sigreturn_data_t *data)
Return from a signal handler.
bool signal_has_pending(void)
Return true if there's a pending signal.
void signal_exit_to_user_prepare(platform_regs_t *regs)
Prepare to exit to userspace.
long signal_send_to_thread(Thread *target, signal_t signal)
Send a signal to a thread.
MOSAPI void linked_list_init(list_node_t *head_node)
Initialise a circular double linked list.
MOSAPI void list_node_append(list_node_t *head, list_node_t *item)
#define list_foreach(t, v, h)
Iterate over a list.
#define list_node(element)
Get the ‘list_node’ of a list element. This is exactly the reverse of ‘list_entry’ above.
#define list_remove(element)
void define_syscall thread_exit(void)
T * create(Args &&...args)
#define pr_emerg(fmt,...)
#define pr_dinfo2(feat, fmt,...)
void process_exit(Process *&&proc, u8 exit_code, signal_t signal)
void scheduler_wake_thread(Thread *thread)
Wake a thread.
static void do_signal_exit_to_user_prepare(platform_regs_t *regs, signal_t next_signal, const sigaction_t *action)
static bool is_fatal_signal(signal_t signal)
static void signal_do_coredump(signal_t signal)
static int sigset_add(sigset_t *sigset, int sig)
static void signal_do_terminate(signal_t signal)
static int sigset_del(sigset_t *sigset, int sig)
static void signal_do_ignore(signal_t signal)
static int sigset_test(const sigset_t *sigset, int sig)
static signal_t signal_get_next_pending(void)
should_inline bool spinlock_is_locked(const spinlock_t *lock)
#define spinlock_acquire(lock)
#define spinlock_release(lock)
mos::list< Thread * > thread_list
thread_mode mode
user-mode thread or kernel-mode
thread_signal_info_t signal_info
list_head pending
list of pending signals