Add a helper for yielding from 2LSs
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 18 Feb 2016 22:51:24 +0000 (17:51 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 2 May 2016 21:11:15 +0000 (17:11 -0400)
vcore_yield() does not always succeed.  Some 2LSs can just use this in a
loop (e.g. pthreads).  Other 2LSs might want to just either yield or start
over with a fresh vcore context.  This helper will do that.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/parlib/vcore.h
user/parlib/vcore.c

index 01df275..975dc4e 100644 (file)
@@ -63,6 +63,7 @@ void ensure_vcore_runs(uint32_t vcoreid);
 void cpu_relax_vc(uint32_t vcoreid);
 uint32_t get_vcoreid(void);
 bool check_vcoreid(const char *str, uint32_t vcoreid);
+void __attribute__((noreturn)) vcore_yield_or_restart(void);
 void print_hw_tf(struct hw_trapframe *tf);
 void print_sw_tf(struct sw_trapframe *sw_tf);
 void print_user_context(struct user_context *ctx);
index a31ae33..e59105f 100644 (file)
@@ -507,3 +507,14 @@ bool check_vcoreid(const char *str, uint32_t vcoreid)
        }
        return TRUE;
 }
+
+/* Helper.  Yields the vcore, or restarts it from scratch. */
+void __attribute__((noreturn)) vcore_yield_or_restart(void)
+{
+       struct preempt_data *vcpd = vcpd_of(vcore_id());
+
+       vcore_yield(FALSE);
+       /* If vcore_yield returns, we have an event.  Just restart vcore context. */
+       set_stack_pointer((void*)vcpd->vcore_stack);
+       vcore_entry();
+}