New vcoremap in procinfo
[akaros.git] / kern / include / ros / notification.h
1 /* Copyright (c) 2010 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Kernel interface for notification delivery and preemption. */
6
7 #ifndef ROS_INC_NOTIFICATION_H
8 #define ROS_INC_NOTIFICATION_H
9
10 #include <ros/common.h>
11 #include <ros/arch/trapframe.h>
12 // TODO: #include some one-way queue macros for the notif_event queue
13 // TODO: move me to an atomic header, and give me some support functions.
14 #ifndef __TMP_SEQ_CTR
15 #define __TMP_SEQ_CTR
16 typedef uint8_t seq_ctr_t;
17 #endif
18
19 /* How/If a process wants to be notified about an event */
20 struct notif_method {
21         uint32_t                                vcoreid;        /* which vcore to notify */
22         int                                             flags;
23 };
24
25 /* Notification Flags.  vcore0 stuff might be implemented. */
26 #define NOTIF_WANTED                    0x001   /* wanted, process-wide */
27 #define NOTIF_NO_IPI                    0x002   /* do not IPI the core */
28 #define NOTIF_NO_MSG                    0x004   /* no message, just flip the bit */
29 #define NOTIF_VCORE0_IPI                0x008   /* fall back to vcore0 for an IPI */
30 #define NOTIF_VCORE0_EVENT              0x010   /* fall back to vcore0 for an event */
31
32 /* Notification Event Types */
33 #define NE_NONE                                  0
34 #define NE_PREMPT_PENDING                1
35 #define NE_GANG_PREMPT_PENDING   2
36 #define NE_VCORE_REVOKE                  3
37 #define NE_GANG_RETURN                   4
38 #define NE_USER_IPI                              5
39 #define NE_PAGE_FAULT                    6
40 #define NE_ALARM                                 7
41 #define NE_FREE_APPLE_PIE                8
42 #define NE_ETC_ETC_ETC                   9
43 #define NR_NOTIF_TYPES                  10 /* keep me last */
44
45 /* Will probably have dynamic notifications later */
46 #define MAX_NR_DYN_NOTIF                25
47 #define MAX_NR_NOTIF                    (NR_NOTIF_TYPES + MAX_NR_DYN_NOTIF)
48
49 /* Want to keep this small and generic, but add items as you need them.  One
50  * item some will need is an expiration time, which ought to be put in the 64
51  * bit arg.  Will need tweaking / thought as we come up with events.  These are
52  * what get put on the per-core queue in procdata. */
53 struct notif_event {
54         uint16_t                                ne_type;
55         uint16_t                                ne_arg1;
56         uint32_t                                ne_arg2;
57         uint64_t                                ne_arg3;
58         uint64_t                                ne_arg4;
59 };
60
61 #define NR_PERCORE_EVENTS 10 // whatever
62
63 /* Per-core data about preemptions and notifications */
64 struct preempt_data {
65         struct user_trapframe   preempt_tf;
66         struct ancillary_state  preempt_anc;
67         struct user_trapframe   notif_tf;
68         void                                    *transition_stack;      /* advertised by the user */
69         // TODO: move to procinfo!
70         uint64_t                                preempt_pending;
71         bool                                    notif_enabled;          /* vcore is willing to receive*/
72         bool                                    notif_pending;          /* notif a_msg on the way */
73         seq_ctr_t                               preempt_tf_valid;
74         uint8_t                                 notif_bmask[(NR_PERCORE_EVENTS - 1) / 8 + 1];
75         struct notif_event              notif_events[NR_PERCORE_EVENTS];
76         unsigned int                    prod_idx;
77         unsigned int                    cons_idx;
78         unsigned int                    event_overflows;
79 };
80
81 /* Structs for different types of events that need parameters. */
82 // TODO: think about this a bit.  And don't want to make them til we need them.
83
84 /* Example: want the vcoreid of what was lost. */
85 struct ne_vcore_revoke {
86         uint16_t                                ne_type;
87         uint16_t                                ne_pad1;
88         uint32_t                                ne_vcoreid;
89         uint64_t                                ne_pad3;
90         uint64_t                                ne_pad4;
91 };
92
93 #endif /* ROS_INC_NOTIFICATION_H */