Skip to content

Commit e0333e1

Browse files
committed
implement sys_kill
1 parent 0904a19 commit e0333e1

File tree

2 files changed

+61
-9
lines changed

2 files changed

+61
-9
lines changed

etc/syscalls_linux_aarch64.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@
9999
| 0x60 (96) | set_tid_address | (int *tidptr) | __arm64_sys_set_tid_address | dummy |
100100
| 0x61 (97) | unshare | (unsigned long unshare_flags) | __arm64_sys_unshare | false |
101101
| 0x62 (98) | futex | (u32 *uaddr, int op, u32 val, const struct __kernel_timespec *utime, u32 *uaddr2, u32 val3) | __arm64_sys_futex | false |
102-
| 0x63 (99) | set_robust_list | (struct robust_list_head *head, size_t len) | __arm64_sys_set_robust_list | true |
102+
| 0x63 (99) | set_robust_list | (struct robust_list_head *head, size_t len) | __arm64_sys_set_robust_list | true |
103103
| 0x64 (100) | get_robust_list | (int pid, struct robust_list_head **head_ptr, size_t *len_ptr) | __arm64_sys_get_robust_list | false |
104104
| 0x65 (101) | nanosleep | (struct __kernel_timespec *rqtp, struct __kernel_timespec *rmtp) | __arm64_sys_nanosleep | true |
105105
| 0x66 (102) | getitimer | (int which, struct __kernel_old_itimerval *value) | __arm64_sys_getitimer | false |
@@ -129,7 +129,7 @@
129129
| 0x7e (126) | sched_get_priority_min | (int policy) | __arm64_sys_sched_get_priority_min | false |
130130
| 0x7f (127) | sched_rr_get_interval | (pid_t pid, struct __kernel_timespec *interval) | __arm64_sys_sched_rr_get_interval | false |
131131
| 0x80 (128) | restart_syscall | () | __arm64_sys_restart_syscall | false |
132-
| 0x81 (129) | kill | (pid_t pid, int sig) | __arm64_sys_kill | dummy |
132+
| 0x81 (129) | kill | (pid_t pid, int sig) | __arm64_sys_kill | partially |
133133
| 0x82 (130) | tkill | (pid_t pid, int sig) | __arm64_sys_tkill | true |
134134
| 0x83 (131) | tgkill | (pid_t tgid, pid_t pid, int sig) | __arm64_sys_tgkill | false |
135135
| 0x84 (132) | sigaltstack | (const stack_t *uss, stack_t *uoss) | __arm64_sys_sigaltstack | true |
@@ -178,7 +178,7 @@
178178
| 0xaf (175) | geteuid | () | __arm64_sys_geteuid | true |
179179
| 0xb0 (176) | getgid | () | __arm64_sys_getgid | true |
180180
| 0xb1 (177) | getegid | () | __arm64_sys_getegid | true |
181-
| 0xb2 (178) | gettid | () | __arm64_sys_gettid | true |
181+
| 0xb2 (178) | gettid | () | __arm64_sys_gettid | true |
182182
| 0xb3 (179) | sysinfo | (struct sysinfo *info) | __arm64_sys_sysinfo | false |
183183
| 0xb4 (180) | mq_open | (const char *u_name, int oflag, umode_t mode, struct mq_attr *u_attr) | __arm64_sys_mq_open | false |
184184
| 0xb5 (181) | mq_unlink | (const char *u_name) | __arm64_sys_mq_unlink | false |
@@ -226,7 +226,7 @@
226226
| 0xdf (223) | fadvise64_64 | (int fd, loff_t offset, loff_t len, int advice) | __arm64_sys_fadvise64_64 | false |
227227
| 0xe0 (224) | swapon | (const char *specialfile, int swap_flags) | __arm64_sys_swapon | false |
228228
| 0xe1 (225) | swapoff | (const char *specialfile) | __arm64_sys_swapoff | false |
229-
| 0xe2 (226) | mprotect | (unsigned long start, size_t len, unsigned long prot) | __arm64_sys_mprotect | true |
229+
| 0xe2 (226) | mprotect | (unsigned long start, size_t len, unsigned long prot) | __arm64_sys_mprotect | true |
230230
| 0xe3 (227) | msync | (unsigned long start, size_t len, int flags) | __arm64_sys_msync | false |
231231
| 0xe4 (228) | mlock | (unsigned long start, size_t len) | __arm64_sys_mlock | false |
232232
| 0xe5 (229) | munlock | (unsigned long start, size_t len) | __arm64_sys_munlock | false |

src/process/thread_group/signal/kill.rs

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,69 @@
11
use crate::{
2-
process::{Tid, thread_group::pid::PidT},
2+
process::{
3+
Tid,
4+
thread_group::{Pgid, Tgid, ThreadGroup, pid::PidT},
5+
},
36
sched::current_task,
47
};
8+
59
use libkernel::error::{KernelError, Result};
610

711
use super::{SigId, uaccess::UserSigId};
812

9-
pub fn sys_kill(_pid: PidT, _signal: UserSigId) -> Result<usize> {
10-
// let target_tg = Tgid(pid as _);
13+
pub fn sys_kill(pid: PidT, signal: UserSigId) -> Result<usize> {
14+
let signal: SigId = signal.try_into()?;
1115

12-
// let signal: SigId = signal.try_into()?;
16+
let current_task = current_task();
17+
// Kill ourselves
18+
if pid == current_task.process.tgid.value() as PidT {
19+
current_task
20+
.process
21+
.signals
22+
.lock_save_irq()
23+
.set_pending(signal);
24+
return Ok(0);
25+
}
26+
27+
match pid {
28+
p if p > 0 => {
29+
let target_tg = ThreadGroup::get(Tgid(p as _)).ok_or(KernelError::NoProcess)?;
30+
target_tg.signals.lock_save_irq().set_pending(signal);
31+
}
32+
33+
0 => {
34+
let our_pgid = *current_task.process.pgid.lock_save_irq();
35+
// Iterate over all thread groups and signal the ones that are in
36+
// the same PGID.
37+
for tg_weak in crate::process::thread_group::TG_LIST
38+
.lock_save_irq()
39+
.values()
40+
{
41+
if let Some(tg) = tg_weak.upgrade() {
42+
if *tg.pgid.lock_save_irq() == our_pgid {
43+
tg.signals.lock_save_irq().set_pending(signal);
44+
}
45+
}
46+
}
47+
}
48+
49+
p if p < 0 && p != -1 => {
50+
let target_pgid = Pgid((-p) as _);
51+
for tg_weak in crate::process::thread_group::TG_LIST
52+
.lock_save_irq()
53+
.values()
54+
{
55+
if let Some(tg) = tg_weak.upgrade() {
56+
if *tg.pgid.lock_save_irq() == target_pgid {
57+
tg.signals.lock_save_irq().set_pending(signal);
58+
}
59+
}
60+
}
61+
}
1362

14-
todo!();
63+
_ => return Err(KernelError::NotSupported),
64+
}
65+
66+
Ok(0)
1567
}
1668

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

0 commit comments

Comments
 (0)