aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMarvin Borner2020-08-17 13:52:51 +0200
committerMarvin Borner2020-08-17 13:52:51 +0200
commitca7d400b7705ba887df69391cb774d4de83e8bf3 (patch)
treea59b97c9405413d1cb01e05c3f0c760554cecc5c /kernel
parent0ba9ee15d0a229c619f35a5db04e45fe8861c3c9 (diff)
Added event unmap
Diffstat (limited to 'kernel')
-rw-r--r--kernel/features/event.c14
-rw-r--r--kernel/features/syscall.c6
-rw-r--r--kernel/inc/event.h3
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