summaryrefslogtreecommitdiffstats
path: root/src/VBox/VMM
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/VMM')
-rw-r--r--src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp14
-rw-r--r--src/VBox/VMM/VMMAll/TMAll.cpp14
-rw-r--r--src/VBox/VMM/VMMR3/PDM.cpp8
3 files changed, 26 insertions, 10 deletions
diff --git a/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp b/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp
index 8ffcab9e..15e0aa6b 100644
--- a/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp
+++ b/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp
@@ -6670,17 +6670,19 @@ static int iemVmxVmentryCheckCtls(PVMCPUCC pVCpu, const char *pszInstr) RT_NOEXC
IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_EntryIntInfoErrCodePe);
/* Exceptions that provide an error code. */
- if ( uType == VMX_ENTRY_INT_INFO_TYPE_HW_XCPT
- && ( uVector == X86_XCPT_DF
+ if (uType == VMX_ENTRY_INT_INFO_TYPE_HW_XCPT)
+ {
+ if ( uVector == X86_XCPT_DF
|| uVector == X86_XCPT_TS
|| uVector == X86_XCPT_NP
|| uVector == X86_XCPT_SS
|| uVector == X86_XCPT_GP
|| uVector == X86_XCPT_PF
- || uVector == X86_XCPT_AC))
- { /* likely */ }
- else
- IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_EntryIntInfoErrCodeVec);
+ || uVector == X86_XCPT_AC)
+ { /* likely */ }
+ else
+ IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_EntryIntInfoErrCodeVec);
+ }
/* Exception error-code reserved bits. */
if (!(pVmcs->u32EntryXcptErrCode & ~VMX_ENTRY_INT_XCPT_ERR_CODE_VALID_MASK))
diff --git a/src/VBox/VMM/VMMAll/TMAll.cpp b/src/VBox/VMM/VMMAll/TMAll.cpp
index 677decdd..db39fdaa 100644
--- a/src/VBox/VMM/VMMAll/TMAll.cpp
+++ b/src/VBox/VMM/VMMAll/TMAll.cpp
@@ -712,8 +712,9 @@ void tmTimerQueuesSanityChecks(PVMCC pVM, const char *pszWhere)
# ifdef IN_RING3
/* Go thru all the timers and check that the active ones all are in the active lists. */
- uint32_t idxTimer = pQueue->cTimersAlloc;
- uint32_t cFree = 0;
+ int const rcAllocLock = PDMCritSectRwTryEnterShared(pVM, &pQueue->AllocLock);
+ uint32_t idxTimer = pQueue->cTimersAlloc;
+ uint32_t cFree = 0;
while (idxTimer-- > 0)
{
PTMTIMER const pTimer = &pQueue->paTimers[idxTimer];
@@ -778,7 +779,14 @@ void tmTimerQueuesSanityChecks(PVMCC pVM, const char *pszWhere)
Assert(((pTimer->hSelf >> TMTIMERHANDLE_QUEUE_IDX_SHIFT) & TMTIMERHANDLE_QUEUE_IDX_SMASK) == idxQueue);
}
}
- Assert(cFree == pQueue->cTimersFree);
+ if (RT_SUCCESS(rcAllocLock))
+ {
+ Assert(cFree == pQueue->cTimersFree);
+ PDMCritSectRwLeaveShared(pVM, &pQueue->AllocLock);
+ }
+ else
+ Assert(cFree >= pQueue->cTimersFree); /* Can be lower as the tmr3TimerCreate may run concurrent. */
+
# endif /* IN_RING3 */
if (pQueue->enmClock == TMCLOCK_VIRTUAL_SYNC)
diff --git a/src/VBox/VMM/VMMR3/PDM.cpp b/src/VBox/VMM/VMMR3/PDM.cpp
index 1e56b66f..3d3ff8d4 100644
--- a/src/VBox/VMM/VMMR3/PDM.cpp
+++ b/src/VBox/VMM/VMMR3/PDM.cpp
@@ -1246,7 +1246,13 @@ static DECLCALLBACK(int) pdmR3LoadExec(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersi
if (!(pDevIns->Internal.s.fIntFlags & PDMDEVINSINT_FLAGS_FOUND))
{
LogRel(("Device '%s'/%d not found in the saved state\n", pDevIns->pReg->szName, pDevIns->iInstance));
- if (SSMR3HandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT)
+ /** @todo The TPM PPI device was added due to @bugref{10701} and it is not an issue if it isn't there
+ * in the saved state because there is nothing to load. It might make sense to add a new
+ * flag to PDMDEVREG::fFlags to indicate that having a new device added for a saved state is okay.
+ * (For now I just want to get saved states unwedged).
+ */
+ if ( SSMR3HandleGetAfter(pSSM) != SSMAFTER_DEBUG_IT
+ && RTStrCmp(pDevIns->pReg->szName, "tpm-ppi"))
return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Device '%s'/%d not found in the saved state"),
pDevIns->pReg->szName, pDevIns->iInstance);
}