mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 05:57:44 +00:00
Implement sending signals to blocked-in-kernel processes.
This is dirty but pretty cool! If we have a pending, unmasked signal for a process that's blocked inside the kernel, we set up alternate stacks for that process and unblock it to execute the signal handler. A slightly different return trampoline is used here: since we need to get back into the kernel, a dedicated syscall is used (sys$sigreturn.) This restores the TSS contents of the process to the state it was in while we were originally blocking in the kernel. NOTE: There's currently only one "kernel resume TSS" so signal nesting definitely won't work.
This commit is contained in:
parent
c8b308910e
commit
03a8357e84
10 changed files with 190 additions and 27 deletions
|
@ -54,6 +54,7 @@
|
|||
__ENUMERATE_SYSCALL(umask) \
|
||||
__ENUMERATE_SYSCALL(getgroups) \
|
||||
__ENUMERATE_SYSCALL(setgroups) \
|
||||
__ENUMERATE_SYSCALL(sigreturn) \
|
||||
|
||||
|
||||
#define DO_SYSCALL_A0(function) Syscall::invoke((dword)(function))
|
||||
|
@ -78,6 +79,7 @@ inline constexpr const char* toString(Function function)
|
|||
ENUMERATE_SYSCALLS
|
||||
#undef __ENUMERATE_SYSCALL
|
||||
}
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
void initialize();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue