1
/*
2
* \brief Protection domain (PD) session interface
3
* \author Christian Helmuth
4
* \author Norman Feske
5
* \date 2006-06-27
6
*
7
* A pd session represents the protection domain of a program.
8
*/
9
10
/*
11
* Copyright (C) 2006-2013 Genode Labs GmbH
12
*
13
* This file is part of the Genode OS framework, which is distributed
14
* under the terms of the GNU General Public License version 2.
15
*/
16
17
#
ifndef _INCLUDE__PD_SESSION__PD_SESSION_H_
18
#
define _INCLUDE__PD_SESSION__PD_SESSION_H_
19
20
#
include <base/exception.h>
21
#
include <thread/capability.h>
22
#
include <session/session.h>
23
#
include <signal_source/signal_source.h>
24
25
namespace
Genode {
26
27
struct
Pd_session;
28
struct
Parent;
29
struct
Signal_context;
30
}
31
32
33
struct
Genode::
Pd_session :
Session
34
{
35
static
const
char *
service_name(
)
{
return
"PD"
;
}
36
37
virtual
~
Pd_session(
)
{
}
38
39
/**
40
* Bind thread to protection domain
41
*
42
* \param thread capability of thread to bind
43
*
44
* \return 0 on success or negative error code
45
*
46
* After successful bind, the thread will execute inside this
47
* protection domain when started.
48
*/
49
virtual
int
bind_thread(
Thread_capability
thread
)
=
0
;
50
51
/**
52
* Assign parent to protection domain
53
*
54
* \param parent capability of parent interface
55
* \return 0 on success, or negative error code
56
*/
57
virtual
int
assign_parent(
Capability<
Parent
>
parent
)
=
0
;
58
59
/**
60
* Assign PCI device to PD
61
*
62
* The specified address has to refer to the locally mapped PCI
63
* configuration space of the device.
64
*
65
* This function is solely used on the NOVA kernel.
66
*/
67
virtual
bool
assign_pci(
addr_t
pci_config_memory_address
,
uint16_t
bdf
)
=
0
;
68
69
70
/********************************
71
** Support for the signal API **
72
********************************/
73
74
typedef
Capability<
Signal_source
>
Signal_source_capability
;
75
76
class
Out_of_metadata :
public
Exception
{
}
;
77
class
Invalid_signal_source :
public
Exception
{
}
;
78
79
/**
80
* Create a new signal source
81
*
82
* \return a cap that acts as reference to the created source
83
*
84
* The signal source provides an interface to wait for incoming signals.
85
*
86
* \throw Out_of_metadata
87
*/
88
virtual
Signal_source_capability
alloc_signal_source(
)
=
0
;
89
90
/**
91
* Free a signal source
92
*
93
* \param cap capability of the signal source to destroy
94
*/
95
virtual
void
free_signal_source(
Signal_source_capability
cap
)
=
0
;
96
97
/**
98
* Allocate signal context
99
*
100
* \param source signal source that shall provide the new context
101
*
102
*
103
* \param imprint opaque value that gets delivered with signals
104
* originating from the allocated signal-context capability
105
* \return new signal-context capability
106
*
107
* \throw Out_of_metadata
108
* \throw Invalid_signal_source
109
*/
110
virtual
Capability<
Signal_context
>
111
alloc_context(
Signal_source_capability
source
,
unsigned
long
imprint
)
=
0
;
112
113
/**
114
* Free signal-context
115
*
116
* \param cap capability of signal-context to release
117
*/
118
virtual
void
free_context(
Capability<
Signal_context
>
cap
)
=
0
;
119
120
/**
121
* Submit signals to the specified signal context
122
*
123
* \param context signal destination
124
* \param cnt number of signals to submit at once
125
*
126
* The `context` argument does not necessarily belong to this PD session.
127
* Normally, it is a capability obtained from a potentially untrusted
128
* component. Because we cannot trust this capability, signals are not
129
* submitted by invoking `cap` directly but by using it as argument to our
130
* trusted PD-session interface. Otherwise, a potential signal receiver
131
* could supply a capability with a blocking interface to compromise the
132
* nonblocking behaviour of the signal submission.
133
*/
134
virtual
void
submit(
Capability<
Signal_context
>
context
,
unsigned
cnt
=
1
)
=
0
;
135
136
137
/***********************************
138
** Support for the RPC framework **
139
***********************************/
140
141
/**
142
* Allocate new RPC-object capability
143
*
144
* \param ep entry point that will use this capability
145
*
146
* \throw Out_of_metadata if meta-data backing store is exhausted
147
*
148
* \return new RPC capability
149
*/
150
virtual
Native_capability
alloc_rpc_cap(
Native_capability
ep
)
=
0
;
151
152
/**
153
* Free RPC-object capability
154
*
155
* \param cap capability to free
156
*/
157
virtual
void
free_rpc_cap(
Native_capability
cap
)
=
0
;
158
159
160
/*****************************************
161
** Access to kernel-specific interface **
162
*****************************************/
163
164
/**
165
* Common base class of kernel-specific PD interfaces
166
*/
167
struct
Native_pd {
}
;
168
169
/**
170
* Return capability to kernel-specific PD operations
171
*/
172
virtual
Capability<
Native_pd
>
native_pd(
)
=
0
;
173
174
175
/*********************
176
** RPC declaration **
177
*********************/
178
179
GENODE_RPC
(
Rpc_bind_thread,
int,
bind_thread,
Thread_capability)
;
180
GENODE_RPC
(
Rpc_assign_parent,
int,
assign_parent,
Capability<
Parent
>
)
;
181
GENODE_RPC
(
Rpc_assign_pci,
bool,
assign_pci,
addr_t,
uint16_t)
;
182
183
GENODE_RPC_THROW
(
Rpc_alloc_signal_source,
Signal_source_capability,
184
alloc_signal_source,
GENODE_TYPE_LIST
(
Out_of_metadata)
)
;
185
186
GENODE_RPC
(
Rpc_free_signal_source,
void,
free_signal_source,
Signal_source_capability)
;
187
188
GENODE_RPC_THROW
(
Rpc_alloc_context,
Capability<
Signal_context
>
,
alloc_context,
189
GENODE_TYPE_LIST
(
Out_of_metadata,
Invalid_signal_source)
,
190
Signal_source_capability,
unsigned
long)
;
191
192
GENODE_RPC
(
Rpc_free_context,
void,
free_context,
193
Capability<
Signal_context
>
)
;
194
195
GENODE_RPC
(
Rpc_submit,
void,
submit,
Capability<
Signal_context
>
,
unsigned
)
;
196
197
GENODE_RPC_THROW
(
Rpc_alloc_rpc_cap,
Native_capability,
alloc_rpc_cap,
198
GENODE_TYPE_LIST
(
Out_of_metadata)
,
Native_capability)
;
199
200
GENODE_RPC
(
Rpc_free_rpc_cap,
void,
free_rpc_cap,
Native_capability)
;
201
202
GENODE_RPC
(
Rpc_native_pd,
Capability<
Native_pd
>
,
native_pd)
;
203
204
/*
205
* Manual definition of `Rpc_functions`, see the comment in cpu_session.h.
206
*/
207
typedef
Meta::
Type_tuple<
Rpc_bind_thread
,
208
Meta::
Type_tuple<
Rpc_assign_parent
,
209
Meta::
Type_tuple<
Rpc_assign_pci
,
210
Meta::
Type_tuple<
Rpc_alloc_signal_source
,
211
Meta::
Type_tuple<
Rpc_free_signal_source
,
212
Meta::
Type_tuple<
Rpc_alloc_context
,
213
Meta::
Type_tuple<
Rpc_free_context
,
214
Meta::
Type_tuple<
Rpc_submit
,
215
Meta::
Type_tuple<
Rpc_alloc_rpc_cap
,
216
Meta::
Type_tuple<
Rpc_free_rpc_cap
,
217
Meta::
Type_tuple<
Rpc_native_pd
,
218
Meta::
Empty
>
219
>
>
>
>
>
>
>
>
>
>
Rpc_functions
;
220
}
;
221
222
#
endif /* _INCLUDE__PD_SESSION__PD_SESSION_H_ */