flounder: moving receiving cap slots from a thread to a dispatcher
[barrelfish] / include / barrelfish / dispatcher.h
1 /**
2  * \file
3  * \brief Generic dispatcher structure private to the user
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, 2011, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #ifndef BARRELFISH_DISPATCHER_H
16 #define BARRELFISH_DISPATCHER_H
17
18 #include <barrelfish/dispatch.h>
19 #include <barrelfish/core_state_arch.h>
20 #include <barrelfish/heap.h>
21 #include <barrelfish/threads.h>
22
23 struct lmp_chan;
24 struct ump_chan;
25 struct deferred_event;
26 struct notificator;
27
28 /// Maximum number of buffered capability receive slots
29 #define MAX_RECV_SLOTS   4
30
31 // Architecture generic user only dispatcher struct
32 struct dispatcher_generic {
33     /// stack for traps and disabled pagefaults
34     uintptr_t trap_stack[DISPATCHER_STACK_WORDS] __attribute__ ((aligned (16)));
35     /// all other dispatcher upcalls run on this stack
36     uintptr_t stack[DISPATCHER_STACK_WORDS] __attribute__ ((aligned (16)));
37
38     /// Currently-running (or last-run) thread, if any
39     struct thread *current;
40
41     /// Thread run queue (all threads eligible to be run)
42     struct thread *runq;
43
44     /// Cap to this dispatcher, used for creating new endpoints
45     struct capref dcb_cap;
46
47 #ifdef CONFIG_INTERCONNECT_DRIVER_LMP
48     /// List of LMP endpoints to poll
49     struct lmp_endpoint *lmp_poll_list;
50
51     /// List of LMP channels waiting to retry a send
52     struct lmp_chan *lmp_send_events_list;
53     struct ump_chan *ump_send_events_list;
54
55     /// LMP endpoint heap state
56     struct heap lmp_endpoint_heap;
57 #endif // CONFIG_INTERCONNECT_DRIVER_LMP
58
59     /// Queue of deferred events (i.e. timers)
60     struct deferred_event *deferred_events;
61
62     /// The core the dispatcher is running on
63     coreid_t core_id;
64
65     uintptr_t timeslice;
66
67     /// Per core dispatcher state
68     struct core_state_arch core_state;
69
70     /// Tracing buffer
71     struct trace_buffer *trace_buf;
72
73     struct thread *cleanupthread;
74     struct thread_mutex cleanupthread_lock;
75
76     /// Last FPU-using thread
77     struct thread *fpu_thread;
78
79     /// Domain ID cache
80     domainid_t domain_id;
81
82     /// virtual address of the eh_frame
83     lvaddr_t eh_frame;
84
85     /// size of the eh frame
86     size_t   eh_frame_size;
87
88     /// virtual address of the eh_frame
89     lvaddr_t eh_frame_hdr;
90
91     /// size of the eh frame
92     size_t   eh_frame_hdr_size;
93
94     /// list of polled channels
95     struct waitset_chanstate *polled_channels;
96     
97     struct notificator *notificators;
98
99     struct capref recv_slots[MAX_RECV_SLOTS];///< Queued cap recv slots
100     int8_t recv_slot_count;                 ///< number of currently queued recv slots
101
102 };
103
104 #endif // BARRELFISH_DISPATCHER_H