summaryrefslogtreecommitdiff
path: root/src/VBox/VMM/VMMR0/GVMMR0.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2014-03-26 19:21:20 +0000
committer <>2014-05-08 15:03:54 +0000
commitfb123f93f9f5ce42c8e5785d2f8e0edaf951740e (patch)
treec2103d76aec5f1f10892cd1d3a38e24f665ae5db /src/VBox/VMM/VMMR0/GVMMR0.cpp
parent58ed4748338f9466599adfc8a9171280ed99e23f (diff)
downloadVirtualBox-master.tar.gz
Imported from /home/lorry/working-area/delta_VirtualBox/VirtualBox-4.3.10.tar.bz2.HEADVirtualBox-4.3.10master
Diffstat (limited to 'src/VBox/VMM/VMMR0/GVMMR0.cpp')
-rw-r--r--src/VBox/VMM/VMMR0/GVMMR0.cpp47
1 files changed, 31 insertions, 16 deletions
diff --git a/src/VBox/VMM/VMMR0/GVMMR0.cpp b/src/VBox/VMM/VMMR0/GVMMR0.cpp
index ed0d6035..41604258 100644
--- a/src/VBox/VMM/VMMR0/GVMMR0.cpp
+++ b/src/VBox/VMM/VMMR0/GVMMR0.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2007-2010 Oracle Corporation
+ * Copyright (C) 2007-2012 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -544,7 +544,7 @@ GVMMR0DECL(int) GVMMR0SetConfig(PSUPDRVSESSION pSession, const char *pszName, ui
/*
* String switch time!
*/
- if (strncmp(pszName, "/GVMM/", sizeof("/GVMM/") - 1))
+ if (strncmp(pszName, RT_STR_TUPLE("/GVMM/")))
return VERR_CFGM_VALUE_NOT_FOUND; /* borrow status codes from CFGM... */
int rc = VINF_SUCCESS;
pszName += sizeof("/GVMM/") - 1;
@@ -612,7 +612,7 @@ GVMMR0DECL(int) GVMMR0QueryConfig(PSUPDRVSESSION pSession, const char *pszName,
/*
* String switch time!
*/
- if (strncmp(pszName, "/GVMM/", sizeof("/GVMM/") - 1))
+ if (strncmp(pszName, RT_STR_TUPLE("/GVMM/")))
return VERR_CFGM_VALUE_NOT_FOUND; /* borrow status codes from CFGM... */
int rc = VINF_SUCCESS;
pszName += sizeof("/GVMM/") - 1;
@@ -867,8 +867,9 @@ GVMMR0DECL(int) GVMMR0CreateVM(PSUPDRVSESSION pSession, uint32_t cCpus, PVM *ppV
pVM->aCpus[i].hNativeThreadR0 = NIL_RTNATIVETHREAD;
}
- rc = RTR0MemObjMapUser(&pGVM->gvmm.s.VMPagesMapObj, pGVM->gvmm.s.VMPagesMemObj, (RTR3PTR)-1, 0,
- RTMEM_PROT_READ | RTMEM_PROT_WRITE, NIL_RTR0PROCESS);
+ rc = RTR0MemObjMapUser(&pGVM->gvmm.s.VMPagesMapObj, pGVM->gvmm.s.VMPagesMemObj, (RTR3PTR)-1,
+ 0 /* uAlignment */, RTMEM_PROT_READ | RTMEM_PROT_WRITE,
+ NIL_RTR0PROCESS);
if (RT_SUCCESS(rc))
{
pVM->paVMPagesR3 = RTR0MemObjAddressR3(pGVM->gvmm.s.VMPagesMapObj);
@@ -887,14 +888,18 @@ GVMMR0DECL(int) GVMMR0CreateVM(PSUPDRVSESSION pSession, uint32_t cCpus, PVM *ppV
pVM->aCpus[0].hNativeThreadR0 = hEMT0;
pGVMM->cEMTs += cCpus;
- VBOXVMM_R0_GVMM_VM_CREATED(pGVM, pVM, ProcId, (void *)hEMT0, cCpus);
+ rc = VMMR0ThreadCtxHooksCreate(&pVM->aCpus[0]);
+ if (RT_SUCCESS(rc))
+ {
+ VBOXVMM_R0_GVMM_VM_CREATED(pGVM, pVM, ProcId, (void *)hEMT0, cCpus);
- gvmmR0UsedUnlock(pGVMM);
- gvmmR0CreateDestroyUnlock(pGVMM);
+ gvmmR0UsedUnlock(pGVMM);
+ gvmmR0CreateDestroyUnlock(pGVMM);
- *ppVM = pVM;
- Log(("GVMMR0CreateVM: pVM=%p pVMR3=%p pGVM=%p hGVM=%d\n", pVM, pVM->pVMR3, pGVM, iHandle));
- return VINF_SUCCESS;
+ *ppVM = pVM;
+ Log(("GVMMR0CreateVM: pVM=%p pVMR3=%p pGVM=%p hGVM=%d\n", pVM, pVM->pVMR3, pGVM, iHandle));
+ return VINF_SUCCESS;
+ }
}
RTR0MemObjFree(pGVM->gvmm.s.VMMapObj, false /* fFreeMappings */);
@@ -1068,13 +1073,13 @@ GVMMR0DECL(int) GVMMR0DestroyVM(PVM pVM)
PGVMM pGVMM;
GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
-
/*
* Validate the VM structure, state and caller.
*/
AssertPtrReturn(pVM, VERR_INVALID_POINTER);
AssertReturn(!((uintptr_t)pVM & PAGE_OFFSET_MASK), VERR_INVALID_POINTER);
- AssertMsgReturn(pVM->enmVMState >= VMSTATE_CREATING && pVM->enmVMState <= VMSTATE_TERMINATED, ("%d\n", pVM->enmVMState), VERR_WRONG_ORDER);
+ AssertMsgReturn(pVM->enmVMState >= VMSTATE_CREATING && pVM->enmVMState <= VMSTATE_TERMINATED, ("%d\n", pVM->enmVMState),
+ VERR_WRONG_ORDER);
uint32_t hGVM = pVM->hSelf;
AssertReturn(hGVM != NIL_GVM_HANDLE, VERR_INVALID_HANDLE);
@@ -1084,7 +1089,7 @@ GVMMR0DECL(int) GVMMR0DestroyVM(PVM pVM)
AssertReturn(pHandle->pVM == pVM, VERR_NOT_OWNER);
RTPROCESS ProcId = RTProcSelf();
- RTNATIVETHREAD hSelf = RTThreadNativeSelf();
+ RTNATIVETHREAD hSelf = RTThreadNativeSelf();
AssertReturn( ( pHandle->hEMT0 == hSelf
&& pHandle->ProcId == ProcId)
|| pHandle->hEMT0 == NIL_RTNATIVETHREAD, VERR_NOT_OWNER);
@@ -1097,7 +1102,7 @@ GVMMR0DECL(int) GVMMR0DestroyVM(PVM pVM)
int rc = gvmmR0CreateDestroyLock(pGVMM);
AssertRC(rc);
- /* be careful here because we might theoretically be racing someone else cleaning up. */
+ /* Be careful here because we might theoretically be racing someone else cleaning up. */
if ( pHandle->pVM == pVM
&& ( ( pHandle->hEMT0 == hSelf
&& pHandle->ProcId == ProcId)
@@ -1111,6 +1116,15 @@ GVMMR0DECL(int) GVMMR0DestroyVM(PVM pVM)
pHandle->pvObj = NULL;
gvmmR0CreateDestroyUnlock(pGVMM);
+ for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
+ {
+ /** @todo Can we busy wait here for all thread-context hooks to be
+ * deregistered before releasing (destroying) it? Only until we find a
+ * solution for not deregistering hooks everytime we're leaving HMR0
+ * context. */
+ VMMR0ThreadCtxHooksRelease(&pVM->aCpus[idCpu]);
+ }
+
SUPR0ObjRelease(pvObj, pHandle->pSession);
}
else
@@ -1336,7 +1350,8 @@ GVMMR0DECL(int) GVMMR0RegisterVCpu(PVM pVM, VMCPUID idCpu)
pVM->aCpus[idCpu].hNativeThreadR0 = pGVM->aCpus[idCpu].hEMT = RTThreadNativeSelf();
- return VINF_SUCCESS;
+ rc = VMMR0ThreadCtxHooksCreate(&pVM->aCpus[idCpu]);
+ return rc;
}