From: Matthias Kruk Date: Tue, 14 Jan 2020 12:07:34 +0000 (+0900) Subject: Extend task_signal_deliver() function to allow passing of a siginfo_t to the signal... X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=8153a6e7e78c922bb6e409c4080f090e1a97efe2;p=corax Extend task_signal_deliver() function to allow passing of a siginfo_t to the signal handler --- diff --git a/kernel/arch/interrupt.c b/kernel/arch/interrupt.c index 40240fd..3b0bdf0 100644 --- a/kernel/arch/interrupt.c +++ b/kernel/arch/interrupt.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "cpu.h" #include "defs.h" @@ -34,6 +35,8 @@ extern int sys_cxnet(long, long, long, long, long, long, long); extern int sys_cxipc(long, long, long); #if FEATURE(POSIX) extern int sys_posixcall(stack_frame_t*); +/* extern void _sig_hwint_deliver(const int); */ +#define _sig_hwint_deliver(foo) #endif /* FEATURE(POSIX) */ static const char *_exc_name[] = { @@ -48,7 +51,7 @@ extern void _apic_eoi(u32_t); extern void _i8259_eoi(u32_t); #endif /* CONFIG_APIC */ -void task_signal_deliver(task_t *task, stack_frame_t *stk, int signum) +void task_signal_deliver(task_t *task, stack_frame_t *stk, int signum, siginfo_t *info) { struct { void *eip; @@ -58,10 +61,17 @@ void task_signal_deliver(task_t *task, stack_frame_t *stk, int signum) siginfo_t si; } __attribute__((packed)) stkfrm; - stkfrm.data = NULL; - stkfrm.signal = signum; stkfrm.eip = (void*)stk->eip; stkfrm.handler = process_get_sighandler((process_t*)task->t_proc, signum); + stkfrm.signal = signum; + stkfrm.data = NULL; + + if(info) { + memcpy(&(stkfrm.si), info, sizeof(stkfrm.si)); + } else { + memset(&(stkfrm.si), 0, sizeof(stkfrm.si)); + } + stk->eip = (u32_t)_task_sig_stub; stk->prevesp -= sizeof(stkfrm); @@ -122,7 +132,11 @@ void _int_handle(stack_frame_t ctx) if(ctx.intn == INT_TIMER) { sched_tick(); } else { - /* FIXME: handle interrupt */ +#if FEATURE(POSIX) + _sig_hwint_deliver(ctx.intn); +#else /* ! FEATURE(POSIX) */ + /* FIXME: Do something with the interrupt */ +#endif /* ! FEATURE(POSIX) */ } return; @@ -220,7 +234,7 @@ void _exc_handle(stack_frame_t ctx) /* * Deliver the signal to the currently executing task */ - task_signal_deliver(ctask, &ctx, sig); + task_signal_deliver(ctask, &ctx, sig, NULL); } return; diff --git a/kernel/include/arch.h b/kernel/include/arch.h index 19f40a9..6b5f216 100644 --- a/kernel/include/arch.h +++ b/kernel/include/arch.h @@ -72,6 +72,7 @@ #include #include +#include typedef struct stack_frame stack_frame_t; @@ -233,7 +234,7 @@ int pg_dir_munmap(pg_dir_t*, void*, u32_t); u8_t io_inb(const u16_t); void io_outb(const u16_t, const u8_t); -void task_signal_deliver(task_t*, stack_frame_t*, int); +void task_signal_deliver(task_t*, stack_frame_t*, int, siginfo_t*); #endif /* !__ASSEMBLY_SOURCE */