vcpd_of() helper for userspace
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 5 Dec 2011 19:27:32 +0000 (11:27 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Dec 2011 22:48:41 +0000 (14:48 -0800)
There are a few places I didn't change it yet; those are getting
concurrently modified in another commit.

Note I don't have a helper for the kernel.  For now, I want to be
explicit about which entry point into procdata we use (the user address
or the kernel address).

user/c3po/threads/vcore.c
user/parlib/include/vcore.h
user/parlib/uthread.c
user/parlib/vcore.c

index 4f751e7..f79f174 100644 (file)
@@ -112,7 +112,7 @@ void switch_to_vcore() {
        /* Disable notifications.  Once we do this, we might miss a notif_pending,
         * so we need to enter vcore entry later.  Need to disable notifs so we
         * don't get in weird loops */
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
+       struct preempt_data *vcpd = vcpd_of(vcoreid);
        vcpd->notif_disabled = TRUE;
 
        /* Grab a reference to the currently running thread on this vcore */
@@ -152,7 +152,7 @@ void __attribute__((noreturn)) vcore_entry()
      * vcoremap */
        assert(in_vcore_context());
        uint32_t vcoreid = vcore_id();
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
+       struct preempt_data *vcpd = vcpd_of(vcoreid);
        struct vcore *vc = &__procinfo.vcoremap[vcoreid];
 
        tdebug("current=%s, vcore=%d\n",
index 4f49e34..23cf5a3 100644 (file)
@@ -48,6 +48,7 @@ static inline void __disable_notifs(uint32_t vcoreid);
 static inline bool notif_is_enabled(uint32_t vcoreid);
 static inline bool vcore_is_mapped(uint32_t vcoreid);
 static inline bool vcore_is_preempted(uint32_t vcoreid);
+static inline struct preempt_data *vcpd_of(uint32_t vcoreid);
 int vcore_init(void);
 int vcore_request(long nr_new_vcores);
 void vcore_yield(bool preempt_pending);
@@ -85,17 +86,17 @@ static inline bool in_multi_mode(void)
 /* Only call this if you know what you are doing. */
 static inline void __enable_notifs(uint32_t vcoreid)
 {
-       __procdata.vcore_preempt_data[vcoreid].notif_disabled = FALSE;
+       vcpd_of(vcoreid)->notif_disabled = FALSE;
 }
 
 static inline void __disable_notifs(uint32_t vcoreid)
 {
-       __procdata.vcore_preempt_data[vcoreid].notif_disabled = TRUE;
+       vcpd_of(vcoreid)->notif_disabled = TRUE;
 }
 
 static inline bool notif_is_enabled(uint32_t vcoreid)
 {
-       return !__procdata.vcore_preempt_data[vcoreid].notif_disabled;
+       return !vcpd_of(vcoreid)->notif_disabled;
 }
 
 static inline bool vcore_is_mapped(uint32_t vcoreid)
@@ -106,10 +107,15 @@ static inline bool vcore_is_mapped(uint32_t vcoreid)
 /* We could also check for VC_K_LOCK, but that's a bit much. */
 static inline bool vcore_is_preempted(uint32_t vcoreid)
 {
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
+       struct preempt_data *vcpd = vcpd_of(vcoreid);
        return atomic_read(&vcpd->flags) & VC_PREEMPTED;
 }
 
+static inline struct preempt_data *vcpd_of(uint32_t vcoreid)
+{
+       return &__procdata.vcore_preempt_data[vcoreid];
+}
+
 #ifdef __cplusplus
 }
 #endif
index da0147d..2fc423b 100644 (file)
@@ -71,7 +71,7 @@ int uthread_lib_init(struct uthread *uthread)
 void __attribute__((noreturn)) uthread_vcore_entry(void)
 {
        uint32_t vcoreid = vcore_id();
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
+       struct preempt_data *vcpd = vcpd_of(vcoreid);
        /* Should always have notifications disabled when coming in here. */
        assert(!notif_is_enabled(vcoreid));
        assert(in_vcore_context());
@@ -202,7 +202,7 @@ void uthread_yield(bool save_state)
        cmb();  /* don't let DONT_MIGRATE write pass the vcoreid read */
        uint32_t vcoreid = vcore_id();
        printd("[U] Uthread %08p is yielding on vcore %d\n", uthread, vcoreid);
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
+       struct preempt_data *vcpd = vcpd_of(vcoreid);
        /* once we do this, we might miss a notif_pending, so we need to enter vcore
         * entry later.  Need to disable notifs so we don't get in weird loops with
         * save_ros_tf() and pop_ros_tf(). */
@@ -293,7 +293,7 @@ void ros_syscall_blockon(struct syscall *sysc)
 static void __run_cur_uthread(struct user_trapframe *utf)
 {
        uint32_t vcoreid = vcore_id();
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
+       struct preempt_data *vcpd = vcpd_of(vcoreid);
        clear_notif_pending(vcoreid);
        /* clear_notif might have handled a preemption event, and we might not have
         * a current_uthread anymore.  Need to recheck */
@@ -318,7 +318,7 @@ static void __run_cur_uthread(struct user_trapframe *utf)
 void run_current_uthread(void)
 {
        uint32_t vcoreid = vcore_id();
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
+       struct preempt_data *vcpd = vcpd_of(vcoreid);
        assert(current_uthread);
        assert(current_uthread->state == UT_RUNNING);
        printd("[U] Vcore %d is restarting uthread %08p\n", vcoreid,
@@ -355,7 +355,7 @@ void run_uthread(struct uthread *uthread)
 static void __run_current_uthread_raw(void)
 {
        uint32_t vcoreid = vcore_id();
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
+       struct preempt_data *vcpd = vcpd_of(vcoreid);
        /* 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;
index 3fb8354..2ae69ec 100644 (file)
@@ -94,7 +94,7 @@ static void free_transition_stack(int id)
 
 static int allocate_transition_stack(int id)
 {
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[id];
+       struct preempt_data *vcpd = vcpd_of(id);
        if (vcpd->transition_stack)
                return 0; // reuse old stack
 
@@ -247,7 +247,7 @@ handle_it:
 void vcore_yield(bool preempt_pending)
 {
        uint32_t vcoreid = vcore_id();
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[vcoreid];
+       struct preempt_data *vcpd = vcpd_of(vcoreid);
        vcpd->can_rcv_msg = FALSE;
        /* no wrmb() necessary, clear_notif() has an mb() */
        /* Clears notif pending.  If we had an event outstanding, this will handle
@@ -283,7 +283,7 @@ bool clear_notif_pending(uint32_t vcoreid)
 {
        bool handled_event = FALSE;
        do {
-               __procdata.vcore_preempt_data[vcoreid].notif_pending = 0;
+               vcpd_of(vcoreid)->notif_pending = 0;
                /* need a full mb(), since handle events might be just a read or might
                 * be a write, either way, it needs to happen after notif_pending */
                mb();
@@ -303,7 +303,7 @@ void enable_notifs(uint32_t vcoreid)
        /* Note we could get migrated before executing this.  If that happens, our
         * vcore had gone into vcore context (which is what we wanted), and this
         * self_notify to our old vcore is spurious and harmless. */
-       if (__procdata.vcore_preempt_data[vcoreid].notif_pending)
+       if (vcpd_of(vcoreid)->notif_pending)
                sys_self_notify(vcoreid, EV_NONE, 0);
 }