Changeset 82031 in vbox
- Timestamp:
- Nov 20, 2019 4:11:16 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134835
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/gvm.h
r81162 r82031 213 213 } iomr0; 214 214 215 union 216 { 217 #if defined(VMM_INCLUDED_SRC_include_APICInternal_h) && defined(IN_RING0) 218 struct APICR0PERVM s; 219 #endif 220 uint8_t padding[64]; 221 } apicr0; 222 215 223 /** Padding so aCpus starts on a page boundrary. */ 216 224 #ifdef VBOX_WITH_NEM_R0 217 uint8_t abPadding2[4096 - 64 - 256 - 512 - 256 - 64 - 1792 - 512 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT];218 #else 219 uint8_t abPadding2[4096 - 64 - 256 - 512 - 64 - 1792 - 512 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT];225 uint8_t abPadding2[4096 - 64 - 256 - 512 - 256 - 64 - 1792 - 512 - 64 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT]; 226 #else 227 uint8_t abPadding2[4096 - 64 - 256 - 512 - 64 - 1792 - 512 - 64 - sizeof(PGVMCPU) * VMM_MAX_CPU_COUNT]; 220 228 #endif 221 229 -
trunk/src/VBox/VMM/VMMAll/APICAll.cpp
r82026 r82031 1384 1384 * 1385 1385 * @returns VBox status code. 1386 * @param pDevIns The device instance. 1386 1387 * @param pVCpu The cross context virtual CPU structure. 1387 1388 * @param rcBusy The busy return code for the timer critical section. 1388 1389 * @param puValue Where to store the LVT timer CCR. 1389 1390 */ 1390 static VBOXSTRICTRC apicGetTimerCcr(P VMCPUCC pVCpu, int rcBusy, uint32_t *puValue)1391 static VBOXSTRICTRC apicGetTimerCcr(PPDMDEVINS pDevIns, PVMCPUCC pVCpu, int rcBusy, uint32_t *puValue) 1391 1392 { 1392 1393 VMCPU_ASSERT_EMT(pVCpu); … … 1411 1412 * We also need to lock before reading the timer CCR, see apicR3TimerCallback(). 1412 1413 */ 1413 PCAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);1414 PTMTIMER pTimer = pApicCpu->CTX_SUFF(pTimer);1415 1416 int rc = TMTimerLock(pTimer, rcBusy);1414 PCAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 1415 TMTIMERHANDLE hTimer = pApicCpu->hTimer; 1416 1417 int rc = PDMDevHlpTimerLock(pDevIns, hTimer, rcBusy); 1417 1418 if (rc == VINF_SUCCESS) 1418 1419 { … … 1421 1422 if (uCurrentCount) 1422 1423 { 1423 uint64_t const cTicksElapsed = TMTimerGet(pApicCpu->CTX_SUFF(pTimer)) - pApicCpu->u64TimerInitial;1424 TMTimerUnlock(pTimer);1424 uint64_t const cTicksElapsed = PDMDevHlpTimerGet(pDevIns, hTimer) - pApicCpu->u64TimerInitial; 1425 PDMDevHlpTimerUnlock(pDevIns, hTimer); 1425 1426 uint8_t const uTimerShift = apicGetTimerShift(pXApicPage); 1426 1427 uint64_t const uDelta = cTicksElapsed >> uTimerShift; … … 1429 1430 } 1430 1431 else 1431 TMTimerUnlock(pTimer);1432 PDMDevHlpTimerUnlock(pDevIns, hTimer); 1432 1433 } 1433 1434 return rc; … … 1439 1440 * 1440 1441 * @returns Strict VBox status code. 1442 * @param pDevIns The device instance. 1441 1443 * @param pVCpu The cross context virtual CPU structure. 1442 1444 * @param rcBusy The busy return code for the timer critical section. 1443 1445 * @param uInitialCount The timer ICR. 1444 1446 */ 1445 static VBOXSTRICTRC apicSetTimerIcr(P VMCPUCC pVCpu, int rcBusy, uint32_t uInitialCount)1447 static VBOXSTRICTRC apicSetTimerIcr(PPDMDEVINS pDevIns, PVMCPUCC pVCpu, int rcBusy, uint32_t uInitialCount) 1446 1448 { 1447 1449 VMCPU_ASSERT_EMT(pVCpu); … … 1450 1452 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 1451 1453 PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu); 1452 PTMTIMER pTimer = pApicCpu->CTX_SUFF(pTimer);1453 1454 1454 1455 Log2(("APIC%u: apicSetTimerIcr: uInitialCount=%#RX32\n", pVCpu->idCpu, uInitialCount)); … … 1465 1466 * timer ICR. We rely on CCR being consistent in apicGetTimerCcr(). 1466 1467 */ 1467 int rc = TMTimerLock(pTimer, rcBusy); 1468 TMTIMERHANDLE hTimer = pApicCpu->hTimer; 1469 int rc = PDMDevHlpTimerLock(pDevIns, hTimer, rcBusy); 1468 1470 if (rc == VINF_SUCCESS) 1469 1471 { … … 1474 1476 else 1475 1477 apicStopTimer(pVCpu); 1476 TMTimerUnlock(pTimer);1478 PDMDevHlpTimerUnlock(pDevIns, hTimer); 1477 1479 } 1478 1480 return rc; … … 1588 1590 * Hints TM about the APIC timer frequency. 1589 1591 * 1592 * @param pDevIns The device instance. 1590 1593 * @param pApicCpu The APIC CPU state. 1591 1594 * @param uInitialCount The new initial count. … … 1593 1596 * @thread Any. 1594 1597 */ 1595 void apicHintTimerFreq(P APICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift)1598 void apicHintTimerFreq(PPDMDEVINS pDevIns, PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift) 1596 1599 { 1597 1600 Assert(pApicCpu); … … 1604 1607 { 1605 1608 uint64_t cTicksPerPeriod = (uint64_t)uInitialCount << uTimerShift; 1606 uHz = TMTimerGetFreq(pApicCpu->CTX_SUFF(pTimer)) / cTicksPerPeriod;1609 uHz = PDMDevHlpTimerGetFreq(pDevIns, pApicCpu->hTimer) / cTicksPerPeriod; 1607 1610 } 1608 1611 else 1609 1612 uHz = 0; 1610 1613 1611 TMTimerSetFrequencyHint(pApicCpu->CTX_SUFF(pTimer), uHz);1614 PDMDevHlpTimerSetFrequencyHint(pDevIns, pApicCpu->hTimer, uHz); 1612 1615 pApicCpu->uHintedTimerInitialCount = uInitialCount; 1613 1616 pApicCpu->uHintedTimerShift = uTimerShift; … … 1698 1701 { 1699 1702 Assert(!XAPIC_IN_X2APIC_MODE(pVCpu)); 1700 rc = apicGetTimerCcr(p VCpu, VINF_IOM_R3_MMIO_READ, &uValue);1703 rc = apicGetTimerCcr(pDevIns, pVCpu, VINF_IOM_R3_MMIO_READ, &uValue); 1701 1704 break; 1702 1705 } … … 1766 1769 case XAPIC_OFF_TIMER_ICR: 1767 1770 { 1768 rcStrict = apicSetTimerIcr(p VCpu, VINF_IOM_R3_MMIO_WRITE, uValue);1771 rcStrict = apicSetTimerIcr(pDevIns, pVCpu, VINF_IOM_R3_MMIO_WRITE, uValue); 1769 1772 break; 1770 1773 } … … 1910 1913 { 1911 1914 uint32_t uValue; 1912 rcStrict = apicGetTimerCcr( pVCpu, VINF_CPUM_R3_MSR_READ, &uValue);1915 rcStrict = apicGetTimerCcr(VMCPU_TO_DEVINS(pVCpu), pVCpu, VINF_CPUM_R3_MSR_READ, &uValue); 1913 1916 *pu64Value = uValue; 1914 1917 break; … … 2011 2014 { /* likely */ } 2012 2015 else 2013 {2014 2016 return apicMsrAccessError(pVCpu, u32Reg, pApic->enmMaxMode == PDMAPICMODE_NONE ? 2015 APICMSRACCESS_WRITE_DISALLOWED_CONFIG : APICMSRACCESS_WRITE_RSVD_OR_UNKNOWN); 2016 } 2017 APICMSRACCESS_WRITE_DISALLOWED_CONFIG : APICMSRACCESS_WRITE_RSVD_OR_UNKNOWN); 2017 2018 2018 2019 #ifndef IN_RING3 … … 2088 2089 case MSR_IA32_X2APIC_TIMER_ICR: 2089 2090 { 2090 rcStrict = apicSetTimerIcr( pVCpu, VINF_CPUM_R3_MSR_WRITE, u32Value);2091 rcStrict = apicSetTimerIcr(VMCPU_TO_DEVINS(pVCpu), pVCpu, VINF_CPUM_R3_MSR_WRITE, u32Value); 2091 2092 break; 2092 2093 } … … 2611 2612 { 2612 2613 PCAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 2613 *pu64Value = TMTimerGetFreq(pApicCpu->CTX_SUFF(pTimer));2614 *pu64Value = PDMDevHlpTimerGetFreq(VMCPU_TO_DEVINS(pVCpu), pApicCpu->hTimer); 2614 2615 return VINF_SUCCESS; 2615 2616 } … … 3159 3160 { 3160 3161 Assert(pVCpu); 3161 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 3162 Assert(TMTimerIsLockOwner(pApicCpu->CTX_SUFF(pTimer))); 3162 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 3163 PPDMDEVINS pDevIns = VMCPU_TO_DEVINS(pVCpu); 3164 Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pApicCpu->hTimer)); 3163 3165 Assert(uInitialCount > 0); 3164 3166 … … 3176 3178 * tick. 3177 3179 */ 3178 PTMTIMER pTimer = pApicCpu->CTX_SUFF(pTimer); 3179 TMTimerSetRelative(pTimer, cTicksToNext, &pApicCpu->u64TimerInitial); 3180 apicHintTimerFreq(pApicCpu, uInitialCount, uTimerShift); 3180 PDMDevHlpTimerSetRelative(pDevIns, pApicCpu->hTimer, cTicksToNext, &pApicCpu->u64TimerInitial); 3181 apicHintTimerFreq(pDevIns, pApicCpu, uInitialCount, uTimerShift); 3181 3182 } 3182 3183 … … 3191 3192 { 3192 3193 Assert(pVCpu); 3193 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 3194 Assert(TMTimerIsLockOwner(pApicCpu->CTX_SUFF(pTimer))); 3194 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 3195 PPDMDEVINS pDevIns = VMCPU_TO_DEVINS(pVCpu); 3196 Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pApicCpu->hTimer)); 3195 3197 3196 3198 Log2(("APIC%u: apicStopTimer\n", pVCpu->idCpu)); 3197 3199 3198 PTMTIMER pTimer = pApicCpu->CTX_SUFF(pTimer); 3199 TMTimerStop(pTimer); /* This will reset the hint, no need to explicitly call TMTimerSetFrequencyHint(). */ 3200 PDMDevHlpTimerStop(pDevIns, pApicCpu->hTimer); /* This will reset the hint, no need to explicitly call TMTimerSetFrequencyHint(). */ 3200 3201 pApicCpu->uHintedTimerInitialCount = 0; 3201 3202 pApicCpu->uHintedTimerShift = 0; … … 3507 3508 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns); 3508 3509 PAPICDEV pThis = PDMDEVINS_2_DATA(pDevIns, PAPICDEV); 3510 PVMCC pVM = PDMDevHlpGetVM(pDevIns); 3511 3512 pVM->apicr0.s.pDevInsR0 = pDevIns; 3509 3513 3510 3514 int rc = PDMDevHlpMmioSetUpContext(pDevIns, pThis->hMmio, apicWriteMmio, apicReadMmio, NULL /*pvUser*/); -
trunk/src/VBox/VMM/VMMR3/APIC.cpp
r82026 r82031 930 930 pXApicPage->timer_ccr.u32CurrentCount = pXApicPage->timer_icr.u32InitialCount; 931 931 932 rc = TMR3TimerLoad(pApicCpu->pTimerR3, pSSM);932 rc = PDMDevHlpTimerLoad(pDevIns, pApicCpu->hTimer, pSSM); 933 933 AssertRCReturn(rc, rc); 934 934 Assert(pApicCpu->uHintedTimerInitialCount == 0); 935 935 Assert(pApicCpu->uHintedTimerShift == 0); 936 if ( TMTimerIsActive(pApicCpu->pTimerR3))936 if (PDMDevHlpTimerIsActive(pDevIns, pApicCpu->hTimer)) 937 937 { 938 938 uint32_t const uInitialCount = pXApicPage->timer_icr.u32InitialCount; 939 apicHintTimerFreq(p ApicCpu, uInitialCount, uTimerShift);939 apicHintTimerFreq(pDevIns, pApicCpu, uInitialCount, uTimerShift); 940 940 } 941 941 … … 981 981 /* Save the timer. */ 982 982 pHlp->pfnSSMPutU64(pSSM, pApicCpu->u64TimerInitial); 983 TMR3TimerSave(pApicCpu->pTimerR3, pSSM);983 PDMDevHlpTimerSave(pDevIns, pApicCpu->hTimer, pSSM); 984 984 985 985 /* Save the LINT0, LINT1 interrupt line states. */ … … 1061 1061 /* Load the timer. */ 1062 1062 rc = pHlp->pfnSSMGetU64(pSSM, &pApicCpu->u64TimerInitial); AssertRCReturn(rc, rc); 1063 rc = TMR3TimerLoad(pApicCpu->pTimerR3, pSSM);AssertRCReturn(rc, rc);1063 rc = PDMDevHlpTimerLoad(pDevIns, pApicCpu->hTimer, pSSM); AssertRCReturn(rc, rc); 1064 1064 Assert(pApicCpu->uHintedTimerShift == 0); 1065 1065 Assert(pApicCpu->uHintedTimerInitialCount == 0); 1066 if ( TMTimerIsActive(pApicCpu->pTimerR3))1066 if (PDMDevHlpTimerIsActive(pDevIns, pApicCpu->hTimer)) 1067 1067 { 1068 1068 PCXAPICPAGE pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu); 1069 1069 uint32_t const uInitialCount = pXApicPage->timer_icr.u32InitialCount; 1070 1070 uint8_t const uTimerShift = apicGetTimerShift(pXApicPage); 1071 apicHintTimerFreq(p ApicCpu, uInitialCount, uTimerShift);1071 apicHintTimerFreq(pDevIns, pApicCpu, uInitialCount, uTimerShift); 1072 1072 } 1073 1073 … … 1116 1116 static DECLCALLBACK(void) apicR3TimerCallback(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 1117 1117 { 1118 PVMCPU pVCpu = (PVMCPU)pvUser; 1119 Assert(TMTimerIsLockOwner(pTimer)); 1118 PVMCPU pVCpu = (PVMCPU)pvUser; 1119 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 1120 Assert(PDMDevHlpTimerIsLockOwner(pDevIns, pApicCpu->hTimer)); 1120 1121 Assert(pVCpu); 1121 1122 LogFlow(("APIC%u: apicR3TimerCallback\n", pVCpu->idCpu)); … … 1125 1126 uint32_t const uLvtTimer = pXApicPage->lvt_timer.all.u32LvtTimer; 1126 1127 #ifdef VBOX_WITH_STATISTICS 1127 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);1128 1128 STAM_COUNTER_INC(&pApicCpu->StatTimerCallback); 1129 1129 #endif … … 1183 1183 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpuDest); 1184 1184 1185 if ( TMTimerIsActive(pApicCpu->pTimerR3))1186 TMTimerStop(pApicCpu->pTimerR3);1185 if (PDMDevHlpTimerIsActive(pDevIns, pApicCpu->hTimer)) 1186 PDMDevHlpTimerStop(pDevIns, pApicCpu->hTimer); 1187 1187 1188 1188 apicResetCpu(pVCpuDest, true /* fResetApicBaseMsr */); … … 1411 1411 pApicDev->pDevInsR3 = pDevIns; 1412 1412 1413 pApic->pDevInsR3 = pDevIns; 1413 1414 pApic->pApicDevR3 = pApicDev; 1414 1415 pApic->pApicDevR0 = PDMINS_2_DATA_R0PTR(pDevIns); … … 1492 1493 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 1493 1494 RTStrPrintf(&pApicCpu->szTimerDesc[0], sizeof(pApicCpu->szTimerDesc), "APIC Timer %u", pVCpu->idCpu); 1494 rc = PDMDevHlpT MTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, apicR3TimerCallback, pVCpu, TMTIMER_FLAGS_NO_CRIT_SECT,1495 pApicCpu->szTimerDesc, &pApicCpu->pTimerR3);1495 rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, apicR3TimerCallback, pVCpu, TMTIMER_FLAGS_NO_CRIT_SECT, 1496 pApicCpu->szTimerDesc, &pApicCpu->hTimer); 1496 1497 AssertRCReturn(rc, rc); 1497 pApicCpu->pTimerR0 = TMTimerR0Ptr(pApicCpu->pTimerR3);1498 1498 } 1499 1499 -
trunk/src/VBox/VMM/include/APICInternal.h
r82026 r82031 58 58 #define VM_TO_APIC(a_pVM) (&(a_pVM)->apic.s) 59 59 #define VM_TO_APICDEV(a_pVM) CTX_SUFF(VM_TO_APIC(a_pVM)->pApicDev) 60 #ifdef IN_RING3 61 # define VMCPU_TO_DEVINS(a_pVCpu) ((a_pVCpu)->pVMR3->apic.s.pDevInsR3) 62 #elif defined(IN_RING0) 63 # define VMCPU_TO_DEVINS(a_pVCpu) ((a_pVCpu)->pGVM->apicr0.s.pDevInsR0) 64 #endif 60 65 61 66 #define APICCPU_TO_XAPICPAGE(a_ApicCpu) ((PXAPICPAGE)(CTX_SUFF((a_ApicCpu)->pvApicPage))) … … 1164 1169 typedef APICDEV const *PCAPICDEV; 1165 1170 1171 1172 /** 1173 * The APIC GVM instance data. 1174 */ 1175 typedef struct APICR0PERVM 1176 { 1177 /** The ring-0 device instance. */ 1178 PPDMDEVINSR0 pDevInsR0; 1179 } APICR0PERVM; 1180 1181 1166 1182 /** 1167 1183 * APIC VM Instance data. … … 1175 1191 /** The APIC device - R3 ptr. */ 1176 1192 R3PTRTYPE(PAPICDEV) pApicDevR3; 1193 /** The ring-3 device instance. */ 1194 PPDMDEVINSR3 pDevInsR3; 1177 1195 /** @} */ 1178 1196 … … 1283 1301 /** @name The APIC timer. 1284 1302 * @{ */ 1285 /** The timer - R0 ptr. */ 1286 PTMTIMERR0 pTimerR0; 1287 /** The timer - R3 ptr. */ 1288 PTMTIMERR3 pTimerR3; 1303 /** The timer. */ 1304 TMTIMERHANDLE hTimer; 1289 1305 /** The time stamp when the timer was initialized. */ 1290 1306 uint64_t u64TimerInitial; … … 1412 1428 const char *apicGetDestShorthandName(XAPICDESTSHORTHAND enmDestShorthand); 1413 1429 const char *apicGetTimerModeName(XAPICTIMERMODE enmTimerMode); 1414 void apicHintTimerFreq(P APICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift);1430 void apicHintTimerFreq(PPDMDEVINS pDevIns, PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift); 1415 1431 APICMODE apicGetMode(uint64_t uApicBaseMsr); 1416 1432 -
trunk/src/VBox/VMM/testcase/tstVMStruct.h
r81153 r82031 1408 1408 GEN_CHECK_OFF(APICCPU, pvApicPibR3); 1409 1409 GEN_CHECK_OFF(APICCPU, ApicPibLevel); 1410 GEN_CHECK_OFF(APICCPU, pTimerR0); 1411 GEN_CHECK_OFF(APICCPU, pTimerR3); 1410 GEN_CHECK_OFF(APICCPU, hTimer); 1412 1411 GEN_CHECK_OFF(APICCPU, TimerCritSect); 1413 1412
Note:
See TracChangeset
for help on using the changeset viewer.