proc: make switch_to(NULL) a noop Previously, it would switch out of any address space and into the boot_pgdir. However, it wouldn't permanently leave the process's address space, and boot_pgdir is mapped in all address spaces. No one was using it in this manner. Although I can think of reasons to do this, no one was doing it, and it's more convenient to have NULL be a noop. In particular, this is for PCI code that may or may not need to switch into a process's address space. Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/src/process.c b/kern/src/process.c index 44d8c50..78fcf8d 100644 --- a/kern/src/process.c +++ b/kern/src/process.c
@@ -1910,7 +1910,9 @@ } /* Switches to the address space/context of new_p, doing nothing if we are - * already in new_p. This won't add extra refcnts or anything, and needs to be + * already in new_p. You can pass NULL for a noop. + * + * This won't add extra refcnts or anything, and needs to be * paired with switch_back() at the end of whatever function you are in. * Specifically, the uncounted refs are one for the old_proc, which is passed * back to the caller, and new_p is getting placed in cur_proc. */ @@ -1921,14 +1923,13 @@ struct proc *old_proc; uintptr_t ret; + if (!new_p) + return -1; old_proc = pcpui->cur_proc; /* uncounted ref */ /* If we aren't the proc already, then switch to it */ if (old_proc != new_p) { pcpui->cur_proc = new_p; /* uncounted ref */ - if (new_p) - lcr3(new_p->env_cr3); - else - lcr3(boot_cr3); + lcr3(new_p->env_cr3); } ret = (uintptr_t)old_proc; if (is_ktask(kth)) { @@ -1950,6 +1951,8 @@ struct kthread *kth = pcpui->cur_kthread; struct proc *old_proc; + if (!new_p) + return; if (is_ktask(kth)) { if (old_ret & 0x1) { kth->flags &= ~KTH_SAVE_ADDR_SPACE;