Uthread helper to copy a uthread's context
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 13 Dec 2011 23:15:00 +0000 (15:15 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Dec 2011 22:48:42 +0000 (14:48 -0800)
From the VCPD to the uthread, subject to where the uthread's flags say
its contexts are.

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

index 6a0dd2b..c5c12cd 100644 (file)
@@ -64,6 +64,7 @@ void ros_syscall_blockon(struct syscall *sysc);
 bool check_preempt_pending(uint32_t vcoreid);
 void uth_disable_notifs(void);
 void uth_enable_notifs(void);
+void copyout_uthread(struct preempt_data *vcpd, struct uthread *uthread);
 
 bool register_evq(struct syscall *sysc, struct event_queue *ev_q);
 void deregister_evq(struct syscall *sysc);
index 1fa85b5..bb1a7ee 100644 (file)
@@ -423,6 +423,27 @@ void uth_enable_notifs(void)
        }
 }
 
+/* Copies the uthread trapframe and silly state from the vcpd to the uthread,
+ * subject to the uthread's flags. */
+void copyout_uthread(struct preempt_data *vcpd, struct uthread *uthread)
+{
+       assert(uthread);
+       /* Copy out the main tf if we need to */
+       if (!(uthread->flags & UTHREAD_SAVED)) {
+               uthread->utf = vcpd->notif_tf;
+               uthread->flags |= UTHREAD_SAVED;
+               printd("VC %d copying out uthread %08p\n", vcore_id(), uthread);
+       }
+       /* could optimize here in case the FP/silly state wasn't being used.
+        * Depends how we use the FPSAVED flag.  It means that the uthread's FP
+        * state is not currently saved, for whatever reason, so we'll do it. */
+       if (!(uthread->flags & UTHREAD_FPSAVED)) {
+               /* TODO: (HSS) handle FP state: review this when fixing the other HSS */
+               uthread->as = vcpd->preempt_anc;
+               uthread->flags |= UTHREAD_FPSAVED;
+       }
+}
+
 static void handle_vc_preempt(struct event_msg *ev_msg, unsigned int ev_type)
 {
        printf("Vcore %d was preempted, we're fucked!!!\n", ev_msg->ev_arg2);