Kernel/LibC: Add bareboness signals

You can now call raise() to raise a signal. Signal handlers are
not yet supported, but the handling works :)
This commit is contained in:
Bananymous
2023-07-21 15:45:02 +03:00
parent faf4220b38
commit dcd4d0daeb
14 changed files with 126 additions and 3 deletions

View File

@@ -14,6 +14,9 @@
#include <stdio.h>
#include <sys/sysmacros.h>
extern "C" void signal_trampoline();
extern "C" void test_signal();
namespace Kernel
{
@@ -788,6 +791,27 @@ namespace Kernel
return 0;
}
BAN::ErrorOr<long> Process::sys_raise(int signal, uintptr_t& return_rsp, uintptr_t& return_rip)
{
if (signal < _SIGMIN || signal > _SIGMAX)
return BAN::Error::from_errno(EINVAL);
ASSERT(&Process::current() == this);
LockGuard lock_guard(m_lock);
asm volatile("cli");
uintptr_t* return_rsp_ptr = (uintptr_t*)return_rsp;
*--return_rsp_ptr = return_rip;
*--return_rsp_ptr = signal;
*--return_rsp_ptr = (uintptr_t)test_signal;
return_rsp = (uintptr_t)return_rsp_ptr;
return_rip = (uintptr_t)signal_trampoline;
return 0;
}
BAN::ErrorOr<long> Process::sys_setuid(uid_t uid)
{
if (uid < 0 || uid >= 1'000'000'000)

View File

@@ -140,6 +140,9 @@ namespace Kernel
case SYS_DUP2:
ret = Process::current().sys_dup2((int)arg1, (int)arg2);
break;
case SYS_RAISE:
ret = Process::current().sys_raise((int)arg1, interrupt_stack.rsp, interrupt_stack.rip);
break;
default:
dwarnln("Unknown syscall {}", syscall);
break;

View File

@@ -98,8 +98,8 @@ namespace BAN::Formatter
}
extern "C" uintptr_t g_kernel_start;
extern "C" uintptr_t g_kernel_end;
extern "C" uint8_t g_userspace_start[];
extern "C" uint8_t g_userspace_end[];
static void init2(void*);