mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-02 20:16:48 +00:00
vbox6: synchronize guest-memory handling
This commit is contained in:
parent
ae8050bb82
commit
9ac23a18d4
@ -28,6 +28,9 @@
|
|||||||
#include <VBox/vmm/em.h>
|
#include <VBox/vmm/em.h>
|
||||||
#include <VBox/err.h>
|
#include <VBox/err.h>
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
|
#include <base/mutex.h>
|
||||||
|
|
||||||
/* local includes */
|
/* local includes */
|
||||||
#include <stub_macros.h>
|
#include <stub_macros.h>
|
||||||
#include <sup.h>
|
#include <sup.h>
|
||||||
@ -104,10 +107,11 @@ struct Sup::Nem
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Mutex mutex { };
|
||||||
Range host_range { };
|
Range host_range { };
|
||||||
Range guest_range { };
|
Range guest_range { };
|
||||||
|
|
||||||
void commit_range()
|
void commit_range_unsynchronized()
|
||||||
{
|
{
|
||||||
/* ignore commit of invalid ranges */
|
/* ignore commit of invalid ranges */
|
||||||
if (!host_range.valid())
|
if (!host_range.valid())
|
||||||
@ -124,8 +128,17 @@ struct Sup::Nem
|
|||||||
guest_range = { };
|
guest_range = { };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void commit_range()
|
||||||
|
{
|
||||||
|
Mutex::Guard guard(mutex);
|
||||||
|
|
||||||
|
commit_range_unsynchronized();
|
||||||
|
}
|
||||||
|
|
||||||
void map_to_guest(addr_t host_addr, addr_t guest_addr, size_t size, Protection prot)
|
void map_to_guest(addr_t host_addr, addr_t guest_addr, size_t size, Protection prot)
|
||||||
{
|
{
|
||||||
|
Mutex::Guard guard(mutex);
|
||||||
|
|
||||||
Range new_host_range { host_addr, host_addr + (size - 1), prot };
|
Range new_host_range { host_addr, host_addr + (size - 1), prot };
|
||||||
Range new_guest_range { guest_addr, guest_addr + (size - 1), prot };
|
Range new_guest_range { guest_addr, guest_addr + (size - 1), prot };
|
||||||
|
|
||||||
@ -144,7 +157,7 @@ struct Sup::Nem
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* new page starts a new range */
|
/* new page starts a new range */
|
||||||
commit_range();
|
commit_range_unsynchronized();
|
||||||
|
|
||||||
/* start over with new page */
|
/* start over with new page */
|
||||||
host_range = { host_addr, host_addr + (size - 1), prot };
|
host_range = { host_addr, host_addr + (size - 1), prot };
|
||||||
|
@ -95,6 +95,8 @@ Sup::Gmm::Vmm_addr Sup::Gmm::_alloc_pages(Pages pages)
|
|||||||
|
|
||||||
void Sup::Gmm::reservation_pages(Pages pages)
|
void Sup::Gmm::reservation_pages(Pages pages)
|
||||||
{
|
{
|
||||||
|
Mutex::Guard guard(_mutex);
|
||||||
|
|
||||||
_reservation_pages = pages;
|
_reservation_pages = pages;
|
||||||
|
|
||||||
_update_pool_size();
|
_update_pool_size();
|
||||||
@ -103,6 +105,8 @@ void Sup::Gmm::reservation_pages(Pages pages)
|
|||||||
|
|
||||||
Sup::Gmm::Vmm_addr Sup::Gmm::alloc_ex(Pages pages)
|
Sup::Gmm::Vmm_addr Sup::Gmm::alloc_ex(Pages pages)
|
||||||
{
|
{
|
||||||
|
Mutex::Guard guard(_mutex);
|
||||||
|
|
||||||
_alloc_ex_pages = { _alloc_ex_pages.value + pages.value };
|
_alloc_ex_pages = { _alloc_ex_pages.value + pages.value };
|
||||||
|
|
||||||
_update_pool_size();
|
_update_pool_size();
|
||||||
@ -113,12 +117,16 @@ Sup::Gmm::Vmm_addr Sup::Gmm::alloc_ex(Pages pages)
|
|||||||
|
|
||||||
Sup::Gmm::Vmm_addr Sup::Gmm::alloc_from_reservation(Pages pages)
|
Sup::Gmm::Vmm_addr Sup::Gmm::alloc_from_reservation(Pages pages)
|
||||||
{
|
{
|
||||||
|
Mutex::Guard guard(_mutex);
|
||||||
|
|
||||||
return _alloc_pages(pages);
|
return _alloc_pages(pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Sup::Gmm::Page_id Sup::Gmm::page_id(Vmm_addr addr)
|
Sup::Gmm::Page_id Sup::Gmm::page_id(Vmm_addr addr)
|
||||||
{
|
{
|
||||||
|
Mutex::Guard guard(_mutex);
|
||||||
|
|
||||||
bool const inside_map = (addr.value >= _map.base.value)
|
bool const inside_map = (addr.value >= _map.base.value)
|
||||||
&& (addr.value <= _map.end.value);
|
&& (addr.value <= _map.end.value);
|
||||||
|
|
||||||
@ -143,6 +151,8 @@ uint32_t Sup::Gmm::page_id_as_uint32(Page_id page_id)
|
|||||||
|
|
||||||
Sup::Gmm::Vmm_addr Sup::Gmm::vmm_addr(Page_id page_id)
|
Sup::Gmm::Vmm_addr Sup::Gmm::vmm_addr(Page_id page_id)
|
||||||
{
|
{
|
||||||
|
Mutex::Guard guard(_mutex);
|
||||||
|
|
||||||
/* NIL_GMM_CHUNKID kept unused - so offset 0 is chunk ID 1 */
|
/* NIL_GMM_CHUNKID kept unused - so offset 0 is chunk ID 1 */
|
||||||
addr_t const addr = _map.base.value
|
addr_t const addr = _map.base.value
|
||||||
+ ((page_id.value - (1u << GMM_CHUNKID_SHIFT)) << PAGE_SHIFT);
|
+ ((page_id.value - (1u << GMM_CHUNKID_SHIFT)) << PAGE_SHIFT);
|
||||||
@ -159,6 +169,8 @@ Sup::Gmm::Vmm_addr Sup::Gmm::vmm_addr(Page_id page_id)
|
|||||||
|
|
||||||
void Sup::Gmm::map_to_guest(Vmm_addr from, Guest_addr to, Pages pages, Protection prot)
|
void Sup::Gmm::map_to_guest(Vmm_addr from, Guest_addr to, Pages pages, Protection prot)
|
||||||
{
|
{
|
||||||
|
Mutex::Guard guard(_mutex);
|
||||||
|
|
||||||
/* revoke existing mappings to avoid overmap */
|
/* revoke existing mappings to avoid overmap */
|
||||||
_vm_connection.detach(to.value, pages.value << PAGE_SHIFT);
|
_vm_connection.detach(to.value, pages.value << PAGE_SHIFT);
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/allocator_avl.h>
|
#include <base/allocator_avl.h>
|
||||||
#include <base/attached_dataspace.h>
|
#include <base/attached_dataspace.h>
|
||||||
|
#include <base/mutex.h>
|
||||||
#include <rm_session/connection.h>
|
#include <rm_session/connection.h>
|
||||||
#include <vm_session/connection.h>
|
#include <vm_session/connection.h>
|
||||||
#include <region_map/client.h>
|
#include <region_map/client.h>
|
||||||
@ -93,6 +94,8 @@ class Sup::Gmm
|
|||||||
static constexpr Bytes _map_size { 32*1024*1024*1024ul };
|
static constexpr Bytes _map_size { 32*1024*1024*1024ul };
|
||||||
static constexpr auto _num_slices { _map_size.value / _slice_size.value };
|
static constexpr auto _num_slices { _map_size.value / _slice_size.value };
|
||||||
|
|
||||||
|
Mutex _mutex { };
|
||||||
|
|
||||||
Dataspace_capability _slices[_num_slices];
|
Dataspace_capability _slices[_num_slices];
|
||||||
|
|
||||||
Pages _size_pages { 0 }; /* current backing-store allocations */
|
Pages _size_pages { 0 }; /* current backing-store allocations */
|
||||||
|
Loading…
Reference in New Issue
Block a user