base: assign allocator and quota to platform pd

Enable platform specific allocations and ram quota accounting for
protection domains. Needed to allocate object identity references
in the base-hw kernel when delegating capabilities via IPC.
Moreover, it can be used to account translation table entries in the
future.

Ref #1443
This commit is contained in:
Stefan Kalkowski 2015-04-09 15:33:20 +02:00 committed by Christian Helmuth
parent d9d65aa86b
commit 358380046c
19 changed files with 92 additions and 49 deletions

View File

@ -14,6 +14,9 @@
#ifndef _CORE__INCLUDE__PLATFORM_PD_H_
#define _CORE__INCLUDE__PLATFORM_PD_H_
/* Genode includes */
#include <base/allocator.h>
/* core includes */
#include <platform_thread.h>
#include <address_space.h>
@ -42,7 +45,8 @@ namespace Genode {
* Constructors
*/
Platform_pd(bool core);
Platform_pd(char const *, signed pd_id = -1, bool create = true);
Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id = -1, bool create = true);
/**
* Destructor

View File

@ -98,7 +98,8 @@ Platform_pd::Platform_pd(bool core)
}
Platform_pd::Platform_pd(char const *, signed pd_id, bool create)
Platform_pd::Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id, bool create)
: _space_id(TASK_ID_INVALID)
{
_space_id = TASK_ID_INVALID;

View File

@ -17,6 +17,7 @@
#ifndef _CORE__INCLUDE__PLATFORM_PD_H_
#define _CORE__INCLUDE__PLATFORM_PD_H_
#include <base/allocator.h>
#include <platform_thread.h>
#include <address_space.h>
@ -142,7 +143,8 @@ namespace Genode {
/**
* Constructor
*/
Platform_pd(char const *, signed pd_id = PD_INVALID,
Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id = PD_INVALID,
bool create = true);
/**

View File

@ -490,7 +490,8 @@ Platform::Platform() :
/* setup pd object for core pd */
_core_label[0] = 0;
_core_pd = new(core_mem_alloc()) Platform_pd(_core_label, myself.id.task, false);
_core_pd = new(core_mem_alloc()) Platform_pd(nullptr, 0, _core_label,
myself.id.task, false);
/*
* We setup the thread object for thread0 in core pd using a special

View File

@ -236,7 +236,8 @@ void Platform_pd::unbind_thread(Platform_thread *thread)
}
Platform_pd::Platform_pd(char const *, signed pd_id, bool create)
Platform_pd::Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id, bool create)
{
/* check correct init */
if (!_init)

View File

@ -34,7 +34,8 @@ namespace Genode {
public:
Pd_session_component(Rpc_entrypoint *thread_ep, const char *args)
Pd_session_component(Rpc_entrypoint *thread_ep,
Allocator *md_alloc, const char *args)
: _thread_ep(thread_ep) { }

View File

@ -27,7 +27,8 @@ namespace Genode {
* Constructors
*/
Platform_pd(bool core);
Platform_pd(char const *, signed pd_id = -1, bool create = true);
Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id = -1, bool create = true);
/**
* Destructor

View File

@ -43,7 +43,8 @@ Platform_pd::Platform_pd(bool core)
}
Platform_pd::Platform_pd(char const *, signed pd_id, bool create)
Platform_pd::Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id, bool create)
{
PWRN("not yet implemented");
}

View File

@ -66,7 +66,9 @@ namespace Genode
*
* \param label name of protection domain
*/
Platform_pd(char const *label) : _main_thread(0), _label(label)
Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *label)
: _main_thread(0), _label(label)
{
Lock::Guard guard(_lock);

View File

@ -15,6 +15,7 @@
#define _CORE__INCLUDE__PD_SESSION_COMPONENT_H_
/* Genode includes */
#include <base/allocator.h>
#include <base/rpc_server.h>
#include <linux_pd_session/linux_pd_session.h>
@ -43,9 +44,12 @@ namespace Genode {
/**
* Constructor
*
* \param ds_ep entrypoint where the dataspaces are managed
* \param ds_ep entrypoint where the dataspaces are managed
* \param md_alloc meta-data allocator
* \param args additional session arguments
*/
Pd_session_component(Rpc_entrypoint *ds_ep, const char *args);
Pd_session_component(Rpc_entrypoint *ds_ep, Allocator * md_alloc,
const char *args);
~Pd_session_component();

View File

@ -305,7 +305,9 @@ static const char *get_env(const char *key)
** PD session interface **
**************************/
Pd_session_component::Pd_session_component(Rpc_entrypoint *ep, const char *args)
Pd_session_component::Pd_session_component(Rpc_entrypoint * ep,
Allocator * md_alloc,
const char * args)
:
_pid(0), _uid(0), _gid(0), _ds_ep(ep)
{

View File

@ -52,8 +52,13 @@ namespace Genode {
public:
Pd_session_component(Rpc_entrypoint *thread_ep, const char *args)
: _label(args), _pd(_label.string), _thread_ep(thread_ep) { }
Pd_session_component(Rpc_entrypoint *thread_ep,
Allocator * md_alloc, char const *args)
: _label(args),
_pd(md_alloc,
Arg_string::find_arg(args, "ram_quota").long_value(0),
_label.string),
_thread_ep(thread_ep) { }
/**************************/

View File

@ -14,6 +14,7 @@
#ifndef _CORE__INCLUDE__PLATFORM_PD_H_
#define _CORE__INCLUDE__PLATFORM_PD_H_
#include <base/allocator.h>
#include <platform_thread.h>
#include <address_space.h>
@ -39,7 +40,8 @@ namespace Genode {
/**
* Constructors
*/
Platform_pd(char const *, signed pd_id = -1, bool create = true);
Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id = -1, bool create = true);
/**
* Destructor

View File

@ -46,7 +46,8 @@ int Platform_pd::assign_parent(Native_capability parent)
}
Platform_pd::Platform_pd(char const *, signed pd_id, bool create)
Platform_pd::Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id, bool create)
: _thread_cnt(0), _pd_sel(~0UL) { }

View File

@ -33,7 +33,8 @@ namespace Genode {
public:
Pd_session_component(Rpc_entrypoint *thread_ep, const char *args)
Pd_session_component(Rpc_entrypoint *thread_ep,
Allocator *md_alloc, const char *args)
: _thread_ep(thread_ep) { }

View File

@ -14,6 +14,7 @@
#ifndef _CORE__INCLUDE__PLATFORM_PD_H_
#define _CORE__INCLUDE__PLATFORM_PD_H_
#include <base/allocator.h>
#include <platform_thread.h>
#include <address_space.h>
@ -183,7 +184,8 @@ namespace Genode {
* Constructors
*/
Platform_pd(bool core);
Platform_pd(char const *, signed pd_id = PD_INVALID,
Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id = PD_INVALID,
bool create = true);
/**

View File

@ -340,7 +340,8 @@ Platform_pd::Platform_pd(bool core) :
}
Platform_pd::Platform_pd(char const *, signed pd_id, bool create)
Platform_pd::Platform_pd(Allocator * md_alloc, size_t ram_quota,
char const *, signed pd_id, bool create)
{
if (!create)
panic("create must be true.");

View File

@ -21,34 +21,40 @@
#include <pd_session_component.h>
namespace Genode {
class Pd_root : public Root_component<Pd_session_component>
{
private:
Rpc_entrypoint *_thread_ep;
protected:
Pd_session_component *_create_session(const char *args) {
return new (md_alloc()) Pd_session_component(_thread_ep, args); }
public:
/**
* Constructor
*
* \param session_ep entry point for managing pd session objects
* \param thread_ep entry point for managing threads
* \param md_alloc meta-data allocator to be used by root component
*/
Pd_root(Rpc_entrypoint *session_ep,
Rpc_entrypoint *thread_ep,
Allocator *md_alloc)
:
Root_component<Pd_session_component>(session_ep, md_alloc),
_thread_ep(thread_ep) { }
};
class Pd_root;
}
class Genode::Pd_root
: public Genode::Root_component<Genode::Pd_session_component>
{
private:
Rpc_entrypoint *_thread_ep;
Allocator *_md_alloc;
protected:
Pd_session_component *_create_session(const char *args)
{
return new (md_alloc()) Pd_session_component(_thread_ep,
_md_alloc, args);
}
public:
/**
* Constructor
*
* \param session_ep entry point for managing pd session objects
* \param thread_ep entry point for managing threads
* \param md_alloc meta-data allocator to be used by root component
*/
Pd_root(Rpc_entrypoint *session_ep,
Rpc_entrypoint *thread_ep,
Allocator *md_alloc)
: Root_component<Pd_session_component>(session_ep, md_alloc),
_thread_ep(thread_ep), _md_alloc(md_alloc) { }
};
#endif /* _CORE__INCLUDE__PD_ROOT_H_ */

View File

@ -52,8 +52,13 @@ namespace Genode {
public:
Pd_session_component(Rpc_entrypoint *thread_ep, char const *args)
: _label(args), _pd(_label.string), _thread_ep(thread_ep) { }
Pd_session_component(Rpc_entrypoint *thread_ep,
Allocator * md_alloc, char const *args)
: _label(args),
_pd(md_alloc,
Arg_string::find_arg(args, "ram_quota").long_value(0),
_label.string),
_thread_ep(thread_ep) { }
/**************************/