diff options
author | Ian Moffett <ian@osmora.org> | 2025-05-28 22:35:28 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-05-28 22:37:41 -0400 |
commit | 415fb9894a4cbd761791ef1e218a5b01089cf80d (patch) | |
tree | 2203b7ba6b986aa86987af5a1a27a100f70fb77f | |
parent | 3dc995e1eb82022453da9ed9d3b639b989e485cf (diff) |
kernel: exit: Handle killings of kernel threads
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r-- | sys/include/sys/proc.h | 7 | ||||
-rw-r--r-- | sys/kern/kern_exit.c | 14 | ||||
-rw-r--r-- | sys/kern/kern_spawn.c | 2 | ||||
-rw-r--r-- | sys/kern/kern_stub.c | 6 |
4 files changed, 19 insertions, 10 deletions
diff --git a/sys/include/sys/proc.h b/sys/include/sys/proc.h index 1b59de9..7b03672 100644 --- a/sys/include/sys/proc.h +++ b/sys/include/sys/proc.h @@ -84,6 +84,11 @@ struct proc { #define PROC_LEAFQ BIT(3) /* Leaf queue is active */ #define PROC_WAITED BIT(4) /* Being waited on by parent */ +/* + * Flags for exit1() + */ +#define EXIT_KTD BIT(0) /* Kill a kernel thread */ + struct proc *this_td(void); struct proc *get_child(struct proc *cur, pid_t pid); int md_spawn(struct proc *p, struct proc *parent, uintptr_t ip); @@ -95,7 +100,7 @@ void md_td_stackinit(struct proc *td, void *stack_top, struct exec_prog *prog); __dead void md_td_kick(struct proc *td); int fork1(struct proc *cur, int flags, void(*ip)(void), struct proc **newprocp); -int exit1(struct proc *td); +int exit1(struct proc *td, int flags); __dead scret_t sys_exit(struct syscall_args *scargs); #endif /* _KERNEL */ diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index d6c9168..da1e3cf 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -40,7 +40,7 @@ #define pr_error(...) pr_trace(__VA_ARGS__) static void -unload_td(struct proc *td) +unload_td(struct proc *td, int flags) { const struct auxval *auxvalp; struct exec_prog *execp; @@ -49,6 +49,10 @@ unload_td(struct proc *td) size_t len; sched_detach(td); + if (ISSET(flags, EXIT_KTD)) { + return; + } + execp = &td->exec; auxvalp = &execp->auxval; pcbp = &td->pcb; @@ -79,7 +83,7 @@ unload_td(struct proc *td) * @td: Thread to exit */ int -exit1(struct proc *td) +exit1(struct proc *td, int flags) { struct pcb *pcbp; struct proc *curtd, *procp; @@ -97,7 +101,7 @@ exit1(struct proc *td) /* If we have any children, kill them too */ if (td->nleaves > 0) { TAILQ_FOREACH(procp, &td->leafq, leaf_link) { - exit1(procp); + exit1(procp, flags); } } @@ -110,7 +114,7 @@ exit1(struct proc *td) stack -= VM_HIGHER_HALF; } - unload_td(td); + unload_td(td, flags); vm_unmap(pcbp->addrsp, td->stack_base, PROC_STACK_SIZE); vm_free_frame(stack, PROC_STACK_PAGES); pmap_destroy_vas(pcbp->addrsp); @@ -145,6 +149,6 @@ sys_exit(struct syscall_args *scargs) struct proc *td = this_td(); td->exit_status = scargs->arg0; - exit1(td); + exit1(td, 0); __builtin_unreachable(); } diff --git a/sys/kern/kern_spawn.c b/sys/kern/kern_spawn.c index cb898dc..032ba24 100644 --- a/sys/kern/kern_spawn.c +++ b/sys/kern/kern_spawn.c @@ -84,7 +84,7 @@ spawn_thunk(void) if (execve(cur, &execve_args) != 0) { pr_error("execve failed, aborting\n"); - exit1(this_td()); + exit1(this_td(), 0); } __builtin_unreachable(); } diff --git a/sys/kern/kern_stub.c b/sys/kern/kern_stub.c index 1a5fb0e..fa1be65 100644 --- a/sys/kern/kern_stub.c +++ b/sys/kern/kern_stub.c @@ -41,7 +41,7 @@ sigfpe_default(int signo) td = this_td(); kprintf("Floating point exception (pid=%d)\n", td->pid); - exit1(td); + exit1(td, 0); } void @@ -51,7 +51,7 @@ sigkill_default(int signo) td = this_td(); kprintf("Terminated (pid=%d)\n", td->pid); - exit1(td); + exit1(td, 0); } void @@ -61,7 +61,7 @@ sigsegv_default(int signo) td = this_td(); kprintf("Segmentation fault (pid=%d)\n", td->pid); - exit1(td); + exit1(td, 0); } int |