Event handlers also take the ev_type
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 24 Feb 2011 23:45:07 +0000 (15:45 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:59 +0000 (17:35 -0700)
So handlers call for bits/no_msg can tell what type they are, which
would be useful for a generic handler.

tests/mhello.c
tests/syscall.c
user/parlib/event.c
user/parlib/include/event.h

index f79b0c1..08f3cc7 100644 (file)
@@ -22,7 +22,8 @@ __thread int temp;
 void *core0_tls = 0;
 
 struct event_queue *indirect_q;
-static void handle_generic(struct event_msg *ev_msg, bool overflow);
+static void handle_generic(struct event_msg *ev_msg, unsigned int ev_type,
+                           bool overflow);
 
 int main(int argc, char** argv)
 {
@@ -113,14 +114,11 @@ int main(int argc, char** argv)
        return 0;
 }
 
-static void handle_generic(struct event_msg *ev_msg, bool overflow)
+static void handle_generic(struct event_msg *ev_msg, unsigned int ev_type,
+                           bool overflow)
 {
-       if (ev_msg)
-               printf("Got event type %d on vcore %d, with%s overflow\n",
-                      ev_msg->ev_type, vcore_id(), overflow ? "" : "out");
-       else
-               printf("Got event type UNK on vcore %d, with%s overflow\n",
-                      vcore_id(), overflow ? "" : "out");
+       printf("Got event type %d on vcore %d, with%s overflow\n",
+              ev_type, vcore_id(), overflow ? "" : "out");
 }
 
 void vcore_entry(void)
index f240133..924b237 100644 (file)
@@ -6,7 +6,8 @@
 #include <rassert.h>
 #include <ros/bcq.h>
 
-static void handle_syscall(struct event_msg *ev_msg, bool overflow);
+static void handle_syscall(struct event_msg *ev_msg, unsigned int ev_type,
+                           bool overflow);
 struct syscall sysc = {0};
 struct event_queue *ev_q;
 void *core0_tls = 0;
@@ -81,9 +82,12 @@ int main(int argc, char** argv)
        return 0;
 }
 
-static void handle_syscall(struct event_msg *ev_msg, bool overflow)
+static void handle_syscall(struct event_msg *ev_msg, unsigned int ev_type,
+                           bool overflow)
 {
        struct syscall *my_sysc;
+       if (!ev_msg)
+               return;
        my_sysc = ev_msg->ev_arg3;
        printf("Handling syscall event for sysc %08p (%08p)\n",
               my_sysc, &sysc);
index c7cdb1a..16df0f6 100644 (file)
@@ -176,7 +176,7 @@ static int handle_mbox(struct event_mbox *ev_mbox, unsigned int flags)
                ev_type = local_msg.ev_type;
                printd("BCQ: ev_type: %d\n", ev_type);
                if (ev_handlers[ev_type])
-                       ev_handlers[ev_type](&local_msg, overflow);
+                       ev_handlers[ev_type](&local_msg, ev_type, overflow);
                check_preempt_pending(vcoreid);
                retval++;
        }
@@ -192,9 +192,9 @@ static int handle_mbox(struct event_mbox *ev_mbox, unsigned int flags)
         * thread safe (tested on some code in mhello, asm looks like it knows to
         * have the function use addresses relative to the frame pointer). */
        void bit_handler(unsigned int bit) {
-               printd("Bit: ev_type: %d\n", ev_type);
+               printd("Bit: ev_type: %d\n", bit);
                if (ev_handlers[bit])
-                       ev_handlers[bit](0, overflow);
+                       ev_handlers[bit](0, bit, overflow);
                retval++;
                check_preempt_pending(vcoreid);
                /* Consider checking the queue for incoming messages while we're here */
@@ -206,7 +206,7 @@ static int handle_mbox(struct event_mbox *ev_mbox, unsigned int flags)
 /* The EV_EVENT handler - extract the ev_q from the message.  If you want this
  * to catch overflows, you'll need to register your event_queues (TODO).  Might
  * be issues with per-core handling (register globally, or just per vcore). */
-void handle_ev_ev(struct event_msg *ev_msg, bool overflow)
+void handle_ev_ev(struct event_msg *ev_msg, unsigned int ev_type, bool overflow)
 {
        struct event_queue *ev_q;
        /* TODO: handle overflow (register, etc) */
index c03f714..7f2962a 100644 (file)
@@ -29,9 +29,11 @@ unsigned int get_event_type(struct event_mbox *ev_mbox);
 
 /* List of handlers, process-wide, that the 2LS should fill in.  They all must
  * return (don't context switch to a u_thread) */
-typedef void (*handle_event_t)(struct event_msg *ev_msg, bool overflow);
+typedef void (*handle_event_t)(struct event_msg *ev_msg, unsigned int ev_type,
+                               bool overflow);
 extern handle_event_t ev_handlers[];
-void handle_ev_ev(struct event_msg *ev_msg, bool overflow);
+void handle_ev_ev(struct event_msg *ev_msg, unsigned int ev_type,
+                  bool overflow);
 int handle_events(uint32_t vcoreid);
 int handle_event_q(struct event_queue *ev_q);