Add a bulk interface to sem_down()
[akaros.git] / kern / src / event.c
index f304ac5..ed5fe39 100644 (file)
@@ -6,6 +6,7 @@
  * processes. */
 
 #include <ucq.h>
+#include <ceq.h>
 #include <bitmask.h>
 #include <event.h>
 #include <atomic.h>
@@ -70,9 +71,9 @@ static void send_evbitmap_msg(struct evbitmap *evbm, struct event_msg *msg)
        evbm->check_bits = TRUE;
 }
 
-/* Posts a message to the mbox.  Make sure that if mbox is a user
- * pointer, that you've checked it *and* have that processes address space
- * loaded.  This can get called with a KVA for mbox. */
+/* Posts a message to the mbox.  mbox is a pointer to user-accessible memory.
+ * If mbox is a user-provided pointer, make sure that you've checked it.
+ * Regardless make sure you have that process's address space loaded. */
 static void post_ev_msg(struct proc *p, struct event_mbox *mbox,
                         struct event_msg *msg, int ev_flags)
 {
@@ -86,6 +87,9 @@ static void post_ev_msg(struct proc *p, struct event_mbox *mbox,
                case (EV_MBOX_BITMAP):
                        send_evbitmap_msg(&mbox->evbm, msg);
                        break;
+               case (EV_MBOX_CEQ):
+                       send_ceq_msg(&mbox->ceq, p, msg);
+                       break;
                default:
                        printk("[kernel] Unknown mbox type %d!\n", mbox->type);
        }
@@ -358,11 +362,12 @@ static void send_indir(struct proc *p, struct event_queue *ev_q,
 void send_event(struct proc *p, struct event_queue *ev_q, struct event_msg *msg,
                 uint32_t vcoreid)
 {
-       struct proc *old_proc;
+       uintptr_t old_proc;
        struct event_mbox *ev_mbox = 0;
+
        assert(!in_irq_ctx(&per_cpu_info[core_id()]));
        assert(p);
-       if (p->state == PROC_DYING)
+       if (proc_is_dying(p))
                return;
        printd("[kernel] sending msg to proc %p, ev_q %p\n", p, ev_q);
        if (!ev_q) {
@@ -478,7 +483,8 @@ void post_vcore_event(struct proc *p, struct event_msg *msg, uint32_t vcoreid,
 {
        /* Need to set p as current to post the event */
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
-       struct proc *old_proc = switch_to(p);
+       uintptr_t old_proc = switch_to(p);
+
        /* *ev_mbox is the user address of the vcpd mbox */
        post_vc_msg(p, vcoreid, get_vcpd_mbox(vcoreid, ev_flags), msg, ev_flags);
        switch_back(p, old_proc);