vcore_idle()
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 12 Mar 2011 02:17:02 +0000 (18:17 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:00 +0000 (17:36 -0700)
When you don't want to give up a vcore, but you don't know what to do.
Can only break out via an IPI/notif/interrupt.

user/parlib/include/vcore.h
user/parlib/vcore.c

index 12e8f73..b28ebfd 100644 (file)
@@ -48,6 +48,7 @@ int vcore_request(size_t k);
 void vcore_yield(void);
 void clear_notif_pending(uint32_t vcoreid);
 void enable_notifs(uint32_t vcoreid);
+void vcore_idle(void);
 
 /* Static inlines */
 static inline size_t max_vcores(void)
index 906c891..5debbb4 100644 (file)
@@ -194,3 +194,15 @@ void enable_notifs(uint32_t vcoreid)
        if (__procdata.vcore_preempt_data[vcoreid].notif_pending)
                sys_self_notify(vcoreid, EV_NONE, 0);
 }
+
+/* Like smp_idle(), this will put the core in a state that it can only be woken
+ * up by an IPI.  In the future, we may halt or something. */
+void __attribute__((noreturn)) vcore_idle(void)
+{
+       uint32_t vcoreid = vcore_id();
+       clear_notif_pending(vcoreid);
+       enable_notifs(vcoreid);
+       while (1) {
+               cpu_relax();
+       }
+}