diff --git a/base-nova/src/core/core_rm_session.cc b/base-nova/src/core/core_rm_session.cc index d1e2165f40..47d4e86758 100644 --- a/base-nova/src/core/core_rm_session.cc +++ b/base-nova/src/core/core_rm_session.cc @@ -36,9 +36,6 @@ Core_rm_session::attach(Dataspace_capability ds_cap, size_t size, if (!ds) throw Invalid_dataspace(); - if (size == 0) - size = ds->size(); - if (use_local_addr) { PERR("Parameter 'use_local_addr' not supported within core"); return 0UL; diff --git a/base-nova/src/core/include/core_rm_session.h b/base-nova/src/core/include/core_rm_session.h index d3a9780555..a6d1937216 100644 --- a/base-nova/src/core/include/core_rm_session.h +++ b/base-nova/src/core/include/core_rm_session.h @@ -37,7 +37,15 @@ namespace Genode { Local_addr local_addr = 0, bool executable = false); - void detach(Local_addr) { } + void detach(Local_addr) + { + /* + * The core-local mapping gets established in + * 'Ram_session_component::_clear_ds()' and reverted in + * 'Ram_session_component::_revoke_ram_ds(), so there's + * nothing to do here. + */ + } Pager_capability add_client(Thread_capability thread) { return Pager_capability(); } diff --git a/base-nova/src/core/ram_session_support.cc b/base-nova/src/core/ram_session_support.cc index 031be90236..2f5bbc698a 100644 --- a/base-nova/src/core/ram_session_support.cc +++ b/base-nova/src/core/ram_session_support.cc @@ -29,7 +29,20 @@ enum { verbose_ram_ds = false }; using namespace Genode; void Ram_session_component::_export_ram_ds(Dataspace_component *ds) { } -void Ram_session_component::_revoke_ram_ds(Dataspace_component *ds) { } + +void Ram_session_component::_revoke_ram_ds(Dataspace_component *ds) +{ + size_t page_rounded_size = (ds->size() + get_page_size() - 1) & get_page_mask(); + + unmap_local((Nova::Utcb *)Thread_base::myself()->utcb(), + ds->core_local_addr(), + page_rounded_size >> get_page_size_log2()); + + platform()->region_alloc()->free((void*)ds->core_local_addr(), + page_rounded_size); + + ds->assign_core_local_addr(0); +} void Ram_session_component::_clear_ds(Dataspace_component *ds) {