mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-19 15:43:56 +00:00
@ -44,7 +44,9 @@ class Genode::Local_parent : public Expanding_parent_client
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Allocator &_alloc;
|
Region_map &_local_rm;
|
||||||
|
Allocator &_alloc;
|
||||||
|
|
||||||
Id_space<Client> _local_sessions_id_space { };
|
Id_space<Client> _local_sessions_id_space { };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -60,11 +62,11 @@ class Genode::Local_parent : public Expanding_parent_client
|
|||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* \param parent_cap real parent capability used to
|
* \param parent_cap real parent capability used to direct requests to
|
||||||
* promote requests to non-local
|
* non-local services
|
||||||
* services
|
* \param local_rm region map of local address space
|
||||||
*/
|
*/
|
||||||
Local_parent(Parent_capability parent_cap, Allocator &);
|
Local_parent(Parent_capability parent_cap, Region_map &local_rm, Allocator &);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _INCLUDE__BASE__INTERNAL__LOCAL_PARENT_H_ */
|
#endif /* _INCLUDE__BASE__INTERNAL__LOCAL_PARENT_H_ */
|
||||||
|
@ -28,24 +28,32 @@ namespace Genode { struct Local_rm_session; }
|
|||||||
|
|
||||||
struct Genode::Local_rm_session : Rm_session, Local_session
|
struct Genode::Local_rm_session : Rm_session, Local_session
|
||||||
{
|
{
|
||||||
Allocator &md_alloc;
|
Region_map &_local_rm;
|
||||||
|
Allocator &_md_alloc;
|
||||||
|
|
||||||
Local_rm_session(Allocator &md_alloc, Id_space<Parent::Client> &id_space,
|
Local_rm_session(Region_map &local_rm, Allocator &md_alloc,
|
||||||
Parent::Client::Id id)
|
Id_space<Parent::Client> &id_space, Parent::Client::Id id)
|
||||||
:
|
:
|
||||||
Local_session(id_space, id, *this), md_alloc(md_alloc)
|
Local_session(id_space, id, *this),
|
||||||
|
_local_rm(local_rm), _md_alloc(md_alloc)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
Capability<Region_map> create(size_t size) override
|
Capability<Region_map> create(size_t size) override
|
||||||
{
|
{
|
||||||
Region_map *rm = new (md_alloc) Region_map_mmap(true, size);
|
Region_map *rm = new (_md_alloc) Region_map_mmap(true, size);
|
||||||
return Local_capability<Region_map>::local_cap(rm);
|
return Local_capability<Region_map>::local_cap(rm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroy(Capability<Region_map> cap) override
|
void destroy(Capability<Region_map> cap) override
|
||||||
{
|
{
|
||||||
Region_map *rm = Local_capability<Region_map>::deref(cap);
|
Region_map *rm_ptr = Local_capability<Region_map>::deref(cap);
|
||||||
Genode::destroy(md_alloc, rm);
|
|
||||||
|
/* detach sub region map from local address space */
|
||||||
|
Region_map_mmap &rm = static_cast<Region_map_mmap &>(*rm_ptr);
|
||||||
|
rm.with_attached_sub_rm_base_ptr([&] (void *base_ptr) {
|
||||||
|
_local_rm.detach(base_ptr); });
|
||||||
|
|
||||||
|
Genode::destroy(_md_alloc, &rm);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#include <base/internal/local_pd_session.h>
|
#include <base/internal/local_pd_session.h>
|
||||||
#include <base/internal/local_parent.h>
|
#include <base/internal/local_parent.h>
|
||||||
|
|
||||||
|
#include <deprecated/env.h>
|
||||||
|
|
||||||
namespace Genode {
|
namespace Genode {
|
||||||
class Platform_env_base;
|
class Platform_env_base;
|
||||||
class Platform_env;
|
class Platform_env;
|
||||||
@ -44,7 +46,7 @@ class Genode::Platform_env_base : public Env_deprecated
|
|||||||
|
|
||||||
Cpu_session_capability _cpu_session_cap;
|
Cpu_session_capability _cpu_session_cap;
|
||||||
Expanding_cpu_session_client _cpu_session_client;
|
Expanding_cpu_session_client _cpu_session_client;
|
||||||
Region_map_mmap _region_map_mmap;
|
Region_map_mmap &_region_map_mmap;
|
||||||
Pd_session_capability _pd_session_cap;
|
Pd_session_capability _pd_session_cap;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -59,28 +61,18 @@ class Genode::Platform_env_base : public Env_deprecated
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
Platform_env_base(Parent &parent,
|
||||||
* Constructor
|
Region_map_mmap &local_rm,
|
||||||
*/
|
|
||||||
Platform_env_base(Parent &parent,
|
|
||||||
Cpu_session_capability cpu_cap,
|
Cpu_session_capability cpu_cap,
|
||||||
Pd_session_capability pd_cap)
|
Pd_session_capability pd_cap)
|
||||||
:
|
:
|
||||||
_cpu_session_cap(cpu_cap),
|
_cpu_session_cap(cpu_cap),
|
||||||
_cpu_session_client(parent, cpu_cap, Parent::Env::cpu()),
|
_cpu_session_client(parent, cpu_cap, Parent::Env::cpu()),
|
||||||
_region_map_mmap(false),
|
_region_map_mmap(local_rm),
|
||||||
_pd_session_cap(pd_cap),
|
_pd_session_cap(pd_cap),
|
||||||
_local_pd_session(parent, _pd_session_cap)
|
_local_pd_session(parent, _pd_session_cap)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor used by 'Core_env'
|
|
||||||
*/
|
|
||||||
Platform_env_base(Parent &parent)
|
|
||||||
:
|
|
||||||
Platform_env_base(parent, Cpu_session_capability(), Pd_session_capability())
|
|
||||||
{ }
|
|
||||||
|
|
||||||
|
|
||||||
/******************************
|
/******************************
|
||||||
** Env_deprecated interface **
|
** Env_deprecated interface **
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
#include <base/env.h>
|
#include <base/env.h>
|
||||||
#include <region_map/region_map.h>
|
#include <region_map/region_map.h>
|
||||||
#include <dataspace/client.h>
|
#include <dataspace/client.h>
|
||||||
#include <deprecated/env.h>
|
|
||||||
|
|
||||||
/* base-internal includes */
|
/* base-internal includes */
|
||||||
#include <base/internal/local_capability.h>
|
#include <base/internal/local_capability.h>
|
||||||
@ -106,11 +105,11 @@ class Genode::Region_map_mmap : public Region_map, public Dataspace
|
|||||||
Region_map_mmap(bool sub_rm, size_t size = ~0)
|
Region_map_mmap(bool sub_rm, size_t size = ~0)
|
||||||
: _sub_rm(sub_rm), _size(size), _base(0) { }
|
: _sub_rm(sub_rm), _size(size), _base(0) { }
|
||||||
|
|
||||||
~Region_map_mmap()
|
template <typename FN>
|
||||||
|
void with_attached_sub_rm_base_ptr(FN const &fn)
|
||||||
{
|
{
|
||||||
/* detach sub RM session when destructed */
|
|
||||||
if (_sub_rm && _is_attached())
|
if (_sub_rm && _is_attached())
|
||||||
env_deprecated()->rm_session()->detach((void *)_base);
|
fn((void *)_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ Session_capability Local_parent::session(Parent::Client::Id id,
|
|||||||
if (strcmp(service_name.string(), Rm_session::service_name()) == 0) {
|
if (strcmp(service_name.string(), Rm_session::service_name()) == 0) {
|
||||||
|
|
||||||
Local_rm_session *local_rm_session = new (_alloc)
|
Local_rm_session *local_rm_session = new (_alloc)
|
||||||
Local_rm_session(_alloc, _local_sessions_id_space, id);
|
Local_rm_session(_local_rm, _alloc, _local_sessions_id_space, id);
|
||||||
|
|
||||||
return local_rm_session->local_session_cap();
|
return local_rm_session->local_session_cap();
|
||||||
}
|
}
|
||||||
@ -101,9 +101,9 @@ Parent::Close_result Local_parent::close(Client::Id id)
|
|||||||
|
|
||||||
|
|
||||||
Local_parent::Local_parent(Parent_capability parent_cap,
|
Local_parent::Local_parent(Parent_capability parent_cap,
|
||||||
Allocator &alloc)
|
Region_map &local_rm, Allocator &alloc)
|
||||||
:
|
:
|
||||||
Expanding_parent_client(parent_cap), _alloc(alloc)
|
Expanding_parent_client(parent_cap), _local_rm(local_rm), _alloc(alloc)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
@ -145,16 +145,23 @@ static Parent_capability obtain_parent_cap()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Region_map_mmap &local_rm()
|
||||||
|
{
|
||||||
|
static Region_map_mmap local_rm(false);
|
||||||
|
return local_rm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Local_parent &Platform_env::_parent()
|
Local_parent &Platform_env::_parent()
|
||||||
{
|
{
|
||||||
static Local_parent local_parent(obtain_parent_cap(), _heap);
|
static Local_parent local_parent(obtain_parent_cap(), local_rm(), _heap);
|
||||||
return local_parent;
|
return local_parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Platform_env::Platform_env()
|
Platform_env::Platform_env()
|
||||||
:
|
:
|
||||||
Platform_env_base(_parent(),
|
Platform_env_base(_parent(), local_rm(),
|
||||||
static_cap_cast<Cpu_session>(_parent().session_cap(Parent::Env::cpu())),
|
static_cap_cast<Cpu_session>(_parent().session_cap(Parent::Env::cpu())),
|
||||||
static_cap_cast<Pd_session> (_parent().session_cap(Parent::Env::pd()))),
|
static_cap_cast<Pd_session> (_parent().session_cap(Parent::Env::pd()))),
|
||||||
_heap(Platform_env_base::pd_session(), Platform_env_base::rm_session())
|
_heap(Platform_env_base::pd_session(), Platform_env_base::rm_session())
|
||||||
|
Reference in New Issue
Block a user