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