Uthread flag tells us where the context is saved
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 19 Nov 2011 02:00:59 +0000 (18:00 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Dec 2011 22:48:40 +0000 (14:48 -0800)
So we know how to save it during preemption recovery.  The flag means
that the context for the uthread is in the utf.  If it isn't there, it's
in the VCPD notif trapframe (or will be there soon, in such a manner
that we won't steal the thread or handle other vcore's preemptions until
it is in the notif_tf).

user/parlib/include/uthread.h
user/parlib/uthread.c

index 5d30d56..2b6ed80 100644 (file)
@@ -5,6 +5,7 @@
 #include <ros/syscall.h>
 
 #define UTHREAD_DONT_MIGRATE           0x001 /* don't move to another vcore */
+#define UTHREAD_SAVED                          0x002 /* uthread's state is in utf */
 
 /* Thread States */
 #define UT_CREATED     1
index 40a97c5..4165e76 100644 (file)
@@ -208,6 +208,9 @@ void uthread_yield(bool save_state)
        if (!yielding)
                goto yield_return_path;
        yielding = FALSE; /* for when it starts back up */
+       /* Signal the current state is in utf.  Need to do this only the first time
+        * through (not on the yield return path that comes after save_ros_tf) */
+       uthread->flags |= UTHREAD_SAVED;
        /* Change to the transition context (both TLS and stack). */
        extern void** vcore_thread_control_blocks;
        set_tls_desc(vcore_thread_control_blocks[vcoreid], vcoreid);
@@ -281,6 +284,8 @@ void run_current_uthread(void)
        printd("[U] Vcore %d is restarting uthread %08p\n", vcoreid,
               current_uthread);
        clear_notif_pending(vcoreid);
+       /* utf no longer represents the current state of the uthread */
+       current_uthread->flags &= ~UTHREAD_SAVED;
        set_tls_desc(current_uthread->tls_desc, vcoreid);
        /* Pop the user trap frame */
        pop_ros_tf(&vcpd->notif_tf, vcoreid);
@@ -297,6 +302,8 @@ static void __run_current_uthread_raw(void)
        /* We need to manually say we have a notif pending, so we eventually return
         * to vcore context.  (note the kernel turned it off for us) */
        vcpd->notif_pending = TRUE;
+       /* utf no longer represents the current state of the uthread */
+       current_uthread->flags &= ~UTHREAD_SAVED;
        set_tls_desc(current_uthread->tls_desc, vcoreid);
        /* Pop the user trap frame */
        pop_ros_tf_raw(&vcpd->notif_tf, vcoreid);
@@ -320,6 +327,8 @@ void run_uthread(struct uthread *uthread)
        current_uthread = uthread;
        vcoreid = vcore_id();
        clear_notif_pending(vcoreid);
+       /* utf no longer represents the current state of the uthread */
+       uthread->flags &= ~UTHREAD_SAVED;
        set_tls_desc(uthread->tls_desc, vcoreid);
        /* Load silly state (Floating point) too.  For real */
        /* TODO: (HSS) */