summaryrefslogtreecommitdiff
path: root/src/user/knob/quit.c
diff options
context:
space:
mode:
authorBenji Dial <benji6283@gmail.com>2020-09-06 00:48:07 -0400
committerBenji Dial <benji6283@gmail.com>2020-09-06 00:48:07 -0400
commite8c6577617bffa4402c07c7aa20e3c24f03c1c20 (patch)
tree2fb9230b62d2344a44453117de9e656892219788 /src/user/knob/quit.c
parent7ff724fe8f709440da9c730fdb8dcbaa4f989ed5 (diff)
downloadportland-os-e8c6577617bffa4402c07c7aa20e3c24f03c1c20.tar.gz
program loading, others
big kernel additions: paging, elf loading, separate kernel and user page allocation it now properly loads and runs sd0:bin/init.elf still need to determine which disk was booted from, and start the init on that disk
Diffstat (limited to 'src/user/knob/quit.c')
-rw-r--r--src/user/knob/quit.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/user/knob/quit.c b/src/user/knob/quit.c
new file mode 100644
index 0000000..a2ef5aa
--- /dev/null
+++ b/src/user/knob/quit.c
@@ -0,0 +1,29 @@
+#include <pland/syscall.h>
+#include <knob/heap.h>
+
+struct quit_list_node {
+ struct quit_list_node *prev;
+ void (*f)();
+};
+
+static struct quit_list_node head = {
+ .f = &_exit_task
+};
+
+static struct quit_list_node *last = &head;
+
+void on_quit(void (*run_f)()) {
+ struct quit_list_node *new = get_block(sizeof(struct quit_list_node));
+ new->prev = last;
+ new->f = run_f;
+ last = new;
+}
+
+__attribute__ ((noreturn))
+void quit() {
+ struct quit_list_node *node = last;
+ while (1) {
+ node->f();
+ node = node->prev;
+ }
+} \ No newline at end of file