Kernel: Clean up signal handling

We now appreciate sa_mask and SA_NODEFER and change the signal mask for
the duration of signal handler. This is done by making a sigprocmask
syscall at the end of the signal handler. Back-to-back signals will
still grow stack as original registers are popped AFTER the block mask
is updated. I guess this is why linux has sigreturn(?).
This commit is contained in:
2026-04-05 02:25:59 +03:00
parent df257755f7
commit 8ca3c5d778
4 changed files with 83 additions and 78 deletions

View File

@@ -157,12 +157,13 @@ namespace Kernel
struct signal_handle_info_t
{
vaddr_t signal_handler;
vaddr_t signal_stack_top;
vaddr_t handler;
vaddr_t stack_top;
uint64_t restore_sigmask;
bool has_sa_restart;
};
signal_handle_info_t remove_signal_and_get_info(int signal);
void handle_signal_impl(int signal, const siginfo_t&, vaddr_t signal_handler, vaddr_t signal_stack_top);
void handle_signal_impl(int signal, const siginfo_t&, const signal_handle_info_t&);
private:
// NOTE: this is the first member to force it being last destructed