Merge branch 'master' of ssh://scm.millennium.berkeley.edu/project/cs/radlab/src...
[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/arch.h>
10 #include <arch/mmu.h>
11 #include <arch/trap.h>
12
13 // func ptr for interrupt service routines
14 typedef void ( *poly_isr_t)(trapframe_t* tf, TV(t) data);
15 typedef void (*isr_t)(trapframe_t* tf, void * data);
16 typedef struct InterruptHandler {
17         poly_isr_t isr;
18         TV(t) data;
19 } handler_t;
20
21 #ifdef __IVY__
22 #pragma cilnoremove("iht_lock")
23 #endif
24 extern spinlock_t iht_lock;
25 extern handler_t LCKD(&iht_lock) (CT(NUM_INTERRUPT_HANDLERS) RO interrupt_handlers)[];
26
27 void idt_init(void);
28 void register_interrupt_handler(handler_t SSOMELOCK (CT(NUM_INTERRUPT_HANDLERS)table)[],
29                                 uint8_t int_num,
30                                 poly_isr_t handler, TV(t) data);
31 void ( print_trapframe)(trapframe_t *tf);
32 void ( page_fault_handler)(trapframe_t *tf);
33
34 void sysenter_init(void);
35 extern void sysenter_handler();
36
37 /* Active messages.  Each arch implements them in their own way.  Both should be
38  * guaranteeing in-order delivery.  Kept here in trap.h, since sparc is using
39  * trap.h for AMs
40  *
41  * These are different (for now) than the smp_calls in smp.h, since
42  * they will be executed immediately, and in the order in which they are sent.
43  * smp_calls are currently not run in order, and if they put things on the
44  * workqueue, they don't get run until smp_idle (for now).
45  *
46  * Also, a big difference is that smp_calls can use the same message (registered
47  * in the interrupt_handlers[] for x86) for every recipient, but the active
48  * messages require a unique message.  Also for now, but it might be like that
49  * for a while on x86. */
50
51 typedef void (*amr_t)(trapframe_t* tf, uint32_t srcid,
52                       TV(a0t) a0, TV(a1t) a1, TV(a2t) a2);
53
54 struct active_message
55 {
56         uint32_t srcid;
57         amr_t pc;
58         TV(a0t) arg0;
59         TV(a1t) arg1;
60         TV(a2t) arg2;
61         uint32_t pad;
62 };
63 typedef struct active_message NTPTV(a0t) NTPTV(a1t) NTPTV(a2t) active_message_t;
64
65 uint32_t send_active_message(uint32_t dst, amr_t pc,
66                              TV(a0t) arg0, TV(a1t) arg1, TV(a2t) arg2);
67
68 /* Spins til the active message is sent.  Could block in the future. */
69 static inline void
70 send_active_msg_sync(uint32_t dst, amr_t pc,
71                      TV(a0t) arg0, TV(a1t) arg1, TV(a2t) arg2)
72 {
73         while (send_active_message(dst, pc, arg0, arg1, arg2))
74                 cpu_relax();
75         return;
76 }
77
78 #endif /* ROS_KERN_TRAP_H */