sys_self_notify() takes a flag for private mboxes
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 9 Dec 2011 01:41:42 +0000 (17:41 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Dec 2011 22:48:41 +0000 (14:48 -0800)
Sending TRUE will send the message to the VCPD private mbox.  I'm not
100% on sys_self_notify like this - perhaps we'll take an ev_q in the
future.  But for now this works.

kern/src/syscall.c
tests/mhello.c
user/parlib/include/i686/vcore.h
user/parlib/include/parlib.h
user/parlib/syscall.c
user/parlib/vcore.c

index 70acbe6..da444ea 100644 (file)
@@ -712,7 +712,8 @@ static int sys_notify(struct proc *p, int target_pid, unsigned int ev_type,
 /* Will notify the calling process on the given vcore, independently of WANTED
  * or advertised vcoreid.  If you change the parameters, change pop_ros_tf() */
 static int sys_self_notify(struct proc *p, uint32_t vcoreid,
-                           unsigned int ev_type, struct event_msg *u_msg)
+                           unsigned int ev_type, struct event_msg *u_msg,
+                           bool priv)
 {
        struct event_msg local_msg = {0};
 
@@ -726,7 +727,7 @@ static int sys_self_notify(struct proc *p, uint32_t vcoreid,
                }
        }
        /* this will post a message and IPI, regardless of wants/needs/debutantes.*/
-       post_vcore_event(p, &local_msg, vcoreid, EVENT_VCORE_PRIVATE);
+       post_vcore_event(p, &local_msg, vcoreid, priv ? EVENT_VCORE_PRIVATE : 0);
        proc_notify(p, vcoreid);
        return 0;
 }
index 03babf4..7b532cc 100644 (file)
@@ -97,7 +97,7 @@ int main(int argc, char** argv)
        printf("Vcore 0 self-notifying vcore 2 with notif 4!\n");
        struct event_msg msg;
        msg.ev_type = 4;
-       sys_self_notify(2, 4, &msg);
+       sys_self_notify(2, 4, &msg, TRUE);
        udelay(5000000);
        printf("Vcore 0 notifying itself with notif 6!\n");
        msg.ev_type = 6;
index f52dac6..5735927 100644 (file)
@@ -84,6 +84,7 @@ static inline void pop_ros_tf(struct user_trapframe *tf, uint32_t vcoreid)
        /* Need to prep the async sysc in case we need to notify ourselves */
        rst->sysc->num = SYS_self_notify;
        rst->sysc->arg0 = vcoreid;      /* arg 1 & 2 already = 0 (null notif, no u_ne)*/
+       rst->sysc->arg3 = TRUE;         /* just a private VCPD notification */
        rst->eax_save = 0;                      /* avoid bugs */
        rst->eflags = tf->tf_eflags;
        rst->eip = tf->tf_eip;
index 2ae407f..b8cc743 100644 (file)
@@ -47,7 +47,7 @@ void *COUNT(length) sys_mmap(void *SNT addr, size_t length, int prot, int flags,
                              int fd, size_t offset);
 int         sys_notify(int pid, unsigned int ev_type, struct event_msg *u_msg);
 int         sys_self_notify(uint32_t vcoreid, unsigned int ev_type,
-                            struct event_msg *u_msg);
+                            struct event_msg *u_msg, bool priv);
 int         sys_halt_core(unsigned int usec);
 void*          sys_init_arsc();
 int         sys_block(unsigned int usec);
index 1fceb4c..e340572 100644 (file)
@@ -118,9 +118,9 @@ int sys_notify(int pid, unsigned int ev_type, struct event_msg *u_msg)
 }
 
 int sys_self_notify(uint32_t vcoreid, unsigned int ev_type,
-                    struct event_msg *u_msg)
+                    struct event_msg *u_msg, bool priv)
 {
-       return ros_syscall(SYS_self_notify, vcoreid, ev_type, u_msg, 0, 0, 0);
+       return ros_syscall(SYS_self_notify, vcoreid, ev_type, u_msg, priv, 0, 0);
 }
 
 int sys_halt_core(unsigned int usec)
index d699746..124ada8 100644 (file)
@@ -307,7 +307,7 @@ void enable_notifs(uint32_t vcoreid)
         * vcore had gone into vcore context (which is what we wanted), and this
         * self_notify to our old vcore is spurious and harmless. */
        if (vcpd_of(vcoreid)->notif_pending)
-               sys_self_notify(vcoreid, EV_NONE, 0);
+               sys_self_notify(vcoreid, EV_NONE, 0, TRUE);
 }
 
 /* Helper to disable notifs.  It simply checks to make sure we disabled uthread