From 830f6934f9fae1690fa39d40d2505deb71a78028 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 23 Aug 2017 11:02:12 +0200 Subject: [PATCH] base: add support to unconstrain virtual space Issue #2507. --- repos/base/include/pd_session/connection.h | 7 ++++--- repos/base/src/core/include/core_env.h | 1 + repos/base/src/core/include/pd_root.h | 12 ++++++++++++ repos/base/src/core/include/pd_session_component.h | 4 +++- repos/base/src/core/include/ram_dataspace_factory.h | 3 ++- repos/os/src/drivers/platform/spec/x86/device_pd.cc | 3 +-- repos/os/src/drivers/platform/spec/x86/device_pd.h | 2 +- 7 files changed, 24 insertions(+), 8 deletions(-) diff --git a/repos/base/include/pd_session/connection.h b/repos/base/include/pd_session/connection.h index bcd7eeb25..db1e05a11 100644 --- a/repos/base/include/pd_session/connection.h +++ b/repos/base/include/pd_session/connection.h @@ -23,17 +23,18 @@ namespace Genode { struct Pd_connection; } struct Genode::Pd_connection : Connection, Pd_session_client { enum { RAM_QUOTA = 24*1024*sizeof(long)}; + enum Virt_space { UNCONSTRAIN = 0, CONSTRAIN = 1 }; /** * Constructor * * \param label session label */ - Pd_connection(Env &env, char const *label = "") + Pd_connection(Env &env, char const *label = "", Virt_space space = CONSTRAIN) : Connection(env, session(env.parent(), - "ram_quota=%u, cap_quota=%u, label=\"%s\"", - RAM_QUOTA, CAP_QUOTA, label)), + "ram_quota=%u, cap_quota=%u, label=\"%s\", virt_space=%u", + RAM_QUOTA, CAP_QUOTA, label, space)), Pd_session_client(cap()) { } diff --git a/repos/base/src/core/include/core_env.h b/repos/base/src/core/include/core_env.h index fe12f049c..ca98f1986 100644 --- a/repos/base/src/core/include/core_env.h +++ b/repos/base/src/core/include/core_env.h @@ -67,6 +67,7 @@ class Genode::Core_env : public Env_deprecated Session::Diag{false}, *platform()->ram_alloc(), Ram_dataspace_factory::any_phys_range(), + Ram_dataspace_factory::Virt_range { platform()->vm_start(), platform()->vm_size() }, _region_map, *((Pager_entrypoint *)nullptr), "" /* args to native PD */) diff --git a/repos/base/src/core/include/pd_root.h b/repos/base/src/core/include/pd_root.h index 0e09da01a..5fcd1e5e4 100644 --- a/repos/base/src/core/include/pd_root.h +++ b/repos/base/src/core/include/pd_root.h @@ -44,6 +44,17 @@ class Genode::Pd_root : public Genode::Root_componentvm_start(), + platform()->vm_size() }; + } + protected: Pd_session_component *_create_session(const char *args) @@ -55,6 +66,7 @@ class Genode::Pd_root : public Genode::Root_component public: typedef Ram_dataspace_factory::Phys_range Phys_range; + typedef Ram_dataspace_factory::Virt_range Virt_range; /** * Constructor @@ -118,6 +119,7 @@ class Genode::Pd_session_component : public Session_object Diag diag, Range_allocator &phys_alloc, Phys_range phys_range, + Virt_range virt_range, Region_map &local_rm, Pager_entrypoint &pager_ep, char const *args) @@ -131,7 +133,7 @@ class Genode::Pd_session_component : public Session_object _rpc_cap_factory(_sliced_heap), _native_pd(*this, args), _address_space(ep, _sliced_heap, pager_ep, - platform()->vm_start(), platform()->vm_size()), + virt_range.start, virt_range.size), _stack_area (ep, _sliced_heap, pager_ep, 0, stack_area_virtual_size()), _linker_area(ep, _sliced_heap, pager_ep, 0, LINKER_AREA_SIZE) { diff --git a/repos/base/src/core/include/ram_dataspace_factory.h b/repos/base/src/core/include/ram_dataspace_factory.h index 3ba6c6237..b706e5591 100644 --- a/repos/base/src/core/include/ram_dataspace_factory.h +++ b/repos/base/src/core/include/ram_dataspace_factory.h @@ -33,9 +33,10 @@ class Genode::Ram_dataspace_factory : public Ram_allocator, public: struct Phys_range { addr_t start, end; }; - static Phys_range any_phys_range() { return { 0UL, ~0UL }; } + struct Virt_range { addr_t start, size; }; + /* * Dimension '_ds_slab' such that slab blocks (including the * meta-data overhead of the sliced-heap blocks) are page sized. diff --git a/repos/os/src/drivers/platform/spec/x86/device_pd.cc b/repos/os/src/drivers/platform/spec/x86/device_pd.cc index f82240935..a1a97091f 100644 --- a/repos/os/src/drivers/platform/spec/x86/device_pd.cc +++ b/repos/os/src/drivers/platform/spec/x86/device_pd.cc @@ -64,9 +64,8 @@ void Platform::Device_pd::assign_pci(Genode::Io_mem_dataspace_capability io_mem_ using namespace Genode; Dataspace_client ds_client(io_mem_cap); - addr_t const phys = ds_client.phys_addr(); - addr_t page = _address_space.attach_at(io_mem_cap, phys); + addr_t page = _address_space.attach(io_mem_cap); /* sanity check */ if (!page) diff --git a/repos/os/src/drivers/platform/spec/x86/device_pd.h b/repos/os/src/drivers/platform/spec/x86/device_pd.h index 6c1575b9f..42524c1cb 100644 --- a/repos/os/src/drivers/platform/spec/x86/device_pd.h +++ b/repos/os/src/drivers/platform/spec/x86/device_pd.h @@ -89,7 +89,7 @@ class Platform::Device_pd Device_pd(Genode::Env &env, Genode::Session_label const &label) : - _pd(env, label.string()), + _pd(env, label.string(), Genode::Pd_connection::Virt_space::UNCONSTRAIN), _label(label), _address_space(env, _pd.address_space()) { }