libc: support executable memory allocations

in internal memory allocator used by libc and vbox*

Issue #1723
This commit is contained in:
Alexander Boettcher 2017-10-18 14:14:07 +02:00 committed by Christian Helmuth
parent dfa8b787be
commit e87b322616
2 changed files with 17 additions and 6 deletions

View File

@ -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; }

View File

@ -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)
{ }