Active messages for x86
[akaros.git] / kern / include / trap.h
1 /* See COPYRIGHT for copyright information. */
2
3 #ifndef ROS_KERN_TRAP_H
4 #define ROS_KERN_TRAP_H
5 #ifndef ROS_KERNEL
6 # error "This is an ROS kernel header; user programs should not #include it"
7 #endif
8
9 #include <arch/mmu.h>
10 #include <arch/trap.h>
11
12 // func ptr for interrupt service routines
13 typedef void ( *poly_isr_t)(trapframe_t* tf, TV(t) data);
14 typedef void (*isr_t)(trapframe_t* tf, void * data);
15 typedef struct InterruptHandler {
16         poly_isr_t isr;
17         TV(t) data;
18 } handler_t;
19 extern handler_t interrupt_handlers[];
20
21 void idt_init(void);
22 void register_interrupt_handler(handler_t (COUNT(256)table)[], uint8_t int_num,
23                                 poly_isr_t handler, TV(t) data);
24 void ( print_trapframe)(trapframe_t *tf);
25 void ( page_fault_handler)(trapframe_t *tf);
26
27 void sysenter_init(void);
28 extern void sysenter_handler();
29
30 /* Active messages.  Each arch implements them in their own way.  Both should be
31  * guaranteeing in-order delivery.  Kept here in trap.h, since sparc is using
32  * trap.h for AMs
33  *
34  * These are different (for now) than the smp_calls in smp.h, since
35  * they will be executed immediately, and in the order in which they are sent.
36  * smp_calls are currently not run in order, and if they put things on the
37  * workqueue, they don't get run until smp_idle (for now).
38  *
39  * Also, a big difference is that smp_calls can use the same message (registered
40  * in the interrupt_handlers[] for x86) for every recipient, but the active
41  * messages require a unique message.  Also for now, but it might be like that
42  * for a while on x86. */
43
44 typedef void (*amr_t)(trapframe_t* tf, uint32_t srcid, uint32_t a0, uint32_t a1,
45                       uint32_t a2);
46 typedef struct
47 {
48         uint32_t srcid;
49         amr_t pc;
50         uint32_t arg0;
51         uint32_t arg1;
52         uint32_t arg2;
53         uint32_t pad;
54 } active_message_t;
55
56 uint32_t send_active_message(uint32_t dst, amr_t pc, uint32_t arg0,
57                              uint32_t arg1, uint32_t arg2);
58 #endif /* ROS_KERN_TRAP_H */