From e87b322616c427e08806d67b89589baabe51776c Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 18 Oct 2017 14:14:07 +0200 Subject: [PATCH] libc: support executable memory allocations in internal memory allocator used by libc and vbox* Issue #1723 --- repos/libports/src/lib/libc/libc_mem_alloc.cc | 9 +++++++-- repos/libports/src/lib/libc/libc_mem_alloc.h | 14 ++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/repos/libports/src/lib/libc/libc_mem_alloc.cc b/repos/libports/src/lib/libc/libc_mem_alloc.cc index 264663cd5..45c2d6c9e 100644 --- a/repos/libports/src/lib/libc/libc_mem_alloc.cc +++ b/repos/libports/src/lib/libc/libc_mem_alloc.cc @@ -37,10 +37,12 @@ Libc::Mem_alloc_impl::Dataspace_pool::~Dataspace_pool() */ Ram_dataspace_capability ds_cap = ds->cap; + void const * const local_addr = ds->local_addr; remove(ds); delete ds; - _region_map->detach(ds->local_addr); + + _region_map->detach(local_addr); _ram_session->free(ds_cap); } } @@ -54,7 +56,10 @@ int Libc::Mem_alloc_impl::Dataspace_pool::expand(size_t size, Range_allocator *a /* make new ram dataspace available at our local address space */ try { new_ds_cap = _ram_session->alloc(size); - local_addr = _region_map->attach(new_ds_cap); + + enum { MAX_SIZE = 0, NO_OFFSET = 0, ANY_LOCAL_ADDR = false }; + local_addr = _region_map->attach(new_ds_cap, MAX_SIZE, NO_OFFSET, + ANY_LOCAL_ADDR, nullptr, _executable); } catch (Out_of_ram) { return -2; } catch (Out_of_caps) { return -4; } diff --git a/repos/libports/src/lib/libc/libc_mem_alloc.h b/repos/libports/src/lib/libc/libc_mem_alloc.h index ebd138baf..7ea6f0a0d 100644 --- a/repos/libports/src/lib/libc/libc_mem_alloc.h +++ b/repos/libports/src/lib/libc/libc_mem_alloc.h @@ -60,14 +60,18 @@ namespace Libc { Genode::Ram_session *_ram_session; /* ram session for backing store */ Genode::Region_map *_region_map; /* region map of address space */ + bool const _executable; /* whether to allocate executable dataspaces */ public: /** * Constructor */ - Dataspace_pool(Genode::Ram_session *ram, Genode::Region_map *rm): - _ram_session(ram), _region_map(rm) { } + Dataspace_pool(Genode::Ram_session *ram, + Genode::Region_map *rm, bool executable) : + _ram_session(ram), _region_map(rm), + _executable(executable) + { } /** * Destructor @@ -108,9 +112,11 @@ namespace Libc { public: - Mem_alloc_impl(Genode::Region_map &rm, Genode::Ram_session &ram) + Mem_alloc_impl(Genode::Region_map &rm, + Genode::Ram_session &ram, + bool executable = false) : - _ds_pool(&ram, &rm), + _ds_pool(&ram, &rm, executable), _alloc(0), _chunk_size(MIN_CHUNK_SIZE) { }