From a19662abc707fc284c1479953a6da0f68d0848b1 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 10 Mar 2017 14:37:15 +0100 Subject: [PATCH] vbox5: update to 5.1.18 Issue #2338 --- repos/ports/lib/mk/virtualbox5-common.inc | 1 + repos/ports/lib/mk/virtualbox5-vmm.mk | 2 + repos/ports/lib/mk/virtualbox5-xml.mk | 2 +- repos/ports/ports/virtualbox5.hash | 2 +- repos/ports/ports/virtualbox5.port | 10 +- repos/ports/src/virtualbox5/devices.cc | 2 +- repos/ports/src/virtualbox5/mm.cc | 100 ------------------ repos/ports/src/virtualbox5/patches/mm.patch | 98 +++++++++++++++++ repos/ports/src/virtualbox5/patches/series | 2 +- repos/ports/src/virtualbox5/patches/vmm.patch | 17 --- repos/ports/src/virtualbox5/spec/nova/sup.cc | 8 +- repos/ports/src/virtualbox5/spec/nova/vcpu.h | 66 ++++++++++-- .../src/virtualbox5/spec/nova/vcpu_vmx.h | 4 + repos/ports/src/virtualbox5/sup.cc | 18 +++- repos/ports/src/virtualbox5/target.inc | 1 + repos/ports/src/virtualbox5/unimpl.cc | 4 - 16 files changed, 191 insertions(+), 146 deletions(-) create mode 100644 repos/ports/src/virtualbox5/patches/mm.patch delete mode 100644 repos/ports/src/virtualbox5/patches/vmm.patch diff --git a/repos/ports/lib/mk/virtualbox5-common.inc b/repos/ports/lib/mk/virtualbox5-common.inc index cf7cef1d47..b48ad2fa47 100644 --- a/repos/ports/lib/mk/virtualbox5-common.inc +++ b/repos/ports/lib/mk/virtualbox5-common.inc @@ -32,6 +32,7 @@ VBOX_CC_OPT += -DRT_OS_FREEBSD VBOX_CC_OPT += -DVBOX_WITH_REM VBOX_CC_OPT += -DVBOX_WITH_2ND_IEM_STEP +VBOX_CC_OPT += -DVBOX_WITH_3RD_IEM_STEP VBOX_CC_OPT += -DVBOX_WITH_HGCM -DVBOX_WITH_HGSMI diff --git a/repos/ports/lib/mk/virtualbox5-vmm.mk b/repos/ports/lib/mk/virtualbox5-vmm.mk index 4ce96ceff4..d956a314be 100644 --- a/repos/ports/lib/mk/virtualbox5-vmm.mk +++ b/repos/ports/lib/mk/virtualbox5-vmm.mk @@ -92,6 +92,8 @@ SRC_CC += VMM/VMMR3/APIC.cpp SRC_CC += VMM/VMMAll/APICAll.cpp endif +SRC_CC += VMM/VMMR3/MM.cpp + CC_OPT += -DVBOX_IN_VMM # definitions needed by SSM.cpp diff --git a/repos/ports/lib/mk/virtualbox5-xml.mk b/repos/ports/lib/mk/virtualbox5-xml.mk index 8b18cebc64..75c7b3f5ba 100644 --- a/repos/ports/lib/mk/virtualbox5-xml.mk +++ b/repos/ports/lib/mk/virtualbox5-xml.mk @@ -1,7 +1,7 @@ include $(REP_DIR)/lib/mk/virtualbox5-common.inc ZLIB_DIR = $(VIRTUALBOX_DIR)/src/libs/zlib-1.2.8 -LIBXML_DIR = $(VIRTUALBOX_DIR)/src/libs/libxml2-2.9.2 +LIBXML_DIR = $(VIRTUALBOX_DIR)/src/libs/libxml2-2.9.4 INC_DIR += $(ZLIB_DIR) INC_DIR += $(LIBXML_DIR)/include diff --git a/repos/ports/ports/virtualbox5.hash b/repos/ports/ports/virtualbox5.hash index f45f0f8452..7d3d6c62fe 100644 --- a/repos/ports/ports/virtualbox5.hash +++ b/repos/ports/ports/virtualbox5.hash @@ -1 +1 @@ -570552db8aed1167dc7c910e2693833209ddfede +94dea6e6f2eba1626d6c6f96933a121d6ae8a30b diff --git a/repos/ports/ports/virtualbox5.port b/repos/ports/ports/virtualbox5.port index 833a12058c..cc604b0c95 100644 --- a/repos/ports/ports/virtualbox5.port +++ b/repos/ports/ports/virtualbox5.port @@ -1,17 +1,17 @@ LICENSE := GPLv2 -VERSION := 5.1.14 +VERSION := 5.1.18 DOWNLOADS := virtualbox.archive virtualbox_sdk.archive VIRTUALBOX_TBZ2 := VirtualBox-$(VERSION).tar.bz2 -VIRTUALBOX_SDK_ZIP := VirtualBoxSDK-$(VERSION)-112924.zip +VIRTUALBOX_SDK_ZIP := VirtualBoxSDK-$(VERSION)-114002.zip URL(virtualbox) := http://download.virtualbox.org/virtualbox/$(VERSION)/$(VIRTUALBOX_TBZ2) DIR(virtualbox) := src/app/virtualbox -SHA(virtualbox) := 9f5c4880b6a94bf57a6c6e64166753147ccee5e1 +SHA(virtualbox) := 672939da34addc06a71b20df0a0e47d8c8940f71 URL(virtualbox_sdk) := http://download.virtualbox.org/virtualbox/$(VERSION)/$(VIRTUALBOX_SDK_ZIP) DIR(virtualbox_sdk) := src/app/virtualbox_sdk -SHA(virtualbox_sdk) := c94dc6fcd0ccd02d6342865c0c53e7ae16c72acc +SHA(virtualbox_sdk) := 3115c50899ababaf5cbdafdc14950ced2e8a2f50 PATCHES_DIR := src/virtualbox5/patches PATCHES_DIR_VBOX4 := src/virtualbox/patches @@ -106,7 +106,7 @@ VBOX_CONTENT += $(addprefix include/VBox/, $(VBOX_INC)) VBOX_CONTENT += $(addprefix include/VBox/com/, $(VBOX_INC_COM)) VBOX_CONTENT += include/VBox/HostServices/ -VBOX_CONTENT += src/libs/zlib-1.2.8 src/libs/liblzf-3.4 src/libs/libxml2-2.9.2 +VBOX_CONTENT += src/libs/zlib-1.2.8 src/libs/liblzf-3.4 src/libs/libxml2-2.9.4 VBOX_CONTENT += src/recompiler include/VBox/vmm include/iprt Config.kmk diff --git a/repos/ports/src/virtualbox5/devices.cc b/repos/ports/src/virtualbox5/devices.cc index 82d6c3bae8..f0dbfcb9f5 100644 --- a/repos/ports/src/virtualbox5/devices.cc +++ b/repos/ports/src/virtualbox5/devices.cc @@ -55,7 +55,7 @@ extern "C" int VBoxDevicesRegister(PPDMDEVREGCB pCallbacks, uint32_t u32Version) REGISTER(DeviceE1000); #endif REGISTER(DeviceICHAC97); - REGISTER(DeviceHDA); + REGISTER(DeviceICH6_HDA); REGISTER(DeviceOHCI); REGISTER(DeviceACPI); REGISTER(DeviceDMA); diff --git a/repos/ports/src/virtualbox5/mm.cc b/repos/ports/src/virtualbox5/mm.cc index 3a773e6d75..a2fe3d90d4 100644 --- a/repos/ports/src/virtualbox5/mm.cc +++ b/repos/ports/src/virtualbox5/mm.cc @@ -256,13 +256,6 @@ void MMR3HeapFree(void *pv) } -uint64_t MMR3PhysGetRamSize(PVM pVM) -{ - /* when called from REMR3Init, it is expected to return 0 */ - return 0; -} - - int MMR3HyperMapHCPhys(PVM pVM, void *pvR3, RTR0PTR pvR0, RTHCPHYS HCPhys, size_t cb, const char *pszDesc, PRTGCPTR pGCPtr) { @@ -283,12 +276,6 @@ int MMR3HyperReserve(PVM pVM, unsigned cb, const char *pszDesc, PRTGCPTR pGCPtr) } -VMMR3DECL(int) MMR3IncreaseBaseReservation(PVM pVM, uint64_t cAddBasePages) -{ - return VINF_SUCCESS; -} - - int MMR3AdjustFixedReservation(PVM, int32_t, const char *pszDesc) { if (VERBOSE_MM) @@ -310,79 +297,6 @@ int MMR3HyperMapMMIO2(PVM pVM, PPDMDEVINS pDevIns, uint32_t iSubDev, } -/* - * Based on 'VBox/VMM/VMMR3/MM.cpp' - */ -int MMR3InitPaging(PVM pVM) -{ - /* - * Query the CFGM values. - */ - int rc; - PCFGMNODE pMMCfg = CFGMR3GetChild(CFGMR3GetRoot(pVM), "MM"); - if (!pMMCfg) - { - rc = CFGMR3InsertNode(CFGMR3GetRoot(pVM), "MM", &pMMCfg); - AssertRCReturn(rc, rc); - } - - /** @cfgm{RamSize, uint64_t, 0, 16TB, 0} - * Specifies the size of the base RAM that is to be set up during - * VM initialization. - */ - uint64_t cbRam; - rc = CFGMR3QueryU64(CFGMR3GetRoot(pVM), "RamSize", &cbRam); - if (rc == VERR_CFGM_VALUE_NOT_FOUND) - cbRam = 0; - else - AssertMsgRCReturn(rc, ("Configuration error: Failed to query integer \"RamSize\", rc=%Rrc.\n", rc), rc); - cbRam &= X86_PTE_PAE_PG_MASK; - - /** @cfgm{RamHoleSize, uint32_t, 0, 4032MB, 512MB} - * Specifies the size of the memory hole. The memory hole is used - * to avoid mapping RAM to the range normally used for PCI memory regions. - * Must be aligned on a 4MB boundary. */ - uint32_t cbRamHole; - rc = CFGMR3QueryU32Def(CFGMR3GetRoot(pVM), "RamHoleSize", &cbRamHole, MM_RAM_HOLE_SIZE_DEFAULT); - uint64_t const offRamHole = _4G - cbRamHole; - - /* - * Make the initial memory reservation with GMM. - */ - LogFlow(("GMMR3INitialReservation missing\n")); - - /* - * If RamSize is 0 we're done now. - */ - if (cbRam < PAGE_SIZE) - { - Log(("MM: No RAM configured\n")); - return VINF_SUCCESS; - } - - /* - * Setup the base ram (PGM). - */ - if (cbRam > offRamHole) - { - pVM->mm.s.cbRamBelow4GB = offRamHole; - rc = PGMR3PhysRegisterRam(pVM, 0, offRamHole, "Base RAM"); - if (RT_SUCCESS(rc)) - { - pVM->mm.s.cbRamAbove4GB = cbRam - offRamHole; - rc = PGMR3PhysRegisterRam(pVM, _4G, cbRam - offRamHole, "Above 4GB Base RAM"); - } - } else { - pVM->mm.s.cbRamBelow4GB = cbRam; - pVM->mm.s.cbRamAbove4GB = 0; - rc = PGMR3PhysRegisterRam(pVM, 0, RT_MIN(cbRam, offRamHole), "Base RAM"); - } - - LogFlow(("MMR3InitPaging: returns %Rrc\n", rc)); - return rc; -} - - char * MMR3HeapStrDupU(PUVM pUVM, MMTAG enmTag, const char *string) { if (!string) @@ -472,20 +386,6 @@ VMMDECL(uint32_t) MMHyperHeapPtrToOffset(PVM pVM, void *pv) } -VMMR3DECL(uint32_t) MMR3PhysGetRamSizeBelow4GB(PVM pVM) -{ - VM_ASSERT_VALID_EXT_RETURN(pVM, UINT32_MAX); - return pVM->mm.s.cbRamBelow4GB; -} - - -VMMR3DECL(uint64_t) MMR3PhysGetRamSizeAbove4GB(PVM pVM) -{ - VM_ASSERT_VALID_EXT_RETURN(pVM, UINT64_MAX); - return pVM->mm.s.cbRamAbove4GB; -} - - extern "C" { char * MMR3HeapAPrintf(PVM pVM, MMTAG enmTag, const char *pszFormat, ...) diff --git a/repos/ports/src/virtualbox5/patches/mm.patch b/repos/ports/src/virtualbox5/patches/mm.patch new file mode 100644 index 0000000000..27f87345b1 --- /dev/null +++ b/repos/ports/src/virtualbox5/patches/mm.patch @@ -0,0 +1,98 @@ +--- a/src/app/virtualbox/src/VBox/VMM/VMMR3/MM.cpp ++++ b/src/app/virtualbox/src/VBox/VMM/VMMR3/MM.cpp +@@ -185,6 +185,7 @@ + * @returns VBox status code. + * @param pUVM Pointer to the user mode VM structure. + */ ++#if 0 + VMMR3DECL(int) MMR3InitUVM(PUVM pUVM) + { + /* +@@ -208,6 +209,7 @@ + } + return rc; + } ++#endif + + + /** +@@ -228,6 +230,7 @@ + * @returns VBox status code. + * @param pVM The cross context VM structure. + */ ++#if 0 + VMMR3DECL(int) MMR3Init(PVM pVM) + { + LogFlow(("MMR3Init\n")); +@@ -284,6 +287,7 @@ + MMR3Term(pVM); + return rc; + } ++#endif + + + /** +@@ -456,6 +460,7 @@ + * @returns VBox status code. + * @param pVM The cross context VM structure. + */ ++#if 0 + VMMR3DECL(int) MMR3Term(PVM pVM) + { + /* +@@ -484,6 +489,7 @@ + + return VINF_SUCCESS; + } ++#endif + + + /** +@@ -495,6 +501,7 @@ + * @returns VBox status code. + * @param pUVM Pointer to the user mode VM structure. + */ ++#if 0 + VMMR3DECL(void) MMR3TermUVM(PUVM pUVM) + { + /* +@@ -508,6 +515,7 @@ + mmR3HeapDestroy(pUVM->mm.s.pHeap); + pUVM->mm.s.pHeap = NULL; + } ++#endif + + + /** +@@ -656,6 +664,7 @@ + * @param pVM The cross context VM structure. + * @param cHandyPages The number of handy pages. + */ ++#if 0 + VMMR3DECL(int) MMR3ReserveHandyPages(PVM pVM, uint32_t cHandyPages) + { + AssertReturn(!pVM->mm.s.cHandyPages, VERR_WRONG_ORDER); +@@ -671,6 +680,7 @@ + } + return rc; + } ++#endif + + + /** +@@ -683,6 +693,7 @@ + * @param cDeltaFixedPages The number of pages to add (positive) or subtract (negative). + * @param pszDesc Some description associated with the reservation. + */ ++#if 0 + VMMR3DECL(int) MMR3AdjustFixedReservation(PVM pVM, int32_t cDeltaFixedPages, const char *pszDesc) + { + const uint32_t cOld = pVM->mm.s.cFixedPages; +@@ -697,6 +708,7 @@ + } + return rc; + } ++#endif + + + /** diff --git a/repos/ports/src/virtualbox5/patches/series b/repos/ports/src/virtualbox5/patches/series index 166fe1d698..13337052a6 100644 --- a/repos/ports/src/virtualbox5/patches/series +++ b/repos/ports/src/virtualbox5/patches/series @@ -3,9 +3,9 @@ vbox_main.patch vga_vbva.patch vmmdev.patch usb.patch -vmm.patch iem_wip.patch dbg.patch dev_e1000.patch tm_tpr_vbox5.patch vm.patch +mm.patch diff --git a/repos/ports/src/virtualbox5/patches/vmm.patch b/repos/ports/src/virtualbox5/patches/vmm.patch deleted file mode 100644 index d60ee0d305..0000000000 --- a/repos/ports/src/virtualbox5/patches/vmm.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/src/app/virtualbox/src/VBox/VMM/VMMR3/EM.cpp -+++ b/src/app/virtualbox/src/VBox/VMM/VMMR3/EM.cpp -@@ -2211,10 +2227,11 @@ - */ - case VINF_EM_RESCHEDULE_REM: - Assert(!pVM->em.s.fIemExecutesAll || pVCpu->em.s.enmState != EMSTATE_IEM); -- if (HMIsEnabled(pVM)) -+ if (HMIsEnabled(pVM) && -+ !(VM_FF_IS_PENDING(pVM, VM_FF_ALL_REM_MASK) || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_ALL_REM_MASK))) - { -- Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d -> %d (EMSTATE_IEM_THEN_REM)\n", -- enmOldState, EMSTATE_IEM_THEN_REM)); -+ Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d, %d -> %d (EMSTATE_IEM_THEN_REM)\n", -+ pVCpu->em.s.enmState, enmOldState, EMSTATE_IEM_THEN_REM)); - if (pVCpu->em.s.enmState != EMSTATE_IEM_THEN_REM) - { - pVCpu->em.s.enmState = EMSTATE_IEM_THEN_REM; diff --git a/repos/ports/src/virtualbox5/spec/nova/sup.cc b/repos/ports/src/virtualbox5/spec/nova/sup.cc index f4b09c6256..9bd2ae6dbc 100644 --- a/repos/ports/src/virtualbox5/spec/nova/sup.cc +++ b/repos/ports/src/virtualbox5/spec/nova/sup.cc @@ -336,7 +336,7 @@ int SUPR3CallVMMR0Ex(PVMR0 pVMR0, VMCPUID idCpu, unsigned uOperation, Vcpu_handler *vcpu_handler = lookup_vcpu_handler(idCpu); Assert(vcpu_handler); if (vcpu_handler) - vcpu_handler->recall(); + vcpu_handler->recall(vcpu_handler_list().first()); return VINF_SUCCESS; } case VMMR0_DO_GMM_ALLOCATE_PAGES: @@ -628,6 +628,12 @@ int SUPR3CallVMMR0Ex(PVMR0 pVMR0, VMCPUID idCpu, unsigned uOperation, return VINF_SUCCESS; } + case VMMR0_DO_GMM_INITIAL_RESERVATION: + Genode::log("VMMR0_DO_GMM_INITIAL_RESERVATION called"); + return VINF_SUCCESS; + case VMMR0_DO_GMM_UPDATE_RESERVATION: + Genode::log("VMMR0_DO_GMM_UPDATE_RESERVATION called"); + return VINF_SUCCESS; default: Genode::error("SUPR3CallVMMR0Ex: unhandled uOperation ", uOperation, " ", (int)VMMR0_DO_PGM_ALLOCATE_HANDY_PAGES, " ", diff --git a/repos/ports/src/virtualbox5/spec/nova/vcpu.h b/repos/ports/src/virtualbox5/spec/nova/vcpu.h index 2cc4ef3c41..e306479d9f 100644 --- a/repos/ports/src/virtualbox5/spec/nova/vcpu.h +++ b/repos/ports/src/virtualbox5/spec/nova/vcpu.h @@ -83,13 +83,12 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, Vmm::Vcpu_other_pd _vcpu; - Genode::addr_t _ec_sel; - bool _irq_win; + Genode::addr_t _ec_sel; + bool _irq_win = false; - unsigned int _cpu_id; - - unsigned int _last_inj_info; - unsigned int _last_inj_error; + unsigned int _cpu_id; + unsigned int _last_inj_info = 0; + unsigned int _last_inj_error = 0; void fpu_save(char * data) { Assert(!(reinterpret_cast(data) & 0xF)); @@ -133,6 +132,15 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, protected: + Genode::addr_t _vm_exits = 0; + Genode::addr_t _recall_skip = 0; + Genode::addr_t _recall_req = 0; + Genode::addr_t _recall_inv = 0; + Genode::addr_t _recall_drop = 0; + Genode::addr_t _irq_request = 0; + Genode::addr_t _irq_inject = 0; + Genode::addr_t _irq_drop = 0; + struct { Nova::mword_t mtd; unsigned intr_state; @@ -164,6 +172,8 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, Assert(utcb->actv_state == ACTIVITY_STATE_ACTIVE); Assert(!(utcb->inj_info & IRQ_INJ_VALID_MASK)); + _vm_exits ++; + /* go back to VirtualBox */ _fpu_save_and_longjmp(); } @@ -172,6 +182,9 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, { Nova::Utcb * utcb = reinterpret_cast(Thread::utcb()); + _vm_exits ++; + _recall_inv ++; + Assert(utcb->actv_state == ACTIVITY_STATE_ACTIVE); if (utcb->inj_info & IRQ_INJ_VALID_MASK) { @@ -184,10 +197,9 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, Assert(utcb->intr_state == INTERRUPT_STATE_NONE); -/* if (!continue_hw_accelerated(utcb)) - Vmm::log("WARNING - recall ignored during IRQ delivery"); -*/ + _recall_drop ++; + /* got recall during irq injection and the guest is ready for * delivery of IRQ - just continue */ Nova::reply(_stack_reply); @@ -235,6 +247,7 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, continue_hw_accelerated(utcb, true); if (_irq_win) { + _irq_drop++; _irq_win = false; utcb->inj_info = IRQ_INJ_NONE; utcb->mtd |= Nova::Mtd::INJ; @@ -583,6 +596,8 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, VMCPU_FF_INTERRUPT_PIC))) return false; + _irq_request++; + unsigned vector = 0; utcb->inj_info = NOVA_REQ_IRQWIN_EXIT | vector; utcb->mtd |= Nova::Mtd::INJ; @@ -595,6 +610,8 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, { Nova::Utcb * utcb = reinterpret_cast(Thread::utcb()); + _vm_exits ++; + PVMCPU pVCpu = _current_vcpu; Assert(utcb->intr_state == INTERRUPT_STATE_NONE); @@ -625,12 +642,14 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, } if (!TRPMHasTrap(pVCpu)) { + _irq_drop++; /* happens if PDMApicSetTPR (see above) mask IRQ */ utcb->inj_info = IRQ_INJ_NONE; utcb->mtd = Nova::Mtd::INJ | Nova::Mtd::FPU; Nova::reply(_stack_reply); } } + _irq_inject++; /* * If we have no IRQ for injection, something with requesting the @@ -773,7 +792,6 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, name), _vcpu(cpu_session, location, pd_vcpu), _ec_sel(Genode::cap_map()->insert()), - _irq_win(false), _cpu_id(cpu_id) { } @@ -783,15 +801,41 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, _vcpu.start(_ec_sel); } - void recall() + void recall(Vcpu_handler * other = nullptr) { using namespace Nova; + asm volatile ("":::"memory"); + + _recall_req ++; + + if (_irq_win) { + _recall_skip ++; + return; + } + if (ec_ctrl(EC_RECALL, _ec_sel) != NOVA_OK) { Genode::error("recall failed"); Genode::Lock lock(Genode::Lock::LOCKED); lock.lock(); } + +#if 0 + if (_recall_req % 1000 == 0) { + using Genode::log; + + while (other) { + log(other->_cpu_id, " exits=", other->_vm_exits, + " req:skip:drop,inv recall=", other->_recall_req, ":", + other->_recall_skip, ":", other->_recall_drop, ":", + other->_recall_inv, " req:inj:drop irq=", + other->_irq_request, ":", other->_irq_inject, ":", + other->_irq_drop); + + other = other->next(); + } + } +#endif } void halt(Genode::uint64_t tsc_abs) diff --git a/repos/ports/src/virtualbox5/spec/nova/vcpu_vmx.h b/repos/ports/src/virtualbox5/spec/nova/vcpu_vmx.h index e85e336f6f..f01603c415 100644 --- a/repos/ports/src/virtualbox5/spec/nova/vcpu_vmx.h +++ b/repos/ports/src/virtualbox5/spec/nova/vcpu_vmx.h @@ -150,6 +150,8 @@ class Vcpu_handler_vmx : public Vcpu_handler if (cr == 8) _default_handler(); + _vm_exits ++; + Genode::uint64_t *pdpte = pdpte_map(_current_vm, utcb->cr3); Assert(pdpte != 0); @@ -198,6 +200,8 @@ class Vcpu_handler_vmx : public Vcpu_handler /* we don't support tsc offsetting for now - so let the rdtsc exit */ register_handler (exc_base, Mtd::ALL | Mtd::FPU); + register_handler (exc_base, Mtd::ALL | Mtd::FPU); register_handler (exc_base, Mtd::ALL | Mtd::FPU); diff --git a/repos/ports/src/virtualbox5/sup.cc b/repos/ports/src/virtualbox5/sup.cc index ca92302cc5..e5eedbefa8 100644 --- a/repos/ports/src/virtualbox5/sup.cc +++ b/repos/ports/src/virtualbox5/sup.cc @@ -215,8 +215,7 @@ int SUPSemEventWaitNoResume(PSUPDRVSESSION pSession, SUPSEMEVENT hEvent, } -SUPDECL(int) SUPSemEventMultiCreate(PSUPDRVSESSION, - PSUPSEMEVENTMULTI phEventMulti) +int SUPSemEventMultiCreate(PSUPDRVSESSION, PSUPSEMEVENTMULTI phEventMulti) { RTSEMEVENTMULTI sem; @@ -236,11 +235,22 @@ SUPDECL(int) SUPSemEventMultiCreate(PSUPDRVSESSION, } -SUPDECL(int) SUPSemEventMultiClose(PSUPDRVSESSION, SUPSEMEVENTMULTI hEvMulti) +int SUPSemEventMultiWaitNoResume(PSUPDRVSESSION, SUPSEMEVENTMULTI event, + uint32_t ms) { - return RTSemEventMultiDestroy(reinterpret_cast(hEvMulti)); + RTSEMEVENTMULTI const rtevent = reinterpret_cast(event); + return RTSemEventMultiWait(rtevent, ms); } +int SUPSemEventMultiSignal(PSUPDRVSESSION, SUPSEMEVENTMULTI event) { + return RTSemEventMultiSignal(reinterpret_cast(event)); } + +int SUPSemEventMultiReset(PSUPDRVSESSION, SUPSEMEVENTMULTI event) { + return RTSemEventMultiReset(reinterpret_cast(event)); } + +int SUPSemEventMultiClose(PSUPDRVSESSION, SUPSEMEVENTMULTI event) { + return RTSemEventMultiDestroy(reinterpret_cast(event)); } + int SUPR3CallVMMR0(PVMR0 pVMR0, VMCPUID idCpu, unsigned uOperation, void *pvArg) diff --git a/repos/ports/src/virtualbox5/target.inc b/repos/ports/src/virtualbox5/target.inc index 0645a02e9c..d878d5bb11 100644 --- a/repos/ports/src/virtualbox5/target.inc +++ b/repos/ports/src/virtualbox5/target.inc @@ -41,6 +41,7 @@ SRC_CC += HostServices/SharedFolders/service.cpp SRC_CC += HostServices/SharedFolders/mappings.cpp SRC_CC += HostServices/SharedFolders/vbsf.cpp SRC_CC += HostServices/SharedFolders/vbsfpath.cpp +SRC_CC += HostServices/SharedFolders/vbsfpathabs.cpp SRC_CC += HostServices/SharedFolders/shflhandle.cpp SRC_CC += HostServices/SharedClipboard/service.cpp diff --git a/repos/ports/src/virtualbox5/unimpl.cc b/repos/ports/src/virtualbox5/unimpl.cc index 542154f8d7..5527be8480 100644 --- a/repos/ports/src/virtualbox5/unimpl.cc +++ b/repos/ports/src/virtualbox5/unimpl.cc @@ -136,10 +136,6 @@ DUMMY(SUPR3PageMapKernel) DUMMY(SUPR3ReadTsc) DUMMY(SUPGetCpuHzFromGipForAsyncMode) -DUMMY(SUPSemEventMultiSignal) -DUMMY(SUPSemEventMultiWaitNoResume) -DUMMY(SUPSemEventMultiReset) - DUMMY(VMMR3GetHostToGuestSwitcher) DUMMY(RTHeapSimpleRelocate)