From a2f9ae9d4ab678fa66a2ec5d1072ea22a36a18a1 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Thu, 19 Jan 2023 23:36:11 +0100 Subject: kernel: user interrupts --- src/user/app/init/driver/initctl.c | 4 +++- src/user/app/init/init.c | 22 +++++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) (limited to 'src/user/app/init') diff --git a/src/user/app/init/driver/initctl.c b/src/user/app/init/driver/initctl.c index 76d1b1b..67c8ade 100644 --- a/src/user/app/init/driver/initctl.c +++ b/src/user/app/init/driver/initctl.c @@ -29,7 +29,9 @@ void initctl_drv(handle_t killswitch) { } if (!strcmp(buf, "halt")) { _syscall_write(killswitch, "halt", 4, 0, 0); - exit(1); + } + if (!strcmp(buf, "intr")) { + _syscall_write(killswitch, "intr", 4, 0, 0); } c0_fs_respond(NULL, res.len, 0); break; diff --git a/src/user/app/init/init.c b/src/user/app/init/init.c index 350d9a0..0114ac5 100644 --- a/src/user/app/init/init.c +++ b/src/user/app/init/init.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -29,7 +30,7 @@ void redirect(const char *exe, const char *out, const char *in) { exit(1); } _syscall_await(); - _syscall_filicide(); + _syscall_intr(); } } } @@ -39,7 +40,7 @@ int main(void) { freopen("/kdev/com1", "a+", stdout); freopen("/kdev/com1", "a+", stderr); - printf("in init (stage 2), main at %p\n", &main); + printf("[init] stage 2, main at %p\n", &main); MOUNT_AT("/keyboard") { MOUNT_AT("/") { fs_whitelist((const char*[]){"/kdev/ps2/kb", NULL}); } @@ -104,7 +105,22 @@ int main(void) { exit(1); } - _syscall_read(killswitch_pipe[0], NULL, 0, 0); + char buf[128]; + for (;;) { + if (_syscall_read(killswitch_pipe[0], buf, 128, 0) != 4) { + break; + } + if (memcmp(buf, "intr", 4) == 0) { + _syscall_intr(); + } else if (memcmp(buf, "halt", 4) == 0) { + break; + } + } + printf("[init] intr\n"); + _syscall_intr(); + _syscall_sleep(1000); + printf("[init] filicide\n"); _syscall_filicide(); + printf("[init] goodbye\n"); return 0; } -- cgit v1.2.3