mirror of
https://github.com/hexagonal-sun/moss-kernel.git
synced 2025-12-23 22:47:55 -05:00
implement sys_kill
This commit is contained in:
committed by
Matthew Leach
parent
0904a1994c
commit
661f368334
@@ -99,7 +99,7 @@
|
||||
| 0x60 (96) | set_tid_address | (int *tidptr) | __arm64_sys_set_tid_address | dummy |
|
||||
| 0x61 (97) | unshare | (unsigned long unshare_flags) | __arm64_sys_unshare | false |
|
||||
| 0x62 (98) | futex | (u32 *uaddr, int op, u32 val, const struct __kernel_timespec *utime, u32 *uaddr2, u32 val3) | __arm64_sys_futex | false |
|
||||
| 0x63 (99) | set_robust_list | (struct robust_list_head *head, size_t len) | __arm64_sys_set_robust_list | true |
|
||||
| 0x63 (99) | set_robust_list | (struct robust_list_head *head, size_t len) | __arm64_sys_set_robust_list | true |
|
||||
| 0x64 (100) | get_robust_list | (int pid, struct robust_list_head **head_ptr, size_t *len_ptr) | __arm64_sys_get_robust_list | false |
|
||||
| 0x65 (101) | nanosleep | (struct __kernel_timespec *rqtp, struct __kernel_timespec *rmtp) | __arm64_sys_nanosleep | true |
|
||||
| 0x66 (102) | getitimer | (int which, struct __kernel_old_itimerval *value) | __arm64_sys_getitimer | false |
|
||||
@@ -129,7 +129,7 @@
|
||||
| 0x7e (126) | sched_get_priority_min | (int policy) | __arm64_sys_sched_get_priority_min | false |
|
||||
| 0x7f (127) | sched_rr_get_interval | (pid_t pid, struct __kernel_timespec *interval) | __arm64_sys_sched_rr_get_interval | false |
|
||||
| 0x80 (128) | restart_syscall | () | __arm64_sys_restart_syscall | false |
|
||||
| 0x81 (129) | kill | (pid_t pid, int sig) | __arm64_sys_kill | dummy |
|
||||
| 0x81 (129) | kill | (pid_t pid, int sig) | __arm64_sys_kill | partially |
|
||||
| 0x82 (130) | tkill | (pid_t pid, int sig) | __arm64_sys_tkill | true |
|
||||
| 0x83 (131) | tgkill | (pid_t tgid, pid_t pid, int sig) | __arm64_sys_tgkill | false |
|
||||
| 0x84 (132) | sigaltstack | (const stack_t *uss, stack_t *uoss) | __arm64_sys_sigaltstack | true |
|
||||
@@ -178,7 +178,7 @@
|
||||
| 0xaf (175) | geteuid | () | __arm64_sys_geteuid | true |
|
||||
| 0xb0 (176) | getgid | () | __arm64_sys_getgid | true |
|
||||
| 0xb1 (177) | getegid | () | __arm64_sys_getegid | true |
|
||||
| 0xb2 (178) | gettid | () | __arm64_sys_gettid | true |
|
||||
| 0xb2 (178) | gettid | () | __arm64_sys_gettid | true |
|
||||
| 0xb3 (179) | sysinfo | (struct sysinfo *info) | __arm64_sys_sysinfo | false |
|
||||
| 0xb4 (180) | mq_open | (const char *u_name, int oflag, umode_t mode, struct mq_attr *u_attr) | __arm64_sys_mq_open | false |
|
||||
| 0xb5 (181) | mq_unlink | (const char *u_name) | __arm64_sys_mq_unlink | false |
|
||||
@@ -226,7 +226,7 @@
|
||||
| 0xdf (223) | fadvise64_64 | (int fd, loff_t offset, loff_t len, int advice) | __arm64_sys_fadvise64_64 | false |
|
||||
| 0xe0 (224) | swapon | (const char *specialfile, int swap_flags) | __arm64_sys_swapon | false |
|
||||
| 0xe1 (225) | swapoff | (const char *specialfile) | __arm64_sys_swapoff | false |
|
||||
| 0xe2 (226) | mprotect | (unsigned long start, size_t len, unsigned long prot) | __arm64_sys_mprotect | true |
|
||||
| 0xe2 (226) | mprotect | (unsigned long start, size_t len, unsigned long prot) | __arm64_sys_mprotect | true |
|
||||
| 0xe3 (227) | msync | (unsigned long start, size_t len, int flags) | __arm64_sys_msync | false |
|
||||
| 0xe4 (228) | mlock | (unsigned long start, size_t len) | __arm64_sys_mlock | false |
|
||||
| 0xe5 (229) | munlock | (unsigned long start, size_t len) | __arm64_sys_munlock | false |
|
||||
|
||||
@@ -1,17 +1,69 @@
|
||||
use crate::{
|
||||
process::{Tid, thread_group::pid::PidT},
|
||||
process::{
|
||||
Tid,
|
||||
thread_group::{Pgid, Tgid, ThreadGroup, pid::PidT},
|
||||
},
|
||||
sched::current_task,
|
||||
};
|
||||
|
||||
use libkernel::error::{KernelError, Result};
|
||||
|
||||
use super::{SigId, uaccess::UserSigId};
|
||||
|
||||
pub fn sys_kill(_pid: PidT, _signal: UserSigId) -> Result<usize> {
|
||||
// let target_tg = Tgid(pid as _);
|
||||
pub fn sys_kill(pid: PidT, signal: UserSigId) -> Result<usize> {
|
||||
let signal: SigId = signal.try_into()?;
|
||||
|
||||
// let signal: SigId = signal.try_into()?;
|
||||
let current_task = current_task();
|
||||
// Kill ourselves
|
||||
if pid == current_task.process.tgid.value() as PidT {
|
||||
current_task
|
||||
.process
|
||||
.signals
|
||||
.lock_save_irq()
|
||||
.set_pending(signal);
|
||||
return Ok(0);
|
||||
}
|
||||
|
||||
todo!();
|
||||
match pid {
|
||||
p if p > 0 => {
|
||||
let target_tg = ThreadGroup::get(Tgid(p as _)).ok_or(KernelError::NoProcess)?;
|
||||
target_tg.signals.lock_save_irq().set_pending(signal);
|
||||
}
|
||||
|
||||
0 => {
|
||||
let our_pgid = *current_task.process.pgid.lock_save_irq();
|
||||
// Iterate over all thread groups and signal the ones that are in
|
||||
// the same PGID.
|
||||
for tg_weak in crate::process::thread_group::TG_LIST
|
||||
.lock_save_irq()
|
||||
.values()
|
||||
{
|
||||
if let Some(tg) = tg_weak.upgrade()
|
||||
&& *tg.pgid.lock_save_irq() == our_pgid
|
||||
{
|
||||
tg.signals.lock_save_irq().set_pending(signal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
p if p < 0 && p != -1 => {
|
||||
let target_pgid = Pgid((-p) as _);
|
||||
for tg_weak in crate::process::thread_group::TG_LIST
|
||||
.lock_save_irq()
|
||||
.values()
|
||||
{
|
||||
if let Some(tg) = tg_weak.upgrade()
|
||||
&& *tg.pgid.lock_save_irq() == target_pgid
|
||||
{
|
||||
tg.signals.lock_save_irq().set_pending(signal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_ => return Err(KernelError::NotSupported),
|
||||
}
|
||||
|
||||
Ok(0)
|
||||
}
|
||||
|
||||
pub fn sys_tkill(tid: PidT, signal: UserSigId) -> Result<usize> {
|
||||
|
||||
Reference in New Issue
Block a user