Feat: POSIX signal
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include <thread.h>
|
||||
#include <process.h>
|
||||
#include <mbox.h>
|
||||
#include <exec.h>
|
||||
|
||||
void syscall_handler(trapframe_t *regs)
|
||||
{
|
||||
@@ -27,13 +28,22 @@ void syscall_handler(trapframe_t *regs)
|
||||
regs->x0 = sys_fork();
|
||||
break;
|
||||
case 5: // void exit(int32_t status)
|
||||
sys_exit((int)regs->x0);
|
||||
sys_exit((int32_t)regs->x0);
|
||||
break;
|
||||
case 6: // int32_t mbox_call(uint8_t ch, uint32_t *mbox)
|
||||
regs->x0 = sys_mbox_call((uint8_t)regs->x0, (uint32_t *)regs->x1);
|
||||
break;
|
||||
case 7: // void kill(int32_t pid)
|
||||
sys_kill((int)regs->x0);
|
||||
case 7: // void kill_by_id(int32_t pid)
|
||||
sys_kill_by_id((int32_t)regs->x0);
|
||||
break;
|
||||
case 8: // void signal(int32_t SIGNAL, signal_handler_t handler)
|
||||
sys_signal((int32_t)regs->x0, (signal_handler_t)regs->x1);
|
||||
break;
|
||||
case 9: // void kill(int32_t pid, int32_t SIGNAL)
|
||||
sys_kill((int32_t)regs->x0, (int32_t)regs->x1);
|
||||
break;
|
||||
case 10: // void sigreturn(void)
|
||||
sys_sigreturn();
|
||||
break;
|
||||
default:
|
||||
LOG("unsupported syscall"); ERROR(regs->x8);
|
||||
@@ -74,6 +84,34 @@ void sys_exit(int32_t status)
|
||||
int32_t sys_mbox_call(uint8_t ch, uint32_t *mbox)
|
||||
{ return mbox_call(ch, mbox); }
|
||||
|
||||
void sys_kill(int32_t pid)
|
||||
void sys_kill_by_id(int32_t pid)
|
||||
{
|
||||
if (!global_processes || global_processes->size <= (size_t)pid) {
|
||||
LOG("Process not exist"); INFOR(pid);
|
||||
return;
|
||||
}
|
||||
|
||||
process_t *process = VEC_AT(process_t, global_processes, pid);
|
||||
process->th->status = THREAD_STATUS_ZOMBIE;
|
||||
LOG("Process killed"); INFOR(pid);
|
||||
}
|
||||
|
||||
void sys_signal(int32_t SIGNAL, signal_handler_t handler)
|
||||
{
|
||||
thread_t *th = get_current();
|
||||
th->process->sighandlers[SIGNAL] = handler;
|
||||
LOG(handler); LOG(SIGNAL); DEBUG_SIGNAL("registered");
|
||||
}
|
||||
|
||||
void sys_kill(int32_t pid, int32_t SIGNAL)
|
||||
{
|
||||
process_t *process = VEC_AT(process_t, global_processes, pid);
|
||||
process->sigstate[SIGNAL] = true;
|
||||
}
|
||||
|
||||
void sys_sigreturn(void)
|
||||
{
|
||||
DEBUG_SIGNAL("sigreturn");
|
||||
thread_t *th = get_current();
|
||||
user_exec(th->process->regs);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user