diff options
author | Ian Moffett <ian@osmora.org> | 2024-07-02 21:41:29 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2024-07-02 21:41:29 -0400 |
commit | 531f6f7b00821867bb4941b05bcbeea9f0357557 (patch) | |
tree | 657ca5b1a6ec0ed25e4d360a6cd5c3ddf9ae0d55 /sys | |
parent | 2d7bc823503167276c6d3c40500c3055d4f38938 (diff) |
kernel: proc: Remove PROC_INEXEC flag
This commit removes handling of the PROC_INEXEC flag as md_td_kick() takes
care of the transfer to user mode in a cleaner way.
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/include/sys/proc.h | 1 | ||||
-rw-r--r-- | sys/kern/kern_exec.c | 11 | ||||
-rw-r--r-- | sys/kern/kern_sched.c | 16 |
3 files changed, 3 insertions, 25 deletions
diff --git a/sys/include/sys/proc.h b/sys/include/sys/proc.h index 805c4a5..ceeb5e4 100644 --- a/sys/include/sys/proc.h +++ b/sys/include/sys/proc.h @@ -58,7 +58,6 @@ struct proc { #define PROC_EXITING BIT(0) /* Exiting */ #define PROC_EXEC BIT(1) /* Exec called (cleared by sched) */ -#define PROC_INEXEC BIT(2) /* Exec in progress */ struct proc *this_td(void); int md_fork(struct proc *p, struct proc *parent, uintptr_t ip); diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 7825448..1466159 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -71,7 +71,7 @@ execve(struct proc *td, const struct execve_args *args) return error; /* Mark the thread as running exec */ - td->flags |= (PROC_EXEC | PROC_INEXEC); + td->flags |= PROC_EXEC; /* Create the new stack */ stack = vm_alloc_frame(PROC_STACK_PAGES); @@ -97,12 +97,7 @@ execve(struct proc *td, const struct execve_args *args) md_td_stackinit(td, (void *)(stack_top + VM_HIGHER_HALF), &prog); setregs(td, &prog, stack_top); - /* - * Done, reset flags and start the user thread. - * - * XXX: PROC_EXEC is unset by the scheduler so it - * can properly start the new exec'd program. - */ - td->flags &= ~PROC_INEXEC; + /* Done, reset flags and start the user thread */ + td->flags &= ~PROC_EXEC; md_td_kick(td); } diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c index 278eba2..1d79937 100644 --- a/sys/kern/kern_sched.c +++ b/sys/kern/kern_sched.c @@ -150,26 +150,10 @@ sched_switch(struct trapframe *tf) struct pcb *pcbp; struct proc *next_td, *td; bool use_current = true; - bool inexec; ci = this_cpu(); td = ci->curtd; - if (td != NULL) { - inexec = ISSET(td->flags, PROC_INEXEC); - - /* - * If both PROC_INEXEC and PROC_EXEC are set, - * an exec is in progress. However, if PROC_INEXEC is - * unset and PROC_EXEC is set, an exec has completed - * and we can unset PROC_EXEC and copy the new trapframe. - */ - if (ISSET(td->flags, PROC_EXEC) && !inexec) { - memcpy(tf, &td->tf, sizeof(*tf)); - td->flags &= ~PROC_EXEC; - } - } - /* * Get the next thread and use it only if it isn't * in the middle of an exit, exec, or whatever. |