From fc79a479579747ae9b8cbf4766877dc8be22b13f Mon Sep 17 00:00:00 2001 From: starnakin Date: Fri, 18 Apr 2025 17:07:56 +0200 Subject: [PATCH] add signal api --- headers/signal.h | 26 +++++++++++------- headers/task.h | 3 ++- src/drivers/clock.c | 2 +- src/interrupt/signals/signal.c | 10 ------- src/kernel.c | 10 +++++++ src/multitasking/scheduler.c | 1 + src/multitasking/task.c | 4 +++ src/signal/signal.c | 49 ++++++++++++++++++++++++++++++++++ 8 files changed, 84 insertions(+), 21 deletions(-) delete mode 100644 src/interrupt/signals/signal.c create mode 100644 src/signal/signal.c diff --git a/headers/signal.h b/headers/signal.h index 4960b19..5fc5e53 100644 --- a/headers/signal.h +++ b/headers/signal.h @@ -1,9 +1,12 @@ #pragma once -#define SIG_DFL -1 -#define SIG_IGN 0 +#include +#include -enum { +#define SIG_DFL 0 +#define SIG_IGN -1 + +typedef enum { SIGABRT, // Abort signal from abort(3) SIGALRM, // Timer signal from alarm(2) SIGBUS, // Bus error (bad memory access) @@ -44,11 +47,16 @@ enum { SIGXFSZ, // File size limit exceeded (4.2BSD); see setrlimit(2) SIGWINCH, // Window resize signal (4.3BSD, Sun) SIG_INT, // Interrupt from keyboard -}; + LAST +} SIGNAL_CODE; -typedef void (*sighandler_t)(int); +typedef void (*signal_handler_t)(int); -struct signal { - int signum; - sighandler_t handler; -}; +void signal(SIGNAL_CODE sig_num, void *handler); +void kill(int pid, SIGNAL_CODE sig_num); +void exec_signal_pending(void); + +struct signal_data { + void *handlers[LAST]; + uint32_t pending; +}; \ No newline at end of file diff --git a/headers/task.h b/headers/task.h index 52bd6e5..4fd9835 100644 --- a/headers/task.h +++ b/headers/task.h @@ -2,6 +2,7 @@ #include "list.h" #include "memory.h" +#include "signal.h" #include @@ -23,7 +24,7 @@ struct task { uint8_t uid; struct task *daddy; struct task *child; - struct list **signals; + struct signal_data signals; struct task *next; struct task *prev; }; diff --git a/src/drivers/clock.c b/src/drivers/clock.c index d7c7cef..4ef66a9 100644 --- a/src/drivers/clock.c +++ b/src/drivers/clock.c @@ -38,7 +38,7 @@ void clock_init(struct registers *regs) static void clock_handler(struct registers *regs) { (void)regs; - if (scheduler_counter % 100 == 0) + if (scheduler_counter % 10 == 0) scheduler(); scheduler_counter++; sleep_counter--; diff --git a/src/interrupt/signals/signal.c b/src/interrupt/signals/signal.c deleted file mode 100644 index b1310f8..0000000 --- a/src/interrupt/signals/signal.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "signal.h" -#include - -void (*signal(int sig, void (*func)(int)))(int) -{ - // TODO after multi tasking and processes - (void)sig; - (void)func; - return NULL; -} diff --git a/src/kernel.c b/src/kernel.c index cc7dd63..a831305 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -52,6 +52,11 @@ static void awa(void) wait(); } +static void bozo(int int_code) +{ + kprintf("apagnan code\n"); +} + void kernel_main(multiboot_info_t *mbd, uint32_t magic) { terminal_initialize(); @@ -79,5 +84,10 @@ void kernel_main(multiboot_info_t *mbd, uint32_t magic) // exec_fn(owo); // exec_fn(owo); // exec_fn(owo); + kill(0, 4); + for (size_t i = 0; i < 10000; i++) + free_pages(alloc_pages(1, NULL), 1); + signal(4, bozo); + kill(0, 4); shell_init(); } diff --git a/src/multitasking/scheduler.c b/src/multitasking/scheduler.c index 0d9b917..f3bded5 100644 --- a/src/multitasking/scheduler.c +++ b/src/multitasking/scheduler.c @@ -30,5 +30,6 @@ void scheduler(void) it = it->next; } switch_to_task(it); + exec_signal_pending(); toris(); } diff --git a/src/multitasking/task.c b/src/multitasking/task.c index 8a68658..d64dbbf 100644 --- a/src/multitasking/task.c +++ b/src/multitasking/task.c @@ -49,6 +49,9 @@ struct task *create_task(uint8_t uid) new_task->next = current_task->next; new_task->prev = current_task; current_task->next = new_task; + + new_task->signals.pending = SIG_IGN; + return new_task; } @@ -64,6 +67,7 @@ int8_t create_kernel_task(void) new_task->cr3 = (uint32_t *)((uint32_t)kernel_pd - HEAP_END); new_task->prev = new_task; new_task->next = new_task; + new_task->signals.pending = SIG_IGN; current_task = new_task; return 0; } diff --git a/src/signal/signal.c b/src/signal/signal.c new file mode 100644 index 0000000..a94cd18 --- /dev/null +++ b/src/signal/signal.c @@ -0,0 +1,49 @@ +#include "signal.h" +#include "kprintf.h" +#include "task.h" +#include + +void signal(SIGNAL_CODE sig_num, void *handler) +{ + current_task->signals.handlers[sig_num] = handler; +} + +void kill(int pid, SIGNAL_CODE sig_num) +{ + struct task *task = current_task; + + while (task->pid != pid) + task = task->next; + + task->signals.pending = sig_num; +} + +static void display_signal(SIGNAL_CODE sig_num) +{ + kprintf("signal: %d\n", sig_num); +} + +static void exec_signal(SIGNAL_CODE sig_num) +{ + void *handler = current_task->signals.handlers[sig_num]; + + if (handler == SIG_IGN) + return; + + if (handler == SIG_DFL) { + display_signal(sig_num); + return; + } + + signal_handler_t func = handler; + func(sig_num); +} + +void exec_signal_pending(void) +{ + uint32_t signal_code = current_task->signals.pending; + if (signal_code != SIG_IGN) { + exec_signal(signal_code); + current_task->signals.pending = SIG_IGN; + } +} \ No newline at end of file