summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-05-28 22:35:28 -0400
committerIan Moffett <ian@osmora.org>2025-05-28 22:37:41 -0400
commit415fb9894a4cbd761791ef1e218a5b01089cf80d (patch)
tree2203b7ba6b986aa86987af5a1a27a100f70fb77f
parent3dc995e1eb82022453da9ed9d3b639b989e485cf (diff)
kernel: exit: Handle killings of kernel threads
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r--sys/include/sys/proc.h7
-rw-r--r--sys/kern/kern_exit.c14
-rw-r--r--sys/kern/kern_spawn.c2
-rw-r--r--sys/kern/kern_stub.c6
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