diff --git a/repos/ports/src/virtualbox5/spec/nova/sup.cc b/repos/ports/src/virtualbox5/spec/nova/sup.cc index af2d20b3f..3bd9fcf9d 100644 --- a/repos/ports/src/virtualbox5/spec/nova/sup.cc +++ b/repos/ports/src/virtualbox5/spec/nova/sup.cc @@ -64,14 +64,22 @@ enum { }; typedef Genode::Bit_allocator Page_ids; -typedef Genode::Bit_allocator Chunk_ids; -typedef Genode::Bit_array Free_ids; +typedef Genode::Bit_array Free_ids; + +class Chunk_ids: public Genode::Bit_allocator +{ + public: + + void reserve(Genode::addr_t bit_start, size_t const num) { + _reserve(bit_start, num); }; +}; static Page_ids page_ids; static Chunk_ids chunk_ids; -static Sub_rm_connection &vm_memory(Genode::addr_t vm_size = 0) + +static Sub_rm_connection &vm_memory(Genode::uint64_t vm_size = 0) { /* memory used by the VM in any order as the VMM asks for allocations */ static Sub_rm_connection vm_memory(genode_env(), vm_size); @@ -113,6 +121,12 @@ static Sub_rm_connection &vm_memory(Genode::addr_t vm_size = 0) memory = fli.page(); } + /* reserve chunkids which are special or unused */ + chunk_ids.reserve(0, CHUNKID_START); + addr_t const unused_id = CHUNKID_START + vm_size / GMM_CHUNK_SIZE; + addr_t const unused_count = MAX_CHUNK_IDS - unused_id - 1; + chunk_ids.reserve(unused_id, unused_count); + return vm_memory; } @@ -156,7 +170,7 @@ HRESULT genode_setup_machine(ComObjPtr machine) HRESULT ret = genode_check_memory_config(machine); if (ret == VINF_SUCCESS) - vm_memory(memory_vbox * 1024 * 1024 + (CHUNKID_START + 1) * GMM_CHUNK_SIZE); + vm_memory(1024ULL * 1024 * memory_vbox + (CHUNKID_START + 1) * GMM_CHUNK_SIZE); return ret; }; @@ -307,17 +321,6 @@ int SUPR3CallVMMR0Ex(PVMR0 pVMR0, VMCPUID idCpu, unsigned uOperation, GVMMCREATEVMREQ &req = reinterpret_cast(*pReqHdr); SUPR3QueryHWACCLonGenodeSupport(reinterpret_cast(req.pVMR3)); - /* reserve lower chunk ids */ - try { - for (unsigned i = 0; i < CHUNKID_START; i++) { - unsigned chunkid = chunk_ids.alloc(); - AssertMsg(chunkid == i, ("chunkid %u != %u i\n", chunkid, i)); - } - } catch (...) { - Genode::error(__func__," ", __LINE__, " allocation failed"); - throw; - } - return VINF_SUCCESS; } case VMMR0_DO_GVMM_REGISTER_VMCPU: @@ -443,7 +446,7 @@ int SUPR3CallVMMR0Ex(PVMR0 pVMR0, VMCPUID idCpu, unsigned uOperation, Assert(req->idChunkUnmap == NIL_GMM_CHUNKID); Assert(req->idChunkMap != NIL_GMM_CHUNKID); - Genode::addr_t local_addr_offset = req->idChunkMap << GMM_CHUNK_SHIFT; + Genode::addr_t local_addr_offset = (uintptr_t)req->idChunkMap << GMM_CHUNK_SHIFT; Genode::addr_t to = vm_memory().local_addr(local_addr_offset); req->pvR3 = reinterpret_cast(to); @@ -501,7 +504,7 @@ int SUPR3CallVMMR0Ex(PVMR0 pVMR0, VMCPUID idCpu, unsigned uOperation, AssertMsgReturn(pVM->pgm.s.aHandyPages[iFirst + iPage].idSharedPage == NIL_GMM_PAGEID, ("#%#x: %#x\n", iFirst + iPage, pVM->pgm.s.aHandyPages[iFirst + iPage].idSharedPage), VERR_INVALID_PARAMETER); } - unsigned chunkid = 0; + Genode::uint64_t chunkid = 0; try { chunkid = chunk_ids.alloc(); @@ -576,7 +579,7 @@ int SUPR3CallVMMR0Ex(PVMR0 pVMR0, VMCPUID idCpu, unsigned uOperation, Assert(pVM->pgm.s.cLargeHandyPages == 0); try { - unsigned chunkid = chunk_ids.alloc(); + Genode::uint64_t chunkid = chunk_ids.alloc(); pVM->pgm.s.aLargeHandyPage[0].idPage = (chunkid << GMM_CHUNKID_SHIFT); pVM->pgm.s.aLargeHandyPage[0].HCPhysGCPhys = vm_memory().local_addr(chunkid << GMM_CHUNK_SHIFT);