Don't cache pcpui in sys_fork()
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 14 Aug 2018 18:27:46 +0000 (14:27 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 14 Aug 2018 18:27:46 +0000 (14:27 -0400)
There wasn't a bug here, yet, but this cuts down on the number of places
that could accidentally cache pcpui and access it after a migration.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/syscall.c

index 22d3099..b3dabcb 100644 (file)
@@ -860,7 +860,6 @@ static ssize_t sys_fork(env_t* e)
 {
        uintptr_t temp;
        int ret;
-       struct per_cpu_info *pcpui = this_pcpui_ptr();
 
        // TODO: right now we only support fork for single-core processes
        if (e->state != PROC_RUNNING_S) {
@@ -880,7 +879,7 @@ static ssize_t sys_fork(env_t* e)
                set_errno(EINVAL);
                return -1;
        }
-       assert(pcpui->cur_proc == pcpui->owning_proc);
+       assert(current == this_pcpui_var(owning_proc));
        copy_current_ctx_to(&env->scp_ctx);
 
        /* Make the new process have the same VMRs as the older.  This will copy the
@@ -896,8 +895,7 @@ static ssize_t sys_fork(env_t* e)
         * is cloned before we return for the original process.  If we ever do CoW
         * for forked memory, this will be the first place that gets CoW'd. */
        temp = switch_to(env);
-       pcpui = this_pcpui_ptr();       /* reload in case of migration */
-       finish_sysc(pcpui->cur_kthread->sysc, env, 0);
+       finish_sysc(current_kthread->sysc, env, 0);
        switch_back(env, temp);
 
        /* Copy some state from the original proc into the new proc. */