Kthreads stop zeroing the current_tf
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 12 Nov 2010 22:01:52 +0000 (14:01 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:56 +0000 (17:35 -0700)
Should have been done a few patches ago.  The kthreads were still saving
the current_tf, preventing us from really popping out to userspace
(though we were still smp_idling and running other processes - just not
the one that 'blocked').

kern/include/kthread.h
kern/include/smp.h
kern/src/kthread.c
kern/src/syscall.c

index 5ce5ff4..9089471 100644 (file)
@@ -25,8 +25,7 @@ struct kthread {
        struct trapframe                        context;
        uintptr_t                                       stacktop;
        struct proc                                     *proc;
-       struct trapframe                        *proc_tf;                       /* TODO: change this? */
-       /* TODO: put in the sys_return, if we decide to keep this shit */
+       struct syscall                          *sysc;
        TAILQ_ENTRY(kthread)            link;
        /* ID, other shit, etc */
 };
index 277d42c..a0c32b6 100644 (file)
@@ -29,6 +29,7 @@ struct per_cpu_info {
        trapframe_t *cur_tf;
        struct kthread *spare;          /* useful when restarting */
        /* Syscall management */
+       // TODO: 2 sysc
        struct syscall *syscalls;       /* ptr is into cur_proc's address space */
        unsigned int nr_calls;
        int *errno_loc;
index e45f9ee..cb2c6fb 100644 (file)
@@ -69,9 +69,11 @@ void sleep_on(struct semaphore *sem)
         * we want to leave, we'll need to do that in smp_idle() or elsewhere in the
         * code. */
        kthread->proc = current;
-       /* TODO: this will change in a commit or two */
-       kthread->proc_tf = current_tf;
-       current_tf = 0; /* don't want this *pointer* to persist past the block */
+       /* kthread tracks the syscall it is working on, which implies errno */
+       if (pcpui->syscalls)
+               kthread->sysc = pcpui->syscalls - 1;    // TODO: 2 sysc
+       else
+               kthread->sysc = 0;
        if (kthread->proc)
                kref_get(&kthread->proc->kref, 1);
        /* Save the context, toggle blocking for the reactivation */
@@ -102,7 +104,6 @@ unwind_sleep_prep:
        printd("Didn't sleep, unwinding...\n");
        /* Restore the core's current and default stacktop */
        current = kthread->proc;                        /* arguably unnecessary */
-       set_current_tf(kthread->proc_tf);
        if (kthread->proc)
                kref_put(&kthread->proc->kref);
        set_stack_top(kthread->stacktop);
@@ -152,9 +153,9 @@ void restart_kthread(struct kthread *kthread)
                if (kthread->proc)
                        lcr3(kthread->proc->env_cr3);
        }
-       /* TODO: (CTF) change me when we use async syscalls */
-       if (kthread->proc_tf)
-               set_current_tf(kthread->proc_tf);
+       // TODO: 2 sysc (set the syscall in progress to kthread->sysc */
+       if (kthread->sysc)
+               pcpui->errno_loc = &kthread->sysc->err;
        /* Finally, restart our thread */
        pop_kernel_tf(&kthread->context);
 }
index 60469ac..0e85dff 100644 (file)
@@ -77,6 +77,7 @@ static bool proc_is_traced(struct proc *p)
  * two separate struct syscall *s. */
 static void signal_current_sc(int retval)
 {
+       // TODO 2 sysc
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
        struct syscall *sysc = pcpui->syscalls - 1;     /* it was already advanced */
        sysc->retval = retval;
@@ -1401,6 +1402,7 @@ void prep_syscalls(struct proc *p, struct syscall *sysc, unsigned int nr_calls)
                warn("Debutante calls: %d\n", nr_calls);
        /* Set up this core to process the local call */
        *pcpui->tf_retval_loc = 0;      /* current_tf's retval says how many are done */
+       // TODO: 2 sysc
        pcpui->syscalls = sysc;
        pcpui->nr_calls = nr_calls;
 }
@@ -1418,6 +1420,7 @@ void run_local_syscall(void)
                 * have the same memory map anymore */
                return;
        }
+       // TODO 2 sysc
        sysc = pcpui->syscalls++;               /* get the next */
        pcpui->nr_calls--;                              /* one less to do */
        (*pcpui->tf_retval_loc)++;              /* one more started */