diff options
author | Marvin Borner | 2020-08-17 13:52:51 +0200 |
---|---|---|
committer | Marvin Borner | 2020-08-17 13:52:51 +0200 |
commit | ca7d400b7705ba887df69391cb774d4de83e8bf3 (patch) | |
tree | a59b97c9405413d1cb01e05c3f0c760554cecc5c /kernel | |
parent | 0ba9ee15d0a229c619f35a5db04e45fe8861c3c9 (diff) |
Added event unmap
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/features/event.c | 14 | ||||
-rw-r--r-- | kernel/features/syscall.c | 6 | ||||
-rw-r--r-- | kernel/inc/event.h | 3 |
3 files changed, 21 insertions, 2 deletions
diff --git a/kernel/features/event.c b/kernel/features/event.c index 320b45a..8bdba1a 100644 --- a/kernel/features/event.c +++ b/kernel/features/event.c @@ -19,6 +19,20 @@ u32 event_map(enum event id, u32 *func) return 0; } +// TODO: Fix unmap +void event_unmap(enum event id, u32 *func) +{ + struct list *list = ((struct list *)event_table[id]); + struct node *iterator = list->head; + while (iterator->data != (void *)func) { + iterator = iterator->next; + if (!iterator) + return; + } + + list_remove(list, iterator); +} + u32 event_trigger(enum event id, u32 *data) { assert(id < sizeof(event_table) / sizeof(*event_table)); diff --git a/kernel/features/syscall.c b/kernel/features/syscall.c index 2a01d8a..9d5ac82 100644 --- a/kernel/features/syscall.c +++ b/kernel/features/syscall.c @@ -53,7 +53,11 @@ void syscall_handler(struct regs *r) break; } case SYS_MAP: { - event_map(r->ebx, (u32(*)())r->ecx); + event_map(r->ebx, (u32 *)r->ecx); + break; + } + case SYS_UNMAP: { + event_unmap(r->ebx, (u32 *)r->ecx); break; } default: { diff --git a/kernel/inc/event.h b/kernel/inc/event.h index f4025b4..e40b345 100644 --- a/kernel/inc/event.h +++ b/kernel/inc/event.h @@ -6,7 +6,8 @@ #include <def.h> #include <sys.h> -u32 event_map(enum event id, u32 (*function)()); +u32 event_map(enum event id, u32 *func); +void event_unmap(enum event id, u32 *func); u32 event_trigger(enum event id, u32 *data); #endif |