diff --git a/repos/base-fiasco/lib/mk/core-fiasco.inc b/repos/base-fiasco/lib/mk/core-fiasco.inc index 6ff7746720..376c6afb0e 100644 --- a/repos/base-fiasco/lib/mk/core-fiasco.inc +++ b/repos/base-fiasco/lib/mk/core-fiasco.inc @@ -4,7 +4,7 @@ GEN_SRC_DIR := $(realpath $(GEN_CORE_DIR)/..) SRC_CC += stack_area.cc \ core_log.cc \ core_log_out.cc \ - core_region_map.cc \ + core_local_rm.cc \ core_rpc_cap_alloc.cc \ cpu_session_component.cc \ cpu_thread_component.cc \ @@ -62,7 +62,7 @@ vpath capability_space.cc $(GEN_CORE_DIR) vpath rpc_cap_factory_l4.cc $(GEN_CORE_DIR) vpath ram_dataspace_factory.cc $(GEN_CORE_DIR) vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR) -vpath core_region_map.cc $(GEN_CORE_DIR) +vpath core_local_rm.cc $(GEN_CORE_DIR) vpath pd_session_support.cc $(GEN_CORE_DIR) vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR) vpath region_map_component.cc $(GEN_CORE_DIR) diff --git a/repos/base-fiasco/src/core/include/platform_thread.h b/repos/base-fiasco/src/core/include/platform_thread.h index aabf222984..08fd0935af 100644 --- a/repos/base-fiasco/src/core/include/platform_thread.h +++ b/repos/base-fiasco/src/core/include/platform_thread.h @@ -62,7 +62,7 @@ class Core::Platform_thread : Interface * Constructor */ Platform_thread(Platform_pd &pd, Rpc_entrypoint &, Ram_allocator &, - Region_map &, size_t, const char *name, unsigned, + Local_rm &, size_t, const char *name, unsigned, Affinity::Location, addr_t) : _name(name), _pd(pd) { } diff --git a/repos/base-foc/lib/mk/core-foc.inc b/repos/base-foc/lib/mk/core-foc.inc index a7854b1a02..a65b56f2f7 100644 --- a/repos/base-foc/lib/mk/core-foc.inc +++ b/repos/base-foc/lib/mk/core-foc.inc @@ -6,7 +6,7 @@ SRC_CC += stack_area.cc \ stack_area_addr.cc \ core_log.cc \ core_log_out.cc \ - core_region_map.cc \ + core_local_rm.cc \ core_rpc_cap_alloc.cc \ cpu_session_component.cc \ cpu_session_support.cc \ @@ -70,7 +70,7 @@ vpath ram_dataspace_factory.cc $(GEN_CORE_DIR) vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR) vpath signal_receiver.cc $(GEN_CORE_DIR) vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR) -vpath core_region_map.cc $(GEN_CORE_DIR) +vpath core_local_rm.cc $(GEN_CORE_DIR) vpath platform_rom_modules.cc $(GEN_CORE_DIR) vpath heartbeat.cc $(GEN_CORE_DIR) vpath vm_session_common.cc $(GEN_CORE_DIR) diff --git a/repos/base-foc/src/core/include/platform_thread.h b/repos/base-foc/src/core/include/platform_thread.h index e2b2d681e5..cfffebe209 100644 --- a/repos/base-foc/src/core/include/platform_thread.h +++ b/repos/base-foc/src/core/include/platform_thread.h @@ -75,7 +75,7 @@ class Core::Platform_thread : Interface /** * Constructor for non-core threads */ - Platform_thread(Platform_pd &, Rpc_entrypoint &, Ram_allocator &, Region_map &, + Platform_thread(Platform_pd &, Rpc_entrypoint &, Ram_allocator &, Local_rm &, size_t, const char *name, unsigned priority, Affinity::Location, addr_t); /** diff --git a/repos/base-foc/src/core/include/vm_session_component.h b/repos/base-foc/src/core/include/vm_session_component.h index 7df96d69cb..3c7c0fdbc7 100644 --- a/repos/base-foc/src/core/include/vm_session_component.h +++ b/repos/base-foc/src/core/include/vm_session_component.h @@ -106,7 +106,7 @@ class Core::Vm_session_component using Cap_quota_guard::upgrade; Vm_session_component(Rpc_entrypoint &, Resources, Label const &, - Diag, Ram_allocator &ram, Region_map &, unsigned, + Diag, Ram_allocator &ram, Local_rm &, unsigned, Trace::Source_registry &); ~Vm_session_component(); diff --git a/repos/base-foc/src/core/platform_thread.cc b/repos/base-foc/src/core/platform_thread.cc index 378f232671..1c438e63ed 100644 --- a/repos/base-foc/src/core/platform_thread.cc +++ b/repos/base-foc/src/core/platform_thread.cc @@ -278,7 +278,7 @@ void Platform_thread::_finalize_construction() Platform_thread::Platform_thread(Platform_pd &pd, Rpc_entrypoint &, Ram_allocator &, - Region_map &, size_t, const char *name, unsigned prio, + Local_rm &, size_t, const char *name, unsigned prio, Affinity::Location location, addr_t) : _name(name), diff --git a/repos/base-foc/src/core/spec/x86/platform_services.cc b/repos/base-foc/src/core/spec/x86/platform_services.cc index 051c42bc31..6e33d1c1c8 100644 --- a/repos/base-foc/src/core/spec/x86/platform_services.cc +++ b/repos/base-foc/src/core/spec/x86/platform_services.cc @@ -24,10 +24,10 @@ void Core::platform_add_local_services(Rpc_entrypoint &ep, Registry &services, Trace::Source_registry &trace_sources, Ram_allocator &core_ram, - Region_map &core_rm, + Local_rm &local_rm, Range_allocator &io_port_ranges) { - static Vm_root vm_root(ep, heap, core_ram, core_rm, trace_sources); + static Vm_root vm_root(ep, heap, core_ram, local_rm, trace_sources); static Core_service vm(services, vm_root); diff --git a/repos/base-foc/src/core/vm_session_component.cc b/repos/base-foc/src/core/vm_session_component.cc index e6bdfd6867..9b6e3d9b99 100644 --- a/repos/base-foc/src/core/vm_session_component.cc +++ b/repos/base-foc/src/core/vm_session_component.cc @@ -92,7 +92,7 @@ Vm_session_component::Vm_session_component(Rpc_entrypoint &ep, Label const &, Diag, Ram_allocator &ram, - Region_map &local_rm, + Local_rm &local_rm, unsigned, Trace::Source_registry &) : diff --git a/repos/base-hw/lib/mk/core-hw.inc b/repos/base-hw/lib/mk/core-hw.inc index 832c4de40d..76e1800e61 100644 --- a/repos/base-hw/lib/mk/core-hw.inc +++ b/repos/base-hw/lib/mk/core-hw.inc @@ -17,7 +17,7 @@ SRC_CC += cpu_session_support.cc SRC_CC += cpu_thread_component.cc SRC_CC += core_log.cc SRC_CC += core_log_out.cc -SRC_CC += core_region_map.cc +SRC_CC += core_local_rm.cc SRC_CC += core_mem_alloc.cc SRC_CC += core_rpc_cap_alloc.cc SRC_CC += dataspace_component.cc diff --git a/repos/base-hw/src/core/core_region_map.cc b/repos/base-hw/src/core/core_local_rm.cc similarity index 67% rename from repos/base-hw/src/core/core_region_map.cc rename to repos/base-hw/src/core/core_local_rm.cc index 84735efc4f..31d21d0e26 100644 --- a/repos/base-hw/src/core/core_region_map.cc +++ b/repos/base-hw/src/core/core_local_rm.cc @@ -16,22 +16,23 @@ /* core includes */ #include -#include +#include #include #include +#include using namespace Core; -Region_map::Attach_result -Core_region_map::attach(Dataspace_capability ds_cap, Attr const &attr) +Core_local_rm::Result +Core_local_rm::attach(Dataspace_capability ds_cap, Attach_attr const &attr) { using Virt_allocation = Range_allocator::Allocation; - return _ep.apply(ds_cap, [&] (Dataspace_component *ds_ptr) -> Attach_result { + return _ep.apply(ds_cap, [&] (Dataspace_component *ds_ptr) -> Result { if (!ds_ptr) - return Attach_error::INVALID_DATASPACE; + return Error::INVALID_DATASPACE; Dataspace_component &ds = *ds_ptr; @@ -40,7 +41,7 @@ Core_region_map::attach(Dataspace_capability ds_cap, Attr const &attr) /* attach attributes 'use_at' and 'offset' not supported within core */ if (attr.use_at || attr.offset) - return Attach_error::REGION_CONFLICT; + return Error::REGION_CONFLICT; unsigned const align = get_page_size_log2(); @@ -51,7 +52,7 @@ Core_region_map::attach(Dataspace_capability ds_cap, Attr const &attr) if (virt.failed()) { error("could not allocate virtual address range in core of size ", page_rounded_size); - return Attach_error::REGION_CONFLICT; + return Error::REGION_CONFLICT; } using namespace Hw; @@ -68,27 +69,27 @@ Core_region_map::attach(Dataspace_capability ds_cap, Attr const &attr) .cacheable = ds.cacheability() }; - return virt.convert( + return virt.convert( - [&] (Virt_allocation &a) -> Attach_result { + [&] (Virt_allocation &a) -> Result { if (!map_local(ds.phys_addr(), (addr_t)a.ptr, num_pages, flags)) - return Attach_error::REGION_CONFLICT; + return Error::REGION_CONFLICT; a.deallocate = false; - return Range { .start = addr_t(a.ptr), - .num_bytes = page_rounded_size }; + return { *this, { .ptr = a.ptr, + .num_bytes = page_rounded_size } }; }, [&] (Alloc_error) { - return Attach_error::REGION_CONFLICT; }); + return Error::REGION_CONFLICT; }); }); } -void Core_region_map::detach(addr_t core_local_addr) +void Core_local_rm::_free(Attachment &a) { - size_t size = platform_specific().region_alloc_size_at((void *)core_local_addr); + size_t size = platform_specific().region_alloc_size_at(a.ptr); - unmap_local(core_local_addr, size >> get_page_size_log2()); + unmap_local(addr_t(a.ptr), size >> get_page_size_log2()); - platform().region_alloc().free((void *)core_local_addr); + platform().region_alloc().free(a.ptr); } diff --git a/repos/base-hw/src/core/guest_memory.h b/repos/base-hw/src/core/guest_memory.h index e824de612c..81b40c4906 100644 --- a/repos/base-hw/src/core/guest_memory.h +++ b/repos/base-hw/src/core/guest_memory.h @@ -217,9 +217,9 @@ class Core::Guest_memory } - Guest_memory(Accounted_ram_allocator &ram, Region_map ®ion_map) + Guest_memory(Accounted_ram_allocator &ram, Local_rm &local_rm) : - _sliced_heap(ram, region_map) + _sliced_heap(ram, local_rm) { /* configure managed VM area */ if (_map.add_range(0UL, ~0UL).failed()) diff --git a/repos/base-hw/src/core/phys_allocated.h b/repos/base-hw/src/core/phys_allocated.h index dd640930b5..2b36768292 100644 --- a/repos/base-hw/src/core/phys_allocated.h +++ b/repos/base-hw/src/core/phys_allocated.h @@ -38,7 +38,7 @@ class Core::Phys_allocated : Genode::Noncopyable Rpc_entrypoint &_ep; Ram_allocator &_ram; - Region_map &_rm; + Local_rm &_rm; Attached_ram_dataspace _ds { _ram, _rm, sizeof(T) }; public: @@ -47,7 +47,7 @@ class Core::Phys_allocated : Genode::Noncopyable Phys_allocated(Rpc_entrypoint &ep, Ram_allocator &ram, - Region_map &rm) + Local_rm &rm) : _ep(ep), _ram(ram), _rm(rm) { @@ -56,7 +56,7 @@ class Core::Phys_allocated : Genode::Noncopyable Phys_allocated(Rpc_entrypoint &ep, Ram_allocator &ram, - Region_map &rm, + Local_rm &rm, auto const &construct_fn) : _ep(ep), _ram(ram), _rm(rm) diff --git a/repos/base-hw/src/core/platform.h b/repos/base-hw/src/core/platform.h index 62fd61469e..a958d91584 100644 --- a/repos/base-hw/src/core/platform.h +++ b/repos/base-hw/src/core/platform.h @@ -32,7 +32,7 @@ /* base-hw core includes */ #include -#include +#include #include #include #include @@ -121,7 +121,7 @@ class Core::Platform : public Platform_generic /** * Determine size of a core local mapping required for a - * Core_region_map::detach(). + * Core_local_rm::_free(). */ size_t region_alloc_size_at(void * addr) { diff --git a/repos/base-hw/src/core/platform_thread.cc b/repos/base-hw/src/core/platform_thread.cc index d96a81dc41..c5fd836f55 100644 --- a/repos/base-hw/src/core/platform_thread.cc +++ b/repos/base-hw/src/core/platform_thread.cc @@ -29,16 +29,18 @@ using namespace Core; -addr_t Platform_thread::Utcb::_attach(Region_map &core_rm) +addr_t Platform_thread::Utcb::_attach(Local_rm &local_rm) { addr_t start = 0; ds.with_result( [&] (Ram::Allocation const &allocation) { Region_map::Attr attr { }; attr.writeable = true; - core_rm.attach(allocation.cap, attr).with_result( - [&] (Region_map::Range range) { start = range.start; }, - [&] (Region_map::Attach_error) { + local_rm.attach(allocation.cap, attr).with_result( + [&] (Local_rm::Attachment &a) { + a.deallocate = false; + start = addr_t(a.ptr); }, + [&] (Local_rm::Error) { error("failed to attach UTCB of new thread within core"); }); }, [&] (Ram::Error) { }); @@ -108,7 +110,7 @@ Platform_thread::Platform_thread(Label const &label, Native_utcb &utcb) Platform_thread::Platform_thread(Platform_pd &pd, Rpc_entrypoint &ep, Ram_allocator &ram, - Region_map &core_rm, + Local_rm &local_rm, size_t const quota, Label const &label, unsigned const virt_prio, @@ -118,7 +120,7 @@ Platform_thread::Platform_thread(Platform_pd &pd, _label(label), _pd(pd), _pager(nullptr), - _utcb(ep, ram, core_rm), + _utcb(ep, ram, local_rm), _priority(_scale_priority(virt_prio)), _quota((unsigned)quota), _main_thread(!pd.has_any_thread), diff --git a/repos/base-hw/src/core/platform_thread.h b/repos/base-hw/src/core/platform_thread.h index c54bc2cfde..1a946401b0 100644 --- a/repos/base-hw/src/core/platform_thread.h +++ b/repos/base-hw/src/core/platform_thread.h @@ -60,8 +60,8 @@ class Core::Platform_thread : Noncopyable struct Utcb : Noncopyable { struct { - Ram_allocator *_ram_ptr = nullptr; - Region_map *_core_rm_ptr = nullptr; + Ram_allocator *_ram_ptr = nullptr; + Local_rm *_local_rm_ptr = nullptr; }; Ram_allocator::Result const ds; /* UTCB ds of non-core threads */ @@ -69,7 +69,7 @@ class Core::Platform_thread : Noncopyable addr_t const core_addr; /* UTCB address within core/kernel */ addr_t const phys_addr; - addr_t _attach(Region_map &); + addr_t _attach(Local_rm &); static addr_t _phys(Rpc_entrypoint &ep, Dataspace_capability ds) { @@ -92,18 +92,18 @@ class Core::Platform_thread : Noncopyable /** * Constructor used for threads outside of core */ - Utcb(Rpc_entrypoint &ep, Ram_allocator &ram, Region_map &core_rm) + Utcb(Rpc_entrypoint &ep, Ram_allocator &ram, Local_rm &local_rm) : - _core_rm_ptr(&core_rm), + _local_rm_ptr(&local_rm), ds(ram.try_alloc(sizeof(Native_utcb), CACHED)), - core_addr(_attach(core_rm)), + core_addr(_attach(local_rm)), phys_addr(_ds_phys(ep, ds)) { } ~Utcb() { - if (_core_rm_ptr) - _core_rm_ptr->detach(core_addr); + if (_local_rm_ptr) + _local_rm_ptr->detach(core_addr); } Ram_dataspace_capability ds_cap() const @@ -173,7 +173,7 @@ class Core::Platform_thread : Noncopyable * \param utcb core local pointer to userland stack */ Platform_thread(Platform_pd &, Rpc_entrypoint &, Ram_allocator &, - Region_map &, size_t const quota, Label const &label, + Local_rm &, size_t const quota, Label const &label, unsigned const virt_prio, Affinity::Location, addr_t const utcb); diff --git a/repos/base-hw/src/core/spec/arm/virtualization/platform_services.cc b/repos/base-hw/src/core/spec/arm/virtualization/platform_services.cc index a7d355235d..47ad19b2b5 100644 --- a/repos/base-hw/src/core/spec/arm/virtualization/platform_services.cc +++ b/repos/base-hw/src/core/spec/arm/virtualization/platform_services.cc @@ -36,7 +36,7 @@ void Core::platform_add_local_services(Rpc_entrypoint &ep, Registry &services, Trace::Source_registry &trace_sources, Ram_allocator &core_ram, - Region_map &core_rm, + Local_rm &local_rm, Range_allocator &) { map_local(Platform::core_phys_addr((addr_t)&hypervisor_exception_vector), @@ -46,16 +46,18 @@ void Core::platform_add_local_services(Rpc_entrypoint &ep, platform().ram_alloc().alloc_aligned(Hw::Mm::hypervisor_stack().size, get_page_size_log2()).with_result( - [&] (void *stack) { - map_local((addr_t)stack, + [&] (Range_allocator::Allocation &stack) { + map_local((addr_t)stack.ptr, Hw::Mm::hypervisor_stack().base, Hw::Mm::hypervisor_stack().size / get_page_size(), Hw::PAGE_FLAGS_KERN_DATA); - static Vm_root vm_root(ep, sh, core_ram, core_rm, trace_sources); + stack.deallocate = false; + + static Vm_root vm_root(ep, sh, core_ram, local_rm, trace_sources); static Core_service vm_service(services, vm_root); }, - [&] (Range_allocator::Alloc_error) { + [&] (Alloc_error) { warning("failed to allocate hypervisor stack for VM service"); } ); diff --git a/repos/base-hw/src/core/spec/arm/virtualization/vm_session_component.cc b/repos/base-hw/src/core/spec/arm/virtualization/vm_session_component.cc index aac0133ef9..1e049c7b9a 100644 --- a/repos/base-hw/src/core/spec/arm/virtualization/vm_session_component.cc +++ b/repos/base-hw/src/core/spec/arm/virtualization/vm_session_component.cc @@ -72,10 +72,11 @@ void * Vm_session_component::_alloc_table() /* get some aligned space for the translation table */ return cma().alloc_aligned(sizeof(Board::Vm_page_table), Board::Vm_page_table::ALIGNM_LOG2).convert( - [&] (void *table_ptr) { - return table_ptr; }, + [&] (Range_allocator::Allocation &a) { + a.deallocate = false; + return a.ptr; }, - [&] (Range_allocator::Alloc_error) -> void * { + [&] (Alloc_error) -> void * { /* XXX handle individual error conditions */ error("failed to allocate kernel object"); throw Insufficient_ram_quota(); } @@ -95,7 +96,7 @@ Vm_session_component::Vm_session_component(Vmid_allocator & vmid_alloc, Label const &, Diag, Ram_allocator &ram_alloc, - Region_map ®ion_map, + Local_rm &local_rm, unsigned, Trace::Source_registry &) : @@ -103,8 +104,8 @@ Vm_session_component::Vm_session_component(Vmid_allocator & vmid_alloc, Cap_quota_guard(resources.cap_quota), _ep(ds_ep), _ram(ram_alloc, _ram_quota_guard(), _cap_quota_guard()), - _sliced_heap(_ram, region_map), - _region_map(region_map), + _sliced_heap(_ram, local_rm), + _local_rm(local_rm), _table(*construct_at(_alloc_table())), _table_array(*(new (cma()) Board::Vm_page_table_array([] (void * virt) { return (addr_t)cma().phys_addr(virt);}))), @@ -112,8 +113,8 @@ Vm_session_component::Vm_session_component(Vmid_allocator & vmid_alloc, _id({(unsigned)_vmid_alloc.alloc(), cma().phys_addr(&_table)}) { /* configure managed VM area */ - _map.add_range(0, 0UL - 0x1000); - _map.add_range(0UL - 0x1000, 0x1000); + (void)_map.add_range(0, 0UL - 0x1000); + (void)_map.add_range(0UL - 0x1000, 0x1000); } @@ -136,7 +137,7 @@ Vm_session_component::~Vm_session_component() Vcpu & vcpu = *_vcpus[i]; if (vcpu.state().valid()) - _region_map.detach(vcpu.ds_addr); + _local_rm.detach(vcpu.ds_addr); } /* free guest-to-host page tables */ diff --git a/repos/base-hw/src/core/spec/arm_v7/trustzone/platform_services.cc b/repos/base-hw/src/core/spec/arm_v7/trustzone/platform_services.cc index 3d121ef192..c7ad603677 100644 --- a/repos/base-hw/src/core/spec/arm_v7/trustzone/platform_services.cc +++ b/repos/base-hw/src/core/spec/arm_v7/trustzone/platform_services.cc @@ -33,7 +33,7 @@ void Core::platform_add_local_services(Rpc_entrypoint &ep, Registry &services, Trace::Source_registry &trace_sources, Ram_allocator &core_ram, - Region_map &core_rm, + Local_rm &local_rm, Range_allocator &) { static addr_t const phys_base = @@ -42,7 +42,7 @@ void Core::platform_add_local_services(Rpc_entrypoint &ep, map_local(phys_base, Hw::Mm::system_exception_vector().base, 1, Hw::PAGE_FLAGS_KERN_TEXT); - static Vm_root vm_root(ep, sliced_heap, core_ram, core_rm, trace_sources); + static Vm_root vm_root(ep, sliced_heap, core_ram, local_rm, trace_sources); static Core_service vm_service(services, vm_root); } diff --git a/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc b/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc index ceb3964ddd..e5640b4d18 100644 --- a/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc +++ b/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc @@ -63,15 +63,15 @@ Vm_session_component::Vm_session_component(Vmid_allocator &vmids, Rpc_entrypoint Label const &, Diag, Ram_allocator &ram_alloc, - Region_map ®ion_map, + Local_rm &local_rm, unsigned, Trace::Source_registry &) : Ram_quota_guard(resources.ram_quota), Cap_quota_guard(resources.cap_quota), _ep(ep), _ram(ram_alloc, _ram_quota_guard(), _cap_quota_guard()), - _sliced_heap(_ram, region_map), - _region_map(region_map), + _sliced_heap(_ram, local_rm), + _local_rm(local_rm), _table(*construct_at(_alloc_table())), _table_array(dummy_array()), _vmid_alloc(vmids), @@ -103,7 +103,7 @@ Vm_session_component::~Vm_session_component() Vcpu & vcpu = *_vcpus[i]; if (vcpu.state().valid()) - _region_map.detach(vcpu.ds_addr); + _local_rm.detach(vcpu.ds_addr); } id_alloc--; diff --git a/repos/base-hw/src/core/spec/x86_64/vcpu.h b/repos/base-hw/src/core/spec/x86_64/vcpu.h index 9faa3def2a..8b62d35c32 100644 --- a/repos/base-hw/src/core/spec/x86_64/vcpu.h +++ b/repos/base-hw/src/core/spec/x86_64/vcpu.h @@ -43,7 +43,7 @@ class Core::Vcpu : public Rpc_object Kernel_object _kobj { }; Accounted_ram_allocator &_ram; Ram_allocator::Result _ds; - Region_map &_region_map; + Local_rm &_local_rm; Affinity::Location _location; Phys_allocated _vcpu_data_pages; @@ -58,23 +58,24 @@ class Core::Vcpu : public Rpc_object Vcpu(Kernel::Vm::Identity &id, Rpc_entrypoint &ep, Accounted_ram_allocator &ram, - Region_map ®ion_map, + Local_rm &local_rm, Affinity::Location location) : _id(id), _ep(ep), _ram(ram), _ds( {_ram.try_alloc(vcpu_state_size(), Cache::UNCACHED)} ), - _region_map(region_map), + _local_rm(local_rm), _location(location), - _vcpu_data_pages(ep, ram, region_map) + _vcpu_data_pages(ep, ram, local_rm) { _ds.with_result([&] (Ram::Allocation &allocation) { Region_map::Attr attr { }; attr.writeable = true; - _vcpu_data.vcpu_state = _region_map.attach(allocation.cap, attr).convert( - [&] (Region_map::Range range) { return (Vcpu_state *)range.start; }, - [&] (Region_map::Attach_error) -> Vcpu_state * { + _vcpu_data.vcpu_state = _local_rm.attach(allocation.cap, attr).convert( + [&] (Local_rm::Attachment &a) { + a.deallocate = false; return (Vcpu_state *)a.ptr; }, + [&] (Local_rm::Error) -> Vcpu_state * { error("failed to attach VCPU data within core"); return nullptr; }); @@ -92,7 +93,7 @@ class Core::Vcpu : public Rpc_object ~Vcpu() { - _region_map.detach((addr_t)_vcpu_data.vcpu_state); + _local_rm.detach((addr_t)_vcpu_data.vcpu_state); _ep.dissolve(this); } diff --git a/repos/base-hw/src/core/spec/x86_64/virtualization/platform_services.cc b/repos/base-hw/src/core/spec/x86_64/virtualization/platform_services.cc index 2cd111f391..cbabb0c9ca 100644 --- a/repos/base-hw/src/core/spec/x86_64/virtualization/platform_services.cc +++ b/repos/base-hw/src/core/spec/x86_64/virtualization/platform_services.cc @@ -30,12 +30,12 @@ void Core::platform_add_local_services(Rpc_entrypoint &ep, Registry &local_services, Trace::Source_registry &trace_sources, Ram_allocator &core_ram, - Region_map &core_rm, + Local_rm &local_rm, Range_allocator &io_port_ranges) { static Io_port_root io_port_root(io_port_ranges, sliced_heap); - static Vm_root vm_root(ep, sliced_heap, core_ram, core_rm, trace_sources); + static Vm_root vm_root(ep, sliced_heap, core_ram, local_rm, trace_sources); static Core_service> vm_service(local_services, vm_root); diff --git a/repos/base-hw/src/core/spec/x86_64/virtualization/svm_session_component.h b/repos/base-hw/src/core/spec/x86_64/virtualization/svm_session_component.h index d2f4dbb240..a648d1687d 100644 --- a/repos/base-hw/src/core/spec/x86_64/virtualization/svm_session_component.h +++ b/repos/base-hw/src/core/spec/x86_64/virtualization/svm_session_component.h @@ -85,7 +85,7 @@ class Core::Svm_session_component Rpc_entrypoint &_ep; Accounted_ram_allocator _accounted_ram_alloc; - Region_map &_region_map; + Local_rm &_local_rm; Heap _heap; Phys_allocated _table; Phys_allocated _table_array; @@ -109,28 +109,28 @@ class Core::Svm_session_component public: - Svm_session_component(Vmid_allocator & vmid_alloc, - Rpc_entrypoint &ds_ep, - Resources resources, - Label const &label, - Diag diag, - Ram_allocator &ram_alloc, - Region_map ®ion_map, + Svm_session_component(Vmid_allocator &vmid_alloc, + Rpc_entrypoint &ds_ep, + Resources const &resources, + Label const &label, + Diag diag, + Ram_allocator &ram_alloc, + Local_rm &local_rm, Trace::Source_registry &) : Session_object(ds_ep, resources, label, diag), _ep(ds_ep), _accounted_ram_alloc(ram_alloc, _ram_quota_guard(), _cap_quota_guard()), - _region_map(region_map), - _heap(_accounted_ram_alloc, region_map), - _table(_ep, _accounted_ram_alloc, _region_map), - _table_array(_ep, _accounted_ram_alloc, _region_map, + _local_rm(local_rm), + _heap(_accounted_ram_alloc, local_rm), + _table(_ep, _accounted_ram_alloc, _local_rm), + _table_array(_ep, _accounted_ram_alloc, _local_rm, [] (Phys_allocated &table_array, auto *obj_ptr) { construct_at(obj_ptr, [&] (void *virt) { return table_array.phys_addr() + ((addr_t) obj_ptr - (addr_t)virt); }); }), - _memory(_accounted_ram_alloc, region_map), + _memory(_accounted_ram_alloc, local_rm), _vmid_alloc(vmid_alloc), _id({(unsigned)_vmid_alloc.alloc(), (void *)_table.phys_addr()}) { } @@ -224,7 +224,7 @@ class Core::Svm_session_component _id, _ep, _accounted_ram_alloc, - _region_map, + _local_rm, vcpu_location); return vcpu.cap(); diff --git a/repos/base-hw/src/core/spec/x86_64/virtualization/vmx_session_component.h b/repos/base-hw/src/core/spec/x86_64/virtualization/vmx_session_component.h index 56f0ec9d69..1b0dab7d5b 100644 --- a/repos/base-hw/src/core/spec/x86_64/virtualization/vmx_session_component.h +++ b/repos/base-hw/src/core/spec/x86_64/virtualization/vmx_session_component.h @@ -85,7 +85,7 @@ class Core::Vmx_session_component Rpc_entrypoint &_ep; Accounted_ram_allocator _accounted_ram_alloc; - Region_map &_region_map; + Local_rm &_local_rm; Heap _heap; Phys_allocated _table; Phys_allocated _table_array; @@ -115,22 +115,22 @@ class Core::Vmx_session_component Label const &label, Diag diag, Ram_allocator &ram_alloc, - Region_map ®ion_map, + Local_rm &local_rm, Trace::Source_registry &) : Session_object(ds_ep, resources, label, diag), _ep(ds_ep), _accounted_ram_alloc(ram_alloc, _ram_quota_guard(), _cap_quota_guard()), - _region_map(region_map), - _heap(_accounted_ram_alloc, region_map), - _table(_ep, _accounted_ram_alloc, _region_map), - _table_array(_ep, _accounted_ram_alloc, _region_map, + _local_rm(local_rm), + _heap(_accounted_ram_alloc, local_rm), + _table(_ep, _accounted_ram_alloc, _local_rm), + _table_array(_ep, _accounted_ram_alloc, _local_rm, [] (Phys_allocated &table_array, auto *obj_ptr) { construct_at(obj_ptr, [&] (void *virt) { return table_array.phys_addr() + ((addr_t) obj_ptr - (addr_t)virt); }); }), - _memory(_accounted_ram_alloc, region_map), + _memory(_accounted_ram_alloc, local_rm), _vmid_alloc(vmid_alloc), _id({(unsigned)_vmid_alloc.alloc(), (void *)_table.phys_addr()}) { } @@ -224,7 +224,7 @@ class Core::Vmx_session_component _id, _ep, _accounted_ram_alloc, - _region_map, + _local_rm, vcpu_location); return vcpu.cap(); diff --git a/repos/base-hw/src/core/spec/x86_64/vm_root.h b/repos/base-hw/src/core/spec/x86_64/vm_root.h index ab87d40881..795681a5cb 100644 --- a/repos/base-hw/src/core/spec/x86_64/vm_root.h +++ b/repos/base-hw/src/core/spec/x86_64/vm_root.h @@ -35,7 +35,7 @@ class Core::Vm_root : public Root_component> private: Ram_allocator &_ram_allocator; - Region_map &_local_rm; + Local_rm &_local_rm; Trace::Source_registry &_trace_sources; Vmid_allocator _vmid_alloc { }; @@ -86,7 +86,7 @@ class Core::Vm_root : public Root_component> Vm_root(Rpc_entrypoint &session_ep, Allocator &md_alloc, Ram_allocator &ram_alloc, - Region_map &local_rm, + Local_rm &local_rm, Trace::Source_registry &trace_sources) : Root_component>(&session_ep, &md_alloc), diff --git a/repos/base-hw/src/core/vm_root.h b/repos/base-hw/src/core/vm_root.h index ecf7ee509f..5080a9b601 100644 --- a/repos/base-hw/src/core/vm_root.h +++ b/repos/base-hw/src/core/vm_root.h @@ -30,7 +30,7 @@ class Core::Vm_root : public Root_component private: Ram_allocator &_ram_allocator; - Region_map &_local_rm; + Local_rm &_local_rm; Trace::Source_registry &_trace_sources; Vmid_allocator _vmid_alloc { }; @@ -74,7 +74,7 @@ class Core::Vm_root : public Root_component Vm_root(Rpc_entrypoint &session_ep, Allocator &md_alloc, Ram_allocator &ram_alloc, - Region_map &local_rm, + Local_rm &local_rm, Trace::Source_registry &trace_sources) : Root_component(&session_ep, &md_alloc), diff --git a/repos/base-hw/src/core/vm_session_component.cc b/repos/base-hw/src/core/vm_session_component.cc index ddbfd51c28..d8994d7e26 100644 --- a/repos/base-hw/src/core/vm_session_component.cc +++ b/repos/base-hw/src/core/vm_session_component.cc @@ -65,11 +65,14 @@ Capability Vm_session_component::create_vcpu(Thread_cap vcpu.ds.with_error([&] (Ram::Error e) { throw_exception(e); }); try { - Region_map::Attr attr { }; + Local_rm::Attach_attr attr { }; attr.writeable = true; - vcpu.ds_addr = _region_map.attach(vcpu.state(), attr).convert( - [&] (Region_map::Range range) { return _alloc_vcpu_data(range.start); }, - [&] (Region_map::Attach_error) -> addr_t { + vcpu.ds_addr = _local_rm.attach(vcpu.state(), attr).convert( + [&] (Local_rm::Attachment &a) { + a.deallocate = false; + return _alloc_vcpu_data(addr_t(a.ptr)); + }, + [&] (Local_rm::Error) -> addr_t { error("failed to attach VCPU data within core"); _vcpus[_vcpu_id_alloc].destruct(); return 0; diff --git a/repos/base-hw/src/core/vm_session_component.h b/repos/base-hw/src/core/vm_session_component.h index 635edcc8be..11821b7686 100644 --- a/repos/base-hw/src/core/vm_session_component.h +++ b/repos/base-hw/src/core/vm_session_component.h @@ -98,7 +98,7 @@ class Core::Vm_session_component Accounted_ram_allocator _ram; Sliced_heap _sliced_heap; Avl_region _map { &_sliced_heap }; - Region_map &_region_map; + Local_rm &_local_rm; Board::Vm_page_table &_table; Board::Vm_page_table_array &_table_array; Vmid_allocator &_vmid_alloc; @@ -128,7 +128,7 @@ class Core::Vm_session_component Vm_session_component(Vmid_allocator &, Rpc_entrypoint &, Resources, Label const &, Diag, - Ram_allocator &ram, Region_map &, unsigned, + Ram_allocator &ram, Local_rm &, unsigned, Trace::Source_registry &); ~Vm_session_component(); diff --git a/repos/base-linux/src/core/include/core_region_map.h b/repos/base-linux/src/core/include/core_local_rm.h similarity index 66% rename from repos/base-linux/src/core/include/core_region_map.h rename to repos/base-linux/src/core/include/core_local_rm.h index a132e3beab..a3eb72d88e 100644 --- a/repos/base-linux/src/core/include/core_region_map.h +++ b/repos/base-linux/src/core/include/core_local_rm.h @@ -14,20 +14,29 @@ #ifndef _CORE__INCLUDE__CORE_REGION_MAP_H_ #define _CORE__INCLUDE__CORE_REGION_MAP_H_ +/* Genode includes */ +#include + /* base-internal includes */ #include /* core includes */ #include -namespace Core { class Core_region_map; } +namespace Core { class Core_local_rm; } -struct Core::Core_region_map : Region_map_mmap +struct Core::Core_local_rm : private Region_map_mmap, Pd_local_rm { static void init(Rpc_entrypoint &); - Core_region_map(Rpc_entrypoint &ep) : Region_map_mmap(false) { init(ep); } + Core_local_rm(Rpc_entrypoint &ep) + : + Region_map_mmap(false), + Pd_local_rm(*static_cast(this)) + { + init(ep); + } }; #endif /* _CORE__INCLUDE__CORE_REGION_MAP_H_ */ diff --git a/repos/base-linux/src/core/include/platform_thread.h b/repos/base-linux/src/core/include/platform_thread.h index c8c072055d..1ddc9d0aef 100644 --- a/repos/base-linux/src/core/include/platform_thread.h +++ b/repos/base-linux/src/core/include/platform_thread.h @@ -69,7 +69,7 @@ class Core::Platform_thread : Noncopyable /** * Constructor */ - Platform_thread(Platform_pd &, Rpc_entrypoint &, Ram_allocator &, Region_map &, + Platform_thread(Platform_pd &, Rpc_entrypoint &, Ram_allocator &, Local_rm &, size_t, auto const &name, auto...) : _name(name) { } diff --git a/repos/base-linux/src/core/platform.cc b/repos/base-linux/src/core/platform.cc index e99ab00548..994b581127 100644 --- a/repos/base-linux/src/core/platform.cc +++ b/repos/base-linux/src/core/platform.cc @@ -21,7 +21,7 @@ /* local includes */ #include -#include +#include #include /* Linux includes */ @@ -171,7 +171,7 @@ void Core::init_page_fault_handling(Rpc_entrypoint &) { } static Rpc_entrypoint *_core_ep_ptr; -void Core_region_map::init(Rpc_entrypoint &ep) { _core_ep_ptr = &ep; } +void Core_local_rm::init(Rpc_entrypoint &ep) { _core_ep_ptr = &ep; } static auto with_linux_dataspace(Capability ds, diff --git a/repos/base-linux/src/core/spec/linux/platform_services.cc b/repos/base-linux/src/core/spec/linux/platform_services.cc index db4cff0880..61a72531d7 100644 --- a/repos/base-linux/src/core/spec/linux/platform_services.cc +++ b/repos/base-linux/src/core/spec/linux/platform_services.cc @@ -24,6 +24,6 @@ void Core::platform_add_local_services(Rpc_entrypoint &, Registry &, Trace::Source_registry &, Ram_allocator &, - Region_map &, + Local_rm &, Range_allocator &) { } diff --git a/repos/base-linux/src/core/spec/pc/platform_services.cc b/repos/base-linux/src/core/spec/pc/platform_services.cc index 825f458d30..55fed5df4e 100644 --- a/repos/base-linux/src/core/spec/pc/platform_services.cc +++ b/repos/base-linux/src/core/spec/pc/platform_services.cc @@ -30,7 +30,7 @@ void Core::platform_add_local_services(Rpc_entrypoint &, Registry &services, Trace::Source_registry &, Ram_allocator &, - Region_map &, + Local_rm &, Range_allocator &io_port_ranges) { if (!lx_iopl(3)) { diff --git a/repos/base-linux/src/include/base/internal/platform.h b/repos/base-linux/src/include/base/internal/platform.h index 5c0a5dee8c..820f9eb706 100644 --- a/repos/base-linux/src/include/base/internal/platform.h +++ b/repos/base-linux/src/include/base/internal/platform.h @@ -34,11 +34,11 @@ namespace Genode { struct Platform; } struct Genode::Platform { - Region_map_mmap rm { false }; + Region_map_mmap mmap_rm { false }; static Capability _obtain_parent_cap(); - Local_parent parent { _obtain_parent_cap(), rm, heap }; + Local_parent parent { _obtain_parent_cap(), mmap_rm, heap }; Capability pd_cap = parent.session_cap(Parent::Env::pd()).convert>( @@ -52,11 +52,12 @@ struct Genode::Platform Local_pd_session pd { parent, pd_cap }; - Pd_ram_allocator ram { pd }; + Pd_local_rm local_rm { mmap_rm }; + Pd_ram_allocator ram { pd }; Expanding_cpu_session_client cpu { parent, cpu_cap, Parent::Env::cpu() }; - Heap heap { ram, rm }; + Heap heap { ram, local_rm }; Platform() { _attach_stack_area(); } diff --git a/repos/base-linux/src/lib/base/child_process.cc b/repos/base-linux/src/lib/base/child_process.cc index fad039cdcd..8400a0ab2d 100644 --- a/repos/base-linux/src/lib/base/child_process.cc +++ b/repos/base-linux/src/lib/base/child_process.cc @@ -59,7 +59,7 @@ Child::Start_result Child::_start_process(Dataspace_capability ldso_ds, Pd_session &pd, Initial_thread_base &, Initial_thread::Start &, - Region_map &, + Local_rm &, Region_map &, Parent_capability) { diff --git a/repos/base-linux/src/lib/base/platform.cc b/repos/base-linux/src/lib/base/platform.cc index 3f02741d09..53c2d1987d 100644 --- a/repos/base-linux/src/lib/base/platform.cc +++ b/repos/base-linux/src/lib/base/platform.cc @@ -153,10 +153,10 @@ Platform &Genode::init_platform() init_log(platform.parent); init_rpc_cap_alloc(platform.parent); init_cap_slab(platform.pd, platform.parent); - init_thread(platform.cpu, platform.rm); + init_thread(platform.cpu, platform.local_rm); init_thread_start(platform.pd.rpc_cap()); init_thread_bootstrap(platform.cpu, platform.parent.main_thread_cap()); - init_exception_handling(platform.ram, platform.rm); + init_exception_handling(platform.ram, platform.local_rm); init_signal_receiver(platform.pd, platform.parent); return platform; diff --git a/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc b/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc index 50b8d385f9..39afa726f0 100644 --- a/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc +++ b/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc @@ -91,7 +91,7 @@ namespace Genode { * For lx_hybrid programs, C++ support is initialized by the startup code * provided by the host toolchain. */ -void Genode::init_exception_handling(Ram_allocator &, Region_map &) { } +void Genode::init_exception_handling(Ram_allocator &, Env::Local_rm &) { } /* @@ -409,7 +409,7 @@ static void *thread_start(void *arg) } -void Genode::init_thread(Cpu_session &, Region_map &) { } +void Genode::init_thread(Cpu_session &, Env::Local_rm &) { } void Genode::init_thread_start(Capability) { } diff --git a/repos/base-linux/src/test/lx_rmap/main.cc b/repos/base-linux/src/test/lx_rmap/main.cc index ddd8baeb0a..aa65aa6a08 100644 --- a/repos/base-linux/src/test/lx_rmap/main.cc +++ b/repos/base-linux/src/test/lx_rmap/main.cc @@ -70,11 +70,11 @@ Main::Main(Env &env) : heap(env.ram(), env.rm()) .use_at = true, .at = beg, .executable = { }, .writeable = true }).with_result( - [&] (Region_map::Range) { + [&] (Env::Local_rm::Attachment &) { error("after RAM dataspace attach -- ERROR"); env.parent().exit(-1); }, - [&] (Region_map::Attach_error e) { - if (e == Region_map::Attach_error::REGION_CONFLICT) + [&] (Env::Local_rm::Error e) { + if (e == Env::Local_rm::Error::REGION_CONFLICT) log("OK caught Region_conflict exception"); } ); @@ -89,11 +89,11 @@ Main::Main(Env &env) : heap(env.ram(), env.rm()) .use_at = true, .at = beg, .executable = { }, .writeable = true }).with_result( - [&] (Region_map::Range) { + [&] (Env::Local_rm::Attachment &) { error("after sub-RM dataspace attach -- ERROR"); env.parent().exit(-1); }, - [&] (Region_map::Attach_error e) { - if (e == Region_map::Attach_error::REGION_CONFLICT) + [&] (Env::Local_rm::Error e) { + if (e == Env::Local_rm::Error::REGION_CONFLICT) log("OK caught Region_conflict exception"); } ); } @@ -107,7 +107,10 @@ Main::Main(Env &env) : heap(env.ram(), env.rm()) .size = { }, .offset = { }, .use_at = true, .at = 0x1000, .executable = { }, .writeable = true - }); + }).with_result( + [&] (Region_map::Range) { }, + [&] (Region_map::Attach_error) { error("mapping to managed dataspace failed"); } + ); log("before populated sub-RM dataspace attach"); char * const addr = env.rm().attach(rm.dataspace(), { @@ -115,8 +118,11 @@ Main::Main(Env &env) : heap(env.ram(), env.rm()) .use_at = { }, .at = { }, .executable = { }, .writeable = true }).convert( - [&] (Region_map::Range r) { return (char *)r.start + 0x1000; }, - [&] (Region_map::Attach_error) { return nullptr; } + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; + return (char *)a.ptr + 0x1000; + }, + [&] (Env::Local_rm::Error) { return nullptr; } ); log("after populated sub-RM dataspace attach / before touch"); char const val = *addr; diff --git a/repos/base-nova/lib/mk/core-nova.inc b/repos/base-nova/lib/mk/core-nova.inc index 206f936546..0fdde79ff7 100644 --- a/repos/base-nova/lib/mk/core-nova.inc +++ b/repos/base-nova/lib/mk/core-nova.inc @@ -6,7 +6,7 @@ SRC_CC += stack_area.cc \ core_mem_alloc.cc \ core_log.cc \ core_log_out.cc \ - core_region_map.cc \ + core_local_rm.cc \ core_rpc_cap_alloc.cc \ cpu_session_component.cc \ cpu_session_support.cc \ diff --git a/repos/base-nova/src/core/core_region_map.cc b/repos/base-nova/src/core/core_local_rm.cc similarity index 77% rename from repos/base-nova/src/core/core_region_map.cc rename to repos/base-nova/src/core/core_local_rm.cc index da11a8db98..3e9bc718e2 100644 --- a/repos/base-nova/src/core/core_region_map.cc +++ b/repos/base-nova/src/core/core_local_rm.cc @@ -12,10 +12,11 @@ */ /* core includes */ -#include +#include #include #include #include +#include /* NOVA includes */ #include @@ -51,26 +52,26 @@ static inline void * alloc_region(Dataspace_component &ds, const size_t size) return virt_addr; } -Region_map::Attach_result -Core_region_map::attach(Dataspace_capability ds_cap, Attr const &attr) +Core_local_rm::Result +Core_local_rm::attach(Dataspace_capability ds_cap, Attach_attr const &attr) { - return _ep.apply(ds_cap, [&] (Dataspace_component * const ds_ptr) -> Attach_result { + return _ep.apply(ds_cap, [&] (Dataspace_component * const ds_ptr) -> Result { if (!ds_ptr) - return Attach_error::INVALID_DATASPACE; + return Error::INVALID_DATASPACE; Dataspace_component &ds = *ds_ptr; /* attach attributes 'use_at' and 'offset' not supported within core */ if (attr.use_at || attr.offset) - return Attach_error::REGION_CONFLICT; + return Error::REGION_CONFLICT; const size_t page_rounded_size = align_addr(ds.size(), get_page_size_log2()); /* allocate the virtual region contiguous for the dataspace */ void * virt_ptr = alloc_region(ds, page_rounded_size); if (!virt_ptr) - return Attach_error::OUT_OF_RAM; + return Error::OUT_OF_RAM; /* map it */ Nova::Utcb &utcb = *reinterpret_cast(Thread::myself()->utcb()); @@ -81,20 +82,19 @@ Core_region_map::attach(Dataspace_capability ds_cap, Attr const &attr) page_rounded_size >> get_page_size_log2(), rights, true)) { platform().region_alloc().free(virt_ptr, page_rounded_size); - return Attach_error::OUT_OF_RAM; + return Error::OUT_OF_RAM; } - - return Range { .start = addr_t(virt_ptr), .num_bytes = page_rounded_size }; + return { *this, { virt_ptr, page_rounded_size } }; }); } -void Core_region_map::detach(addr_t core_local_addr) +void Core_local_rm::_free(Attachment &a) { - size_t size = platform_specific().region_alloc_size_at((void *)core_local_addr); + size_t size = platform_specific().region_alloc_size_at(a.ptr); unmap_local(*reinterpret_cast(Thread::myself()->utcb()), - core_local_addr, size >> get_page_size_log2()); + addr_t(a.ptr), size >> get_page_size_log2()); - platform().region_alloc().free((void *)core_local_addr); + platform().region_alloc().free(a.ptr); } diff --git a/repos/base-nova/src/core/include/platform_thread.h b/repos/base-nova/src/core/include/platform_thread.h index 49428a89b8..ae9e1f0cfd 100644 --- a/repos/base-nova/src/core/include/platform_thread.h +++ b/repos/base-nova/src/core/include/platform_thread.h @@ -93,7 +93,7 @@ class Core::Platform_thread /** * Constructor */ - Platform_thread(Platform_pd &, Rpc_entrypoint &, Ram_allocator &, Region_map &, + Platform_thread(Platform_pd &, Rpc_entrypoint &, Ram_allocator &, Local_rm &, size_t quota, char const *name, unsigned priority, Affinity::Location affinity, addr_t utcb); diff --git a/repos/base-nova/src/core/include/vm_session_component.h b/repos/base-nova/src/core/include/vm_session_component.h index ec5bc2e4bb..5de5919bee 100644 --- a/repos/base-nova/src/core/include/vm_session_component.h +++ b/repos/base-nova/src/core/include/vm_session_component.h @@ -131,7 +131,7 @@ class Core::Vm_session_component using Cap_quota_guard::upgrade; Vm_session_component(Rpc_entrypoint &, Resources, Label const &, - Diag, Ram_allocator &ram, Region_map &, unsigned, + Diag, Ram_allocator &ram, Local_rm &, unsigned, Trace::Source_registry &); ~Vm_session_component(); diff --git a/repos/base-nova/src/core/platform_services.cc b/repos/base-nova/src/core/platform_services.cc index cc53dc48c0..d01f12ec0d 100644 --- a/repos/base-nova/src/core/platform_services.cc +++ b/repos/base-nova/src/core/platform_services.cc @@ -24,10 +24,10 @@ void Core::platform_add_local_services(Rpc_entrypoint &ep, Registry &services, Trace::Source_registry &trace_sources, Ram_allocator &core_ram, - Region_map &core_rm, + Local_rm &local_rm, Range_allocator &io_port_ranges) { - static Vm_root vm_root(ep, heap, core_ram, core_rm, trace_sources); + static Vm_root vm_root(ep, heap, core_ram, local_rm, trace_sources); static Core_service vm(services, vm_root); static Io_port_root io_root(io_port_ranges, heap); diff --git a/repos/base-nova/src/core/platform_thread.cc b/repos/base-nova/src/core/platform_thread.cc index e367f7741c..28117753f5 100644 --- a/repos/base-nova/src/core/platform_thread.cc +++ b/repos/base-nova/src/core/platform_thread.cc @@ -344,7 +344,7 @@ void Platform_thread::thread_type(Cpu_session::Native_cpu::Thread_type thread_ty Platform_thread::Platform_thread(Platform_pd &pd, Rpc_entrypoint &, Ram_allocator &, - Region_map &, size_t, const char *name, + Local_rm &, size_t, const char *name, unsigned prio, Affinity::Location affinity, addr_t) : _pd(pd), _pager(0), _id_base(cap_map().insert(2)), diff --git a/repos/base-nova/src/core/vm_session_component.cc b/repos/base-nova/src/core/vm_session_component.cc index f7473a89a1..b6aa1d4432 100644 --- a/repos/base-nova/src/core/vm_session_component.cc +++ b/repos/base-nova/src/core/vm_session_component.cc @@ -363,7 +363,7 @@ Vm_session_component::Vm_session_component(Rpc_entrypoint &ep, Label const &label, Diag, Ram_allocator &ram, - Region_map &local_rm, + Local_rm &local_rm, unsigned const priority, Trace::Source_registry &trace_sources) : diff --git a/repos/base-nova/src/test/nova/main.cc b/repos/base-nova/src/test/nova/main.cc index 1484a1e6aa..df70f1b666 100644 --- a/repos/base-nova/src/test/nova/main.cc +++ b/repos/base-nova/src/test/nova/main.cc @@ -630,8 +630,9 @@ class Greedy : public Genode::Thread { for (unsigned i = 0; i < SUB_RM_SIZE / 4096; i++) { addr_t const map_to = _env.rm().attach(ds, { }).convert( - [&] (Region_map::Range r) { return r.start; }, - [&] (Region_map::Attach_error) { + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; return addr_t(a.ptr); }, + [&] (Env::Local_rm::Error) { error("Greedy: failed to attach RAM dataspace"); return 0UL; } diff --git a/repos/base-okl4/lib/mk/core-okl4.inc b/repos/base-okl4/lib/mk/core-okl4.inc index 0c2bcc4948..a87c0e7d9f 100644 --- a/repos/base-okl4/lib/mk/core-okl4.inc +++ b/repos/base-okl4/lib/mk/core-okl4.inc @@ -9,7 +9,7 @@ SRC_CC += stack_area.cc \ core_mem_alloc.cc \ core_log.cc \ core_log_out.cc \ - core_region_map.cc \ + core_local_rm.cc \ core_rpc_cap_alloc.cc \ cpu_session_component.cc \ cpu_session_support.cc \ diff --git a/repos/base-okl4/src/core/core_region_map.cc b/repos/base-okl4/src/core/core_local_rm.cc similarity index 65% rename from repos/base-okl4/src/core/core_region_map.cc rename to repos/base-okl4/src/core/core_local_rm.cc index 01f407a15b..7bb989612b 100644 --- a/repos/base-okl4/src/core/core_region_map.cc +++ b/repos/base-okl4/src/core/core_local_rm.cc @@ -13,18 +13,19 @@ /* core includes */ #include -#include +#include #include +#include using namespace Core; -Region_map::Attach_result -Core_region_map::attach(Dataspace_capability ds_cap, Attr const &attr) +Core_local_rm::Result +Core_local_rm::attach(Dataspace_capability ds_cap, Attach_attr const &attr) { - return _ep.apply(ds_cap, [&] (Dataspace_component *ds) -> Attach_result { + return _ep.apply(ds_cap, [&] (Dataspace_component *ds) -> Result { if (!ds) - return Attach_error::INVALID_DATASPACE; + return Error::INVALID_DATASPACE; size_t const size = (attr.size == 0) ? ds->size() : attr.size; size_t const page_rounded_size = (size + get_page_size() - 1) @@ -32,30 +33,32 @@ Core_region_map::attach(Dataspace_capability ds_cap, Attr const &attr) /* attach attributes 'use_at' and 'offset' not supported within core */ if (attr.use_at || attr.offset) - return Attach_error::REGION_CONFLICT; + return Error::REGION_CONFLICT; /* allocate range in core's virtual address space */ Range_allocator &virt_alloc = platform().region_alloc(); - return virt_alloc.try_alloc(page_rounded_size).convert( + return virt_alloc.try_alloc(page_rounded_size).convert( - [&] (Range_allocator::Allocation &virt) -> Attach_result { + [&] (Range_allocator::Allocation &virt) -> Result { /* map the dataspace's physical pages to virtual memory */ unsigned num_pages = page_rounded_size >> get_page_size_log2(); if (!map_local(ds->phys_addr(), (addr_t)virt.ptr, num_pages)) - return Attach_error::INVALID_DATASPACE; + return Error::INVALID_DATASPACE; virt.deallocate = false; - return Range { .start = addr_t(virt.ptr), .num_bytes = page_rounded_size }; + return { *this, { .ptr = virt.ptr, + .num_bytes = page_rounded_size } }; }, [&] (Alloc_error) { error("could not allocate virtual address range in core of size ", page_rounded_size); - return Attach_error::REGION_CONFLICT; + return Error::REGION_CONFLICT; }); }); } -void Core_region_map::detach(addr_t) { } +void Core_local_rm::_free(Attachment &) { } + diff --git a/repos/base-okl4/src/core/include/platform.h b/repos/base-okl4/src/core/include/platform.h index 4fc2479bfe..60e7defbc1 100644 --- a/repos/base-okl4/src/core/include/platform.h +++ b/repos/base-okl4/src/core/include/platform.h @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include /* base-internal includes */ diff --git a/repos/base-okl4/src/core/include/platform_thread.h b/repos/base-okl4/src/core/include/platform_thread.h index e515e24ab8..20676bf06b 100644 --- a/repos/base-okl4/src/core/include/platform_thread.h +++ b/repos/base-okl4/src/core/include/platform_thread.h @@ -44,11 +44,9 @@ class Core::Platform_thread Okl4::L4_ThreadId_t _l4_thread_id = Okl4::L4_nilthread; - char _name[32]; /* thread name that will be - registered at the kernel - debugger */ + char _name[32]; /* thread name at the kernel debugger */ Platform_pd &_pd; - unsigned _priority = 0; /* thread priority */ + unsigned _priority = 0; Pager_object *_pager = nullptr; bool _bound_to_pd = false; @@ -62,7 +60,7 @@ class Core::Platform_thread * Constructor */ Platform_thread(Platform_pd &pd, Rpc_entrypoint &, Ram_allocator &, - Region_map &, size_t, const char *name, + Local_rm &, size_t, const char *name, unsigned prio, Affinity::Location, addr_t) : _pd(pd), _priority(prio) diff --git a/repos/base-pistachio/lib/mk/core-pistachio.inc b/repos/base-pistachio/lib/mk/core-pistachio.inc index 5add470f6b..221e1b2f0a 100644 --- a/repos/base-pistachio/lib/mk/core-pistachio.inc +++ b/repos/base-pistachio/lib/mk/core-pistachio.inc @@ -7,7 +7,7 @@ SRC_CC = stack_area.cc \ core_log.cc \ core_log_out.cc \ core_rpc_cap_alloc.cc \ - core_region_map.cc \ + core_local_rm.cc \ cpu_session_component.cc \ cpu_session_support.cc \ cpu_thread_component.cc \ @@ -70,7 +70,7 @@ vpath dataspace_component.cc $(GEN_CORE_DIR) vpath dump_alloc.cc $(GEN_CORE_DIR) vpath default_log.cc $(GEN_CORE_DIR) vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR) -vpath core_region_map.cc $(GEN_CORE_DIR) +vpath core_local_rm.cc $(GEN_CORE_DIR) vpath stack_area.cc $(GEN_CORE_DIR) vpath pager_ep.cc $(GEN_CORE_DIR) vpath platform_rom_modules.cc $(GEN_CORE_DIR) diff --git a/repos/base-pistachio/src/core/include/platform_thread.h b/repos/base-pistachio/src/core/include/platform_thread.h index 0b3a27cfa6..1909a3124c 100644 --- a/repos/base-pistachio/src/core/include/platform_thread.h +++ b/repos/base-pistachio/src/core/include/platform_thread.h @@ -87,7 +87,7 @@ class Core::Platform_thread : Interface * Constructor */ Platform_thread(Platform_pd &pd, Rpc_entrypoint &, Ram_allocator &, - Region_map &, size_t, char const *name, unsigned priority, + Local_rm &, size_t, char const *name, unsigned priority, Affinity::Location location, addr_t) : _name(name), _pd(pd), _priority(priority), _location(location) diff --git a/repos/base-sel4/lib/mk/core-sel4.inc b/repos/base-sel4/lib/mk/core-sel4.inc index c1d17e1895..76e328c7eb 100644 --- a/repos/base-sel4/lib/mk/core-sel4.inc +++ b/repos/base-sel4/lib/mk/core-sel4.inc @@ -27,7 +27,7 @@ GEN_SRC_CC += \ REP_SRC_CC += \ capability_space.cc \ core_log_out.cc \ - core_region_map.cc \ + core_local_rm.cc \ io_mem_session_support.cc \ irq_session_component.cc \ pager.cc \ diff --git a/repos/base-sel4/src/core/core_region_map.cc b/repos/base-sel4/src/core/core_local_rm.cc similarity index 57% rename from repos/base-sel4/src/core/core_region_map.cc rename to repos/base-sel4/src/core/core_local_rm.cc index 55e07e745d..41fbd33c33 100644 --- a/repos/base-sel4/src/core/core_region_map.cc +++ b/repos/base-sel4/src/core/core_local_rm.cc @@ -12,56 +12,58 @@ */ /* core includes */ -#include +#include #include #include +#include using namespace Core; -Region_map::Attach_result -Core_region_map::attach(Dataspace_capability ds_cap, Attr const &attr) +Core_local_rm::Result +Core_local_rm::attach(Dataspace_capability ds_cap, Attach_attr const &attr) { - return _ep.apply(ds_cap, [&] (Dataspace_component *ds) -> Attach_result { + return _ep.apply(ds_cap, [&] (Dataspace_component *ds) -> Result { if (!ds) - return Attach_error::INVALID_DATASPACE; + return Error::INVALID_DATASPACE; size_t const size = (attr.size == 0) ? ds->size() : attr.size; size_t const page_rounded_size = (size + get_page_size() - 1) & get_page_mask(); /* attach attributes 'use_at' and 'offset' not supported within core */ if (attr.use_at || attr.offset) - return Attach_error::REGION_CONFLICT; + return Error::REGION_CONFLICT; /* allocate range in core's virtual address space */ - return platform().region_alloc().try_alloc(page_rounded_size).convert( - [&] (Range_allocator::Allocation &virt) { + return platform().region_alloc().try_alloc(page_rounded_size).convert( + [&] (Range_allocator::Allocation &virt) -> Result { /* map the dataspace's physical pages to core-local virtual addresses */ size_t num_pages = page_rounded_size >> get_page_size_log2(); map_local(ds->phys_addr(), (addr_t)virt.ptr, num_pages); virt.deallocate = false; - return Range { .start = addr_t(virt.ptr), .num_bytes = page_rounded_size }; + return { *this, { .ptr = virt.ptr, + .num_bytes = page_rounded_size } }; }, - [&] (Alloc_error) -> Attach_result { + [&] (Alloc_error) -> Result { error("could not allocate virtual address range in core of size ", page_rounded_size); - return Attach_error::REGION_CONFLICT; + return Error::REGION_CONFLICT; } ); }); } -void Core_region_map::detach(addr_t const at) +void Core_local_rm::_free(Attachment &virt) { - size_t const size = platform_specific().region_alloc_size_at((void *)at); + size_t const size = platform_specific().region_alloc_size_at(virt.ptr); - if (!unmap_local(at, size >> get_page_size_log2())) { - error("could not unmap core virtual address ", Hex(at), " in ", __PRETTY_FUNCTION__); + if (!unmap_local(addr_t(virt.ptr), size >> get_page_size_log2())) { + error("could not unmap core virtual address ", virt.ptr, " in ", __PRETTY_FUNCTION__); return; } - platform().region_alloc().free((void *)at); + platform().region_alloc().free(virt.ptr); } diff --git a/repos/base-sel4/src/core/include/platform_thread.h b/repos/base-sel4/src/core/include/platform_thread.h index d6416451d3..8243cb969d 100644 --- a/repos/base-sel4/src/core/include/platform_thread.h +++ b/repos/base-sel4/src/core/include/platform_thread.h @@ -89,7 +89,7 @@ class Core::Platform_thread : public List::Element * Constructor */ Platform_thread(Platform_pd &pd, Rpc_entrypoint &, Ram_allocator &, - Region_map &, size_t, const char *name, unsigned priority, + Local_rm &, size_t, const char *name, unsigned priority, Affinity::Location, addr_t utcb); /** diff --git a/repos/base-sel4/src/core/include/vm_session_component.h b/repos/base-sel4/src/core/include/vm_session_component.h index d3831e78e1..939736063f 100644 --- a/repos/base-sel4/src/core/include/vm_session_component.h +++ b/repos/base-sel4/src/core/include/vm_session_component.h @@ -105,7 +105,7 @@ class Core::Vm_session_component using Cap_quota_guard::upgrade; Vm_session_component(Rpc_entrypoint &, Resources, Label const &, - Diag, Ram_allocator &ram, Region_map &, unsigned, + Diag, Ram_allocator &ram, Local_rm &, unsigned, Trace::Source_registry &); ~Vm_session_component(); diff --git a/repos/base-sel4/src/core/platform_thread.cc b/repos/base-sel4/src/core/platform_thread.cc index 5f805645cc..455865eb77 100644 --- a/repos/base-sel4/src/core/platform_thread.cc +++ b/repos/base-sel4/src/core/platform_thread.cc @@ -205,7 +205,7 @@ bool Platform_thread::install_mapping(Mapping const &mapping) Platform_thread::Platform_thread(Platform_pd &pd, Rpc_entrypoint &, Ram_allocator &, - Region_map &, size_t, const char *name, + Local_rm &, size_t, const char *name, unsigned priority, Affinity::Location location, addr_t utcb) : diff --git a/repos/base-sel4/src/core/spec/x86/platform_services.cc b/repos/base-sel4/src/core/spec/x86/platform_services.cc index 2f768b8663..1e55e6acee 100644 --- a/repos/base-sel4/src/core/spec/x86/platform_services.cc +++ b/repos/base-sel4/src/core/spec/x86/platform_services.cc @@ -24,10 +24,10 @@ void Core::platform_add_local_services(Rpc_entrypoint &ep, Registry &services, Trace::Source_registry &trace_sources, Ram_allocator &core_ram, - Region_map &core_rm, + Local_rm &local_rm, Range_allocator &io_port_ranges) { - static Vm_root vm_root(ep, heap, core_ram, core_rm, trace_sources); + static Vm_root vm_root(ep, heap, core_ram, local_rm, trace_sources); static Core_service vm(services, vm_root); diff --git a/repos/base-sel4/src/core/spec/x86/vm_session_component.cc b/repos/base-sel4/src/core/spec/x86/vm_session_component.cc index 6f7d76ec7a..ef53a85301 100644 --- a/repos/base-sel4/src/core/spec/x86/vm_session_component.cc +++ b/repos/base-sel4/src/core/spec/x86/vm_session_component.cc @@ -86,7 +86,7 @@ Vm_session_component::Vm_session_component(Rpc_entrypoint &ep, Label const &, Diag, Ram_allocator &ram, - Region_map &local_rm, + Local_rm &local_rm, unsigned, Trace::Source_registry &) try diff --git a/repos/base/include/base/attached_dataspace.h b/repos/base/include/base/attached_dataspace.h index 98ef92b3dd..94db67dfed 100644 --- a/repos/base/include/base/attached_dataspace.h +++ b/repos/base/include/base/attached_dataspace.h @@ -15,7 +15,7 @@ #define _INCLUDE__BASE__ATTACHED_DATASPACE_H_ #include -#include +#include namespace Genode { class Attached_dataspace; } @@ -29,29 +29,18 @@ class Genode::Attached_dataspace : Noncopyable private: - Dataspace_capability _ds; + using Local_rm = Local::Constrained_region_map; - Region_map &_rm; + Dataspace_capability const _ds; - Dataspace_capability _check(Dataspace_capability ds) - { - if (ds.valid()) - return ds; - - throw Invalid_dataspace(); - } - - Region_map::Attach_result _attached = _rm.attach(_ds, { - .size = { }, .offset = { }, - .use_at = { }, .at = { }, - .executable = { }, .writeable = true }); + Local_rm::Result _attached; template T *_ptr() const { return _attached.convert( - [&] (Region_map::Range range) { return (T *)range.start; }, - [&] (Region_map::Attach_error) { return nullptr; }); + [&] (Local_rm::Attachment const &a) { return (T *)a.ptr; }, + [&] (Local_rm::Error) { return nullptr; }); } public: @@ -60,31 +49,28 @@ class Genode::Attached_dataspace : Noncopyable * Constructor * * \throw Region_conflict - * \throw Invalid_dataspace * \throw Out_of_caps * \throw Out_of_ram */ - Attached_dataspace(Region_map &rm, Dataspace_capability ds) + Attached_dataspace(Local_rm &rm, Dataspace_capability ds) : - _ds(_check(ds)), _rm(rm) + _ds(ds), + _attached(rm.attach(ds, { + .size = { }, .offset = { }, + .use_at = { }, .at = { }, + .executable = { }, .writeable = true + })) { - _attached.with_error([&] (Region_map::Attach_error e) { - if (e == Region_map::Attach_error::OUT_OF_RAM) throw Out_of_ram(); - if (e == Region_map::Attach_error::OUT_OF_CAPS) throw Out_of_caps(); - throw Region_conflict(); + _attached.with_error([&] (Local_rm::Error e) { + switch (e) { + case Local_rm::Error::OUT_OF_RAM: throw Out_of_ram(); + case Local_rm::Error::OUT_OF_CAPS: throw Out_of_caps(); + case Local_rm::Error::REGION_CONFLICT: throw Region_conflict(); + case Local_rm::Error::INVALID_DATASPACE: throw Invalid_dataspace(); + } }); } - /** - * Destructor - */ - ~Attached_dataspace() - { - _attached.with_result( - [&] (Region_map::Range range) { _rm.detach(range.start); }, - [&] (Region_map::Attach_error) { }); - } - /** * Return capability of the used dataspace */ @@ -108,8 +94,8 @@ class Genode::Attached_dataspace : Noncopyable size_t size() const { return _attached.convert( - [&] (Region_map::Range range) { return range.num_bytes; }, - [&] (Region_map::Attach_error) { return 0UL; }); + [&] (Local_rm::Attachment const &a) { return a.num_bytes; }, + [&] (Local_rm::Error) { return 0UL; }); } /** @@ -126,7 +112,7 @@ class Genode::Attached_dataspace : Noncopyable * removed the memory mappings of the dataspace. So we have to omit the * detach operation in '~Attached_dataspace'. */ - void invalidate() { _attached = Region_map::Attach_error::INVALID_DATASPACE; } + void invalidate() { _attached = Local_rm::Error::INVALID_DATASPACE; } }; #endif /* _INCLUDE__BASE__ATTACHED_DATASPACE_H_ */ diff --git a/repos/base/include/base/attached_io_mem_dataspace.h b/repos/base/include/base/attached_io_mem_dataspace.h index 4052444f11..d2aaf43c50 100644 --- a/repos/base/include/base/attached_io_mem_dataspace.h +++ b/repos/base/include/base/attached_io_mem_dataspace.h @@ -31,9 +31,9 @@ class Genode::Attached_io_mem_dataspace { private: - Region_map &_env_rm; Io_mem_connection _mmio; Io_mem_dataspace_capability _ds; + Env::Local_rm::Result const _attached; addr_t const _at; static addr_t _with_sub_page_offset(addr_t local, addr_t io_base) @@ -41,18 +41,6 @@ class Genode::Attached_io_mem_dataspace return local | (io_base & 0xfffUL); } - addr_t _attach() - { - return _env_rm.attach(_ds, { - .size = { }, .offset = { }, - .use_at = { }, .at = { }, - .executable = { }, .writeable = true - }).convert( - [&] (Region_map::Range range) { return range.start; }, - [&] (Region_map::Attach_error) { return 0UL; } - ); - } - public: /** @@ -73,20 +61,23 @@ class Genode::Attached_io_mem_dataspace Attached_io_mem_dataspace(Env &env, Genode::addr_t base, Genode::size_t size, bool write_combined = false) : - _env_rm(env.rm()), _mmio(env, base, size, write_combined), _ds(_mmio.dataspace()), - _at(_with_sub_page_offset(_attach(), base)) + + _attached(env.rm().attach(_ds, { + .size = { }, .offset = { }, + .use_at = { }, .at = { }, + .executable = { }, .writeable = true })), + + _at(_attached.convert( + [&] (Env::Local_rm::Attachment const &a) { + return _with_sub_page_offset(addr_t(a.ptr), base); }, + [&] (Env::Local_rm::Error) { return 0UL; })) { if (!_ds.valid()) throw Attached_dataspace::Invalid_dataspace(); if (!_at) throw Attached_dataspace::Region_conflict(); } - /** - * Destructor - */ - ~Attached_io_mem_dataspace() { if (_at) _env_rm.detach(_at); } - /** * Return capability of the used RAM dataspace */ diff --git a/repos/base/include/base/attached_ram_dataspace.h b/repos/base/include/base/attached_ram_dataspace.h index 5c1df5b457..37196e882d 100644 --- a/repos/base/include/base/attached_ram_dataspace.h +++ b/repos/base/include/base/attached_ram_dataspace.h @@ -35,9 +35,11 @@ class Genode::Attached_ram_dataspace { private: + using Local_rm = Local::Constrained_region_map; + size_t _size = 0; Ram_allocator *_ram = nullptr; - Region_map *_rm = nullptr; + Local_rm *_rm = nullptr; Ram_dataspace_capability _ds { }; addr_t _at = 0; Cache const _cache = CACHED; @@ -60,15 +62,16 @@ class Genode::Attached_ram_dataspace _ds = _ram->alloc(_size, _cache); - Region_map::Attr attr { }; + Local_rm::Attach_attr attr { }; attr.writeable = true; _rm->attach(_ds, attr).with_result( - [&] (Region_map::Range range) { _at = range.start; }, - [&] (Region_map::Attach_error e) { + [&] (Local_rm::Attachment &a) { + a.deallocate = false; _at = addr_t(a.ptr); }, + [&] (Local_rm::Error e) { /* revert allocation if attaching the dataspace failed */ _ram->free(_ds, _size); - if (e == Region_map::Attach_error::OUT_OF_RAM) throw Out_of_ram(); - if (e == Region_map::Attach_error::OUT_OF_CAPS) throw Out_of_caps(); + if (e == Local_rm::Error::OUT_OF_RAM) throw Out_of_ram(); + if (e == Local_rm::Error::OUT_OF_CAPS) throw Out_of_caps(); throw Attached_dataspace::Region_conflict(); }); @@ -106,7 +109,7 @@ class Genode::Attached_ram_dataspace * \throw Attached_dataspace::Region_conflict * \throw Attached_dataspace::Invalid_dataspace */ - Attached_ram_dataspace(Ram_allocator &ram, Region_map &rm, + Attached_ram_dataspace(Ram_allocator &ram, Local_rm &rm, size_t size, Cache cache = CACHED) : _size(size), _ram(&ram), _rm(&rm), _cache(cache) diff --git a/repos/base/include/base/attached_rom_dataspace.h b/repos/base/include/base/attached_rom_dataspace.h index 7830976c5c..7b76cfb4af 100644 --- a/repos/base/include/base/attached_rom_dataspace.h +++ b/repos/base/include/base/attached_rom_dataspace.h @@ -26,7 +26,9 @@ class Genode::Attached_rom_dataspace { private: - Region_map &_rm; + using Local_rm = Local::Constrained_region_map; + + Local_rm &_rm; Rom_connection _rom; /* diff --git a/repos/base/include/base/child.h b/repos/base/include/base/child.h index 6f36d99aed..dfdcbeca6b 100644 --- a/repos/base/include/base/child.h +++ b/repos/base/include/base/child.h @@ -268,6 +268,8 @@ class Genode::Child : protected Rpc_object, { private: + using Local_rm = Local::Constrained_region_map; + struct Initial_thread_base : Interface { struct Start : Interface @@ -322,7 +324,7 @@ class Genode::Child : protected Rpc_object, /* print error message with the child's name prepended */ void _error(auto &&... args) { error(_policy.name(), ": ", args...); } - Region_map &_local_rm; + Local_rm &_local_rm; Capability_guard _parent_cap_guard; @@ -383,7 +385,7 @@ class Genode::Child : protected Rpc_object, static Load_result _load_static_elf(Dataspace_capability elf_ds, Ram_allocator &ram, - Region_map &local_rm, + Local_rm &local_rm, Region_map &remote_rm, Parent_capability parent_cap); @@ -393,7 +395,7 @@ class Genode::Child : protected Rpc_object, Pd_session &, Initial_thread_base &, Initial_thread::Start &, - Region_map &local_rm, + Local_rm &local_rm, Region_map &remote_rm, Parent_capability parent); @@ -660,7 +662,7 @@ class Genode::Child : protected Rpc_object, * \throw Service_denied the initial sessions for the child's * environment could not be established */ - Child(Region_map &rm, Rpc_entrypoint &entrypoint, Child_policy &policy); + Child(Local_rm &rm, Rpc_entrypoint &entrypoint, Child_policy &policy); /** * Destructor diff --git a/repos/base/include/base/env.h b/repos/base/include/base/env.h index 592856afbe..ce2286c93a 100644 --- a/repos/base/include/base/env.h +++ b/repos/base/include/base/env.h @@ -18,12 +18,15 @@ #include #include #include +#include namespace Genode { struct Env; } struct Genode::Env : Interface { + using Local_rm = Local::Constrained_region_map; + virtual Parent &parent() = 0; /** @@ -36,7 +39,7 @@ struct Genode::Env : Interface /** * Region map of the component's address space */ - virtual Region_map &rm() = 0; + virtual Local_rm &rm() = 0; /** * PD session of the component as created by the parent diff --git a/repos/base/include/base/heap.h b/repos/base/include/base/heap.h index 10f19193fb..265d893bd4 100644 --- a/repos/base/include/base/heap.h +++ b/repos/base/include/base/heap.h @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include @@ -39,6 +39,8 @@ class Genode::Heap : public Allocator { private: + using Local_rm = Local::Constrained_region_map; + class Dataspace : public List::Element { private: @@ -76,17 +78,17 @@ class Genode::Heap : public Allocator public: Ram_allocator *ram_alloc; /* backing store */ - Region_map *region_map; + Local_rm *local_rm; - Dataspace_pool(Ram_allocator *ram, Region_map *rm) - : ram_alloc(ram), region_map(rm) { } + Dataspace_pool(Ram_allocator *ram, Local_rm *rm) + : ram_alloc(ram), local_rm(rm) { } ~Dataspace_pool(); void remove_and_free(Dataspace &); - void reassign_resources(Ram_allocator *ram, Region_map *rm) { - ram_alloc = ram, region_map = rm; } + void reassign_resources(Ram_allocator *ram, Local_rm *rm) { + ram_alloc = ram, local_rm = rm; } }; Mutex mutable _mutex { }; @@ -122,12 +124,12 @@ class Genode::Heap : public Allocator static constexpr size_t UNLIMITED = ~0; Heap(Ram_allocator *ram_allocator, - Region_map *region_map, + Local_rm *local_rm, size_t quota_limit = UNLIMITED, void *static_addr = 0, size_t static_size = 0); - Heap(Ram_allocator &ram, Region_map &rm) : Heap(&ram, &rm) { } + Heap(Ram_allocator &ram, Local_rm &rm) : Heap(&ram, &rm) { } ~Heap(); @@ -142,7 +144,7 @@ class Genode::Heap : public Allocator /** * Re-assign RAM allocator and region map */ - void reassign_resources(Ram_allocator *ram, Region_map *rm) { + void reassign_resources(Ram_allocator *ram, Local_rm *rm) { _ds_pool.reassign_resources(ram, rm); } /** @@ -182,6 +184,8 @@ class Genode::Sliced_heap : public Allocator { private: + using Local_rm = Local::Constrained_region_map; + /** * Meta-data header placed in front of each allocated block */ @@ -195,7 +199,7 @@ class Genode::Sliced_heap : public Allocator }; Ram_allocator &_ram_alloc; /* RAM allocator for backing store */ - Region_map &_region_map; /* region map of the address space */ + Local_rm &_local_rm; /* region map of the address space */ size_t _consumed = 0; /* number of allocated bytes */ List _blocks { }; /* list of allocated blocks */ Mutex _mutex { }; /* serialize allocations */ @@ -210,7 +214,7 @@ class Genode::Sliced_heap : public Allocator /** * Constructor */ - Sliced_heap(Ram_allocator &ram_alloc, Region_map ®ion_map); + Sliced_heap(Ram_allocator &ram_alloc, Local_rm &local_rm); /** * Destructor diff --git a/repos/base/include/base/local.h b/repos/base/include/base/local.h new file mode 100644 index 0000000000..2a51463e15 --- /dev/null +++ b/repos/base/include/base/local.h @@ -0,0 +1,63 @@ +/* + * \brief Interfaces for the component-local environment + * \author Norman Feske + * \date 2025-04-05 + */ + +/* + * Copyright (C) 2025 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#ifndef _INCLUDE__BASE__LOCAL_H_ +#define _INCLUDE__BASE__LOCAL_H_ + +#include +#include + +namespace Genode::Local { struct Constrained_region_map; } + + +/** + * Access to the component-local virtual address space + */ +struct Genode::Local::Constrained_region_map : Interface, Noncopyable +{ + struct Attr { void *ptr; size_t num_bytes; }; + + using Error = Region_map::Attach_error; + using Attachment = Allocation; + using Result = Attachment::Attempt; + using Attach_attr = Region_map::Attr; + + /** + * Map dataspace into local address space + * + * \param ds capability of dataspace to map + * \param attr mapping attributes + */ + virtual Result attach(Capability ds, Attach_attr const &attr) = 0; + + /** + * Unmap attachment from local address space + * + * \noapi + */ + virtual void _free(Attachment &) = 0; + + /* + * Emulation of 'Genode::Region_map', ror a gradual API transition + * + * \deprecated + * \noapi + */ + void detach(addr_t addr) + { + /* detach via '~Attachment' */ + Attachment { *this, { (void *)addr, 0 } }; + } +}; + +#endif /* _INCLUDE__BASE__LOCAL_H_ */ diff --git a/repos/base/include/pd_session/pd_session.h b/repos/base/include/pd_session/pd_session.h index ffee804237..c233a7ebe0 100644 --- a/repos/base/include/pd_session/pd_session.h +++ b/repos/base/include/pd_session/pd_session.h @@ -21,11 +21,13 @@ #include #include #include +#include namespace Genode { struct Pd_account; struct Pd_session; struct Pd_ram_allocator; + struct Pd_local_rm; struct Pd_session_client; struct Parent; struct Signal_context; @@ -445,4 +447,25 @@ struct Genode::Pd_ram_allocator : Ram_allocator Pd_ram_allocator(Pd_session &pd) : _pd(pd) { } }; + +struct Genode::Pd_local_rm : Genode::Local::Constrained_region_map +{ + Region_map &_rm; + + Pd_local_rm(Region_map &rm) : _rm(rm) { } + + Result attach(Capability ds, Attach_attr const &attr) override + { + if (!ds.valid()) + return Error::INVALID_DATASPACE; + + return _rm.attach(ds, attr).convert( + [&] (Region_map::Range const &r) -> Result { + return { *this, { (void *)r.start, r.num_bytes } }; }, + [&] (Error e) { return e; }); + } + + void _free(Attachment &a) override { _rm.detach(addr_t(a.ptr)); } +}; + #endif /* _INCLUDE__PD_SESSION__PD_SESSION_H_ */ diff --git a/repos/base/include/vm_session/handler.h b/repos/base/include/vm_session/handler.h index 31564a3bd2..3565c3cabe 100644 --- a/repos/base/include/vm_session/handler.h +++ b/repos/base/include/vm_session/handler.h @@ -15,6 +15,7 @@ #ifndef _INCLUDE__VM_SESSION__HANDLER_H_ #define _INCLUDE__VM_SESSION__HANDLER_H_ +#include #include namespace Genode { diff --git a/repos/base/lib/symbols/ld b/repos/base/lib/symbols/ld index e111db4692..7eab4af7f5 100644 --- a/repos/base/lib/symbols/ld +++ b/repos/base/lib/symbols/ld @@ -62,8 +62,8 @@ _ZN6Genode10Ipc_serverD1Ev T _ZN6Genode10Ipc_serverD2Ev T _ZN6Genode11Sliced_heap4freeEPvm T _ZN6Genode11Sliced_heap9try_allocEm T -_ZN6Genode11Sliced_heapC1ERNS_13Ram_allocatorERNS_10Region_mapE T -_ZN6Genode11Sliced_heapC2ERNS_13Ram_allocatorERNS_10Region_mapE T +_ZN6Genode11Sliced_heapC1ERNS_13Ram_allocatorERNS_5Local22Constrained_region_mapE T +_ZN6Genode11Sliced_heapC2ERNS_13Ram_allocatorERNS_5Local22Constrained_region_mapE T _ZN6Genode11Sliced_heapD0Ev T _ZN6Genode11Sliced_heapD1Ev T _ZN6Genode11Sliced_heapD2Ev T @@ -189,8 +189,8 @@ _ZN6Genode4Heap14Dataspace_poolD1Ev T _ZN6Genode4Heap14Dataspace_poolD2Ev T _ZN6Genode4Heap4freeEPvm T _ZN6Genode4Heap9try_allocEm T -_ZN6Genode4HeapC1EPNS_13Ram_allocatorEPNS_10Region_mapEmPvm T -_ZN6Genode4HeapC2EPNS_13Ram_allocatorEPNS_10Region_mapEmPvm T +_ZN6Genode4HeapC1EPNS_13Ram_allocatorEPNS_5Local22Constrained_region_mapEmPvm T +_ZN6Genode4HeapC2EPNS_13Ram_allocatorEPNS_5Local22Constrained_region_mapEmPvm T _ZN6Genode4HeapD0Ev T _ZN6Genode4HeapD1Ev T _ZN6Genode4HeapD2Ev T @@ -228,8 +228,8 @@ _ZN6Genode5Child7sessionENS_8Id_spaceINS_6Parent6ClientEE2IdERKNS_13Rpc_in_buffe _ZN6Genode5Child7upgradeENS_8Id_spaceINS_6Parent6ClientEE2IdERKNS_13Rpc_in_bufferILm160EEE T _ZN6Genode5Child8announceERKNS_13Rpc_in_bufferILm64EEE T _ZN6Genode5Child9heartbeatEv T -_ZN6Genode5ChildC1ERNS_10Region_mapERNS_14Rpc_entrypointERNS_12Child_policyE T -_ZN6Genode5ChildC2ERNS_10Region_mapERNS_14Rpc_entrypointERNS_12Child_policyE T +_ZN6Genode5ChildC1ERNS_5Local22Constrained_region_mapERNS_14Rpc_entrypointERNS_12Child_policyE T +_ZN6Genode5ChildC2ERNS_5Local22Constrained_region_mapERNS_14Rpc_entrypointERNS_12Child_policyE T _ZN6Genode5ChildD0Ev T _ZN6Genode5ChildD1Ev T _ZN6Genode5ChildD2Ev T diff --git a/repos/base/src/core/core_region_map.cc b/repos/base/src/core/core_local_rm.cc similarity index 59% rename from repos/base/src/core/core_region_map.cc rename to repos/base/src/core/core_local_rm.cc index 3a186e3946..6607717183 100644 --- a/repos/base/src/core/core_region_map.cc +++ b/repos/base/src/core/core_local_rm.cc @@ -16,21 +16,22 @@ /* core includes */ #include -#include +#include +#include using namespace Core; -Region_map::Attach_result -Core_region_map::attach(Dataspace_capability ds_cap, Attr const &) +Core_local_rm::Result +Core_local_rm::attach(Dataspace_capability ds_cap, Attach_attr const &) { - return _ep.apply(ds_cap, [] (Dataspace_component *ds) -> Attach_result { + return _ep.apply(ds_cap, [&] (Dataspace_component *ds) -> Result { if (!ds) - return Attach_error::INVALID_DATASPACE; + return Error::INVALID_DATASPACE; - return Range { .start = ds->phys_addr(), .num_bytes = ds->size() }; + return { *this, { (void *)ds->phys_addr(), ds->size() } }; }); } -void Core_region_map::detach(addr_t) { } +void Core_local_rm::_free(Attachment &) { } diff --git a/repos/base/src/core/cpu_session_component.cc b/repos/base/src/core/cpu_session_component.cc index 16813d2dee..031065d4ba 100644 --- a/repos/base/src/core/cpu_session_component.cc +++ b/repos/base/src/core/cpu_session_component.cc @@ -251,7 +251,7 @@ Cpu_session_component::Cpu_session_component(Rpc_entrypoint &session_ep, Label const &label, Diag const &diag, Ram_allocator &ram_alloc, - Region_map &local_rm, + Local_rm &local_rm, Rpc_entrypoint &thread_ep, Pager_entrypoint &pager_ep, Trace::Source_registry &trace_sources, diff --git a/repos/base/src/core/include/core_child.h b/repos/base/src/core/include/core_child.h index c42feb0dd0..047a969972 100644 --- a/repos/base/src/core/include/core_child.h +++ b/repos/base/src/core/include/core_child.h @@ -30,7 +30,7 @@ class Core::Core_child : public Child_policy Registry &_services; Rpc_entrypoint &_ep; - Region_map &_core_rm; + Local_rm &_local_rm; Ram_allocator &_core_ram; Core_account &_core_account; @@ -42,17 +42,17 @@ class Core::Core_child : public Child_policy Id_space _server_ids { }; - Child _child { _core_rm, _ep, *this }; + Child _child { _local_rm, _ep, *this }; public: Core_child(Registry &services, Rpc_entrypoint &ep, - Region_map &core_rm, Ram_allocator &core_ram, + Local_rm &local_rm, Ram_allocator &core_ram, Core_account &core_account, Cpu_session &core_cpu, Capability core_cpu_cap, Cap_quota cap_quota, Ram_quota ram_quota) : - _services(services), _ep(ep), _core_rm(core_rm), _core_ram(core_ram), + _services(services), _ep(ep), _local_rm(local_rm), _core_ram(core_ram), _core_account(core_account), _core_cpu_cap(core_cpu_cap), _core_cpu(core_cpu), _cap_quota(Child::effective_quota(cap_quota)), diff --git a/repos/base/src/core/include/core_local_rm.h b/repos/base/src/core/include/core_local_rm.h new file mode 100644 index 0000000000..40e1a29e12 --- /dev/null +++ b/repos/base/src/core/include/core_local_rm.h @@ -0,0 +1,37 @@ +/* + * \brief Core-local region map + * \author Norman Feske + * \date 2006-07-12 + */ + +/* + * Copyright (C) 2006-2025 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#ifndef _CORE__INCLUDE__CORE_LOCAL_RM_H_ +#define _CORE__INCLUDE__CORE_LOCAL_RM_H_ + +/* Genode includes */ +#include +#include + +/* core includes */ +#include + +namespace Core { struct Core_local_rm; } + + +struct Core::Core_local_rm : Local::Constrained_region_map +{ + Rpc_entrypoint &_ep; + + Core_local_rm(Rpc_entrypoint &ep) : _ep(ep) { } + + Result attach(Dataspace_capability, Attach_attr const &) override; + void _free(Attachment &) override; +}; + +#endif /* _CORE__INCLUDE__CORE_LOCAL_RM_H_ */ diff --git a/repos/base/src/core/include/core_region_map.h b/repos/base/src/core/include/core_region_map.h deleted file mode 100644 index 28623cd0e0..0000000000 --- a/repos/base/src/core/include/core_region_map.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * \brief Core-specific region map - * \author Norman Feske - * \date 2006-07-12 - */ - -/* - * Copyright (C) 2006-2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -#ifndef _CORE__INCLUDE__CORE_REGION_MAP_H_ -#define _CORE__INCLUDE__CORE_REGION_MAP_H_ - -/* Genode includes */ -#include -#include - -/* core includes */ -#include - -namespace Core { class Core_region_map; } - - -class Core::Core_region_map : public Region_map -{ - private: - - Rpc_entrypoint &_ep; - - public: - - Core_region_map(Rpc_entrypoint &ep) : _ep(ep) { } - - Attach_result attach(Dataspace_capability, Attr const &) override; - void detach(addr_t) override; - void fault_handler (Signal_context_capability) override { } - Fault fault() override { return { }; } - Dataspace_capability dataspace() override { return { }; } -}; - -#endif /* _CORE__INCLUDE__CORE_REGION_MAP_H_ */ diff --git a/repos/base/src/core/include/cpu_root.h b/repos/base/src/core/include/cpu_root.h index 9d3cb0d1d1..261fea071c 100644 --- a/repos/base/src/core/include/cpu_root.h +++ b/repos/base/src/core/include/cpu_root.h @@ -28,7 +28,7 @@ class Core::Cpu_root : public Root_component private: Ram_allocator &_ram_alloc; - Region_map &_local_rm; + Local_rm &_local_rm; Rpc_entrypoint &_thread_ep; Pager_entrypoint &_pager_ep; Trace::Source_registry &_trace_sources; @@ -73,7 +73,7 @@ class Core::Cpu_root : public Root_component * \param md_alloc meta data allocator to be used by root component */ Cpu_root(Ram_allocator &ram_alloc, - Region_map &local_rm, + Local_rm &local_rm, Rpc_entrypoint &session_ep, Rpc_entrypoint &thread_ep, Pager_entrypoint &pager_ep, diff --git a/repos/base/src/core/include/cpu_session_component.h b/repos/base/src/core/include/cpu_session_component.h index 3c4894c8a3..4ff6ef0520 100644 --- a/repos/base/src/core/include/cpu_session_component.h +++ b/repos/base/src/core/include/cpu_session_component.h @@ -43,7 +43,7 @@ class Core::Cpu_session_component : public Session_object, Rpc_entrypoint &_session_ep; Rpc_entrypoint &_thread_ep; Pager_entrypoint &_pager_ep; - Region_map &_local_rm; + Local_rm &_local_rm; Accounted_ram_allocator _ram_alloc; Sliced_heap _md_alloc; /* guarded meta-data allocator */ Cpu_thread_allocator _thread_alloc; /* meta-data allocator */ @@ -150,7 +150,7 @@ class Core::Cpu_session_component : public Session_object, Label const &label, Diag const &diag, Ram_allocator &ram_alloc, - Region_map &local_rm, + Local_rm &local_rm, Rpc_entrypoint &thread_ep, Pager_entrypoint &pager_ep, Trace::Source_registry &trace_sources, diff --git a/repos/base/src/core/include/cpu_thread_component.h b/repos/base/src/core/include/cpu_thread_component.h index 2a8d181b90..06c6825ff2 100644 --- a/repos/base/src/core/include/cpu_thread_component.h +++ b/repos/base/src/core/include/cpu_thread_component.h @@ -118,7 +118,7 @@ class Core::Cpu_thread_component : public Rpc_object, Cpu_thread_component(Cpu_session_capability cpu_session_cap, Cpu_session_component &cpu, Rpc_entrypoint &ep, - Region_map &core_rm, + Local_rm &local_rm, Pager_entrypoint &pager_ep, Pd_session_component &pd, Ram_allocator &cpu_ram, @@ -139,8 +139,8 @@ class Core::Cpu_thread_component : public Rpc_object, _weight(weight), _session_label(label), _name(name), _pd_element(pd_threads, *this), - _platform_thread(platform_pd, ep, cpu_ram, core_rm, quota, name.string(), - priority, location, utcb), + _platform_thread(platform_pd, ep, cpu_ram, local_rm, quota, + name.string(), priority, location, utcb), _trace_control_slot(trace_control_area.alloc()), _trace_sources(trace_sources), _managed_thread_cap(_ep, *this), diff --git a/repos/base/src/core/include/pd_root.h b/repos/base/src/core/include/pd_root.h index be37f8563a..c14946236d 100644 --- a/repos/base/src/core/include/pd_root.h +++ b/repos/base/src/core/include/pd_root.h @@ -32,7 +32,7 @@ class Core::Pd_root : public Root_component Rpc_entrypoint &_signal_ep; Pager_entrypoint &_pager_ep; Range_allocator &_phys_alloc; - Region_map &_local_rm; + Local_rm &_local_rm; Range_allocator &_core_mem; System_control &_system_control; @@ -111,7 +111,7 @@ class Core::Pd_root : public Root_component Rpc_entrypoint &signal_ep, Pager_entrypoint &pager_ep, Range_allocator &phys_alloc, - Region_map &local_rm, + Local_rm &local_rm, Allocator &md_alloc, Range_allocator &core_mem, System_control &system_control) diff --git a/repos/base/src/core/include/pd_session_component.h b/repos/base/src/core/include/pd_session_component.h index 10462327ef..d1a9a77c4f 100644 --- a/repos/base/src/core/include/pd_session_component.h +++ b/repos/base/src/core/include/pd_session_component.h @@ -140,7 +140,7 @@ class Core::Pd_session_component : public Session_object Phys_range phys_range, Virt_range virt_range, Managing_system managing_system, - Region_map &local_rm, + Local_rm &local_rm, Pager_entrypoint &pager_ep, char const *args, Range_allocator &core_mem, diff --git a/repos/base/src/core/include/platform_services.h b/repos/base/src/core/include/platform_services.h index fa4ea494b1..908bc4e91d 100644 --- a/repos/base/src/core/include/platform_services.h +++ b/repos/base/src/core/include/platform_services.h @@ -42,7 +42,7 @@ namespace Core { Registry ®, Trace::Source_registry &trace, Ram_allocator &core_ram, - Region_map &core_rm, + Local_rm &local_rm, Range_allocator &io_port_ranges); } diff --git a/repos/base/src/core/include/rm_root.h b/repos/base/src/core/include/rm_root.h index ec30be460d..d479111e9c 100644 --- a/repos/base/src/core/include/rm_root.h +++ b/repos/base/src/core/include/rm_root.h @@ -29,7 +29,7 @@ class Core::Rm_root : public Root_component private: Ram_allocator &_ram_alloc; - Region_map &_local_rm; + Local_rm &_local_rm; Pager_entrypoint &_pager_ep; protected: @@ -64,7 +64,7 @@ class Core::Rm_root : public Root_component Rm_root(Rpc_entrypoint &session_ep, Allocator &md_alloc, Ram_allocator &ram_alloc, - Region_map &local_rm, + Local_rm &local_rm, Pager_entrypoint &pager_ep) : Root_component(&session_ep, &md_alloc), diff --git a/repos/base/src/core/include/rm_session_component.h b/repos/base/src/core/include/rm_session_component.h index bbad67d6de..4ce12ddf84 100644 --- a/repos/base/src/core/include/rm_session_component.h +++ b/repos/base/src/core/include/rm_session_component.h @@ -48,7 +48,7 @@ class Core::Rm_session_component : public Session_object Label const &label, Diag const &diag, Ram_allocator &ram_alloc, - Region_map &local_rm, + Local_rm &local_rm, Pager_entrypoint &pager_ep) : Session_object(ep, resources, label, diag), diff --git a/repos/base/src/core/include/trace/control_area.h b/repos/base/src/core/include/trace/control_area.h index 2d6ce8430b..95f3f81a48 100644 --- a/repos/base/src/core/include/trace/control_area.h +++ b/repos/base/src/core/include/trace/control_area.h @@ -44,7 +44,7 @@ struct Genode::Trace::Control_area : Noncopyable return fn(_area->local_addr()[i]); } - Control_area(Ram_allocator &ram, Region_map &rm) + Control_area(Ram_allocator &ram, Core::Local_rm &rm) { try { _area.construct(ram, rm, SIZE); } catch (Out_of_ram) { error = Alloc_error::OUT_OF_RAM; } diff --git a/repos/base/src/core/include/trace/root.h b/repos/base/src/core/include/trace/root.h index 5818bbae11..11710fc0e4 100644 --- a/repos/base/src/core/include/trace/root.h +++ b/repos/base/src/core/include/trace/root.h @@ -28,7 +28,7 @@ class Core::Trace::Root : public Root_component private: Ram_allocator &_ram; - Region_map &_local_rm; + Local_rm &_local_rm; Source_registry &_sources; Policy_registry &_policies; @@ -65,7 +65,7 @@ class Core::Trace::Root : public Root_component * * \param session_ep entry point for managing session objects */ - Root(Ram_allocator &ram, Region_map &local_rm, + Root(Ram_allocator &ram, Local_rm &local_rm, Rpc_entrypoint &session_ep, Allocator &md_alloc, Source_registry &sources, Policy_registry &policies) : diff --git a/repos/base/src/core/include/trace/session_component.h b/repos/base/src/core/include/trace/session_component.h index 54074ef8c7..550ee97f67 100644 --- a/repos/base/src/core/include/trace/session_component.h +++ b/repos/base/src/core/include/trace/session_component.h @@ -36,7 +36,7 @@ class Core::Trace::Session_component private: Accounted_ram_allocator _ram; - Region_map &_local_rm; + Local_rm &_local_rm; Sliced_heap _md_alloc { _ram, _local_rm }; Tslab _subjects_slab; Tslab _policies_slab; @@ -67,7 +67,7 @@ class Core::Trace::Session_component Label const &label, Diag const &diag, Ram_allocator &ram, - Region_map &local_rm, + Local_rm &local_rm, size_t arg_buffer_size, Source_registry &sources, Policy_registry &policies); diff --git a/repos/base/src/core/include/trace/subject_registry.h b/repos/base/src/core/include/trace/subject_registry.h index 66608447e1..d73db10a7e 100644 --- a/repos/base/src/core/include/trace/subject_registry.h +++ b/repos/base/src/core/include/trace/subject_registry.h @@ -71,7 +71,7 @@ class Core::Trace::Subject return Setup_result::DENIED; } - Setup_result _copy_content(Region_map &local_rm, size_t num_bytes, + Setup_result _copy_content(Local_rm &local_rm, size_t num_bytes, Dataspace_capability from_ds, Dataspace_capability to_ds) { @@ -104,7 +104,7 @@ class Core::Trace::Subject * Clone dataspace into newly allocated dataspace */ [[nodiscard]] Setup_result setup(Ram_allocator &ram, - Region_map &local_rm, + Local_rm &local_rm, Dataspace_capability &from_ds, size_t size) { @@ -194,7 +194,7 @@ class Core::Trace::Subject */ Trace_result trace(Policy_id policy_id, Dataspace_capability policy_ds, Policy_size policy_size, Ram_allocator &ram, - Region_map &local_rm, Buffer_size size) + Local_rm &local_rm, Buffer_size size) { /* check state and return error if subject is not traceable */ switch(_state()) { diff --git a/repos/base/src/core/include/types.h b/repos/base/src/core/include/types.h index 465d60d0de..14e74d0fe5 100644 --- a/repos/base/src/core/include/types.h +++ b/repos/base/src/core/include/types.h @@ -18,6 +18,7 @@ #include #include #include +#include namespace Core { @@ -57,6 +58,8 @@ namespace Core { Genode::print(out, "(r", w ? "w" : "-", x ? "x" : "-", ")"); } }; + + using Local_rm = Local::Constrained_region_map; } namespace Genode { diff --git a/repos/base/src/core/include/vm_root.h b/repos/base/src/core/include/vm_root.h index ac559725b4..ee009fc1d7 100644 --- a/repos/base/src/core/include/vm_root.h +++ b/repos/base/src/core/include/vm_root.h @@ -29,7 +29,7 @@ class Core::Vm_root : public Root_component private: Ram_allocator &_ram_allocator; - Region_map &_local_rm; + Local_rm &_local_rm; Trace::Source_registry &_trace_sources; protected: @@ -71,7 +71,7 @@ class Core::Vm_root : public Root_component Vm_root(Rpc_entrypoint &session_ep, Allocator &md_alloc, Ram_allocator &ram_alloc, - Region_map &local_rm, + Local_rm &local_rm, Trace::Source_registry &trace_sources) : Root_component(&session_ep, &md_alloc), diff --git a/repos/base/src/core/main.cc b/repos/base/src/core/main.cc index 2bcb49f42e..6322a37a91 100644 --- a/repos/base/src/core/main.cc +++ b/repos/base/src/core/main.cc @@ -19,7 +19,7 @@ /* core includes */ #include -#include +#include #include #include #include @@ -99,11 +99,11 @@ void Genode::bootstrap_component(Genode::Platform &) static Core_ram_allocator core_ram { core_ds_factory }; - static Core_region_map core_rm { ep }; + static Core_local_rm local_rm { ep }; static Rpc_entrypoint &signal_ep = core_signal_ep(ep); - init_exception_handling(core_ram, core_rm); + init_exception_handling(core_ram, local_rm); init_core_signal_transmitter(signal_ep); init_page_fault_handling(ep); @@ -120,7 +120,7 @@ void Genode::bootstrap_component(Genode::Platform &) * Allocate session meta data on distinct dataspaces to enable independent * destruction (to enable quota trading) of session component objects. */ - static Sliced_heap sliced_heap { core_ram, core_rm }; + static Sliced_heap sliced_heap { core_ram, local_rm }; /* * Factory for creating RPC capabilities within core @@ -135,16 +135,16 @@ void Genode::bootstrap_component(Genode::Platform &) static Core::System_control &system_control = init_system_control(sliced_heap, ep); static Rom_root rom_root (ep, ep, rom_modules, sliced_heap); - static Rm_root rm_root (ep, sliced_heap, core_ram, core_rm, pager_ep); - static Cpu_root cpu_root (core_ram, core_rm, ep, ep, pager_ep, + static Rm_root rm_root (ep, sliced_heap, core_ram, local_rm, pager_ep); + static Cpu_root cpu_root (core_ram, local_rm, ep, ep, pager_ep, sliced_heap, Core::Trace::sources()); - static Pd_root pd_root (ep, signal_ep, pager_ep, ram_ranges, core_rm, sliced_heap, + static Pd_root pd_root (ep, signal_ep, pager_ep, ram_ranges, local_rm, sliced_heap, platform_specific().core_mem_alloc(), system_control); static Log_root log_root (ep, sliced_heap); static Io_mem_root io_mem_root (ep, ep, io_mem_ranges, ram_ranges, sliced_heap); static Irq_root irq_root (irq_ranges, sliced_heap); - static Trace_root trace_root (core_ram, core_rm, ep, sliced_heap, + static Trace_root trace_root (core_ram, local_rm, ep, sliced_heap, Core::Trace::sources(), trace_policies); static Core_service rom_service (services, rom_root); @@ -158,7 +158,7 @@ void Genode::bootstrap_component(Genode::Platform &) /* make platform-specific services known to service pool */ platform_add_local_services(ep, sliced_heap, services, Core::Trace::sources(), - core_ram, core_rm, io_port_ranges); + core_ram, local_rm, io_port_ranges); if (!core_account.ram_account.try_withdraw({ 224*1024 })) { error("core preservation exceeds available RAM"); @@ -179,14 +179,14 @@ void Genode::bootstrap_component(Genode::Platform &) Session::Resources{{Cpu_session::RAM_QUOTA}, {Cpu_session::CAP_QUOTA}}, "core", Session::Diag{false}, - core_ram, core_rm, ep, pager_ep, Core::Trace::sources(), "", + core_ram, local_rm, ep, pager_ep, Core::Trace::sources(), "", Affinity::unrestricted(), Cpu_session::QUOTA_LIMIT); log(init_ram_quota.value / (1024*1024), " MiB RAM and ", init_cap_quota, " caps assigned to init"); static Reconstructible - init(services, ep, core_rm, core_ram, core_account, + init(services, ep, local_rm, core_ram, core_account, core_cpu, core_cpu.cap(), init_cap_quota, init_ram_quota); Core::platform().wait_for_exit(); diff --git a/repos/base/src/core/platform_services.cc b/repos/base/src/core/platform_services.cc index 3b7482726e..d556e21a2e 100644 --- a/repos/base/src/core/platform_services.cc +++ b/repos/base/src/core/platform_services.cc @@ -19,6 +19,6 @@ void Core::platform_add_local_services(Rpc_entrypoint &, Sliced_heap &, Registry &, Trace::Source_registry &, Ram_allocator &, - Region_map &, + Local_rm &, Range_allocator &) { } diff --git a/repos/base/src/core/spec/x86/platform_services.cc b/repos/base/src/core/spec/x86/platform_services.cc index 8679bb43f5..28dbe44eb6 100644 --- a/repos/base/src/core/spec/x86/platform_services.cc +++ b/repos/base/src/core/spec/x86/platform_services.cc @@ -29,7 +29,7 @@ void Core::platform_add_local_services(Rpc_entrypoint &, Registry &local_services, Trace::Source_registry &, Ram_allocator &, - Region_map &, + Local_rm &, Range_allocator &io_port_ranges) { static Io_port_root io_port_root(io_port_ranges, sliced_heap); diff --git a/repos/base/src/core/trace_session_component.cc b/repos/base/src/core/trace_session_component.cc index 55174fa4ac..ae9ea25a8f 100644 --- a/repos/base/src/core/trace_session_component.cc +++ b/repos/base/src/core/trace_session_component.cc @@ -172,7 +172,7 @@ Session_component::Session_component(Rpc_entrypoint &ep, Label const &label, Diag const &diag, Ram_allocator &ram, - Region_map &local_rm, + Local_rm &local_rm, size_t arg_buffer_size, Source_registry &sources, Policy_registry &policies) diff --git a/repos/base/src/include/base/internal/globals.h b/repos/base/src/include/base/internal/globals.h index 40ecde5d8d..b066cd6ccb 100644 --- a/repos/base/src/include/base/internal/globals.h +++ b/repos/base/src/include/base/internal/globals.h @@ -18,7 +18,10 @@ namespace Genode { - class Region_map; + namespace Local { struct Constrained_region_map; } + + using Local_rm = Local::Constrained_region_map; + class Ram_allocator; class Env; class Platform; @@ -30,11 +33,11 @@ namespace Genode { Platform &init_platform(); void init_stack_area(); - void init_exception_handling(Ram_allocator &, Region_map &); + void init_exception_handling(Ram_allocator &, Local::Constrained_region_map &); void init_signal_transmitter(Env &); void init_signal_receiver(Pd_session &, Parent &); void init_cap_slab(Pd_session &, Parent &); - void init_cxx_heap(Ram_allocator &, Region_map &); + void init_cxx_heap(Ram_allocator &, Local::Constrained_region_map &); void init_cxx_guard(); void init_ldso_phdr(Env &); void init_signal_thread(Env &); @@ -44,7 +47,7 @@ namespace Genode { void init_rpc_cap_alloc(Parent &); void init_parent_resource_requests(Env &); void init_heartbeat_monitoring(Env &); - void init_thread(Cpu_session &, Region_map &); + void init_thread(Cpu_session &, Local_rm &); void init_thread_start(Capability); void init_thread_bootstrap(Cpu_session &, Thread_capability); void exec_static_constructors(); diff --git a/repos/base/src/include/base/internal/platform.h b/repos/base/src/include/base/internal/platform.h index cda24b7285..77ee7ffa96 100644 --- a/repos/base/src/include/base/internal/platform.h +++ b/repos/base/src/include/base/internal/platform.h @@ -44,10 +44,11 @@ struct Genode::Platform : Noncopyable Expanding_cpu_session_client cpu { parent, _request(Parent::Env::cpu()), Parent::Env::cpu() }; - Expanding_region_map_client rm { + Expanding_region_map_client pd_rm { parent, pd.rpc_cap(), pd.address_space(), Parent::Env::pd() }; - Pd_ram_allocator ram { pd }; + Pd_local_rm local_rm { pd_rm }; + Pd_ram_allocator ram { pd }; Attached_stack_area stack_area { parent, pd.rpc_cap() }; diff --git a/repos/base/src/lib/base/child.cc b/repos/base/src/lib/base/child.cc index c528017798..1f0a3ebd39 100644 --- a/repos/base/src/lib/base/child.cc +++ b/repos/base/src/lib/base/child.cc @@ -771,7 +771,7 @@ void Child::_try_construct_env_dependent_members() if (_policy.forked()) { _start_result = Start_result::OK; } else { - _policy.with_address_space(_pd.session(), [&] (Region_map &address_space) { + _policy.with_address_space(_pd.session(), [&] (Genode::Region_map &address_space) { _start_result = _start_process(_linker_dataspace(), _pd.session(), *_initial_thread, _initial_thread_start, _local_rm, address_space, cap()); @@ -922,7 +922,7 @@ void Child::close_all_sessions() } -Child::Child(Region_map &local_rm, +Child::Child(Local_rm &local_rm, Rpc_entrypoint &entrypoint, Child_policy &policy) : diff --git a/repos/base/src/lib/base/child_process.cc b/repos/base/src/lib/base/child_process.cc index 54da16adae..fdd1236659 100644 --- a/repos/base/src/lib/base/child_process.cc +++ b/repos/base/src/lib/base/child_process.cc @@ -26,30 +26,24 @@ using namespace Genode; Child::Load_result Child::_load_static_elf(Dataspace_capability elf_ds, Ram_allocator &ram, - Region_map &local_rm, + Local_rm &local_rm, Region_map &remote_rm, Parent_capability parent_cap) { - addr_t const elf_addr = local_rm.attach(elf_ds, Region_map::Attr{}).convert( - [&] (Region_map::Range range) { return range.start; }, - [&] (Region_map::Attach_error const e) -> addr_t { - if (e == Region_map::Attach_error::INVALID_DATASPACE) - error("dynamic linker is an invalid dataspace"); - if (e == Region_map::Attach_error::REGION_CONFLICT) - error("region conflict while attaching dynamic linker"); - return 0; }); + Local_rm::Result attached_elf = local_rm.attach(elf_ds, { }); + + if (attached_elf == Local_rm::Error::INVALID_DATASPACE) + error("dynamic linker is an invalid dataspace"); + if (attached_elf == Local_rm::Error::REGION_CONFLICT) + error("region conflict while attaching dynamic linker"); + + addr_t const elf_addr = attached_elf.convert( + [&] (Local_rm::Attachment &a) { return addr_t(a.ptr); }, + [&] (Local_rm::Error) { return 0UL; }); if (!elf_addr) return Load_error::INVALID; - /* detach ELF binary from local address space when leaving the scope */ - struct Elf_detach_guard - { - Region_map &local_rm; - addr_t const addr; - ~Elf_detach_guard() { local_rm.detach(addr); } - } elf_detach_guard { .local_rm = local_rm, .addr = elf_addr }; - Elf_binary elf(elf_addr); Entry const entry { elf.entry() }; @@ -84,71 +78,63 @@ Child::Load_result Child::_load_static_elf(Dataspace_capability elf_ds, */ /* alloc dataspace */ - Ram_allocator::Result alloc_result = ram.try_alloc(size); - - if (alloc_result.failed()) + Ram_allocator::Result allocated_rw = ram.try_alloc(size); + if (allocated_rw.failed()) error("allocation of read-write segment failed"); - using Alloc_error = Ram_allocator::Alloc_error; + if (allocated_rw == Alloc_error::OUT_OF_RAM) return Load_error::OUT_OF_RAM; + if (allocated_rw == Alloc_error::OUT_OF_CAPS) return Load_error::OUT_OF_CAPS; + if (allocated_rw.failed()) return Load_error::INVALID; - if (alloc_result == Alloc_error::OUT_OF_RAM) return Load_error::OUT_OF_RAM; - if (alloc_result == Alloc_error::OUT_OF_CAPS) return Load_error::OUT_OF_CAPS; - if (alloc_result.failed()) return Load_error::INVALID; + Ram::Capability ds_cap = allocated_rw.convert( + [&] (Ram::Allocation &a) { return a.cap; }, + [&] (Alloc_error) { return Ram::Capability(); }); - Dataspace_capability ds_cap = alloc_result.convert( - [&] (Ram::Allocation &allocation) { - allocation.deallocate = false; - return allocation.cap; - }, - [&] (Alloc_error) { /* handled above */ return Dataspace_capability(); }); - - /* attach dataspace */ + /* locally attach dataspace for segment */ Region_map::Attr attr { }; attr.writeable = true; - void * const ptr = local_rm.attach(ds_cap, attr).convert( - [&] (Region_map::Range range) { return (void *)range.start; }, - [&] (Region_map::Attach_error const e) { - if (e == Region_map::Attach_error::INVALID_DATASPACE) - error("attempt to attach invalid segment dataspace"); - if (e == Region_map::Attach_error::REGION_CONFLICT) - error("region conflict while locally attaching ELF segment"); - return nullptr; }); - if (!ptr) + Local_rm::Result attached_rw = local_rm.attach(ds_cap, attr); + + if (attached_rw == Local_rm::Error::INVALID_DATASPACE) + error("attempt to attach invalid segment dataspace"); + if (attached_rw == Local_rm::Error::REGION_CONFLICT) + error("region conflict while locally attaching ELF segment"); + if (attached_rw.failed()) return Load_error::INVALID; - addr_t const laddr = elf_addr + seg.file_offset(); + attached_rw.with_result([&] (Local_rm::Attachment &dst) { - /* copy contents and fill with zeros */ - memcpy(ptr, (void *)laddr, seg.file_size()); - if (size > seg.file_size()) - memset((void *)((addr_t)ptr + seg.file_size()), - 0, size - seg.file_size()); + /* copy contents and fill with zeros */ + addr_t const src_addr = elf_addr + seg.file_offset(); + memcpy(dst.ptr, (void *)src_addr, seg.file_size()); + if (size > seg.file_size()) + memset((void *)(addr_t(dst.ptr) + seg.file_size()), + 0, size - seg.file_size()); - /* - * We store the parent information at the beginning of the first - * data segment - */ - if (!parent_info) { - *(Untyped_capability::Raw *)ptr = parent_cap.raw(); - parent_info = true; - } - - /* detach dataspace */ - local_rm.detach(addr_t(ptr)); + /* + * We store the parent information at the beginning of the + * first data segment + */ + if (!parent_info) { + *(Untyped_capability::Raw *)dst.ptr = parent_cap.raw(); + parent_info = true; + } + }, [&] (Local_rm::Error) { }); auto remote_attach_result = remote_rm.attach(ds_cap, Region_map::Attr { - .size = size, - .offset = { }, - .use_at = true, - .at = addr, - .executable = false, - .writeable = true + .size = size, .offset = { }, + .use_at = true, .at = addr, + .executable = false, .writeable = true }); if (remote_attach_result.failed()) { error("failed to remotely attach writable ELF segment"); error("addr=", (void *)addr, " size=", (void *)size); return Load_error::INVALID; } + + /* keep allocation */ + allocated_rw.with_result([] (Ram::Allocation &a) { a.deallocate = false; }, + [] (Alloc_error) { }); } else { /* read-only segment */ @@ -157,12 +143,9 @@ Child::Load_result Child::_load_static_elf(Dataspace_capability elf_ds, warning("filesz and memsz for read-only segment differ"); auto remote_attach_result = remote_rm.attach(elf_ds, Region_map::Attr { - .size = size, - .offset = seg.file_offset(), - .use_at = true, - .at = addr, - .executable = seg.flags().x, - .writeable = false + .size = size, .offset = seg.file_offset(), + .use_at = true, .at = addr, + .executable = seg.flags().x, .writeable = false }); if (remote_attach_result.failed()) { error("failed to remotely attach read-only ELF segment"); @@ -209,7 +192,7 @@ Child::Start_result Child::_start_process(Dataspace_capability ldso_ds, Pd_session &pd, Initial_thread_base &initial_thread, Initial_thread::Start &start, - Region_map &local_rm, + Local_rm &local_rm, Region_map &remote_rm, Parent_capability parent_cap) { diff --git a/repos/base/src/lib/base/component.cc b/repos/base/src/lib/base/component.cc index b3303a0c0f..e58902c98b 100644 --- a/repos/base/src/lib/base/component.cc +++ b/repos/base/src/lib/base/component.cc @@ -42,15 +42,17 @@ struct Genode::Component_env : Env { Platform &_platform; - Parent &_parent = _platform.parent; - Pd_session &_pd = _platform.pd; - Cpu_session &_cpu = _platform.cpu; - Region_map &_rm = _platform.rm; + using Local_rm = Local::Constrained_region_map; + + Parent &_parent = _platform.parent; + Pd_session &_pd = _platform.pd; + Cpu_session &_cpu = _platform.cpu; + Local_rm &_local_rm = _platform.local_rm; Capability _pd_cap = _platform.pd.rpc_cap(); Capability _cpu_cap = _platform.cpu.rpc_cap(); - Pd_ram_allocator _ram { _pd }; + Pd_ram_allocator _ram { _pd }; Entrypoint &_ep; @@ -85,7 +87,7 @@ struct Genode::Component_env : Env Parent &parent() override { return _parent; } Cpu_session &cpu() override { return _cpu; } - Region_map &rm() override { return _rm; } + Local_rm &rm() override { return _local_rm; } Pd_session &pd() override { return _pd; } Ram_allocator &ram() override { return _ram; } Entrypoint &ep() override { return _ep; } diff --git a/repos/base/src/lib/base/heap.cc b/repos/base/src/lib/base/heap.cc index 7a8ef35eca..f722ee6380 100644 --- a/repos/base/src/lib/base/heap.cc +++ b/repos/base/src/lib/base/heap.cc @@ -44,7 +44,7 @@ void Heap::Dataspace_pool::remove_and_free(Dataspace &ds) */ Ram_dataspace_capability ds_cap = ds.cap; - addr_t const at = addr_t(ds.local_addr); + void * const at = ds.local_addr; size_t const size = ds.size; remove(&ds); @@ -57,11 +57,12 @@ void Heap::Dataspace_pool::remove_and_free(Dataspace &ds) */ ds.~Dataspace(); - region_map->detach(at); - { /* deallocate via '~Allocation' */ Ram::Allocation { *ram_alloc, { ds_cap, size } }; + + /* detach via '~Attachment' */ + Local_rm::Attachment { *local_rm, { at, size } }; } } @@ -88,72 +89,54 @@ Heap::_allocate_dataspace(size_t size, bool enforce_separate_metadata) using Result = Alloc_ds_result; return _ds_pool.ram_alloc->try_alloc(size).convert( - [&] (Ram::Allocation &allocation) -> Result { - struct Attach_guard - { - Region_map &rm; - Region_map::Range range { }; - bool keep = false; - - Attach_guard(Region_map &rm) : rm(rm) { } - - ~Attach_guard() { if (!keep && range.start) rm.detach(range.start); } - - } attach_guard(*_ds_pool.region_map); - - Region_map::Attr attr { }; + Local_rm::Attach_attr attr { }; attr.writeable = true; - Region_map::Attach_result const result = _ds_pool.region_map->attach(allocation.cap, attr); - if (result.failed()) { - using Error = Region_map::Attach_error; - return result.convert( - [&] (auto) /* never called */ { return Alloc_error::DENIED; }, - [&] (Error e) { - switch (e) { - case Error::OUT_OF_RAM: return Alloc_error::OUT_OF_RAM; - case Error::OUT_OF_CAPS: return Alloc_error::OUT_OF_CAPS; - case Error::REGION_CONFLICT: break; - case Error::INVALID_DATASPACE: break; - } - return Alloc_error::DENIED; - }); - } + return _ds_pool.local_rm->attach(allocation.cap, attr).convert( + [&] (Local_rm::Attachment &attachment) -> Result { - allocation.deallocate = false; - attach_guard.keep = true; + Alloc_result metadata = Alloc_error::DENIED; - result.with_result( - [&] (Region_map::Range range) { attach_guard.range = range; }, - [&] (auto) { /* handled above */ }); + /* allocate the 'Dataspace' structure */ + if (enforce_separate_metadata) { + metadata = _unsynchronized_alloc(sizeof(Heap::Dataspace)); - Alloc_result metadata = Alloc_error::DENIED; + } else { - /* allocate the 'Dataspace' structure */ - if (enforce_separate_metadata) { - metadata = _unsynchronized_alloc(sizeof(Heap::Dataspace)); + /* add new local address range to our local allocator */ + _alloc->add_range(addr_t(attachment.ptr), size).with_result( + [&] (Ok) { + metadata = _alloc->alloc_aligned(sizeof(Heap::Dataspace), log2(16U)); }, + [&] (Alloc_error error) { + metadata = error; }); + } - } else { + return metadata.convert( + [&] (Allocation &md) -> Result { + md .deallocate = false; + allocation.deallocate = false; + attachment.deallocate = false; - /* add new local address range to our local allocator */ - _alloc->add_range(attach_guard.range.start, size).with_result( - [&] (Ok) { - metadata = _alloc->alloc_aligned(sizeof(Heap::Dataspace), log2(16U)); }, - [&] (Alloc_error error) { - metadata = error; }); - } - - return metadata.convert( - [&] (Allocation &md) -> Result { - md.deallocate = false; - Dataspace &ds = *construct_at(md.ptr, allocation.cap, - (void *)attach_guard.range.start, size); - _ds_pool.insert(&ds); - return &ds; + Dataspace &ds = *construct_at(md.ptr, allocation.cap, + attachment.ptr, size); + _ds_pool.insert(&ds); + return &ds; + }, + [&] (Alloc_error error) { + return error; }); }, - [&] (Alloc_error error) { - return error; }); + [&] (Local_rm::Error e) { + using Error = Local_rm::Error; + switch (e) { + case Error::OUT_OF_RAM: return Alloc_error::OUT_OF_RAM; + case Error::OUT_OF_CAPS: return Alloc_error::OUT_OF_CAPS; + case Error::REGION_CONFLICT: break; + case Error::INVALID_DATASPACE: break; + } + return Alloc_error::DENIED; + } + ); }, [&] (Alloc_error error) { return error; }); @@ -317,13 +300,13 @@ void Heap::free(void *addr, size_t) Heap::Heap(Ram_allocator *ram_alloc, - Region_map *region_map, + Local_rm *local_rm, size_t quota_limit, void *static_addr, size_t static_size) : _alloc(nullptr), - _ds_pool(ram_alloc, region_map), + _ds_pool(ram_alloc, local_rm), _quota_limit(quota_limit), _quota_used(0), _chunk_size(MIN_CHUNK_SIZE) { diff --git a/repos/base/src/lib/base/platform.cc b/repos/base/src/lib/base/platform.cc index dd7cf1d1c2..ed5e1e7fc6 100644 --- a/repos/base/src/lib/base/platform.cc +++ b/repos/base/src/lib/base/platform.cc @@ -31,7 +31,7 @@ Platform &Genode::init_platform() init_log(platform.parent); init_rpc_cap_alloc(platform.parent); init_cap_slab(platform.pd, platform.parent); - init_thread(platform.cpu, platform.rm); + init_thread(platform.cpu, platform.local_rm); init_thread_start(platform.pd.rpc_cap()); init_thread_bootstrap(platform.cpu, platform.parent.main_thread_cap()); init_signal_receiver(platform.pd, platform.parent); diff --git a/repos/base/src/lib/base/sliced_heap.cc b/repos/base/src/lib/base/sliced_heap.cc index c1dfcb4120..2d34212720 100644 --- a/repos/base/src/lib/base/sliced_heap.cc +++ b/repos/base/src/lib/base/sliced_heap.cc @@ -18,9 +18,9 @@ using namespace Genode; -Sliced_heap::Sliced_heap(Ram_allocator &ram_alloc, Region_map ®ion_map) +Sliced_heap::Sliced_heap(Ram_allocator &ram_alloc, Local_rm &local_rm) : - _ram_alloc(ram_alloc), _region_map(region_map) + _ram_alloc(ram_alloc), _local_rm(local_rm) { } @@ -40,6 +40,8 @@ Sliced_heap::~Sliced_heap() Allocator::Alloc_result Sliced_heap::try_alloc(size_t requested_size) { + using Result = Alloc_result; + /* allocation includes space for block meta data and is page-aligned */ size_t const size = align_addr(requested_size + sizeof(Block), 12); @@ -47,55 +49,40 @@ Allocator::Alloc_result Sliced_heap::try_alloc(size_t requested_size) [&] (Ram::Allocation &allocation) -> Alloc_result { - struct Attach_guard - { - Region_map &rm; - Region_map::Range range { }; - bool keep = false; - - Attach_guard(Region_map &rm) : rm(rm) { } - - ~Attach_guard() { if (!keep && range.start) rm.detach(range.start); } - - } attach_guard(_region_map); - - Region_map::Attr attr { }; + Local_rm::Attach_attr attr { }; attr.writeable = true; - Region_map::Attach_result const result = _region_map.attach(allocation.cap, attr); - if (result.failed()) { - using Error = Region_map::Attach_error; - return result.convert( - [&] (auto) /* never called */ { return Alloc_error::DENIED; }, - [&] (Error e) { - switch (e) { - case Error::OUT_OF_RAM: return Alloc_error::OUT_OF_RAM; - case Error::OUT_OF_CAPS: return Alloc_error::OUT_OF_CAPS; - case Error::REGION_CONFLICT: break; - case Error::INVALID_DATASPACE: break; - } - return Alloc_error::DENIED; - }); - } + return _local_rm.attach(allocation.cap, attr).convert( - result.with_result( - [&] (Region_map::Range range) { attach_guard.range = range; }, - [&] (auto) { /* handled above */ }); + [&] (Local_rm::Attachment &attachment) -> Result { - /* serialize access to block list */ - Mutex::Guard guard(_mutex); + /* serialize access to block list */ + Mutex::Guard guard(_mutex); - Block * const block = construct_at((void *)attach_guard.range.start, - allocation.cap, size); - _consumed += size; - _blocks.insert(block); + Block * const block = construct_at(attachment.ptr, + allocation.cap, size); + _consumed += size; + _blocks.insert(block); - allocation.deallocate = false; - attach_guard.keep = true; + allocation.deallocate = false; + attachment.deallocate = false; - /* skip meta data prepended to the payload portion of the block */ - return { *this, { .ptr = block + 1, .num_bytes = requested_size } }; + /* skip meta data prepended to the payload portion of the block */ + return { *this, { .ptr = block + 1, .num_bytes = requested_size } }; + }, + [&] (Local_rm::Error e) { + + using Error = Local_rm::Error; + switch (e) { + case Error::OUT_OF_RAM: return Alloc_error::OUT_OF_RAM; + case Error::OUT_OF_CAPS: return Alloc_error::OUT_OF_CAPS; + case Error::REGION_CONFLICT: break; + case Error::INVALID_DATASPACE: break; + } + return Alloc_error::DENIED; + } + ); }, - [&] (Ram::Error e) { return e; }); + [&] (Alloc_error e) { return e; }); } @@ -129,7 +116,7 @@ void Sliced_heap::free(void *addr, size_t) block->~Block(); } - _region_map.detach(addr_t(local_addr)); + _local_rm.detach(addr_t(local_addr)); { /* deallocate via '~Allocation' */ diff --git a/repos/base/src/lib/base/thread.cc b/repos/base/src/lib/base/thread.cc index da75fc98ec..6613fd577a 100644 --- a/repos/base/src/lib/base/thread.cc +++ b/repos/base/src/lib/base/thread.cc @@ -24,9 +24,10 @@ #include using namespace Genode; +using Local_rm = Local::Constrained_region_map; -static Region_map *local_rm_ptr; +static Local_rm *local_rm_ptr; static Cpu_session *cpu_session_ptr; @@ -284,8 +285,9 @@ void Thread::_init_cpu_session_and_trace_control() Region_map::Attr attr { }; attr.writeable = true; local_rm_ptr->attach(ds, attr).with_result( - [&] (Region_map::Range range) { - _trace_control = reinterpret_cast(range.start); }, + [&] (Local_rm::Attachment &a) { + a.deallocate = false; + _trace_control = reinterpret_cast(a.ptr); }, [&] (Region_map::Attach_error) { error("failed to initialize trace control for new thread"); } ); @@ -340,7 +342,7 @@ Thread::~Thread() } -void Genode::init_thread(Cpu_session &cpu_session, Region_map &local_rm) +void Genode::init_thread(Cpu_session &cpu_session, Local_rm &local_rm) { local_rm_ptr = &local_rm; cpu_session_ptr = &cpu_session; diff --git a/repos/base/src/lib/base/trace.cc b/repos/base/src/lib/base/trace.cc index c0183529bb..0f4cbff219 100644 --- a/repos/base/src/lib/base/trace.cc +++ b/repos/base/src/lib/base/trace.cc @@ -105,9 +105,10 @@ bool Trace::Logger::_evaluate_control() .use_at = { }, .at = { }, .executable = true, .writeable = true, }).with_result( - [&] (Region_map::Range range) { - policy_module = reinterpret_cast(range.start); }, - [&] (Region_map::Attach_error) { error("failed to attach trace policy"); } + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; + policy_module = reinterpret_cast(a.ptr); }, + [&] (Env::Local_rm::Error) { error("failed to attach trace policy"); } ); if (!policy_module) @@ -134,8 +135,9 @@ bool Trace::Logger::_evaluate_control() Region_map::Attr attr { }; attr.writeable = true; _env().rm().attach(buffer_ds, attr).with_result( - [&] (Region_map::Range range) { - buffer = reinterpret_cast(range.start); }, + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; + buffer = reinterpret_cast(a.ptr); }, [&] (Region_map::Attach_error) { error("failed to attach trace buffer"); }); if (!buffer) return false; @@ -242,8 +244,9 @@ Trace::Logger *Thread::_logger() Region_map::Attr attr { }; attr.writeable = true; _env().rm().attach(ds, attr).with_result( - [&] (Region_map::Range range) { - main_trace_control = reinterpret_cast(range.start); }, + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; + main_trace_control = reinterpret_cast(a.ptr); }, [&] (Region_map::Attach_error) { error("failed to attach trace control"); }); } diff --git a/repos/base/src/lib/cxx/exception.cc b/repos/base/src/lib/cxx/exception.cc index 20afd9bd78..03a17ea549 100644 --- a/repos/base/src/lib/cxx/exception.cc +++ b/repos/base/src/lib/cxx/exception.cc @@ -70,7 +70,8 @@ static void terminate_handler() } -void Genode::init_exception_handling(Ram_allocator &ram, Region_map &rm) +void Genode::init_exception_handling(Ram_allocator &ram, + Local::Constrained_region_map &rm) { init_cxx_heap(ram, rm); diff --git a/repos/base/src/lib/cxx/malloc_free.cc b/repos/base/src/lib/cxx/malloc_free.cc index b4f1f9e04b..f6990a2587 100644 --- a/repos/base/src/lib/cxx/malloc_free.cc +++ b/repos/base/src/lib/cxx/malloc_free.cc @@ -48,7 +48,7 @@ Heap &cxx_heap() * '__cxa_allocate_exception', which, in turn, calls 'malloc'. The cxx library * uses a local implementation of 'malloc' using a dedicated heap instance. */ -void Genode::init_cxx_heap(Ram_allocator &ram, Region_map &rm) +void Genode::init_cxx_heap(Ram_allocator &ram, Local::Constrained_region_map &rm) { /* * Exception frames are small. Hence, a small static backing store suffices diff --git a/repos/base/src/lib/ldso/include/file.h b/repos/base/src/lib/ldso/include/file.h index 66447189f2..10f3d5073e 100644 --- a/repos/base/src/lib/ldso/include/file.h +++ b/repos/base/src/lib/ldso/include/file.h @@ -354,8 +354,8 @@ struct Linker::Elf_file : File .executable = { }, .writeable = true }).convert( - [&] (Genode::Region_map::Range range) { return (void *)range.start; }, - [&] (Genode::Region_map::Attach_error) { return nullptr; } + [&] (Env::Local_rm::Attachment &a) { a.deallocate = false; return a.ptr; }, + [&] (Env::Local_rm::Error) { return nullptr; } ); if (!src) { error("dynamic linker failed to locally map RW segment ", nr); diff --git a/repos/base/src/lib/ldso/include/region_map.h b/repos/base/src/lib/ldso/include/region_map.h index 67b74a2efd..fe6c867e21 100644 --- a/repos/base/src/lib/ldso/include/region_map.h +++ b/repos/base/src/lib/ldso/include/region_map.h @@ -61,7 +61,8 @@ class Linker::Region_map .executable = true, .writeable = true }).with_result( - [&] (Genode::Region_map::Range) { + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; if (_range.add_range(base, Pd_session::LINKER_AREA_SIZE).failed()) warning("failed to initialize linker-area range allocator"); @@ -70,7 +71,7 @@ class Linker::Region_map " .. ", Hex(base + Pd_session::LINKER_AREA_SIZE - 1), ": linker area"); }, - [&] (Genode::Region_map::Attach_error) { + [&] (Env::Local_rm::Error) { error("failed to locally attach linker area"); } ); } diff --git a/repos/base/src/lib/ldso/main.cc b/repos/base/src/lib/ldso/main.cc index ab588abac8..37d772c82c 100644 --- a/repos/base/src/lib/ldso/main.cc +++ b/repos/base/src/lib/ldso/main.cc @@ -652,43 +652,39 @@ void Genode::init_ldso_phdr(Env &env) * dynamic linker within the linker area, keeping the rest of the * component's virtual address space unpolluted. */ - struct Linker_area_region_map : Region_map + struct Linker_local_rm : Env::Local_rm { - struct Not_implemented : Exception { }; - - Attach_result attach(Dataspace_capability ds, Attr const &) override + Result attach(Dataspace_capability ds, Attach_attr const &) override { size_t const size = Dataspace_client(ds).size(); Linker::Region_map &linker_area = *Linker::Region_map::r(); - return linker_area.alloc_region_at_end(size).convert( + return linker_area.alloc_region_at_end(size).convert( [&] (addr_t const at) { - return linker_area.attach(ds, Region_map::Attr { - .size = size, - .offset = { }, - .use_at = true, - .at = at, - .executable = { }, - .writeable = true }); + + Linker::Region_map::Attach_result const area_result = + linker_area.attach(ds, { + .size = size, .offset = { }, + .use_at = true, .at = at, + .executable = { }, .writeable = true }); + + return area_result.convert( + [&] (Region_map::Range r) -> Result { + return { *this, { (void *)r.start, r.num_bytes } }; + }, + [&] (Error e) { return e; } + ); }, [&] (Linker::Region_map::Alloc_region_error) { - return Attach_error::REGION_CONFLICT; } + return Error::REGION_CONFLICT; } ); } - void detach(addr_t) override { throw Not_implemented(); } - - void fault_handler(Signal_context_capability) override { } - - Fault fault() override { throw Not_implemented(); } - - Dataspace_capability dataspace() override { throw Not_implemented(); } - - Linker_area_region_map() { } + void _free(Attachment &) override { }; }; - static Linker_area_region_map ld_rm { }; + static Linker_local_rm ld_rm { }; /* * Use a statically allocated initial block to make the first dynamic @@ -773,6 +769,7 @@ void *Dynamic_linker::_respawn(Env &env, char const *binary, char const *entry_n throw Dynamic_linker::Invalid_symbol(); } +extern "C" void wait_for_continue(); void Component::construct(Genode::Env &env) { diff --git a/repos/base/src/test/rm_nested/main.cc b/repos/base/src/test/rm_nested/main.cc index 28e79f5836..0a95240852 100644 --- a/repos/base/src/test/rm_nested/main.cc +++ b/repos/base/src/test/rm_nested/main.cc @@ -90,22 +90,36 @@ class Local_fault_handler : public Entrypoint }; -static void *ptr_from_attach_result(Region_map::Attach_result const &result) +using Attach_attr = Region_map::Attr; + + +static Attach_attr const + attr_rw { .size = { }, .offset = { }, + .use_at = { }, .at = { }, + .executable = { }, .writeable = true }, + attr_ro_at_0x1000 { .size = { }, .offset = { }, + .use_at = true, .at = 0x1000, + .executable = { }, .writeable = { } }; + + +static void *attach(Region_map &rm, Dataspace_capability ds, Attach_attr attr) { - return result.convert( + return rm.attach(ds, attr).convert( [&] (Region_map::Range range) { return (void *)range.start; }, [&] (Region_map::Attach_error) { - error("read-only attach unexpectedly failed"); + error("remote read-only attach unexpectedly failed"); return nullptr; }); } -static void *attach_rw(Region_map &rm, Dataspace_capability ds) +static void *attach(Env::Local_rm &local_rm, Dataspace_capability ds, Attach_attr attr) { - return ptr_from_attach_result(rm.attach(ds, { - .size = { }, .offset = { }, - .use_at = { }, .at = { }, - .executable = { }, .writeable = true })); + return local_rm.attach(ds, attr).convert( + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; return a.ptr; }, + [&] (Env::Local_rm::Error) { + error("local read-only attach unexpectedly failed"); + return nullptr; }); } @@ -124,7 +138,7 @@ void nested_regions(Genode::Env &env) Region_map_client rm_top(rm.create(MANAGED_REGION_TOP_SIZE)); Dataspace_client rm_top_client(rm_top.dataspace()); - void *ptr_top = attach_rw(env.rm(), rm_top.dataspace()); + void *ptr_top = attach(env.rm(), rm_top.dataspace(), attr_rw); addr_t const addr_top = reinterpret_cast(ptr_top); log(" region top ", Hex_range(addr_top, rm_top_client.size())); @@ -132,13 +146,13 @@ void nested_regions(Genode::Env &env) /* shim region 1 */ Region_map_client rm_shim1(rm.create(MANAGED_REGION_SHIM1_SIZE)); Dataspace_client rm_shim1_client(rm_shim1.dataspace()); - void *ptr_shim1 = attach_rw(rm_top, rm_shim1.dataspace()); + void *ptr_shim1 = attach(rm_top, rm_shim1.dataspace(), attr_rw); addr_t const addr_shim1 = reinterpret_cast(ptr_shim1); /* shim region 2 */ Region_map_client rm_shim2(rm.create(MANAGED_REGION_SHIM2_SIZE)); Dataspace_client rm_shim2_client(rm_shim2.dataspace()); - void *ptr_shim2 = attach_rw(rm_top, rm_shim2.dataspace()); + void *ptr_shim2 = attach(rm_top, rm_shim2.dataspace(), attr_rw); addr_t const addr_shim2 = reinterpret_cast(ptr_shim2); log(" region shim ", @@ -148,12 +162,8 @@ void nested_regions(Genode::Env &env) /* attach some memory to region 2 as readonly and touch/map it */ size_t const shim2_ram_size = PAGE_SIZE * 2; Dataspace_capability shim2_ram_ds = env.ram().alloc(shim2_ram_size); - void * const ptr_shim2_ram = - ptr_from_attach_result(rm_shim2.attach(shim2_ram_ds, { - .size = { }, .offset = { }, - .use_at = true, .at = 0x1000, - .executable = { }, .writeable = { } })); + void * const ptr_shim2_ram = attach(rm_shim2, shim2_ram_ds, attr_ro_at_0x1000); addr_t const addr_shim2_ram = reinterpret_cast(ptr_shim2_ram); addr_t const read_shim2 = addr_top + addr_shim2 + addr_shim2_ram; @@ -171,11 +181,10 @@ void nested_regions(Genode::Env &env) Dataspace_client rm_bottom_client(rm_bottom.dataspace()); size_t const size_bottom = MANAGED_REGION_BOTTOM_SIZE - MANAGED_REGION_SHIM2_SIZE; - void const * const ptr_bottom = - ptr_from_attach_result(rm_shim1.attach(rm_bottom.dataspace(), { - .size = size_bottom, .offset = { }, - .use_at = { }, .at = { }, - .executable = { }, .writeable = { } })); + void const * const ptr_bottom = attach(rm_shim1, rm_bottom.dataspace(), { + .size = size_bottom, .offset = { }, + .use_at = { }, .at = { }, + .executable = { }, .writeable = { } }); addr_t const addr_bottom = reinterpret_cast(ptr_bottom); @@ -187,16 +196,15 @@ void nested_regions(Genode::Env &env) /* attach some memory to bottom as writeable */ Dataspace_capability bottom_ram_ds = env.ram().alloc(MANAGED_REGION_BOTTOM_SIZE); { - void * base_rw = attach_rw(env.rm(), bottom_ram_ds); + void * base_rw = attach(env.rm(), bottom_ram_ds, attr_rw); memset(base_rw, 0xff, MANAGED_REGION_BOTTOM_SIZE); env.rm().detach(addr_t(base_rw)); } - void const * const ptr_bottom_ram = - ptr_from_attach_result(rm_bottom.attach(bottom_ram_ds, { - .size = { }, .offset = { }, - .use_at = true, .at = 0, - .executable = { }, .writeable = true })); + void const * const ptr_bottom_ram = attach(rm_bottom, bottom_ram_ds, { + .size = { }, .offset = { }, + .use_at = true, .at = 0, + .executable = { }, .writeable = true }); addr_t const addr_bottom_ram = reinterpret_cast(ptr_bottom_ram); addr_t const write_bottom = addr_top + addr_shim1 + addr_bottom + addr_bottom_ram; @@ -243,7 +251,7 @@ void Component::construct(Genode::Env & env) /* * Attach region map as dataspace to the local address space. */ - void *addr = attach_rw(env.rm(), region_map.dataspace()); + void *addr = attach(env.rm(), region_map.dataspace(), attr_rw); log("attached sub dataspace at local address ", addr); Dataspace_client client(region_map.dataspace()); diff --git a/repos/base/src/test/rm_stress/main.cc b/repos/base/src/test/rm_stress/main.cc index c04a9c00e9..385e868842 100644 --- a/repos/base/src/test/rm_stress/main.cc +++ b/repos/base/src/test/rm_stress/main.cc @@ -54,25 +54,28 @@ void Component::construct(Env &env) for (unsigned i = 0; i < sizeof(page)/sizeof(*page); ++i) { addr_t const offset = 0; - uint8_t volatile const *v = - env.rm().attach(page[i].cap(), { - .size = page[i].size(), - .offset = offset, - .use_at = { }, - .at = { }, - .executable = false, - .writeable = true - }).convert( - [&] (Region_map::Range range) { return (uint8_t *)range.start; }, - [&] (Region_map::Attach_error) { return nullptr; } - ); + env.rm().attach(page[i].cap(), { + .size = page[i].size(), + .offset = offset, + .use_at = { }, + .at = { }, + .executable = false, + .writeable = true + }).with_result( + [&] (Env::Local_rm::Attachment &a) { - if (page[i].color != *v) { - error("value @ ", v, " ", X(*v), " != ", X(page[i].color), " in round ", r); - env.parent().exit(-1); - } + uint8_t const c = *(uint8_t *)a.ptr; - env.rm().detach(addr_t(v)); + if (page[i].color == c) + return; + + error("value @ ", a.ptr, " ", + X(c), " != ", X(page[i].color), " in round ", r); + env.parent().exit(-1); + }, + [&] (Env::Local_rm::Error) { + error("unexpected Local_rm::attach error"); } + ); } } diff --git a/repos/base/src/test/token/main.cc b/repos/base/src/test/token/main.cc index e138751c8a..a3b12d8b4a 100644 --- a/repos/base/src/test/token/main.cc +++ b/repos/base/src/test/token/main.cc @@ -51,8 +51,9 @@ static void test_out_of_bounds_access(Env &env) .use_at = { }, .at = { }, .executable = { }, .writeable = true } ).convert( - [&] (Region_map::Range range) { return (char *)range.start; }, - [&] (Region_map::Attach_error) { return nullptr; } + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; return (char *)a.ptr; }, + [&] (Env::Local_rm::Error) { return nullptr; } ); auto tokenize_two_tokens_at_end_of_buffer = [&] (char const * const input) diff --git a/repos/dde_ipxe/src/lib/dde_ipxe/dde_support.cc b/repos/dde_ipxe/src/lib/dde_ipxe/dde_support.cc index 218eeacdec..47b6153cdb 100644 --- a/repos/dde_ipxe/src/lib/dde_ipxe/dde_support.cc +++ b/repos/dde_ipxe/src/lib/dde_ipxe/dde_support.cc @@ -456,13 +456,13 @@ struct Slab_backend_alloc : public Genode::Allocator, return e; }); } - Slab_backend_alloc(Genode::Env &env, Genode::Region_map &rm, + Slab_backend_alloc(Genode::Env &env, Genode::Env::Local_rm &local_rm, Genode::Ram_allocator &ram, Genode::Allocator &md_alloc) : Rm_connection(env), Region_map_client(Rm_connection::create(VM_SIZE)), - _managed_ds(rm, dataspace()), _range(&md_alloc), _ram(ram) + _managed_ds(local_rm, dataspace()), _range(&md_alloc), _ram(ram) { } Genode::addr_t start() const { return _base; } diff --git a/repos/dde_rump/src/include/util/allocator_fap.h b/repos/dde_rump/src/include/util/allocator_fap.h index 3f51c301e2..41c56107a5 100644 --- a/repos/dde_rump/src/include/util/allocator_fap.h +++ b/repos/dde_rump/src/include/util/allocator_fap.h @@ -71,7 +71,7 @@ namespace Allocator { Allocator_avl _range; /* manage allocations */ bool _quota_exceeded = false; - addr_t _attach_managed_ds(Region_map &local_rm) + addr_t _attach_managed_ds(Env::Local_rm &local_rm) { return local_rm.attach(dataspace(), { .size = { }, @@ -81,8 +81,10 @@ namespace Allocator { .executable = false, .writeable = true }).convert( - [&] (Range range) { return range.start; }, - [&] (Attach_error) { + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; + return addr_t(a.ptr); }, + [&] (Env::Local_rm::Error) { error("rump backend allocator failed to attach managed dataspace"); return 0UL; } ); diff --git a/repos/dde_rump/src/lib/vfs/rump/vfs_rump.cc b/repos/dde_rump/src/lib/vfs/rump/vfs_rump.cc index f3596437e0..bb82027950 100644 --- a/repos/dde_rump/src/lib/vfs/rump/vfs_rump.cc +++ b/repos/dde_rump/src/lib/vfs/rump/vfs_rump.cc @@ -486,33 +486,32 @@ class Vfs::Rump_file_system : public File_system }; return _env.env().ram().try_alloc(s.st_size).convert( - [&] (Genode::Ram::Allocation &a) { - return _env.env().rm().attach(a.cap, { + [&] (Genode::Ram::Allocation &allocation) { + return _env.env().rm().attach(allocation.cap, { .size = { }, .offset = { }, .use_at = { }, .at = { }, .executable = { }, .writeable = true }).convert( - [&] (Region_map::Range const range) -> Dataspace_capability { + [&] (Genode::Env::Local_rm::Attachment &attachment) -> Dataspace_capability { - bool const complete = read_file_content(range); - _env.env().rm().detach(range.start); + bool const complete = read_file_content({ + .start = Genode::addr_t(attachment.ptr), + .num_bytes = attachment.num_bytes }); if (complete) { - a.deallocate = false; - return a.cap; + allocation.deallocate = false; + attachment.deallocate = false; + return allocation.cap; } - Genode::error("rump failed to read content into VFS dataspace"); return Dataspace_capability(); }, - [&] (Region_map::Attach_error) { - return Dataspace_capability(); - } + [&] (Genode::Env::Local_rm::Error) { + return Dataspace_capability(); } ); }, [&] (Genode::Ram_allocator::Alloc_error) { Genode::error("rump failed to allocate VFS dataspace of size ", s.st_size); - return Dataspace_capability(); - } + return Dataspace_capability(); } ); } diff --git a/repos/demo/include/scout/graphics_backend_impl.h b/repos/demo/include/scout/graphics_backend_impl.h index c8d49b561b..a4e950416b 100644 --- a/repos/demo/include/scout/graphics_backend_impl.h +++ b/repos/demo/include/scout/graphics_backend_impl.h @@ -39,7 +39,7 @@ class Scout::Graphics_backend_impl : public Graphics_backend Graphics_backend_impl(Graphics_backend_impl const &); Graphics_backend_impl &operator = (Graphics_backend_impl const &); - Genode::Region_map &_local_rm; + Genode::Env::Local_rm &_local_rm; Gui::Connection &_gui; @@ -82,7 +82,7 @@ class Scout::Graphics_backend_impl : public Graphics_backend * * \param alloc allocator used for allocating textures */ - Graphics_backend_impl(Genode::Region_map &local_rm, + Graphics_backend_impl(Genode::Env::Local_rm &local_rm, Gui::Connection &gui, Genode::Allocator &alloc, Area max_size, Point position, Area view_size) diff --git a/repos/demo/src/server/liquid_framebuffer/services.cc b/repos/demo/src/server/liquid_framebuffer/services.cc index bec5a210c2..f32269de42 100644 --- a/repos/demo/src/server/liquid_framebuffer/services.cc +++ b/repos/demo/src/server/liquid_framebuffer/services.cc @@ -85,7 +85,7 @@ class Window_content : public Scout::Element unsigned char *alpha; Genode::Texture texture; - Fb_texture(Genode::Ram_allocator &ram, Genode::Region_map &local_rm, + Fb_texture(Genode::Ram_allocator &ram, Genode::Env::Local_rm &local_rm, Genode::Allocator &alloc, unsigned w, unsigned h, bool config_alpha) : @@ -129,7 +129,7 @@ class Window_content : public Scout::Element }; Genode::Ram_allocator &_ram; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Genode::Allocator &_alloc; bool _config_alpha; Content_event_handler _ev_handler; @@ -157,7 +157,7 @@ class Window_content : public Scout::Element public: - Window_content(Genode::Ram_allocator &ram, Genode::Region_map &rm, + Window_content(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Genode::Allocator &alloc, unsigned fb_w, unsigned fb_h, Input::Session_component &input_session, bool config_alpha) @@ -284,7 +284,7 @@ class Framebuffer::Session_component : public Genode::Rpc_object }; -void init_window_content(Genode::Ram_allocator &ram, Genode::Region_map &rm, +void init_window_content(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Genode::Allocator &alloc, Input::Session_component &input_component, unsigned fb_w, unsigned fb_h, bool config_alpha) diff --git a/repos/demo/src/server/liquid_framebuffer/services.h b/repos/demo/src/server/liquid_framebuffer/services.h index 64bf20dbe8..cd99669b84 100644 --- a/repos/demo/src/server/liquid_framebuffer/services.h +++ b/repos/demo/src/server/liquid_framebuffer/services.h @@ -21,7 +21,7 @@ #include "elements.h" extern Scout::Element *window_content(); -extern void init_window_content(Genode::Ram_allocator &, Genode::Region_map &, +extern void init_window_content(Genode::Ram_allocator &, Genode::Env::Local_rm &, Genode::Allocator &, Input::Session_component &, unsigned fb_w, unsigned fb_h, bool config_alpha); extern void init_services(Genode::Env &, Input::Session_component &); diff --git a/repos/gems/include/gems/chunky_texture.h b/repos/gems/include/gems/chunky_texture.h index 55be0d957a..785adce8aa 100644 --- a/repos/gems/include/gems/chunky_texture.h +++ b/repos/gems/include/gems/chunky_texture.h @@ -53,7 +53,7 @@ class Chunky_texture : Genode::Attached_ram_dataspace, public Genode::Texture session_cap) : _session(session_cap), _ds(rm, _session.dataspace()), _name(name) diff --git a/repos/gems/include/gems/png_image.h b/repos/gems/include/gems/png_image.h index b0f628e750..e9b0226be8 100644 --- a/repos/gems/include/gems/png_image.h +++ b/repos/gems/include/gems/png_image.h @@ -49,7 +49,7 @@ class Png_image }; Genode::Ram_allocator &_ram; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Genode::Allocator &_alloc; class Read_struct @@ -176,7 +176,7 @@ class Png_image * \throw Read_struct_failed * \throw Info_failed */ - Png_image(Genode::Ram_allocator &ram, Genode::Region_map &rm, + Png_image(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Genode::Allocator &alloc, void const *data) : _ram(ram), _rm(rm), _alloc(alloc), _read_struct(data) diff --git a/repos/gems/include/nano3d/scene.h b/repos/gems/include/nano3d/scene.h index 196f8788c5..04e214a381 100644 --- a/repos/gems/include/nano3d/scene.h +++ b/repos/gems/include/nano3d/scene.h @@ -75,7 +75,7 @@ class Nano3d::Scene { enum { NUM_BUFFERS = 3 }; - Genode::Region_map &rm; + Genode::Env::Local_rm &local_rm; static Framebuffer::Session & _init_framebuffer(Gui::Connection &gui, @@ -105,7 +105,7 @@ class Nano3d::Scene return Gui::Area(mode.area.w, mode.area.h/NUM_BUFFERS); } - Genode::Attached_dataspace ds { rm, framebuffer.dataspace() }; + Genode::Attached_dataspace ds { local_rm, framebuffer.dataspace() }; PT *pixel_base(unsigned i) { @@ -136,9 +136,9 @@ class Nano3d::Scene } Mapped_framebuffer(Gui::Connection &gui, Gui::Area size, - Genode::Region_map &rm) + Genode::Env::Local_rm &local_rm) : - rm(rm), framebuffer(_init_framebuffer(gui, size)) + local_rm(local_rm), framebuffer(_init_framebuffer(gui, size)) { } } _framebuffer { _gui, _size, _env.rm() }; diff --git a/repos/gems/src/app/decorator/canvas.h b/repos/gems/src/app/decorator/canvas.h index aa746eaaf3..aab8446079 100644 --- a/repos/gems/src/app/decorator/canvas.h +++ b/repos/gems/src/app/decorator/canvas.h @@ -14,6 +14,9 @@ #ifndef _CANVAS_H_ #define _CANVAS_H_ +/* Genode includes */ +#include + /* Painters of the nitpicker and scout graphics backends */ #include #include @@ -36,7 +39,7 @@ namespace Decorator { Genode::Texture_base const &texture_by_id(Texture_id, Genode::Ram_allocator &, - Genode::Region_map &); + Genode::Env::Local_rm &); class Canvas_base; template class Canvas; @@ -63,12 +66,12 @@ class Decorator::Canvas : public Decorator::Canvas_base private: Genode::Ram_allocator &_ram; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Genode::Surface _surface; public: - Canvas(PT *base, Area size, Genode::Ram_allocator &ram, Genode::Region_map &rm) + Canvas(PT *base, Area size, Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm) : _ram(ram), _rm(rm), _surface(base, size) { } Rect clip() const override { return _surface.clip(); } diff --git a/repos/gems/src/app/decorator/texture_by_id.cc b/repos/gems/src/app/decorator/texture_by_id.cc index 9f56f1f867..3829e1648f 100644 --- a/repos/gems/src/app/decorator/texture_by_id.cc +++ b/repos/gems/src/app/decorator/texture_by_id.cc @@ -33,7 +33,7 @@ class Icon_texture : public Chunky_texture */ enum { WIDTH = 14, HEIGHT = 14 }; - Icon_texture(Ram_allocator &ram, Region_map &rm, + Icon_texture(Ram_allocator &ram, Env::Local_rm &rm, unsigned char rgba_data[]) : Chunky_texture(ram, rm, Surface_base::Area(WIDTH, HEIGHT)) @@ -60,7 +60,7 @@ extern unsigned char _binary_windowed_rgba_start[]; * Return texture for the specified texture ID */ Texture_base const & -Decorator::texture_by_id(Texture_id id, Ram_allocator &ram, Region_map &rm) +Decorator::texture_by_id(Texture_id id, Ram_allocator &ram, Env::Local_rm &rm) { static Icon_texture const icons[4] { { ram, rm, _binary_closer_rgba_start }, diff --git a/repos/gems/src/app/depot_autopilot/children.h b/repos/gems/src/app/depot_autopilot/children.h index 53b7a1bc80..9abcb86fd5 100644 --- a/repos/gems/src/app/depot_autopilot/children.h +++ b/repos/gems/src/app/depot_autopilot/children.h @@ -34,7 +34,7 @@ class Depot_deploy::Children Genode::Allocator &_alloc; Timer::Connection &_timer; Genode::Signal_context_capability const _config_handler; - Local::Const_pointer _curr_child { }; + ::Local::Const_pointer _curr_child { }; List_model _children { }; @@ -152,11 +152,11 @@ class Depot_deploy::Children try { Child const &child = _curr_child(); if (child.finished()) { - throw Local::Const_pointer::Invalid(); } + throw ::Local::Const_pointer::Invalid(); } child.gen_query(xml); } - catch (Local::Const_pointer::Invalid) { + catch (::Local::Const_pointer::Invalid) { struct Break : Exception { }; try { _children.for_each([&] (Child const &child) { diff --git a/repos/gems/src/app/menu_view/style_database.h b/repos/gems/src/app/menu_view/style_database.h index 3e64e78d45..ab8fb3d457 100644 --- a/repos/gems/src/app/menu_view/style_database.h +++ b/repos/gems/src/app/menu_view/style_database.h @@ -112,7 +112,7 @@ class Menu_view::Style_database * * \throw Reading_failed */ - Texture_entry(Ram_allocator &ram, Region_map &rm, Allocator &alloc, + Texture_entry(Ram_allocator &ram, Env::Local_rm &rm, Allocator &alloc, Directory const &dir, Path const &path) : path(path), @@ -168,7 +168,7 @@ class Menu_view::Style_database Entrypoint &_ep; Ram_allocator &_ram; - Region_map &_rm; + Env::Local_rm &_rm; Allocator &_alloc; Directory const &_fonts_dir; Directory const &_styles_dir; @@ -234,7 +234,7 @@ class Menu_view::Style_database public: - Style_database(Entrypoint &ep, Ram_allocator &ram, Region_map &rm, + Style_database(Entrypoint &ep, Ram_allocator &ram, Env::Local_rm &rm, Allocator &alloc, Directory const &fonts_dir, Directory const &styles_dir, Signal_context_capability style_changed_sigh) diff --git a/repos/gems/src/app/themed_decorator/theme.cc b/repos/gems/src/app/themed_decorator/theme.cc index 807e1940cc..0f6e9edd0f 100644 --- a/repos/gems/src/app/themed_decorator/theme.cc +++ b/repos/gems/src/app/themed_decorator/theme.cc @@ -39,7 +39,7 @@ struct Texture_from_png_file Png_image png_image; Texture &texture { *png_image.texture() }; - Texture_from_png_file(Genode::Ram_allocator &ram, Genode::Region_map &rm, + Texture_from_png_file(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Genode::Allocator &alloc, char const *path) : png_file(path, alloc), png_image(ram, rm, alloc, png_file.data()) @@ -48,7 +48,7 @@ struct Texture_from_png_file static Genode::Texture const & -texture_by_id(Genode::Ram_allocator &ram, Genode::Region_map &rm, +texture_by_id(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Genode::Allocator &alloc, Texture_id texture_id) { if (texture_id == TEXTURE_ID_DEFAULT) { @@ -72,7 +72,7 @@ texture_by_id(Genode::Ram_allocator &ram, Genode::Region_map &rm, static Genode::Texture const & -texture_by_element_type(Genode::Ram_allocator &ram, Genode::Region_map &rm, +texture_by_element_type(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Genode::Allocator &alloc, Decorator::Theme::Element_type type) { switch (type) { @@ -157,7 +157,7 @@ Decorator::Rect Decorator::Theme::title_geometry() const static Decorator::Rect -element_geometry(Genode::Ram_allocator &ram, Genode::Region_map &rm, +element_geometry(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Genode::Allocator &alloc, char const *sub_node_type, Texture_id texture_id) { diff --git a/repos/gems/src/app/themed_decorator/theme.h b/repos/gems/src/app/themed_decorator/theme.h index 600ea1c0cc..9a1bc73fe5 100644 --- a/repos/gems/src/app/themed_decorator/theme.h +++ b/repos/gems/src/app/themed_decorator/theme.h @@ -38,7 +38,7 @@ class Decorator::Theme private: Genode::Ram_allocator &_ram; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Genode::Allocator &_alloc; public: @@ -52,8 +52,11 @@ class Decorator::Theme enum Element_type { ELEMENT_TYPE_CLOSER, ELEMENT_TYPE_MAXIMIZER }; - Theme(Genode::Ram_allocator &ram, Genode::Region_map &rm, Genode::Allocator &alloc) - : _ram(ram), _rm(rm), _alloc(alloc) { } + Theme(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, + Genode::Allocator &alloc) + : + _ram(ram), _rm(rm), _alloc(alloc) + { } Area background_size() const; diff --git a/repos/gems/src/lib/vfs/trace/vfs.cc b/repos/gems/src/lib/vfs/trace/vfs.cc index 18adbce0e5..e934fd305a 100644 --- a/repos/gems/src/lib/vfs/trace/vfs.cc +++ b/repos/gems/src/lib/vfs/trace/vfs.cc @@ -60,9 +60,11 @@ class Vfs_trace::Trace_buffer_file_system : public Single_file_system .use_at = { }, .at = { }, .executable = { }, .writeable = true }).with_result( - [&] (Region_map::Range range) { - _buffer.construct(*(Trace::Buffer *)range.start); }, - [&] (Region_map::Attach_error) { + [&] (Genode::Env::Local_rm::Attachment &a) { + a.deallocate = false; + _buffer.construct(*(Trace::Buffer *)a.ptr); + }, + [&] (Genode::Env::Local_rm::Error) { error("failed to attach trace buffer"); } ); } diff --git a/repos/libports/ports/qt5.hash b/repos/libports/ports/qt5.hash index 1752c614f3..db8d405fd3 100644 --- a/repos/libports/ports/qt5.hash +++ b/repos/libports/ports/qt5.hash @@ -1 +1 @@ -c52e010782712328044ec1f6a70281c564fcf5c1 +c2ca2017000b44cd101a5c3a55dcfb4b0aee32b7 diff --git a/repos/libports/ports/qt5.port b/repos/libports/ports/qt5.port index 4142c8dc82..ef4097dc58 100644 --- a/repos/libports/ports/qt5.port +++ b/repos/libports/ports/qt5.port @@ -4,5 +4,5 @@ VERSION := 5.15.2 DOWNLOADS := qt5.git URL(qt5) := https://github.com/cproc/qt5.git -REV(qt5) := issue5453 +REV(qt5) := issue5516 DIR(qt5) := src/lib/qt5 diff --git a/repos/libports/ports/qt6_base.hash b/repos/libports/ports/qt6_base.hash index 6f4feb3922..1948b016cc 100644 --- a/repos/libports/ports/qt6_base.hash +++ b/repos/libports/ports/qt6_base.hash @@ -1 +1 @@ -df487d79ab3bc61d32997e96846262e9aa0eca58 +8c5d23890049e3c9aaf55f99eda616a236018992 diff --git a/repos/libports/ports/qt6_base.port b/repos/libports/ports/qt6_base.port index d6a32eaafa..262f2fcc67 100644 --- a/repos/libports/ports/qt6_base.port +++ b/repos/libports/ports/qt6_base.port @@ -4,5 +4,5 @@ VERSION := 6.6.2 DOWNLOADS := qt6_base.git URL(qt6_base) := https://github.com/cproc/qt6_base.git -REV(qt6_base) := issue5463 +REV(qt6_base) := issue5516 DIR(qt6_base) := src/lib/qt6_base diff --git a/repos/libports/src/app/qt5/qt_launchpad/main.cpp b/repos/libports/src/app/qt5/qt_launchpad/main.cpp index 21da83289f..c574672313 100644 --- a/repos/libports/src/app/qt5/qt_launchpad/main.cpp +++ b/repos/libports/src/app/qt5/qt_launchpad/main.cpp @@ -43,7 +43,7 @@ struct Qt_launchpad_namespace::Local_env : Genode::Env Parent &parent() override { return genode_env.parent(); } Cpu_session &cpu() override { return genode_env.cpu(); } - Region_map &rm() override { return genode_env.rm(); } + Env::Local_rm &rm() override { return genode_env.rm(); } Pd_session &pd() override { return genode_env.pd(); } Ram_allocator &ram() override { return genode_env.ram(); } Entrypoint &ep() override { return local_ep; } diff --git a/repos/libports/src/app/qt6/qt_launchpad/main.cpp b/repos/libports/src/app/qt6/qt_launchpad/main.cpp index 55c453f1a0..18e8fa44fa 100644 --- a/repos/libports/src/app/qt6/qt_launchpad/main.cpp +++ b/repos/libports/src/app/qt6/qt_launchpad/main.cpp @@ -43,7 +43,7 @@ struct Qt_launchpad_namespace::Local_env : Genode::Env Parent &parent() override { return genode_env.parent(); } Cpu_session &cpu() override { return genode_env.cpu(); } - Region_map &rm() override { return genode_env.rm(); } + Env::Local_rm &rm() override { return genode_env.rm(); } Pd_session &pd() override { return genode_env.pd(); } Ram_allocator &ram() override { return genode_env.ram(); } Entrypoint &ep() override { return local_ep; } diff --git a/repos/libports/src/driver/framebuffer/vesa/framebuffer.cc b/repos/libports/src/driver/framebuffer/vesa/framebuffer.cc index 0989ee65c3..101f108db3 100644 --- a/repos/libports/src/driver/framebuffer/vesa/framebuffer.cc +++ b/repos/libports/src/driver/framebuffer/vesa/framebuffer.cc @@ -169,8 +169,10 @@ int Framebuffer::map_io_mem(addr_t base, size_t size, bool write_combined, .executable = false, .writeable = true }).with_result( - [&] (Region_map::Range range) { *out_addr = (void *)range.start; }, - [&] (Region_map::Attach_error) { } + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; + *out_addr = a.ptr; }, + [&] (Env::Local_rm::Error) { } ); if (*out_addr == nullptr) diff --git a/repos/libports/src/lib/acpica/iomem.cc b/repos/libports/src/lib/acpica/iomem.cc index 732e594567..5f50640476 100644 --- a/repos/libports/src/lib/acpica/iomem.cc +++ b/repos/libports/src/lib/acpica/iomem.cc @@ -192,8 +192,10 @@ class Acpica::Io_mem .use_at = true, .at = orig_virt, .executable = false, .writeable = true }).convert( - [&] (Genode::Region_map::Range range) { return range.start; }, - [&] (Genode::Region_map::Attach_error) { return 0UL; } + [&] (Genode::Env::Local_rm::Attachment &a) { + a.deallocate = false; + return Genode::addr_t(a.ptr); }, + [&] (Genode::Env::Local_rm::Error) { return 0UL; } ); if (orig_virt != re_attached_virt) @@ -308,8 +310,10 @@ class Acpica::Io_mem .use_at = { }, .at = { }, .executable = { }, .writeable = true }).convert( - [&] (Genode::Region_map::Range r) { return (Genode::uint8_t *)r.start; }, - [&] (Genode::Region_map::Attach_error) { return nullptr; } + [&] (Genode::Env::Local_rm::Attachment &a) { + a.deallocate = false; + return (Genode::uint8_t *)a.ptr; }, + [&] (Genode::Env::Local_rm::Error) { return nullptr; } ); return reinterpret_cast(io_mem->_virt); @@ -383,7 +387,9 @@ class Acpica::Io_mem .use_at = { }, .at = { }, .executable = { }, .writeable = true }).convert( - [&] (Genode::Region_map::Range range) { return (Genode::uint8_t *)range.start; }, + [&] (Genode::Env::Local_rm::Attachment &a) { + a.deallocate = false; + return (Genode::uint8_t *)a.ptr; }, [&] (Genode::Region_map::Attach_error) { Genode::error("attaching while io_ds failed"); return nullptr; diff --git a/repos/libports/src/lib/libc/internal/cloned_malloc_heap_range.h b/repos/libports/src/lib/libc/internal/cloned_malloc_heap_range.h index 379218e67e..c69e5a6b23 100644 --- a/repos/libports/src/lib/libc/internal/cloned_malloc_heap_range.h +++ b/repos/libports/src/lib/libc/internal/cloned_malloc_heap_range.h @@ -26,7 +26,7 @@ namespace Libc { struct Cloned_malloc_heap_range; } struct Libc::Cloned_malloc_heap_range { Ram_allocator &ram; - Region_map &rm; + Env::Local_rm &rm; Ram_dataspace_capability ds; @@ -34,10 +34,11 @@ struct Libc::Cloned_malloc_heap_range Range const range; - Cloned_malloc_heap_range(Ram_allocator &ram, Region_map &rm, Range const range) + Cloned_malloc_heap_range(Ram_allocator &ram, Env::Local_rm &rm, Range const range) : ram(ram), rm(rm), ds(ram.alloc(range.num_bytes)), range(range) { + using Error = Env::Local_rm::Error; rm.attach(ds, { .size = { }, .offset = { }, @@ -46,9 +47,8 @@ struct Libc::Cloned_malloc_heap_range .executable = { }, .writeable = true }).with_result( - [&] (Range) { }, - [&] (Region_map::Attach_error e) { - using Error = Region_map::Attach_error; + [&] (Env::Local_rm::Attachment &a) { a.deallocate = false; }, + [&] (Error e) { switch (e) { case Error::OUT_OF_RAM: throw Out_of_ram(); case Error::OUT_OF_CAPS: throw Out_of_caps(); diff --git a/repos/libports/src/lib/libc/internal/env.h b/repos/libports/src/lib/libc/internal/env.h index 065844772e..14e5ee8706 100644 --- a/repos/libports/src/lib/libc/internal/env.h +++ b/repos/libports/src/lib/libc/internal/env.h @@ -65,7 +65,7 @@ class Libc::Env_implementation : public Libc::Env Parent &parent() override { return _env.parent(); } Cpu_session &cpu() override { return _env.cpu(); } - Region_map &rm() override { return _env.rm(); } + Env::Local_rm &rm() override { return _env.rm(); } Pd_session &pd() override { return _env.pd(); } Ram_allocator &ram() override { return _env.ram(); } Entrypoint &ep() override { return _env.ep(); } diff --git a/repos/libports/src/lib/libc/internal/init.h b/repos/libports/src/lib/libc/internal/init.h index 27eef5e790..f9d6938bb8 100644 --- a/repos/libports/src/lib/libc/internal/init.h +++ b/repos/libports/src/lib/libc/internal/init.h @@ -68,7 +68,7 @@ namespace Libc { /** * Virtual file system */ - void init_vfs_plugin(Monitor &, Genode::Region_map &); + void init_vfs_plugin(Monitor &, Genode::Env::Local_rm &); void init_file_operations(Cwd &, File_descriptor_allocator &, Config_accessor const &); void init_pread_pwrite(File_descriptor_allocator &); diff --git a/repos/libports/src/lib/libc/internal/mem_alloc.h b/repos/libports/src/lib/libc/internal/mem_alloc.h index 959b8e64c4..59513b11b3 100644 --- a/repos/libports/src/lib/libc/internal/mem_alloc.h +++ b/repos/libports/src/lib/libc/internal/mem_alloc.h @@ -66,7 +66,7 @@ namespace Libc { private: Ram_allocator *_ram; /* RAM session for backing store */ - Region_map *_region_map; /* region map of address space */ + Env::Local_rm *_local_rm; /* region map of address space */ bool const _executable; /* whether to allocate executable dataspaces */ public: @@ -74,10 +74,10 @@ namespace Libc { /** * Constructor */ - Dataspace_pool(Ram_allocator *ram, - Region_map *rm, bool executable) : - _ram(ram), _region_map(rm), - _executable(executable) + Dataspace_pool(Ram_allocator *ram, Env::Local_rm *rm, + bool executable) + : + _ram(ram), _local_rm(rm), _executable(executable) { } /** @@ -98,8 +98,11 @@ namespace Libc { */ int expand(size_t size, Range_allocator *alloc); - void reassign_resources(Ram_allocator *ram, Region_map *rm) { - _ram = ram, _region_map = rm; } + void reassign_resources(Ram_allocator *ram, + Env::Local_rm *rm) + { + _ram = ram, _local_rm = rm; + } }; Mutex mutable _mutex; @@ -119,7 +122,7 @@ namespace Libc { public: - Mem_alloc_impl(Region_map &rm, Ram_allocator &ram, + Mem_alloc_impl(Env::Local_rm &rm, Ram_allocator &ram, bool executable = false) : _ds_pool(&ram, &rm, executable), diff --git a/repos/libports/src/lib/libc/libc_mem_alloc.cc b/repos/libports/src/lib/libc/libc_mem_alloc.cc index 3e0e50c270..42e352f468 100644 --- a/repos/libports/src/lib/libc/libc_mem_alloc.cc +++ b/repos/libports/src/lib/libc/libc_mem_alloc.cc @@ -41,7 +41,7 @@ Libc::Mem_alloc_impl::Dataspace_pool::~Dataspace_pool() remove(ds); delete ds; - _region_map->detach(range.start); + _local_rm->detach(range.start); _ram->free(ds_cap); } } @@ -68,7 +68,7 @@ int Libc::Mem_alloc_impl::Dataspace_pool::expand(size_t size, Range_allocator *a if (result < 0) return result; - Region_map::Range const range = _region_map->attach(new_ds_cap, { + Region_map::Range const range = _local_rm->attach(new_ds_cap, { .size = { }, .offset = { }, .use_at = { }, @@ -76,7 +76,9 @@ int Libc::Mem_alloc_impl::Dataspace_pool::expand(size_t size, Range_allocator *a .executable = _executable, .writeable = true }).convert( - [&] (Region_map::Range range) { return range; }, + [&] (Env::Local_rm::Attachment &a) -> Region_map::Range { + a.deallocate = false; + return { addr_t(a.ptr), a.num_bytes }; }, [&] (Region_map::Attach_error e) { switch (e) { case Region_map::Attach_error::OUT_OF_RAM: result = -2; break; @@ -184,7 +186,7 @@ static Libc::Mem_alloc *_libc_mem_alloc_rw = nullptr; static Libc::Mem_alloc *_libc_mem_alloc_rwx = nullptr; -static void _init_mem_alloc(Region_map &rm, Ram_allocator &ram) +static void _init_mem_alloc(Env::Local_rm &rm, Ram_allocator &ram) { enum { MEMORY_EXECUTABLE = true }; diff --git a/repos/libports/src/lib/libc/vfs_plugin.cc b/repos/libports/src/lib/libc/vfs_plugin.cc index 9407450b81..a61d6d4b90 100644 --- a/repos/libports/src/lib/libc/vfs_plugin.cc +++ b/repos/libports/src/lib/libc/vfs_plugin.cc @@ -47,14 +47,14 @@ #include -static Libc::Monitor *_monitor_ptr; -static Genode::Region_map *_region_map_ptr; +static Libc::Monitor *_monitor_ptr; +static Genode::Env::Local_rm *_local_rm_ptr; -void Libc::init_vfs_plugin(Monitor &monitor, Genode::Region_map &rm) +void Libc::init_vfs_plugin(Monitor &monitor, Genode::Env::Local_rm &rm) { _monitor_ptr = &monitor; - _region_map_ptr = &rm; + _local_rm_ptr = &rm; } @@ -67,12 +67,12 @@ static Libc::Monitor & monitor() } -static Genode::Region_map ®ion_map() +static Genode::Env::Local_rm &local_rm() { struct Missing_call_of_init_vfs_plugin : Genode::Exception { }; - if (!_region_map_ptr) + if (!_local_rm_ptr) throw Missing_call_of_init_vfs_plugin(); - return *_region_map_ptr; + return *_local_rm_ptr; } @@ -2375,16 +2375,16 @@ void *Libc::Vfs_plugin::mmap(void *addr_in, ::size_t length, int prot, int flags return MAP_FAILED; } - region_map().attach(ds_cap, { + addr = local_rm().attach(ds_cap, { .size = length, .offset = addr_t(offset), .use_at = { }, .at = { }, .executable = { }, .writeable = true - }).with_result( - [&] (Region_map::Range range) { addr = (void *)range.start; }, - [&] (Region_map::Attach_error) { addr = nullptr; } + }).convert( + [&] (Env::Local_rm::Attachment &a) { a.deallocate = false; return a.ptr; }, + [&] (Env::Local_rm::Error) { return nullptr; } ); if (!addr) { @@ -2430,7 +2430,7 @@ int Libc::Vfs_plugin::munmap(void *addr, ::size_t) if (entry.start == addr) { reference_handle = entry.reference_handle; destroy(_alloc, &entry); - region_map().detach(addr_t(addr)); + local_rm().detach(addr_t(addr)); } }); diff --git a/repos/libports/src/lib/libdrm/ioctl_iris.cc b/repos/libports/src/lib/libdrm/ioctl_iris.cc index 6125229d82..59cd00230b 100644 --- a/repos/libports/src/lib/libdrm/ioctl_iris.cc +++ b/repos/libports/src/lib/libdrm/ioctl_iris.cc @@ -335,7 +335,7 @@ struct Drm::Buffer bool mmap(Genode::Env &env) { - using Region_map = Genode::Region_map; + using Local_rm = Genode::Env::Local_rm; if (!_local_addr) env.rm().attach(_allocation.cap, { @@ -346,8 +346,11 @@ struct Drm::Buffer .executable = { }, .writeable = true }).with_result( - [&] (Region_map::Range range) { _local_addr = range.start; }, - [&] (Region_map::Attach_error) { Genode::error("Drm::Buffer::mmap failed"); } + [&] (Local_rm::Attachment &a) { + a.deallocate = false; + _local_addr = Gpu::addr_t(a.ptr); }, + [&] (Local_rm::Error) { + Genode::error("Drm::Buffer::mmap failed"); } ); return (_local_addr != 0); diff --git a/repos/libports/src/lib/qemu-usb/host.cc b/repos/libports/src/lib/qemu-usb/host.cc index 106e994e8a..bee650b31c 100644 --- a/repos/libports/src/lib/qemu-usb/host.cc +++ b/repos/libports/src/lib/qemu-usb/host.cc @@ -308,7 +308,7 @@ class Device : public List_model::Element Speed &speed, Usb::Connection &usb, Allocator &alloc, - Region_map &rm, + Env::Local_rm &rm, Id_space &space, Signal_context_capability cap) : diff --git a/repos/os/include/audio_in_session/client.h b/repos/os/include/audio_in_session/client.h index 4432068524..48efd52e94 100644 --- a/repos/os/include/audio_in_session/client.h +++ b/repos/os/include/audio_in_session/client.h @@ -58,7 +58,7 @@ class Audio_in::Session_client : public Genode::Rpc_client * \param session session capability * \param progress_signal true, install 'progress_signal' receiver */ - Session_client(Genode::Region_map &rm, + Session_client(Genode::Env::Local_rm &rm, Genode::Capability session, bool progress_signal) : diff --git a/repos/os/include/audio_out_session/client.h b/repos/os/include/audio_out_session/client.h index d0273ee2c3..a40e66efb0 100644 --- a/repos/os/include/audio_out_session/client.h +++ b/repos/os/include/audio_out_session/client.h @@ -59,7 +59,7 @@ class Audio_out::Session_client : public Genode::Rpc_client * \param alloc_signal true, install 'alloc_signal' receiver * \param progress_signal true, install 'progress_signal' receiver */ - Session_client(Genode::Region_map &rm, + Session_client(Genode::Env::Local_rm &rm, Genode::Capability session, bool alloc_signal, bool progress_signal) : diff --git a/repos/os/include/block/component.h b/repos/os/include/block/component.h index b9b899b30d..ed93a19a75 100644 --- a/repos/os/include/block/component.h +++ b/repos/os/include/block/component.h @@ -207,11 +207,11 @@ class Block::Session_component : public Block::Session_component_base, * \param ep entrypoint handling this session component * \param buf_size size of packet-stream payload buffer */ - Session_component(Driver_factory &driver_factory, - Genode::Entrypoint &ep, - Genode::Region_map &rm, - size_t buf_size, - bool writeable) + Session_component(Driver_factory &driver_factory, + Genode::Entrypoint &ep, + Genode::Env::Local_rm &rm, + size_t buf_size, + bool writeable) : Session_component_base(driver_factory, buf_size), Driver_session(rm, _rq.ds, ep.rpc_ep()), _rq_phys(_rq.dma_addr), @@ -275,10 +275,10 @@ class Block::Root : public Genode::Root_component */ Session_client(Session_capability session, Genode::Range_allocator &tx_buffer_alloc, - Genode::Region_map &rm) + Genode::Env::Local_rm &rm) : Genode::Rpc_client(session), _tx(tx_cap(), rm, tx_buffer_alloc) diff --git a/repos/os/include/block_session/rpc_object.h b/repos/os/include/block_session/rpc_object.h index 6d579eec3d..2d06b4c563 100644 --- a/repos/os/include/block_session/rpc_object.h +++ b/repos/os/include/block_session/rpc_object.h @@ -36,7 +36,7 @@ class Block::Session_rpc_object : public Genode::Rpc_object } }; + using Local_rm = Genode::Local::Constrained_region_map; public: - Session_client(Genode::Region_map &local_rm, - Genode::Capability session) + Session_client(Local_rm &local_rm, Genode::Capability session) : Genode::Rpc_client(session), _ds(local_rm, call()) diff --git a/repos/os/include/file_system_session/client.h b/repos/os/include/file_system_session/client.h index f9d94003a8..65f7900024 100644 --- a/repos/os/include/file_system_session/client.h +++ b/repos/os/include/file_system_session/client.h @@ -38,7 +38,7 @@ class File_system::Session_client : public Genode::Rpc_client */ Session_client(Session_capability session, Genode::Range_allocator &tx_buffer_alloc, - Genode::Region_map &rm) + Genode::Env::Local_rm &rm) : Rpc_client(session), _tx(call(), rm, tx_buffer_alloc) diff --git a/repos/os/include/file_system_session/rpc_object.h b/repos/os/include/file_system_session/rpc_object.h index d397c0ffc3..50f9e29cbe 100644 --- a/repos/os/include/file_system_session/rpc_object.h +++ b/repos/os/include/file_system_session/rpc_object.h @@ -36,7 +36,7 @@ class File_system::Session_rpc_object : public Genode::Rpc_object * \param ram allocator for the shared-memory input buffer */ Session_component(Entrypoint &ep, Ram_allocator &ram, - Region_map &rm, Action &action) + Env::Local_rm &rm, Action &action) : _ep(ep), _action(action), _ds(ram, rm, Event_queue::QUEUE_SIZE*sizeof(Input::Event)) diff --git a/repos/os/include/input_session/client.h b/repos/os/include/input_session/client.h index f24aa3e32c..36765a46e8 100644 --- a/repos/os/include/input_session/client.h +++ b/repos/os/include/input_session/client.h @@ -26,6 +26,8 @@ class Input::Session_client : public Rpc_client { private: + using Local_rm = Local::Constrained_region_map; + Attached_dataspace _event_ds; size_t const _max_events = _event_ds.size() / sizeof(Input::Event); @@ -34,7 +36,7 @@ class Input::Session_client : public Rpc_client public: - Session_client(Region_map &local_rm, Session_capability session) + Session_client(Local_rm &local_rm, Session_capability session) : Rpc_client(session), _event_ds(local_rm, call()) diff --git a/repos/os/include/nic/component.h b/repos/os/include/nic/component.h index 3e3fd75307..9773007574 100644 --- a/repos/os/include/nic/component.h +++ b/repos/os/include/nic/component.h @@ -36,14 +36,14 @@ class Nic::Communication_buffers Communication_buffers(Genode::Allocator &rx_block_md_alloc, Genode::Ram_allocator &ram, - Genode::Region_map ®ion_map, + Genode::Env::Local_rm &local_rm, Genode::size_t tx_size, Genode::size_t rx_size, Genode::Cache cache_policy) : _rx_packet_alloc(&rx_block_md_alloc), - _tx_ds(ram, region_map, tx_size, cache_policy), - _rx_ds(ram, region_map, rx_size, cache_policy) + _tx_ds(ram, local_rm, tx_size, cache_policy), + _rx_ds(ram, local_rm, rx_size, cache_policy) { } }; diff --git a/repos/os/include/nic_session/client.h b/repos/os/include/nic_session/client.h index 17c3dd09d4..762bb2ee83 100644 --- a/repos/os/include/nic_session/client.h +++ b/repos/os/include/nic_session/client.h @@ -39,7 +39,7 @@ class Nic::Session_client : public Genode::Rpc_client */ Session_client(Session_capability session, Genode::Range_allocator &tx_buffer_alloc, - Genode::Region_map &rm) + Genode::Env::Local_rm &rm) : Genode::Rpc_client(session), _tx(call(), rm, tx_buffer_alloc), diff --git a/repos/os/include/nic_session/rpc_object.h b/repos/os/include/nic_session/rpc_object.h index f3114854bf..097c21d42a 100644 --- a/repos/os/include/nic_session/rpc_object.h +++ b/repos/os/include/nic_session/rpc_object.h @@ -41,7 +41,7 @@ class Nic::Session_rpc_object : public Genode::Rpc_object, Child_policy_dynamic_rom_file &operator = (Child_policy_dynamic_rom_file const &); Ram_allocator *_ram; - Region_map &_rm; + Env::Local_rm &_rm; /* * The ROM module may be written and consumed by different threads, @@ -82,7 +82,7 @@ class Genode::Child_policy_dynamic_rom_file : public Rpc_object, * * If 'ram' is 0, the child policy is ineffective. */ - Child_policy_dynamic_rom_file(Region_map &rm, + Child_policy_dynamic_rom_file(Env::Local_rm &rm, char const *module_name, Rpc_entrypoint &ep, Ram_allocator *ram) diff --git a/repos/os/include/os/dynamic_rom_session.h b/repos/os/include/os/dynamic_rom_session.h index a6342e1db6..d6301b2b61 100644 --- a/repos/os/include/os/dynamic_rom_session.h +++ b/repos/os/include/os/dynamic_rom_session.h @@ -70,6 +70,8 @@ class Genode::Dynamic_rom_session : public Rpc_object private: + using Local_rm = Local::Constrained_region_map; + /* * Synchronize calls of 'trigger_update' (called locally) with the * 'Rom_session' methods (invoked via RPC). @@ -78,7 +80,7 @@ class Genode::Dynamic_rom_session : public Rpc_object Rpc_entrypoint &_ep; Ram_allocator &_ram; - Region_map &_rm; + Local_rm &_rm; Signal_context_capability _sigh { }; Content_producer &_content_producer; @@ -162,7 +164,7 @@ class Genode::Dynamic_rom_session : public Rpc_object Dynamic_rom_session(Rpc_entrypoint &ep, Ram_allocator &ram, - Region_map &rm, + Local_rm &rm, Content_producer &content_producer) : _ep(ep), _ram(ram), _rm(rm), _content_producer(content_producer) @@ -187,7 +189,7 @@ class Genode::Dynamic_rom_session : public Rpc_object */ Dynamic_rom_session(Entrypoint &ep, Ram_allocator &ram, - Region_map &rm, + Local_rm &rm, Content_producer &content_producer) : Dynamic_rom_session(ep.rpc_ep(), ram, rm, content_producer) diff --git a/repos/os/include/os/packet_stream.h b/repos/os/include/os/packet_stream.h index 5544b247c3..58699d99fb 100644 --- a/repos/os/include/os/packet_stream.h +++ b/repos/os/include/os/packet_stream.h @@ -490,7 +490,7 @@ class Genode::Packet_stream_base protected: - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Genode::Dataspace_capability _ds_cap; Genode::Attached_dataspace _ds { _rm, _ds_cap }; @@ -507,7 +507,7 @@ class Genode::Packet_stream_base * \throw 'Transport_dataspace_too_small' */ Packet_stream_base(Genode::Dataspace_capability transport_ds, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Genode::size_t submit_queue_size, Genode::size_t ack_queue_size) : @@ -633,7 +633,7 @@ class Genode::Packet_stream_source : private Packet_stream_base * rather than pointers. */ Packet_stream_source(Genode::Dataspace_capability transport_ds_cap, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Genode::Range_allocator &packet_alloc) : Packet_stream_base(transport_ds_cap, rm, @@ -869,7 +869,7 @@ class Genode::Packet_stream_sink : private Packet_stream_base * source and sink */ Packet_stream_sink(Genode::Dataspace_capability transport_ds, - Genode::Region_map &rm) + Genode::Env::Local_rm &rm) : Packet_stream_base(transport_ds, rm, sizeof(Submit_queue), sizeof(Ack_queue)), diff --git a/repos/os/include/os/session_requester.h b/repos/os/include/os/session_requester.h index 846f26fdd6..3e7956734d 100644 --- a/repos/os/include/os/session_requester.h +++ b/repos/os/include/os/session_requester.h @@ -24,6 +24,8 @@ class Genode::Session_requester { private: + using Local_rm = Local::Constrained_region_map; + Id_space _id_space { }; struct Content_producer : Dynamic_rom_session::Content_producer @@ -64,7 +66,7 @@ class Genode::Session_requester * \param ram backing store for the ROM dataspace * \param rm local address space, needed to populate the dataspace */ - Session_requester(Rpc_entrypoint &ep, Ram_allocator &ram, Region_map &rm) + Session_requester(Rpc_entrypoint &ep, Ram_allocator &ram, Local_rm &rm) : _session(ep, ram, rm, _content_producer) { } diff --git a/repos/os/include/packet_stream_rx/client.h b/repos/os/include/packet_stream_rx/client.h index d477af484a..7dfa663a3a 100644 --- a/repos/os/include/packet_stream_rx/client.h +++ b/repos/os/include/packet_stream_rx/client.h @@ -43,7 +43,7 @@ class Packet_stream_rx::Client : public Genode::Rpc_client * Constructor */ Client(Genode::Capability channel_cap, - Genode::Region_map &rm) + Genode::Env::Local_rm &rm) : Genode::Rpc_client(channel_cap), _sink(Base::template call(), rm) diff --git a/repos/os/include/packet_stream_rx/rpc_object.h b/repos/os/include/packet_stream_rx/rpc_object.h index 0a0233f022..7abb270590 100644 --- a/repos/os/include/packet_stream_rx/rpc_object.h +++ b/repos/os/include/packet_stream_rx/rpc_object.h @@ -45,7 +45,7 @@ class Packet_stream_rx::Rpc_object : public Genode::Rpc_object * transmission buffer */ Client(Genode::Capability channel_cap, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Genode::Range_allocator &buffer_alloc) : Genode::Rpc_client(channel_cap), diff --git a/repos/os/include/packet_stream_tx/rpc_object.h b/repos/os/include/packet_stream_tx/rpc_object.h index f37354af77..4c0f67cbc6 100644 --- a/repos/os/include/packet_stream_tx/rpc_object.h +++ b/repos/os/include/packet_stream_tx/rpc_object.h @@ -43,7 +43,7 @@ class Packet_stream_tx::Rpc_object : public Genode::Rpc_object(index); } - Region_map &_rm() { return _platform._env.rm(); } + Env::Local_rm &_rm() { return _platform._env.rm(); } public: diff --git a/repos/os/include/report_rom/rom_module.h b/repos/os/include/report_rom/rom_module.h index 43b7957b78..667709c78b 100644 --- a/repos/os/include/report_rom/rom_module.h +++ b/repos/os/include/report_rom/rom_module.h @@ -138,7 +138,7 @@ struct Rom::Module : private Module_list::Element, Readable_module Name _name; Genode::Ram_allocator &_ram; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Read_policy const &_read_policy; Write_policy const &_write_policy; @@ -185,7 +185,7 @@ struct Rom::Module : private Module_list::Element, Readable_module * time when the module content is changed */ Module(Genode::Ram_allocator &ram, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Name const &name, Read_policy const &read_policy, Write_policy const &write_policy) diff --git a/repos/os/include/report_rom/rom_service.h b/repos/os/include/report_rom/rom_service.h index 08d8c30fc7..bbf90fb680 100644 --- a/repos/os/include/report_rom/rom_service.h +++ b/repos/os/include/report_rom/rom_service.h @@ -36,7 +36,7 @@ class Rom::Session_component : public Genode::Rpc_object, private: Genode::Ram_allocator &_ram; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Registry_for_reader &_registry; @@ -80,7 +80,7 @@ class Rom::Session_component : public Genode::Rpc_object, public: - Session_component(Genode::Ram_allocator &ram, Genode::Region_map &rm, + Session_component(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Registry_for_reader ®istry, Genode::Session_label const &label) : diff --git a/repos/os/include/terminal_session/client.h b/repos/os/include/terminal_session/client.h index 1a0de3cf45..a826ac5fae 100644 --- a/repos/os/include/terminal_session/client.h +++ b/repos/os/include/terminal_session/client.h @@ -30,6 +30,8 @@ class Terminal::Session_client : public Genode::Rpc_client { private: + using Local_rm = Genode::Local::Constrained_region_map; + Genode::Mutex _mutex { }; /** @@ -40,7 +42,7 @@ class Terminal::Session_client : public Genode::Rpc_client public: - Session_client(Genode::Region_map &local_rm, Genode::Capability cap) + Session_client(Local_rm &local_rm, Genode::Capability cap) : Genode::Rpc_client(cap), _io_buffer(local_rm, call()) diff --git a/repos/os/include/uart_session/client.h b/repos/os/include/uart_session/client.h index 00c22db267..4b614a40ac 100644 --- a/repos/os/include/uart_session/client.h +++ b/repos/os/include/uart_session/client.h @@ -29,7 +29,8 @@ class Uart::Session_client : public Genode::Rpc_client public: - Session_client(Genode::Region_map &local_rm, Genode::Capability cap) + Session_client(Genode::Env::Local_rm &local_rm, + Genode::Capability cap) : Genode::Rpc_client(cap), _terminal(local_rm, cap) { } diff --git a/repos/os/include/uplink_session/client.h b/repos/os/include/uplink_session/client.h index 6248ea3cc9..928c832da2 100644 --- a/repos/os/include/uplink_session/client.h +++ b/repos/os/include/uplink_session/client.h @@ -40,7 +40,7 @@ class Uplink::Session_client : public Genode::Rpc_client */ Session_client(Session_capability session, Genode::Range_allocator &tx_buffer_alloc, - Genode::Region_map &rm) + Genode::Env::Local_rm &rm) : Genode::Rpc_client(session), _tx(call(), rm, tx_buffer_alloc), diff --git a/repos/os/include/uplink_session/rpc_object.h b/repos/os/include/uplink_session/rpc_object.h index 3bd61683cf..031afb42f4 100644 --- a/repos/os/include/uplink_session/rpc_object.h +++ b/repos/os/include/uplink_session/rpc_object.h @@ -42,7 +42,7 @@ class Uplink::Session_rpc_object : public Genode::Rpc_object cap, - Region_map &rm, Allocator &md_alloc) + Env::Local_rm &rm, Allocator &md_alloc) : _alloc(&md_alloc, URB_ALLOC_GRANULARITY), _tx(cap, rm, _alloc) {} @@ -499,7 +499,7 @@ class Usb::Device ::Usb::Connection &_session; Allocator &_md_alloc; - Region_map &_rm; + Env::Local_rm &_rm; Name const _name { }; Urb_handler _urb_handler; @@ -516,9 +516,9 @@ class Usb::Device public: Device(Connection &usb_session, Allocator &md_alloc, - Region_map &rm, Name name); + Env::Local_rm &rm, Name name); - Device(Connection &session, Allocator &md_alloc, Region_map &rm); + Device(Connection &session, Allocator &md_alloc, Env::Local_rm &rm); ~Device() { _session.release_device(*this); } @@ -758,10 +758,10 @@ Usb::Device::_interface_index(Interface::Type t) } -inline Usb::Device::Device(Connection &session, - Allocator &md_alloc, - Region_map &rm, - Name name) +inline Usb::Device::Device(Connection &session, + Allocator &md_alloc, + Env::Local_rm &rm, + Name name) : Device_capability(session.acquire_device(name)), _session(session), @@ -771,9 +771,9 @@ inline Usb::Device::Device(Connection &session, _urb_handler(call(), rm, md_alloc) {} -inline Usb::Device::Device(Connection &session, - Allocator &md_alloc, - Region_map &rm) +inline Usb::Device::Device(Connection &session, + Allocator &md_alloc, + Env::Local_rm &rm) : Device_capability(session.acquire_device()), _session(session), diff --git a/repos/os/src/app/pointer/rom_registry.h b/repos/os/src/app/pointer/rom_registry.h index b89e073e25..187ed3624a 100644 --- a/repos/os/src/app/pointer/rom_registry.h +++ b/repos/os/src/app/pointer/rom_registry.h @@ -27,7 +27,7 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy Genode::Allocator &_md_alloc; Genode::Ram_allocator &_ram; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Reader &_reader; Module_list _modules { }; @@ -97,7 +97,7 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy public: Registry(Genode::Allocator &md_alloc, - Genode::Ram_allocator &ram, Genode::Region_map &rm, + Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Reader &reader) : _md_alloc(md_alloc), _ram(ram), _rm(rm), _reader(reader) diff --git a/repos/os/src/app/status_bar/main.cc b/repos/os/src/app/status_bar/main.cc index 141c6a2aad..4fd857cbdc 100644 --- a/repos/os/src/app/status_bar/main.cc +++ b/repos/os/src/app/status_bar/main.cc @@ -67,7 +67,7 @@ struct Status_bar::Buffer Tff_font::Static_glyph_buffer<4096> _glyph_buffer { }; Tff_font _font { &_binary_default_tff_start, _glyph_buffer }; - Buffer(Region_map &rm, Gui::Connection &gui) + Buffer(Env::Local_rm &rm, Gui::Connection &gui) : _gui(gui), _fb_ds(rm, _init_buffer()) { } diff --git a/repos/os/src/app/trace_logger/monitor.cc b/repos/os/src/app/trace_logger/monitor.cc index 94e5226992..319196132e 100644 --- a/repos/os/src/app/trace_logger/monitor.cc +++ b/repos/os/src/app/trace_logger/monitor.cc @@ -99,7 +99,7 @@ Monitor &Monitor::find_by_subject_id(Trace::Subject_id const subject_id) Monitor::Monitor(Trace::Connection &trace, - Region_map &rm, + Env::Local_rm &rm, Trace::Subject_id const subject_id) : Monitor_base(trace, rm, subject_id), diff --git a/repos/os/src/app/trace_logger/monitor.h b/repos/os/src/app/trace_logger/monitor.h index 264fd48946..33b52b08c8 100644 --- a/repos/os/src/app/trace_logger/monitor.h +++ b/repos/os/src/app/trace_logger/monitor.h @@ -34,12 +34,12 @@ class Monitor_base protected: Genode::Trace::Connection &_trace; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Genode::Attached_dataspace _ds; Genode::Trace::Buffer &_buffer_raw = *_ds.local_addr(); Monitor_base(Genode::Trace::Connection &trace, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Genode::Trace::Subject_id subject_id) : _trace(trace), _rm(rm), _ds(rm, _trace.buffer(subject_id)) @@ -72,7 +72,7 @@ class Monitor : public Monitor_base, }; Monitor(Genode::Trace::Connection &trace, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Genode::Trace::Subject_id subject_id); /** diff --git a/repos/os/src/driver/ahci/ahci.h b/repos/os/src/driver/ahci/ahci.h index 3b870f7192..9b7f6d80b1 100644 --- a/repos/os/src/driver/ahci/ahci.h +++ b/repos/os/src/driver/ahci/ahci.h @@ -861,11 +861,11 @@ struct Ahci::Port : private Port_base struct Not_ready : Exception { }; - Protocol &protocol; - Region_map &rm; - unsigned cmd_slots = hba.command_slots(); + Protocol &protocol; + Env::Local_rm &rm; + unsigned cmd_slots = hba.command_slots(); - bool stop_processing { }; + bool stop_processing { }; Platform::Dma_buffer device_dma { plat, 0x1000, CACHED }; Platform::Dma_buffer cmd_dma { plat, @@ -892,7 +892,7 @@ struct Ahci::Port : private Port_base }, fn_error); } - Port(Protocol &protocol, Region_map &rm, Platform::Connection & plat, + Port(Protocol &protocol, Env::Local_rm &rm, Platform::Connection &plat, Hba &hba, Mmio_port::Delayer &delayer, unsigned index) : Port_base(index, plat, hba, delayer), diff --git a/repos/os/src/driver/ahci/main.cc b/repos/os/src/driver/ahci/main.cc index 08909c3d77..ae954367ee 100644 --- a/repos/os/src/driver/ahci/main.cc +++ b/repos/os/src/driver/ahci/main.cc @@ -73,7 +73,7 @@ class Ahci::Driver : Noncopyable bool _enable_atapi; bool _schedule_stop { }; - unsigned _scan_ports(Region_map &rm, Platform::Connection &plat, Hba &hba) + unsigned _scan_ports(Env::Local_rm &rm, Platform::Connection &plat, Hba &hba) { log("port scan:"); diff --git a/repos/os/src/driver/framebuffer/sdl/main.cc b/repos/os/src/driver/framebuffer/sdl/main.cc index 830b205b32..97c9a9c933 100644 --- a/repos/os/src/driver/framebuffer/sdl/main.cc +++ b/repos/os/src/driver/framebuffer/sdl/main.cc @@ -58,7 +58,7 @@ struct Fb_sdl::Sdl : Noncopyable { Event::Connection &_event; Capture::Connection &_capture; - Region_map &_rm; + Env::Local_rm &_rm; struct Ticks { Uint32 ms; }; @@ -294,8 +294,8 @@ struct Fb_sdl::Sdl : Noncopyable /* * Construction executed by the main thread */ - Sdl(Event::Connection &event, Capture::Connection &capture, Region_map &rm, - Attr const attr) + Sdl(Event::Connection &event, Capture::Connection &capture, + Env::Local_rm &rm, Attr const attr) : _event(event), _capture(capture), _rm(rm), _attr(attr) { } diff --git a/repos/os/src/driver/gpu/intel/main.cc b/repos/os/src/driver/gpu/intel/main.cc index 8f58afcb0f..2a76e3226a 100644 --- a/repos/os/src/driver/gpu/intel/main.cc +++ b/repos/os/src/driver/gpu/intel/main.cc @@ -627,7 +627,7 @@ struct Igd::Device } Vgpu(Device &device, Allocator &alloc, - Ram_allocator &ram, Region_map &rm) + Ram_allocator &ram, Env::Local_rm &rm) : _device(device), _id(_id_alloc()), @@ -1874,7 +1874,7 @@ class Gpu::Session_component : public Genode::Session_object }; Genode::Env &_env; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Accounted_ram_allocator _ram; Igd::Device &_device; Heap _heap { _device._pci_backend_alloc, _rm }; @@ -2041,10 +2041,10 @@ class Gpu::Session_component : public Genode::Session_object * \param ram_quota initial ram quota * \param device reference to the physical device */ - Session_component(Env &env, + Session_component(Env &env, Entrypoint &ep, Ram_allocator &ram, - Region_map &rm, + Env::Local_rm &rm, Resources resources, Label const &label, Diag diag, diff --git a/repos/os/src/driver/gpu/intel/ppgtt_allocator.h b/repos/os/src/driver/gpu/intel/ppgtt_allocator.h index 2d5102653d..9e2ffeaead 100644 --- a/repos/os/src/driver/gpu/intel/ppgtt_allocator.h +++ b/repos/os/src/driver/gpu/intel/ppgtt_allocator.h @@ -29,7 +29,7 @@ class Igd::Ppgtt_allocator : public Genode::Translation_table_allocator { private: - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Utils::Backend_alloc &_backend; enum { ELEMENTS = 128, }; /* max 128M for page tables */ @@ -40,7 +40,7 @@ class Igd::Ppgtt_allocator : public Genode::Translation_table_allocator public: Ppgtt_allocator(Genode::Allocator &md_alloc, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Utils::Backend_alloc &backend) : _rm { rm }, @@ -95,29 +95,30 @@ class Igd::Ppgtt_allocator : public Genode::Translation_table_allocator .writeable = true }).convert( - [&] (Genode::Region_map::Range const range) -> Alloc_result { + [&] (Genode::Env::Local_rm::Attachment &range) -> Alloc_result { - void * const va = (void*)range.start; + void * const va = (void*)range.ptr; void * const pa = (void*)_backend.dma_addr(ds); if (_map.add(ds, pa, va, range.num_bytes) == true) { - if (_range.add_range(range.start, range.num_bytes).ok()) + if (_range.add_range(addr_t(range.ptr), range.num_bytes).ok()) { + range.deallocate = false; return _range.alloc_aligned(size, 12); + } Genode::error("Ppgtt_allocator failed to extend meta data"); } /* _map.add failed, roll back _rm.attach */ - _rm.detach(range.start); _backend.free(ds); return Alloc_error::DENIED; }, - [&] (Genode::Region_map::Attach_error e) { + [&] (Genode::Env::Local_rm::Error e) { _backend.free(ds); - using Error = Genode::Region_map::Attach_error; + using Error = Genode::Env::Local_rm::Error; if (e == Error::OUT_OF_RAM) return Alloc_error::OUT_OF_RAM; if (e == Error::OUT_OF_CAPS) return Alloc_error::OUT_OF_CAPS; diff --git a/repos/os/src/lib/genode_c_api/usb_client.cc b/repos/os/src/lib/genode_c_api/usb_client.cc index a9777e56ad..a3c8069631 100644 --- a/repos/os/src/lib/genode_c_api/usb_client.cc +++ b/repos/os/src/lib/genode_c_api/usb_client.cc @@ -295,7 +295,7 @@ class Device : public List_model::Element Speed &speed, Usb::Connection &usb, Allocator &alloc, - Region_map &rm, + Env::Local_rm &rm, Id_space &space, Signal_context_capability cap) : diff --git a/repos/os/src/lib/vfs/ram_file_system.h b/repos/os/src/lib/vfs/ram_file_system.h index 5ce9d5a0c8..f8e63ab2fd 100644 --- a/repos/os/src/lib/vfs/ram_file_system.h +++ b/repos/os/src/lib/vfs/ram_file_system.h @@ -914,13 +914,12 @@ class Vfs::Ram_file_system : public Vfs::File_system .size = { }, .offset = { }, .use_at = { }, .at = { }, .executable = { }, .writeable = true }).convert( - [&] (Region_map::Range const range) { - file->read(Byte_range_ptr((char *)range.start, len), Seek{0}); - _env.env().rm().detach(range.start); + [&] (Genode::Env::Local_rm::Attachment &a) { + file->read(Byte_range_ptr((char *)a.ptr, len), Seek{0}); allocation.deallocate = false; return allocation.cap; }, - [&] (Region_map::Attach_error) { + [&] (Genode::Env::Local_rm::Error) { return Dataspace_capability(); } ); diff --git a/repos/os/src/lib/vfs/tar_file_system.h b/repos/os/src/lib/vfs/tar_file_system.h index c066881a78..4bd6358d3b 100644 --- a/repos/os/src/lib/vfs/tar_file_system.h +++ b/repos/os/src/lib/vfs/tar_file_system.h @@ -565,21 +565,18 @@ class Vfs::Tar_file_system : public File_system size_t const len = size_t(record->size()); - using Region_map = Genode::Region_map; - return _env.ram().try_alloc(len).convert( [&] (Genode::Ram::Allocation &allocation) { return _env.rm().attach(allocation.cap, { .size = { }, .offset = { }, .use_at = { }, .at = { }, .executable = { }, .writeable = true }).convert( - [&] (Region_map::Range const range) { - memcpy((void *)range.start, record->data(), len); - _env.rm().detach(range.start); + [&] (Genode::Env::Local_rm::Attachment &a) { + memcpy(a.ptr, record->data(), len); allocation.deallocate = false; return allocation.cap; }, - [&] (Region_map::Attach_error) { + [&] (Genode::Env::Local_rm::Error) { return Dataspace_capability(); } ); diff --git a/repos/os/src/monitor/inferior_pd.h b/repos/os/src/monitor/inferior_pd.h index 56b0b3c074..a199466968 100644 --- a/repos/os/src/monitor/inferior_pd.h +++ b/repos/os/src/monitor/inferior_pd.h @@ -34,7 +34,7 @@ struct Monitor::Inferior_pd : Monitored_pd_session Io_signal_handler _page_fault_handler; - Region_map &_local_rm; /* for wiping RAM dataspaces on free */ + Env::Local_rm &_local_rm; /* for wiping RAM dataspaces on free */ Allocator &_alloc; /* used for allocating 'Ram_ds' objects */ Ram_allocator &_wx_ram; /* RAM used for writeable text segments */ @@ -128,7 +128,7 @@ struct Monitor::Inferior_pd : Monitored_pd_session Inferior_pd(Entrypoint &ep, Capability real, Name const &name, - Inferiors &inferiors, Inferiors::Id id, Region_map &local_rm, + Inferiors &inferiors, Inferiors::Id id, Env::Local_rm &local_rm, Allocator &alloc, Ram_allocator &wx_ram) : Monitored_pd_session(ep, real, name), diff --git a/repos/os/src/monitor/memory_accessor.h b/repos/os/src/monitor/memory_accessor.h index f245e2f125..d825c49092 100644 --- a/repos/os/src/monitor/memory_accessor.h +++ b/repos/os/src/monitor/memory_accessor.h @@ -46,9 +46,9 @@ class Monitor::Memory_accessor : Noncopyable struct Curr_view { - Region_map &_local_rm; - Inferior_pd &_pd; - addr_t const _offset; + Env::Local_rm &_local_rm; + Inferior_pd &_pd; + addr_t const _offset; struct { uint8_t * const _local_ptr; }; @@ -62,12 +62,14 @@ class Monitor::Memory_accessor : Noncopyable .executable = false, .writeable = true }).convert( - [&] (Region_map::Range range) { return (uint8_t *)range.start; }, + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; + return (uint8_t *)a.ptr; }, [&] (Region_map::Attach_error) { return nullptr; } ); } - Curr_view(Region_map &local_rm, Inferior_pd &pd, addr_t offset) + Curr_view(Env::Local_rm &local_rm, Inferior_pd &pd, addr_t offset) : _local_rm(local_rm), _pd(pd), _offset(offset), _local_ptr(_attach()) { } diff --git a/repos/os/src/monitor/monitored_region_map.h b/repos/os/src/monitor/monitored_region_map.h index c45286e89e..4720c7b647 100644 --- a/repos/os/src/monitor/monitored_region_map.h +++ b/repos/os/src/monitor/monitored_region_map.h @@ -34,14 +34,14 @@ struct Monitor::Monitored_region_map : Monitored_rpc_object { Allocator &_alloc; Ram_allocator &_ram; - Region_map &_local_rm; + Env::Local_rm &_local_rm; struct Ram_ds : Registry::Element { Attached_ram_dataspace ds; - Ram_ds(Registry ®istry, Ram_allocator &ram, Region_map &local_rm, - Const_byte_range_ptr const &content) + Ram_ds(Registry ®istry, Ram_allocator &ram, + Env::Local_rm &local_rm, Const_byte_range_ptr const &content) : Registry::Element(registry, *this), ds(ram, local_rm, content.num_bytes) @@ -54,7 +54,7 @@ struct Monitor::Monitored_region_map : Monitored_rpc_object Writeable_text_segments(Allocator &alloc, Ram_allocator &ram, - Region_map &local_rm) + Env::Local_rm &local_rm) : _alloc(alloc), _ram(ram), _local_rm(local_rm) { } @@ -95,7 +95,7 @@ struct Monitor::Monitored_region_map : Monitored_rpc_object void writeable_text_segments(Allocator &alloc, Ram_allocator &ram, - Region_map &local_rm) + Env::Local_rm &local_rm) { if (!_writeable_text_segments.constructed()) _writeable_text_segments.construct(alloc, ram, local_rm); diff --git a/repos/os/src/server/clipboard/main.cc b/repos/os/src/server/clipboard/main.cc index 61b5517dee..4e7750026a 100644 --- a/repos/os/src/server/clipboard/main.cc +++ b/repos/os/src/server/clipboard/main.cc @@ -59,7 +59,7 @@ struct Rom::Registry : Rom::Registry_for_reader, Rom::Registry_for_writer /** * Constructor */ - Registry(Genode::Ram_allocator &ram, Genode::Region_map &rm, + Registry(Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Module::Read_policy const &read_policy, Module::Write_policy const &write_policy) : diff --git a/repos/os/src/server/log_report/main.cc b/repos/os/src/server/log_report/main.cc index 4d66b8d7d5..5fc29f7172 100644 --- a/repos/os/src/server/log_report/main.cc +++ b/repos/os/src/server/log_report/main.cc @@ -42,7 +42,7 @@ class Report::Session_component : public Genode::Rpc_object public: Session_component(Ram_allocator &ram, - Region_map &rm, + Env::Local_rm &rm, Genode::Session_label const &label, size_t buffer_size) : @@ -76,7 +76,7 @@ class Report::Root : public Genode::Root_component private: Ram_allocator &_ram; - Region_map &_rm; + Env::Local_rm &_rm; protected: @@ -98,7 +98,7 @@ class Report::Root : public Genode::Root_component public: Root(Entrypoint &ep, Genode::Allocator &md_alloc, - Ram_allocator &ram, Region_map &rm) + Ram_allocator &ram, Env::Local_rm &rm) : Genode::Root_component(&ep.rpc_ep(), &md_alloc), _ram(ram), _rm(rm) diff --git a/repos/os/src/server/log_terminal/main.cc b/repos/os/src/server/log_terminal/main.cc index b6065f1add..b0622ff88c 100644 --- a/repos/os/src/server/log_terminal/main.cc +++ b/repos/os/src/server/log_terminal/main.cc @@ -101,7 +101,7 @@ class Terminal::Session_component : public Rpc_object(&ep.rpc_ep(), &md_alloc), _ram(ram), _rm(rm) diff --git a/repos/os/src/server/lx_fs/main.cc b/repos/os/src/server/lx_fs/main.cc index d3115acd80..d63a2ff6c4 100644 --- a/repos/os/src/server/lx_fs/main.cc +++ b/repos/os/src/server/lx_fs/main.cc @@ -71,15 +71,15 @@ class Lx_fs::Session_resources Genode::Heap _alloc; Session_resources(Genode::Ram_allocator &ram, - Genode::Region_map ®ion_map, + Genode::Env::Local_rm &local_rm, Genode::Ram_quota ram_quota, Genode::Cap_quota cap_quota, Genode::size_t buffer_size) : _ram_guard(ram_quota), _cap_guard(cap_quota), _ram_alloc(ram, _ram_guard, _cap_guard), - _packet_ds(_ram_alloc, region_map, buffer_size), - _alloc(_ram_alloc, region_map) + _packet_ds(_ram_alloc, local_rm, buffer_size), + _alloc(_ram_alloc, local_rm) { } }; diff --git a/repos/os/src/server/nic_bridge/component.cc b/repos/os/src/server/nic_bridge/component.cc index 7314ce2433..366e5512fb 100644 --- a/repos/os/src/server/nic_bridge/component.cc +++ b/repos/os/src/server/nic_bridge/component.cc @@ -109,7 +109,7 @@ void Session_component::set_ipv4_address(Ipv4_address ip_addr) Session_component::Session_component(Genode::Ram_allocator &ram, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Genode::Entrypoint &ep, Genode::Ram_quota ram_quota, Genode::Cap_quota cap_quota, diff --git a/repos/os/src/server/nic_bridge/component.h b/repos/os/src/server/nic_bridge/component.h index 5ba7be6b80..a699a15607 100644 --- a/repos/os/src/server/nic_bridge/component.h +++ b/repos/os/src/server/nic_bridge/component.h @@ -60,7 +60,7 @@ class Net::Stream_allocator public: Stream_allocator(Genode::Ram_allocator &ram, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Genode::Ram_quota ram_quota, Genode::Cap_quota cap_quota) : @@ -133,7 +133,7 @@ class Net::Session_component : private Net::Stream_allocator, * \param vmac virtual mac address */ Session_component(Genode::Ram_allocator &ram, - Genode::Region_map &rm, + Genode::Env::Local_rm &rm, Genode::Entrypoint &ep, Genode::Ram_quota ram_quota, Genode::Cap_quota cap_quota, diff --git a/repos/os/src/server/nic_dump/component.cc b/repos/os/src/server/nic_dump/component.cc index 53112eefe9..572b9e6d31 100644 --- a/repos/os/src/server/nic_dump/component.cc +++ b/repos/os/src/server/nic_dump/component.cc @@ -39,7 +39,7 @@ Communication_buffer::Communication_buffer(Ram_allocator &ram, Session_component_base:: Session_component_base(Ram_allocator &ram, - Region_map &local_rm, + Env::Local_rm &local_rm, Ram_quota const ram_quota, Cap_quota const cap_quota, size_t const tx_buf_size, diff --git a/repos/os/src/server/nic_dump/component.h b/repos/os/src/server/nic_dump/component.h index 88b0d14e4a..4f61d32036 100644 --- a/repos/os/src/server/nic_dump/component.h +++ b/repos/os/src/server/nic_dump/component.h @@ -64,7 +64,7 @@ class Net::Session_component_base public: Session_component_base(Genode::Ram_allocator &ram, - Genode::Region_map &local_rm, + Genode::Env::Local_rm &local_rm, Genode::Ram_quota ram_quota, Genode::Cap_quota cap_quota, Genode::size_t const tx_buf_size, diff --git a/repos/os/src/server/nic_router/session_creation.h b/repos/os/src/server/nic_router/session_creation.h index af4813eab0..6352195f35 100644 --- a/repos/os/src/server/nic_router/session_creation.h +++ b/repos/os/src/server/nic_router/session_creation.h @@ -61,10 +61,12 @@ class Net::Session_creation .use_at = { }, .at = { }, .executable = { }, .writeable = true }).with_result( - [&] (Region_map::Range range) { _ram_ptr = (void *)range.start; }, - [&] (Region_map::Attach_error e) { - if (e == Region_map::Attach_error::OUT_OF_RAM) throw Out_of_ram(); - if (e == Region_map::Attach_error::OUT_OF_CAPS) throw Out_of_caps(); + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; + _ram_ptr = a.ptr; }, + [&] (Env::Local_rm::Error e) { + if (e == Env::Local_rm::Error::OUT_OF_RAM) throw Out_of_ram(); + if (e == Env::Local_rm::Error::OUT_OF_CAPS) throw Out_of_caps(); error("failed to attach Session_creation::_ram_ds"); } ); diff --git a/repos/os/src/server/nic_router/session_env.h b/repos/os/src/server/nic_router/session_env.h index 41214debc9..e54b5e792a 100644 --- a/repos/os/src/server/nic_router/session_env.h +++ b/repos/os/src/server/nic_router/session_env.h @@ -21,7 +21,7 @@ namespace Genode { class Session_env; } class Genode::Session_env : public Ram_allocator, - public Region_map + public Env::Local_rm { private: @@ -157,24 +157,37 @@ class Genode::Session_env : public Ram_allocator, } - /**************** - ** Region_map ** - ****************/ + /******************* + ** Env::Local_rm ** + *******************/ - Attach_result attach(Dataspace_capability ds, Region_map::Attr const &attr) override + Env::Local_rm::Result attach(Capability ds, Attach_attr const &attr) override { + using Result = Env::Local_rm::Result; + enum { MAX_SHARED_CAP = 2 }; enum { MAX_SHARED_RAM = 4 * 4096 }; - Attach_result result = Attach_error::REGION_CONFLICT; + Result result = Env::Local_rm::Error::REGION_CONFLICT; try { _consume(0, MAX_SHARED_RAM, 0, MAX_SHARED_CAP, [&] { result = _env.rm().attach(ds, attr); }); } - catch (Out_of_ram) { result = Attach_error::OUT_OF_RAM; } - catch (Out_of_caps) { result = Attach_error::OUT_OF_CAPS; } - return result; + catch (Out_of_ram) { result = Env::Local_rm::Error::OUT_OF_RAM; } + catch (Out_of_caps) { result = Env::Local_rm::Error::OUT_OF_CAPS; } + + return result.convert( + [&] (Attachment &a) -> Result { + a.deallocate = false; + return { *this , a }; + }, + [&] (Env::Local_rm::Error e) { return e; }); + } + + void _free(Attachment &a) override + { + _replenish(0, 0, [&] { _env.rm().detach(addr_t(a.ptr)); }); } bool report_empty() const { return false; } @@ -193,15 +206,6 @@ class Genode::Session_env : public Ram_allocator, }); } - void detach(addr_t at) override - { - _replenish(0, 0, [&] { _env.rm().detach(at); }); - } - - void fault_handler(Signal_context_capability handler) override { _env.rm().fault_handler(handler); } - Fault fault() override { return _env.rm().fault(); } - Dataspace_capability dataspace() override { return _env.rm().dataspace(); } - /*************** ** Accessors ** diff --git a/repos/os/src/server/nitpicker/buffer.h b/repos/os/src/server/nitpicker/buffer.h index e00f976a78..833bda61a7 100644 --- a/repos/os/src/server/nitpicker/buffer.h +++ b/repos/os/src/server/nitpicker/buffer.h @@ -34,7 +34,7 @@ struct Nitpicker::Buffer : private Attached_ram_dataspace * \throw Out_of_caps * \throw Region_map::Region_conflict */ - Buffer(Ram_allocator &ram, Region_map &rm, size_t num_bytes) + Buffer(Ram_allocator &ram, Env::Local_rm &rm, size_t num_bytes) : Attached_ram_dataspace(ram, rm, num_bytes) { } diff --git a/repos/os/src/server/nitpicker/chunky_texture.h b/repos/os/src/server/nitpicker/chunky_texture.h index 04427c8a61..71fd9bcd60 100644 --- a/repos/os/src/server/nitpicker/chunky_texture.h +++ b/repos/os/src/server/nitpicker/chunky_texture.h @@ -69,7 +69,7 @@ class Nitpicker::Chunky_texture : Buffer, public Texture using Buffer::cap; - Chunky_texture(Ram_allocator &ram, Region_map &rm, Framebuffer::Mode mode) + Chunky_texture(Ram_allocator &ram, Env::Local_rm &rm, Framebuffer::Mode mode) : Buffer(ram, rm, mode.num_bytes()), Texture((PT *)Buffer::bytes().start, _alpha_base(*this, mode), mode.area), diff --git a/repos/os/src/server/nitpicker/resizeable_texture.h b/repos/os/src/server/nitpicker/resizeable_texture.h index 6f8c4a097e..3469766029 100644 --- a/repos/os/src/server/nitpicker/resizeable_texture.h +++ b/repos/os/src/server/nitpicker/resizeable_texture.h @@ -51,7 +51,7 @@ class Nitpicker::Resizeable_texture void release_current() { _textures[_current].destruct(); } - bool try_construct_next(Ram_allocator &ram, Region_map &rm, Framebuffer::Mode mode) + bool try_construct_next(Ram_allocator &ram, Env::Local_rm &rm, Framebuffer::Mode mode) { try { unsigned const next = !_current; diff --git a/repos/os/src/server/report_rom/rom_registry.h b/repos/os/src/server/report_rom/rom_registry.h index bccf2cab93..7596777016 100644 --- a/repos/os/src/server/report_rom/rom_registry.h +++ b/repos/os/src/server/report_rom/rom_registry.h @@ -27,7 +27,7 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy Genode::Allocator &_md_alloc; Genode::Ram_allocator &_ram; - Genode::Region_map &_rm; + Genode::Env::Local_rm &_rm; Genode::Attached_rom_dataspace &_config_rom; Module_list _modules { }; @@ -134,7 +134,7 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy public: Registry(Genode::Allocator &md_alloc, - Genode::Ram_allocator &ram, Genode::Region_map &rm, + Genode::Ram_allocator &ram, Genode::Env::Local_rm &rm, Genode::Attached_rom_dataspace &config_rom) : _md_alloc(md_alloc), _ram(ram), _rm(rm), _config_rom(config_rom) diff --git a/repos/os/src/server/tar_rom/main.cc b/repos/os/src/server/tar_rom/main.cc index dccfeb5746..07d1635e37 100644 --- a/repos/os/src/server/tar_rom/main.cc +++ b/repos/os/src/server/tar_rom/main.cc @@ -62,7 +62,7 @@ class Tar_rom::Rom_session_component : public Rpc_object * * \param dst destination dataspace */ - void _copy_content_to_dataspace(Region_map &rm, Dataspace_capability dst, + void _copy_content_to_dataspace(Env::Local_rm &rm, Dataspace_capability dst, char const *src, size_t len) { /* temporarily map dataspace */ @@ -76,7 +76,7 @@ class Tar_rom::Rom_session_component : public Rpc_object /** * Initialize dataspace containing the content of the archived file */ - Ram_dataspace_capability _init_file_ds(Ram_allocator &ram, Region_map &rm, + Ram_dataspace_capability _init_file_ds(Ram_allocator &ram, Env::Local_rm &rm, Session_label const &name) { /* measure size of archive in blocks */ @@ -151,7 +151,7 @@ class Tar_rom::Rom_session_component : public Rpc_object * * \throw Service_denied */ - Rom_session_component(Ram_allocator &ram, Region_map &rm, + Rom_session_component(Ram_allocator &ram, Env::Local_rm &rm, char const *tar_addr, unsigned tar_size, Session_label const &label) : diff --git a/repos/os/src/server/vfs/main.cc b/repos/os/src/server/vfs/main.cc index 371c3b0ed5..4f0b43b1d6 100644 --- a/repos/os/src/server/vfs/main.cc +++ b/repos/os/src/server/vfs/main.cc @@ -66,15 +66,15 @@ class Vfs_server::Session_resources Genode::Heap _alloc; Session_resources(Genode::Ram_allocator &ram, - Genode::Region_map ®ion_map, + Genode::Env::Local_rm &local_rm, Genode::Ram_quota ram_quota, Genode::Cap_quota cap_quota, Genode::size_t buffer_size) : _ram_guard(ram_quota), _cap_guard(cap_quota), _ram_alloc(ram, _ram_guard, _cap_guard), - _packet_ds(_ram_alloc, region_map, buffer_size), - _alloc(_ram_alloc, region_map) + _packet_ds(_ram_alloc, local_rm, buffer_size), + _alloc(_ram_alloc, local_rm) { } }; diff --git a/repos/os/src/server/vfs_block/component.cc b/repos/os/src/server/vfs_block/component.cc index 0bf5508bed..08178e2ebc 100644 --- a/repos/os/src/server/vfs_block/component.cc +++ b/repos/os/src/server/vfs_block/component.cc @@ -210,7 +210,7 @@ struct Block_session_component : Rpc_object, Vfs_block::File &_file; Vfs::Env::Io &_io; - Block_session_component(Region_map &rm, + Block_session_component(Env::Local_rm &rm, Entrypoint &ep, Dataspace_capability ds, Signal_context_capability sigh, diff --git a/repos/os/src/test/block_request_stream/main.cc b/repos/os/src/test/block_request_stream/main.cc index 8233ae500b..781565ba3b 100644 --- a/repos/os/src/test/block_request_stream/main.cc +++ b/repos/os/src/test/block_request_stream/main.cc @@ -41,7 +41,7 @@ struct Test::Block_session_component : Rpc_object, using Block::Request_stream::try_acknowledge; using Block::Request_stream::wakeup_client_if_needed; - Block_session_component(Region_map &rm, + Block_session_component(Env::Local_rm &rm, Dataspace_capability ds, Entrypoint &ep, Signal_context_capability sigh) diff --git a/repos/os/src/test/nic_router_dhcp/manager/main.cc b/repos/os/src/test/nic_router_dhcp/manager/main.cc index da36bce4f5..6091582bbe 100644 --- a/repos/os/src/test/nic_router_dhcp/manager/main.cc +++ b/repos/os/src/test/nic_router_dhcp/manager/main.cc @@ -29,10 +29,10 @@ using namespace Net; using namespace Genode; using Domain_name = String<160>; -namespace Local { class Main; } +namespace Test { class Main; } -class Local::Main +class Test::Main { private: @@ -53,7 +53,7 @@ class Local::Main }; -Local::Main::Main(Env &env) : _env(env) +Test::Main::Main(Env &env) : _env(env) { log("Initialized"); _router_state_rom.sigh(_router_state_handler); @@ -61,7 +61,7 @@ Local::Main::Main(Env &env) : _env(env) } -void Local::Main::_handle_router_state() +void Test::Main::_handle_router_state() { /* Request the moste recent content of the router state dataspace. */ log("Read state of nic_router_2"); @@ -208,4 +208,4 @@ void Local::Main::_handle_router_state() } -void Component::construct(Env &env) { static Local::Main main(env); } +void Component::construct(Env &env) { static Test::Main main(env); } diff --git a/repos/os/src/test/trace/main.cc b/repos/os/src/test/trace/main.cc index 07638be7c1..33c7723eeb 100644 --- a/repos/os/src/test/trace/main.cc +++ b/repos/os/src/test/trace/main.cc @@ -67,7 +67,7 @@ class Trace_buffer_monitor static constexpr size_t MAX_ENTRY_BUF = 256; char _buf[MAX_ENTRY_BUF]; - Region_map &_rm; + Env::Local_rm &_rm; Trace::Subject_id _id; Trace::Buffer *_buffer_raw; Trace_buffer _buffer; @@ -82,7 +82,7 @@ class Trace_buffer_monitor public: - Trace_buffer_monitor(Region_map &rm, + Trace_buffer_monitor(Env::Local_rm &rm, Trace::Subject_id id, Dataspace_capability ds_cap) : @@ -92,8 +92,10 @@ class Trace_buffer_monitor .use_at = { }, .at = { }, .executable = { }, .writeable = true }).convert( - [&] (Region_map::Range r) { return (Trace::Buffer *)r.start; }, - [&] (Region_map::Attach_error) { return nullptr; } + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; + return (Trace::Buffer *)a.ptr; }, + [&] (Env::Local_rm::Error) { return nullptr; } )), _buffer(*_buffer_raw) { diff --git a/repos/pc/src/driver/platform/pc/expanding_page_table_allocator.h b/repos/pc/src/driver/platform/pc/expanding_page_table_allocator.h index ae387f5159..ca72c38bf0 100644 --- a/repos/pc/src/driver/platform/pc/expanding_page_table_allocator.h +++ b/repos/pc/src/driver/platform/pc/expanding_page_table_allocator.h @@ -67,7 +67,7 @@ class Driver::Expanding_page_table_allocator Element(Range_allocator & range_alloc, Ram_allocator & ram_alloc, - Region_map & rm, + Env::Local_rm & rm, Pd_session & pd, size_t size) : _range_alloc(range_alloc), diff --git a/repos/ports/src/virtualbox6/include/fb.h b/repos/ports/src/virtualbox6/include/fb.h index bd318721e3..457a537291 100644 --- a/repos/ports/src/virtualbox6/include/fb.h +++ b/repos/ports/src/virtualbox6/include/fb.h @@ -51,8 +51,9 @@ class Genodefb : .size = { }, .offset = { }, .use_at = { }, .at = { }, .executable = { }, .writeable = true }).convert( - [&] (Genode::Region_map::Range range) { return (void *)range.start; }, - [&] (Genode::Region_map::Attach_error) { return nullptr; } + [&] (Genode::Env::Local_rm::Attachment &a) { + a.deallocate = false; return a.ptr; }, + [&] (Genode::Env::Local_rm::Error) { return nullptr; } ); } diff --git a/repos/ports/src/virtualbox6/sup_gmm.h b/repos/ports/src/virtualbox6/sup_gmm.h index 0c7703366f..3cbb26bcc5 100644 --- a/repos/ports/src/virtualbox6/sup_gmm.h +++ b/repos/ports/src/virtualbox6/sup_gmm.h @@ -118,8 +118,9 @@ class Sup::Gmm .size = { }, .offset = { }, .use_at = { }, .at = { }, .executable = { }, .writeable = true }).convert( - [&] (Region_map::Range range) { return range.start; }, - [&] (Region_map::Attach_error) { return 0UL; } + [&] (Env::Local_rm::Attachment &a) { + a.deallocate = false; return addr_t(a.ptr); }, + [&] (Env::Local_rm::Error) { return 0UL; } ); }