]> git.corax.cc Git - corax/commitdiff
Extend task_signal_deliver() function to allow passing of a siginfo_t to the signal...
authorMatthias Kruk <m@m10k.eu>
Tue, 14 Jan 2020 12:07:34 +0000 (21:07 +0900)
committerMatthias Kruk <m@m10k.eu>
Tue, 14 Jan 2020 12:20:40 +0000 (21:20 +0900)
kernel/arch/interrupt.c
kernel/include/arch.h

index 40240fddbde1002f25eee4e30d6fa0b3aa187ddb..3b0bdf0ee98c1bcccb92eb537a99a5c735cef2db 100644 (file)
@@ -23,6 +23,7 @@
 #include <debug.h>
 #include <process.h>
 #include <signal.h>
+#include <string.h>
 #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;
index 19f40a9dfeb8c3b91cd55ce97a8c7cfe7bdf50e6..6b5f216837ad0d05369e97b0fc70c1d8f95ae1b0 100644 (file)
@@ -72,6 +72,7 @@
 
 #include <corax/types.h>
 #include <spinlock.h>
+#include <signal.h>
 
 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 */