Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions etc/syscalls_linux_aarch64.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down Expand Up @@ -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 |
Expand Down Expand Up @@ -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 |
Expand Down Expand Up @@ -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 |
Expand Down
62 changes: 57 additions & 5 deletions src/process/thread_group/signal/kill.rs
Original file line number Diff line number Diff line change
@@ -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);
}

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);
}
}
}

todo!();
_ => return Err(KernelError::NotSupported),
}

Ok(0)
}

pub fn sys_tkill(tid: PidT, signal: UserSigId) -> Result<usize> {
Expand Down