diff options
author | dzwdz | 2023-09-25 00:12:57 +0200 |
---|---|---|
committer | dzwdz | 2023-09-25 00:12:57 +0200 |
commit | 2c78dc983d09e136dd016ae6ecee6b191e033de1 (patch) | |
tree | fa3f0c858a0c1b61d00d4a7474e80b1aa0368bbf /src/kernel/syscalls.c | |
parent | 16138fc20fc9c472af37fb8385a997a0d9202f32 (diff) |
kernel/intr: accept a message, allow killing processes via intrs
Diffstat (limited to 'src/kernel/syscalls.c')
-rw-r--r-- | src/kernel/syscalls.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c index 8ff5112..edc74bb 100644 --- a/src/kernel/syscalls.c +++ b/src/kernel/syscalls.c @@ -356,10 +356,20 @@ void _sys_filicide(void) { } } -void _sys_intr(void) { +int _sys_intr(const char __user *msg, size_t len) { + char buf[INTR_MAX]; + int count = 0; + if (INTR_MAX < len) { + SYSCALL_RETURN(-EINVAL); + } + if (pcpy_from(proc_cur, buf, msg, len) < len) { + SYSCALL_RETURN(-EFAULT); + } for (Proc *p = proc_cur->child; p; p = proc_next(p, proc_cur)) { - proc_intr(p); + proc_intr(p, buf, len); + count++; } + SYSCALL_RETURN(count); } void _sys_intr_set(void __user *ip) { @@ -481,7 +491,7 @@ long _syscall(long num, long a, long b, long c, long d, long e) { break; case _SYS_PIPE: _sys_pipe((userptr_t)a, b); break; case _SYS_SLEEP: _sys_sleep(a); break; case _SYS_FILICIDE: _sys_filicide(); - break; case _SYS_INTR: _sys_intr(); + break; case _SYS_INTR: _sys_intr((userptr_t)a, b); break; case _SYS_INTR_SET: _sys_intr_set((userptr_t)a); break; case _SYS_GETPID: _sys_getpid(); break; case _SYS_GETPPID: _sys_getppid(); |