From b6c440852b6fc9670a30ad8494eeea24109371d7 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 28 Aug 2015 10:35:42 +0200 Subject: [PATCH] vbox: allocate guest memory in chunks Fixes #1575 --- repos/ports/src/virtualbox/vmm_memory.h | 34 ++++++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/repos/ports/src/virtualbox/vmm_memory.h b/repos/ports/src/virtualbox/vmm_memory.h index 61ccfda6b..52cb6247c 100644 --- a/repos/ports/src/virtualbox/vmm_memory.h +++ b/repos/ports/src/virtualbox/vmm_memory.h @@ -26,7 +26,7 @@ #include #include #include -#include +#include #define PAGE_SIZE BACKUP_PAGESIZE @@ -42,12 +42,11 @@ class Vmm_memory typedef Genode::Rm_session Rm_session; typedef Genode::size_t size_t; typedef Genode::Lock Lock; - typedef Genode::Attached_ram_dataspace Attached_ram_dataspace; typedef Genode::List Region_list; private: - struct Region : Region_list::Element, Attached_ram_dataspace + struct Region : Region_list::Element, Genode::Rm_connection { PPDMDEVINS pDevIns; unsigned const iRegion; @@ -56,14 +55,35 @@ class Vmm_memory void *pvUserR3; PGMPHYSHANDLERTYPE enmType; + Genode::addr_t _base; + Genode::size_t _size; + Region(Ram_session &ram, size_t size, PPDMDEVINS pDevIns, - unsigned iRegion) + unsigned iRegion, unsigned sub_rm_max_ds = 32 * 1024 * 1024) : - Attached_ram_dataspace(&ram, size), + Rm_connection(0, size), pDevIns(pDevIns), iRegion(iRegion), - vm_phys(0), pfnHandlerR3(0), pvUserR3(0) - { } + vm_phys(0), pfnHandlerR3(0), pvUserR3(0), + _base(Genode::env()->rm_session()->attach(Rm_connection::dataspace())), + _size(size) + { + Genode::addr_t rest_size = _size; + Genode::addr_t map_size = rest_size < sub_rm_max_ds ? rest_size : sub_rm_max_ds; + + do { + Genode::Ram_dataspace_capability ds = Genode::env()->ram_session()->alloc(map_size); + attach_at(ds, _size - rest_size, map_size); + + rest_size -= map_size; + map_size = rest_size < sub_rm_max_ds ? rest_size : sub_rm_max_ds; + } while (rest_size); + } + + size_t size() { return _size; } + + template + T * local_addr() { return reinterpret_cast(_base); } }; Lock _lock;