base-linux: rm env_deprecated from region_map_mmap

Issue #4784
This commit is contained in:
Norman Feske
2023-03-10 13:44:48 +01:00
parent 73771669f1
commit 223e185b83
5 changed files with 43 additions and 35 deletions

View File

@ -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_ */

View File

@ -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);
} }
}; };

View File

@ -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 **

View File

@ -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);
} }

View File

@ -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())