From bcfcc1db9c0ea258447b46107b0976fa225d872b Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Thu, 24 Aug 2017 11:53:19 +0200 Subject: [PATCH] sel4: handle unmap error more gracefully Issue #2505 --- repos/base-sel4/src/core/include/map_local.h | 3 +-- repos/base-sel4/src/core/include/vm_space.h | 9 ++++++--- repos/base-sel4/src/core/platform_thread.cc | 6 +++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/repos/base-sel4/src/core/include/map_local.h b/repos/base-sel4/src/core/include/map_local.h index f53d77212..8a59e58e5 100644 --- a/repos/base-sel4/src/core/include/map_local.h +++ b/repos/base-sel4/src/core/include/map_local.h @@ -56,8 +56,7 @@ namespace Genode { Platform * platform = nullptr) { platform = platform ? platform : platform_specific(); - platform->core_vm_space().unmap(virt_addr, num_pages); - return true; + return platform->core_vm_space().unmap(virt_addr, num_pages); } } diff --git a/repos/base-sel4/src/core/include/vm_space.h b/repos/base-sel4/src/core/include/vm_space.h index 2bc034164..2849d98c6 100644 --- a/repos/base-sel4/src/core/include/vm_space.h +++ b/repos/base-sel4/src/core/include/vm_space.h @@ -388,11 +388,13 @@ class Genode::Vm_space } } - void unmap(addr_t virt, size_t num_pages) + bool unmap(addr_t virt, size_t num_pages) { + bool unmap_success = true; + Lock::Guard guard(_lock); - for (size_t i = 0; i < num_pages; i++) { + for (size_t i = 0; unmap_success && i < num_pages; i++) { off_t const offset = i << get_page_size_log2(); _page_table_registry.flush_page(virt + offset, [&] (Cap_sel const &idx, addr_t) { @@ -401,7 +403,7 @@ class Genode::Vm_space if (result != seL4_NoError) { error("unmap ", Hex(virt + offset), " failed, idx=", idx, " result=", result); - return; + unmap_success = false; } _leaf_cnode(idx.value()).remove(_leaf_cnode_entry(idx.value())); @@ -409,6 +411,7 @@ class Genode::Vm_space _sel_alloc.free(idx.value()); }); } + return unmap_success; } void unsynchronized_alloc_page_tables(addr_t const start, diff --git a/repos/base-sel4/src/core/platform_thread.cc b/repos/base-sel4/src/core/platform_thread.cc index c9f7591f2..2ceb753f5 100644 --- a/repos/base-sel4/src/core/platform_thread.cc +++ b/repos/base-sel4/src/core/platform_thread.cc @@ -121,7 +121,11 @@ static void prepopulate_ipc_buffer(addr_t ipc_buffer_phys, Cap_sel ep_sel, utcb.lock_sel = lock_sel.value(); /* unmap IPC buffer from core */ - unmap_local((addr_t)virt_addr, 1); + if (!unmap_local((addr_t)virt_addr, 1)) { + Genode::error("could not unmap core virtual address ", + virt_addr, " in ", __PRETTY_FUNCTION__); + return; + } /* free core's virtual address space */ platform()->region_alloc()->free(virt_addr, page_rounded_size);