Changeset 60469 in vbox
- Timestamp:
- Apr 13, 2016 12:27:53 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 106568
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/APIC.cpp
r60468 r60469 950 950 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpuDest); 951 951 952 int rc = TMTimerLock(pApicCpu->pTimerR3, VERR_IGNORED); 953 Assert(rc == VINF_SUCCESS); NOREF(rc); 954 TMTimerStop(pApicCpu->pTimerR3); 955 TMTimerUnlock(pApicCpu->pTimerR3); 952 if (TMTimerIsActive(pApicCpu->pTimerR3)) 953 TMTimerStop(pApicCpu->pTimerR3); 956 954 957 955 APICR3Reset(pVCpuDest); … … 971 969 PAPIC pApic = VM_TO_APIC(pVM); 972 970 PAPICDEV pApicDev = PDMINS_2_DATA(pDevIns, PAPICDEV); 971 973 972 LogFlow(("APIC: apicR3Relocate: pVM=%p pDevIns=%p offDelta=%RGi\n", pVM, pDevIns, offDelta)); 974 973 … … 977 976 pApicDev->pCritSectRC = pApicDev->pApicHlpR3->pfnGetRCCritSect(pDevIns); 978 977 979 pApic->pApicDevRC 980 if (pApic->pvApicPibRC )978 pApic->pApicDevRC = PDMINS_2_DATA_RCPTR(pDevIns); 979 if (pApic->pvApicPibRC != NIL_RTRCPTR) 981 980 pApic->pvApicPibRC = MMHyperR3ToRC(pVM, (RTR3PTR)pApic->pvApicPibR3); 982 981 … … 987 986 pApicCpu->pTimerRC = TMTimerRCPtr(pApicCpu->pTimerR3); 988 987 989 if (pApicCpu->pvApicPageRC )988 if (pApicCpu->pvApicPageRC != NIL_RTRCPTR) 990 989 pApicCpu->pvApicPageRC = MMHyperR3ToRC(pVM, (RTR3PTR)pApicCpu->pvApicPageR3); 991 if (pApicCpu->pvApicPibRC )990 if (pApicCpu->pvApicPibRC != NIL_RTRCPTR) 992 991 pApicCpu->pvApicPibRC = MMHyperR3ToRC(pVM, (RTR3PTR)pApicCpu->pvApicPibR3); 993 992 } … … 1227 1226 pApic->fPostedIntrsEnabled, pApic->fVirtApicRegsEnabled, pApic->fSupportsTscDeadline)); 1228 1227 1229 #ifdef VBOX_WITH_STATISTICS1230 /*1231 * Statistics.1232 */1233 /** @todo Figure out why doing this from apicR3Construct() it doesn't work. See @bugref{8245#c48} */1234 #define APIC_REG_COUNTER(a_Reg, a_Desc, a_Key) \1235 do { \1236 rc = STAMR3RegisterF(pVM, a_Reg, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, a_Desc, a_Key, idCpu); \1237 AssertRCReturn(rc, rc); \1238 } while(0)1239 1240 bool const fHasRC = !HMIsEnabled(pVM);1241 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)1242 {1243 PVMCPU pVCpu = &pVM->aCpus[idCpu];1244 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);1245 1246 APIC_REG_COUNTER(&pApicCpu->StatMmioReadR0, "Number of APIC MMIO reads in R0.", "/Devices/APIC/%u/R0/MmioRead");1247 APIC_REG_COUNTER(&pApicCpu->StatMmioWriteR0, "Number of APIC MMIO writes in R0.", "/Devices/APIC/%u/R0/MmioWrite");1248 APIC_REG_COUNTER(&pApicCpu->StatMsrReadR0, "Number of APIC MSR reads in R0.", "/Devices/APIC/%u/R0/MsrRead");1249 APIC_REG_COUNTER(&pApicCpu->StatMsrWriteR0, "Number of APIC MSR writes in R0.", "/Devices/APIC/%u/R0/MsrWrite");1250 1251 APIC_REG_COUNTER(&pApicCpu->StatMmioReadR3, "Number of APIC MMIO reads in R3.", "/Devices/APIC/%u/R3/MmioReadR3");1252 APIC_REG_COUNTER(&pApicCpu->StatMmioWriteR3, "Number of APIC MMIO writes in R3.", "/Devices/APIC/%u/R3/MmioWriteR3");1253 APIC_REG_COUNTER(&pApicCpu->StatMsrReadR3, "Number of APIC MSR reads in R3.", "/Devices/APIC/%u/R3/MsrReadR3");1254 APIC_REG_COUNTER(&pApicCpu->StatMsrWriteR3, "Number of APIC MSR writes in R3.", "/Devices/APIC/%u/R3/MsrWriteR3");1255 1256 if (fHasRC)1257 {1258 APIC_REG_COUNTER(&pApicCpu->StatMmioReadRC, "Number of APIC MMIO reads in RC.", "/Devices/APIC/%u/RC/MmioRead");1259 APIC_REG_COUNTER(&pApicCpu->StatMmioWriteRC, "Number of APIC MMIO writes in RC.", "/Devices/APIC/%u/RC/MmioWrite");1260 APIC_REG_COUNTER(&pApicCpu->StatMsrReadRC, "Number of APIC MSR reads in RC.", "/Devices/APIC/%u/RC/MsrRead");1261 APIC_REG_COUNTER(&pApicCpu->StatMsrWriteRC, "Number of APIC MSR writes in RC.", "/Devices/APIC/%u/RC/MsrWrite");1262 }1263 }1264 # undef APIC_REG_ACCESS_COUNTER1265 #endif1266 1267 1228 return VINF_SUCCESS; 1268 1229 } … … 1396 1357 PAPICCPU pApicCpu0 = VMCPU_TO_APICCPU(&pVM->aCpus[0]); 1397 1358 RTGCPHYS GCPhysApicBase = MSR_APICBASE_GET_PHYSADDR(pApicCpu0->uApicBaseMsr); 1398 LogRel(("APIC: PDMDevHlpMMIORegister new = %#RGp\n", GCPhysApicBase)); 1359 1399 1360 rc = PDMDevHlpMMIORegister(pDevIns, GCPhysApicBase, sizeof(XAPICPAGE), NULL /* pvUser */, 1400 1361 IOMMMIO_FLAGS_READ_DWORD | IOMMMIO_FLAGS_WRITE_DWORD_ZEROED, … … 1434 1395 pApicCpu->pTimerR0 = TMTimerR0Ptr(pApicCpu->pTimerR3); 1435 1396 pApicCpu->pTimerRC = TMTimerRCPtr(pApicCpu->pTimerR3); 1436 1437 1397 #if 0 1438 1398 rc = PDMR3CritSectInit(pVM, &pApicCpu->TimerCritSect, RT_SRC_POS, pApicCpu->szTimerDesc); 1439 if (RT_SUCCESS(rc)) 1440 TMR3TimerSetCritSect(pApicCpu->pTimerR3, &pApicCpu->TimerCritSect); 1441 else 1442 return rc; 1443 #else 1444 return VINF_SUCCESS; 1399 AssertRCReturn(rc, rc); 1400 TMR3TimerSetCritSect(pApicCpu->pTimerR3, &pApicCpu->TimerCritSect); 1445 1401 #endif 1446 1402 } … … 1460 1416 * Register debugger info callback. 1461 1417 */ 1462 PDMDevHlpDBGFInfoRegister(pDevIns, "apic", "Display Local APIC state for current CPU. " 1463 "Recognizes 'basic', 'lvt', 'timer' as arguments, defaulting to 'basic'.", apicR3DbgInfo); 1418 rc = PDMDevHlpDBGFInfoRegister(pDevIns, "apic", "Display local APIC state for current CPU. Recognizes " 1419 "'basic', 'lvt', 'timer' as arguments, defaults to 'basic'.", apicR3DbgInfo); 1420 AssertRCReturn(rc, rc); 1421 1422 #ifdef VBOX_WITH_STATISTICS 1423 /* 1424 * Statistics. 1425 */ 1426 #define APIC_REG_COUNTER(a_Reg, a_Desc, a_Key) \ 1427 do { \ 1428 rc = STAMR3RegisterF(pVM, a_Reg, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, a_Desc, a_Key, idCpu); \ 1429 AssertRCReturn(rc, rc); \ 1430 } while(0) 1431 1432 bool const fHasRC = !HMIsEnabled(pVM); 1433 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++) 1434 { 1435 PVMCPU pVCpu = &pVM->aCpus[idCpu]; 1436 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 1437 1438 APIC_REG_COUNTER(&pApicCpu->StatMmioReadR0, "Number of APIC MMIO reads in R0.", "/Devices/APIC/%u/R0/MmioRead"); 1439 APIC_REG_COUNTER(&pApicCpu->StatMmioWriteR0, "Number of APIC MMIO writes in R0.", "/Devices/APIC/%u/R0/MmioWrite"); 1440 APIC_REG_COUNTER(&pApicCpu->StatMsrReadR0, "Number of APIC MSR reads in R0.", "/Devices/APIC/%u/R0/MsrRead"); 1441 APIC_REG_COUNTER(&pApicCpu->StatMsrWriteR0, "Number of APIC MSR writes in R0.", "/Devices/APIC/%u/R0/MsrWrite"); 1442 1443 APIC_REG_COUNTER(&pApicCpu->StatMmioReadR3, "Number of APIC MMIO reads in R3.", "/Devices/APIC/%u/R3/MmioReadR3"); 1444 APIC_REG_COUNTER(&pApicCpu->StatMmioWriteR3, "Number of APIC MMIO writes in R3.", "/Devices/APIC/%u/R3/MmioWriteR3"); 1445 APIC_REG_COUNTER(&pApicCpu->StatMsrReadR3, "Number of APIC MSR reads in R3.", "/Devices/APIC/%u/R3/MsrReadR3"); 1446 APIC_REG_COUNTER(&pApicCpu->StatMsrWriteR3, "Number of APIC MSR writes in R3.", "/Devices/APIC/%u/R3/MsrWriteR3"); 1447 1448 if (fHasRC) 1449 { 1450 APIC_REG_COUNTER(&pApicCpu->StatMmioReadRC, "Number of APIC MMIO reads in RC.", "/Devices/APIC/%u/RC/MmioRead"); 1451 APIC_REG_COUNTER(&pApicCpu->StatMmioWriteRC, "Number of APIC MMIO writes in RC.", "/Devices/APIC/%u/RC/MmioWrite"); 1452 APIC_REG_COUNTER(&pApicCpu->StatMsrReadRC, "Number of APIC MSR reads in RC.", "/Devices/APIC/%u/RC/MsrRead"); 1453 APIC_REG_COUNTER(&pApicCpu->StatMsrWriteRC, "Number of APIC MSR writes in RC.", "/Devices/APIC/%u/RC/MsrWrite"); 1454 } 1455 } 1456 # undef APIC_REG_ACCESS_COUNTER 1457 #endif 1464 1458 1465 1459 return VINF_SUCCESS;
Note:
See TracChangeset
for help on using the changeset viewer.