mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-10 21:01:49 +00:00
parent
73771669f1
commit
223e185b83
@ -44,7 +44,9 @@ class Genode::Local_parent : public Expanding_parent_client
|
||||
{
|
||||
private:
|
||||
|
||||
Allocator &_alloc;
|
||||
Region_map &_local_rm;
|
||||
Allocator &_alloc;
|
||||
|
||||
Id_space<Client> _local_sessions_id_space { };
|
||||
|
||||
public:
|
||||
@ -60,11 +62,11 @@ class Genode::Local_parent : public Expanding_parent_client
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* \param parent_cap real parent capability used to
|
||||
* promote requests to non-local
|
||||
* services
|
||||
* \param parent_cap real parent capability used to direct requests to
|
||||
* non-local 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_ */
|
||||
|
@ -28,24 +28,32 @@ namespace Genode { struct Local_rm_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,
|
||||
Parent::Client::Id id)
|
||||
Local_rm_session(Region_map &local_rm, Allocator &md_alloc,
|
||||
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
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
void destroy(Capability<Region_map> cap) override
|
||||
{
|
||||
Region_map *rm = Local_capability<Region_map>::deref(cap);
|
||||
Genode::destroy(md_alloc, rm);
|
||||
Region_map *rm_ptr = Local_capability<Region_map>::deref(cap);
|
||||
|
||||
/* 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_parent.h>
|
||||
|
||||
#include <deprecated/env.h>
|
||||
|
||||
namespace Genode {
|
||||
class Platform_env_base;
|
||||
class Platform_env;
|
||||
@ -44,7 +46,7 @@ class Genode::Platform_env_base : public Env_deprecated
|
||||
|
||||
Cpu_session_capability _cpu_session_cap;
|
||||
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;
|
||||
|
||||
protected:
|
||||
@ -59,28 +61,18 @@ class Genode::Platform_env_base : public Env_deprecated
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
Platform_env_base(Parent &parent,
|
||||
Platform_env_base(Parent &parent,
|
||||
Region_map_mmap &local_rm,
|
||||
Cpu_session_capability cpu_cap,
|
||||
Pd_session_capability pd_cap)
|
||||
:
|
||||
_cpu_session_cap(cpu_cap),
|
||||
_cpu_session_client(parent, cpu_cap, Parent::Env::cpu()),
|
||||
_region_map_mmap(false),
|
||||
_region_map_mmap(local_rm),
|
||||
_pd_session_cap(pd_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 **
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include <base/env.h>
|
||||
#include <region_map/region_map.h>
|
||||
#include <dataspace/client.h>
|
||||
#include <deprecated/env.h>
|
||||
|
||||
/* base-internal includes */
|
||||
#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)
|
||||
: _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())
|
||||
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) {
|
||||
|
||||
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();
|
||||
}
|
||||
@ -101,9 +101,9 @@ Parent::Close_result Local_parent::close(Client::Id id)
|
||||
|
||||
|
||||
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()
|
||||
{
|
||||
static Local_parent local_parent(obtain_parent_cap(), _heap);
|
||||
static Local_parent local_parent(obtain_parent_cap(), local_rm(), _heap);
|
||||
return local_parent;
|
||||
}
|
||||
|
||||
|
||||
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<Pd_session> (_parent().session_cap(Parent::Env::pd()))),
|
||||
_heap(Platform_env_base::pd_session(), Platform_env_base::rm_session())
|
||||
|
Loading…
x
Reference in New Issue
Block a user