Kernel messages infrastructure
[akaros.git] / kern / include / trap.h
index 903c37f..802fdb7 100644 (file)
@@ -36,47 +36,42 @@ void ( page_fault_handler)(trapframe_t *tf);
 void sysenter_init(void);
 extern void sysenter_handler();
 
-/* Active messages.  Each arch implements them in their own way.  Both should be
+/* Kernel messages.  Each arch implements them in their own way.  Both should be
  * guaranteeing in-order delivery.  Kept here in trap.h, since sparc is using
- * trap.h for AMs
+ * trap.h for KMs.  Eventually, both arches will use the same implementation.
  *
  * These are different (for now) than the smp_calls in smp.h, since
- * they will be executed immediately, and in the order in which they are sent.
- * smp_calls are currently not run in order, and if they put things on the
- * workqueue, they don't get run until smp_idle (for now).
+ * they will be executed immediately (for urgent messages), and in the order in
+ * which they are sent.  smp_calls are currently not run in order, and if they
+ * put things on the workqueue, they don't get run until smp_idle (for now).
+ *
+ * Eventually, smp_call and the workqueue will be replaced by these.
  *
  * Also, a big difference is that smp_calls can use the same message (registered
- * in the interrupt_handlers[] for x86) for every recipient, but the active
+ * in the interrupt_handlers[] for x86) for every recipient, but the kernel
  * messages require a unique message.  Also for now, but it might be like that
- * for a while on x86. */
+ * for a while on x86 (til we have a broadcast). */
 
-void active_msg_init(void);
+#define AMSG_IMMEDIATE                         1
+#define AMSG_ROUTINE                   2
+void kernel_msg_init(void);
 typedef void (*amr_t)(trapframe_t* tf, uint32_t srcid,
                       TV(a0t) a0, TV(a1t) a1, TV(a2t) a2);
 
-struct active_message
+struct kernel_message
 {
-       STAILQ_ENTRY(active_message) link;
+       STAILQ_ENTRY(kernel_message NTPTV(a0t) NTPTV(a1t) NTPTV(a2t))
+               NTPTV(a0t) NTPTV(a1t) NTPTV(a2t) link;
        uint32_t srcid;
        amr_t pc;
        TV(a0t) arg0;
        TV(a1t) arg1;
        TV(a2t) arg2;
 };
-STAILQ_HEAD(active_msg_list, active_message);
-typedef struct active_message NTPTV(a0t) NTPTV(a1t) NTPTV(a2t) active_message_t;
-
-uint32_t send_active_message(uint32_t dst, amr_t pc,
-                             TV(a0t) arg0, TV(a1t) arg1, TV(a2t) arg2);
+STAILQ_HEAD(kernel_msg_list, kernel_message NTPTV(a0t) NTPTV(a1t) NTPTV(a2t));
+typedef struct kernel_message NTPTV(a0t) NTPTV(a1t) NTPTV(a2t) kernel_message_t;
 
-/* Spins til the active message is sent.  Could block in the future. */
-static inline void
-send_active_msg_sync(uint32_t dst, amr_t pc,
-                     TV(a0t) arg0, TV(a1t) arg1, TV(a2t) arg2)
-{
-       while (send_active_message(dst, pc, arg0, arg1, arg2))
-               cpu_relax();
-       return;
-}
+uint32_t send_kernel_message(uint32_t dst, amr_t pc, TV(a0t) arg0, TV(a1t) arg1,
+                             TV(a2t) arg2, int type);
 
 #endif /* ROS_KERN_TRAP_H */