Kernel: Make signals more POSIX

This commit is contained in:
2023-07-21 19:54:37 +03:00
parent ad756c36fc
commit 2149cec29f
6 changed files with 52 additions and 14 deletions

View File

@@ -97,7 +97,10 @@ namespace Kernel
, m_open_file_descriptors(m_credentials)
, m_pid(pid)
, m_tty(TTY::current())
{ }
{
for (size_t i = 0; i < sizeof(m_signal_handlers) / sizeof(*m_signal_handlers); i++)
m_signal_handlers[i] = (vaddr_t)SIG_DFL;
}
Process::~Process()
{
@@ -303,6 +306,7 @@ namespace Kernel
forked->m_fixed_width_allocators = BAN::move(fixed_width_allocators);
forked->m_general_allocator = BAN::move(general_allocator);
forked->m_userspace_info = m_userspace_info;
memcpy(forked->m_signal_handlers, m_signal_handlers, sizeof(m_signal_handlers));
ASSERT(this == &Process::current());
// FIXME: this should be able to fail
@@ -352,6 +356,9 @@ namespace Kernel
m_userspace_info.entry = elf->file_header_native().e_entry;
for (size_t i = 0; i < sizeof(m_signal_handlers) / sizeof(*m_signal_handlers); i++)
m_signal_handlers[i] = (vaddr_t)SIG_DFL;
// NOTE: we clear the elf since we don't need the memory anymore
elf.clear();
@@ -789,6 +796,16 @@ namespace Kernel
return 0;
}
BAN::ErrorOr<long> Process::sys_signal(int signal, void (*handler)(int))
{
if (signal < _SIGMIN || signal > _SIGMAX)
return BAN::Error::from_errno(EINVAL);
CriticalScope _;
m_signal_handlers[signal] = (vaddr_t)handler;
return 0;
}
BAN::ErrorOr<long> Process::sys_kill(pid_t pid, int signal, uintptr_t& return_rsp, uintptr_t& return_rip)
{
if (pid <= 0)