forked from Bananymous/banan-os
Kernel: Change signal kernel API
return rsp and rip are now stored per thread
This commit is contained in:
@@ -806,18 +806,19 @@ namespace Kernel
|
||||
return 0;
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> Process::sys_kill(pid_t pid, int signal, uintptr_t& return_rsp, uintptr_t& return_rip)
|
||||
BAN::ErrorOr<long> Process::sys_kill(pid_t pid, int signal)
|
||||
{
|
||||
if (pid <= 0)
|
||||
return BAN::Error::from_errno(ENOTSUP);
|
||||
if (signal != 0 && (signal < _SIGMIN || signal > _SIGMAX))
|
||||
return BAN::Error::from_errno(EINVAL);
|
||||
|
||||
if (pid == this->pid())
|
||||
return sys_raise(signal, return_rsp, return_rip);
|
||||
|
||||
if (pid == Process::current().pid())
|
||||
return Process::current().sys_raise(signal);
|
||||
|
||||
LockGuard process_guard(s_process_lock);
|
||||
CriticalScope _;
|
||||
|
||||
for (auto* process : s_processes)
|
||||
{
|
||||
if (process->pid() == pid)
|
||||
@@ -831,17 +832,24 @@ namespace Kernel
|
||||
return BAN::Error::from_errno(ESRCH);
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> Process::sys_raise(int signal, uintptr_t& return_rsp, uintptr_t& return_rip)
|
||||
BAN::ErrorOr<long> Process::sys_raise(int signal)
|
||||
{
|
||||
if (signal < _SIGMIN || signal > _SIGMAX)
|
||||
return BAN::Error::from_errno(EINVAL);
|
||||
ASSERT(m_threads.size() == 1);
|
||||
CriticalScope _;
|
||||
Thread::current().m_signal_queue.push(signal);
|
||||
Thread::current().handle_signal(signal, return_rsp, return_rip);
|
||||
Thread& current = Thread::current();
|
||||
current.m_signal_queue.push(signal);
|
||||
current.handle_next_signal();
|
||||
return 0;
|
||||
}
|
||||
|
||||
pid_t Process::foreground_pid()
|
||||
{
|
||||
ASSERT(s_foreground_pid);
|
||||
return s_foreground_pid;
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> Process::sys_setuid(uid_t uid)
|
||||
{
|
||||
if (uid < 0 || uid >= 1'000'000'000)
|
||||
|
||||
@@ -21,6 +21,8 @@ namespace Kernel
|
||||
extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, InterruptStack& interrupt_stack)
|
||||
{
|
||||
Thread::current().set_in_syscall(true);
|
||||
Thread::current().set_return_rsp(interrupt_stack.rsp);
|
||||
Thread::current().set_return_rip(interrupt_stack.rip);
|
||||
|
||||
if (syscall == SYS_SIGNAL_DONE)
|
||||
{
|
||||
@@ -147,10 +149,10 @@ namespace Kernel
|
||||
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);
|
||||
ret = Process::current().sys_raise((int)arg1);
|
||||
break;
|
||||
case SYS_KILL:
|
||||
ret = Process::current().sys_kill((pid_t)arg1, (int)arg2, interrupt_stack.rsp, interrupt_stack.rip);
|
||||
ret = Process::current().sys_kill((pid_t)arg1, (int)arg2);
|
||||
break;
|
||||
case SYS_SIGNAL:
|
||||
ret = Process::current().sys_signal((int)arg1, (void (*)(int))arg2);
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include <kernel/Scheduler.h>
|
||||
#include <kernel/Thread.h>
|
||||
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
@@ -167,16 +166,14 @@ namespace Kernel
|
||||
{
|
||||
ASSERT(!interrupts_enabled());
|
||||
ASSERT(!m_signal_queue.empty());
|
||||
handle_signal(m_signal_queue.front(), m_rsp, m_rip);
|
||||
}
|
||||
|
||||
void Thread::handle_signal(int signal, uintptr_t& return_rsp, uintptr_t& return_rip)
|
||||
{
|
||||
ASSERT(!interrupts_enabled());
|
||||
ASSERT(signal >= _SIGMIN && signal <= _SIGMAX);
|
||||
ASSERT(&Thread::current() == this);
|
||||
ASSERT(!m_signal_queue.empty());
|
||||
ASSERT(m_signal_queue.front() == signal);
|
||||
ASSERT(is_userspace());
|
||||
|
||||
int signal = m_signal_queue.front();
|
||||
ASSERT(signal >= _SIGMIN && signal <= _SIGMAX);
|
||||
|
||||
uintptr_t& return_rsp = this->return_rsp();
|
||||
uintptr_t& return_rip = this->return_rip();
|
||||
|
||||
vaddr_t signal_handler = process().m_signal_handlers[signal];
|
||||
|
||||
@@ -212,8 +209,11 @@ namespace Kernel
|
||||
case SIGTRAP:
|
||||
case SIGXCPU:
|
||||
case SIGXFSZ:
|
||||
// TODO: additional actions
|
||||
// fall through
|
||||
{
|
||||
auto message = BAN::String::formatted("killed by signal {}\n", signal);
|
||||
(void)process().tty().write(0, message.data(), message.size());
|
||||
}
|
||||
// fall through
|
||||
|
||||
// Abnormal termination of the process
|
||||
case SIGALRM:
|
||||
@@ -228,9 +228,6 @@ namespace Kernel
|
||||
case SIGPROF:
|
||||
case SIGVTALRM:
|
||||
{
|
||||
auto message = BAN::String::formatted("killed by signal {}\n", signal);
|
||||
(void)process().tty().write(0, message.data(), message.size());
|
||||
|
||||
ENABLE_INTERRUPTS();
|
||||
process().exit(128 + signal);
|
||||
ASSERT_NOT_REACHED();
|
||||
|
||||
Reference in New Issue
Block a user