1
/*
2
* \brief RAM session interface
3
* \author Norman Feske
4
* \date 2006-05-11
5
*/
6
7
/*
8
* Copyright (C) 2006-2013 Genode Labs GmbH
9
*
10
* This file is part of the Genode OS framework, which is distributed
11
* under the terms of the GNU General Public License version 2.
12
*/
13
14
#
ifndef _INCLUDE__RAM_SESSION__RAM_SESSION_H_
15
#
define _INCLUDE__RAM_SESSION__RAM_SESSION_H_
16
17
#
include <base/stdint.h>
18
#
include <base/capability.h>
19
#
include <base/exception.h>
20
#
include <base/cache.h>
21
#
include <dataspace/capability.h>
22
#
include <ram_session/capability.h>
23
#
include <session/session.h>
24
25
namespace
Genode {
26
27
struct
Ram_dataspace;
28
typedef
Capability<
Ram_dataspace
>
Ram_dataspace_capability
;
29
30
struct
Ram_session;
31
}
32
33
34
struct
Genode::
Ram_dataspace :
Dataspace
{
}
;
35
36
37
/**
38
* RAM session interface
39
*/
40
struct
Genode::
Ram_session :
Session
41
{
42
static
const
char *
service_name(
)
{
return
"RAM"
;
}
43
44
45
/*********************
46
** Exception types **
47
*********************/
48
49
class
Alloc_failed :
public
Exception
{
}
;
50
class
Quota_exceeded :
public
Alloc_failed
{
}
;
51
class
Out_of_metadata :
public
Alloc_failed
{
}
;
52
53
/**
54
* Destructor
55
*/
56
virtual
~
Ram_session(
)
{
}
57
58
/**
59
* Allocate RAM dataspace
60
*
61
* \param size size of RAM dataspace
62
* \param cached selects cacheability attributes of the memory,
63
* uncached memory, i.e., for DMA buffers
64
*
65
* \throw Quota_exceeded
66
* \throw Out_of_metadata
67
* \return capability to new RAM dataspace
68
*/
69
virtual
Ram_dataspace_capability
alloc(
size_t
size
,
70
Cache_attribute
cached
=
CACHED
)
=
0
;
71
72
/**
73
* Free RAM dataspace
74
*
75
* \param ds dataspace capability as returned by alloc
76
*/
77
virtual
void
free(
Ram_dataspace_capability
ds
)
=
0
;
78
79
/**
80
* Define reference account for the RAM session
81
*
82
* \param ram_session reference account
83
*
84
* \return 0 on success
85
*
86
* Each RAM session requires another RAM session as reference
87
* account to transfer quota to and from. The reference account can
88
* be defined only once.
89
*/
90
virtual
int
ref_account(
Ram_session_capability
ram_session
)
=
0
;
91
92
/**
93
* Transfer quota to another RAM session
94
*
95
* \param ram_session receiver of quota donation
96
* \param amount amount of quota to donate
97
* \return 0 on success
98
*
99
* Quota can only be transfered if the specified RAM session is
100
* either the reference account for this session or vice versa.
101
*/
102
virtual
int
transfer_quota(
Ram_session_capability
ram_session
,
size_t
amount
)
=
0
;
103
104
/**
105
* Return current quota limit
106
*/
107
virtual
size_t
quota(
)
=
0
;
108
109
/**
110
* Return used quota
111
*/
112
virtual
size_t
used(
)
=
0
;
113
114
/**
115
* Return amount of available quota
116
*/
117
size_t
avail(
)
118
{
119
size_t q =
quota(
)
,
u =
used(
)
;
120
return
q >
u ?
q -
u : 0
;
121
}
122
123
124
/*********************
125
** RPC declaration **
126
*********************/
127
128
GENODE_RPC_THROW
(
Rpc_alloc,
Ram_dataspace_capability,
alloc,
129
GENODE_TYPE_LIST
(
Quota_exceeded,
Out_of_metadata)
,
130
size_t,
Cache_attribute)
;
131
GENODE_RPC
(
Rpc_free,
void,
free,
Ram_dataspace_capability)
;
132
GENODE_RPC
(
Rpc_ref_account,
int,
ref_account,
Ram_session_capability)
;
133
GENODE_RPC
(
Rpc_transfer_quota,
int,
transfer_quota,
Ram_session_capability,
size_t)
;
134
GENODE_RPC
(
Rpc_quota,
size_t,
quota)
;
135
GENODE_RPC
(
Rpc_used,
size_t,
used)
;
136
137
GENODE_RPC_INTERFACE
(
Rpc_alloc,
Rpc_free,
Rpc_ref_account,
138
Rpc_transfer_quota,
Rpc_quota,
Rpc_used)
;
139
}
;
140
141
#
endif /* _INCLUDE__RAM_SESSION__RAM_SESSION_H_ */