Changeset 81938 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Nov 18, 2019 12:14:05 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134735
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevIoApic.cpp
r81765 r81938 185 185 { 186 186 /** The device instance - R3 Ptr. */ 187 PPDMDEVINSR3 pDevInsR3;187 PPDMDEVINSR3 pDevInsR3; 188 188 /** The IOAPIC helpers - R3 Ptr. */ 189 PCPDMIOAPICHLPR3pIoApicHlpR3;189 R3PTRTYPE(PCPDMIOAPICHLP) pIoApicHlpR3; 190 190 191 191 /** The device instance - R0 Ptr. */ 192 PPDMDEVINSR0 pDevInsR0;192 PPDMDEVINSR0 pDevInsR0; 193 193 /** The IOAPIC helpers - R0 Ptr. */ 194 PCPDMIOAPICHLPR0pIoApicHlpR0;194 R0PTRTYPE(PCPDMIOAPICHLP) pIoApicHlpR0; 195 195 196 196 /** The device instance - RC Ptr. */ 197 PPDMDEVINSRC pDevInsRC;197 PPDMDEVINSRC pDevInsRC; 198 198 /** The IOAPIC helpers - RC Ptr. */ 199 PCPDMIOAPICHLPRCpIoApicHlpRC;199 RCPTRTYPE(PCPDMIOAPICHLP) pIoApicHlpRC; 200 200 201 201 /** The ID register. */ … … 1136 1136 1137 1137 pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 1138 pThis->pIoApicHlpRC = pThis->pIoApicHlpR3->pfnGetRCHelpers(pDevIns);1138 pThis->pIoApicHlpRC += offDelta; 1139 1139 } 1140 1140 … … 1169 1169 { 1170 1170 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns); 1171 PIOAPIC pThis = PDMDEVINS_2_DATA(pDevIns, PIOAPIC); 1171 PIOAPIC pThis = PDMDEVINS_2_DATA(pDevIns, PIOAPIC); 1172 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 1172 1173 LogFlow(("IOAPIC: ioapicR3Construct: pThis=%p iInstance=%d\n", pThis, iInstance)); 1173 1174 Assert(iInstance == 0); RT_NOREF(iInstance); … … 1183 1184 * Validate and read the configuration. 1184 1185 */ 1185 PDMDEV_VALIDATE_CONFIG_RETURN(pDevIns, "NumCPUs| RZEnabled|ChipType", "");1186 PDMDEV_VALIDATE_CONFIG_RETURN(pDevIns, "NumCPUs|ChipType", ""); 1186 1187 1187 1188 /* The number of CPUs is currently unused, but left in CFGM and saved-state in case an ID of 0 is 1188 1189 upsets some guest which we haven't yet tested. */ 1189 1190 uint32_t cCpus; 1190 int rc = CFGMR3QueryU32Def(pCfg, "NumCPUs", &cCpus, 1);1191 int rc = pHlp->pfnCFGMQueryU32Def(pCfg, "NumCPUs", &cCpus, 1); 1191 1192 if (RT_FAILURE(rc)) 1192 1193 return PDMDEV_SET_ERROR(pDevIns, rc, N_("Configuration error: Failed to query integer value \"NumCPUs\"")); 1193 1194 pThis->cCpus = (uint8_t)cCpus; 1194 1195 1195 bool fRZEnabled;1196 rc = CFGMR3QueryBoolDef(pCfg, "RZEnabled", &fRZEnabled, true);1197 if (RT_FAILURE(rc))1198 return PDMDEV_SET_ERROR(pDevIns, rc, N_("Configuration error: Failed to query boolean value \"RZEnabled\""));1199 1200 1196 char szChipType[16]; 1201 rc = CFGMR3QueryStringDef(pCfg, "ChipType", &szChipType[0], sizeof(szChipType), "ICH9");1197 rc = pHlp->pfnCFGMQueryStringDef(pCfg, "ChipType", &szChipType[0], sizeof(szChipType), "ICH9"); 1202 1198 if (RT_FAILURE(rc)) 1203 1199 return PDMDEV_SET_ERROR(pDevIns, rc, N_("Configuration error: Failed to query string value \"ChipType\"")); … … 1235 1231 } 1236 1232 else 1237 {1238 1233 return PDMDevHlpVMSetError(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES, RT_SRC_POS, 1239 N_("I/O APIC configuration error: The \"ChipType\" value \"%s\" is unsupported"), 1240 szChipType); 1241 } 1242 Log2(("IOAPIC: cCpus=%u fRZEnabled=%RTbool szChipType=%s\n", cCpus, fRZEnabled, szChipType)); 1234 N_("I/O APIC configuration error: The \"ChipType\" value \"%s\" is unsupported"), szChipType); 1235 Log2(("IOAPIC: cCpus=%u fRZEnabled=%RTbool szChipType=%s\n", cCpus, pDevIns->fR0Enabled | pDevIns->fRCEnabled, szChipType)); 1243 1236 1244 1237 /* … … 1253 1246 */ 1254 1247 rc = PDMDevHlpCritSectInit(pDevIns, &pThis->CritSect, RT_SRC_POS, "IOAPIC"); 1255 if (RT_FAILURE(rc)) 1256 return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS, N_("IOAPIC: Failed to create critical section. rc=%Rrc"), rc); 1248 AssertRCReturn(rc, rc); 1257 1249 # endif 1258 1250 … … 1261 1253 */ 1262 1254 PDMIOAPICREG IoApicReg; 1263 RT_ZERO(IoApicReg);1264 1255 IoApicReg.u32Version = PDM_IOAPICREG_VERSION; 1265 IoApicReg.pfnSetIrqR3 = ioapicSetIrq; 1266 IoApicReg.pfnSendMsiR3 = ioapicSendMsi; 1267 IoApicReg.pfnSetEoiR3 = ioapicSetEoi; 1268 if (fRZEnabled) 1269 { 1270 IoApicReg.pszSetIrqRC = "ioapicSetIrq"; 1271 IoApicReg.pszSetIrqR0 = "ioapicSetIrq"; 1272 1273 IoApicReg.pszSendMsiRC = "ioapicSendMsi"; 1274 IoApicReg.pszSendMsiR0 = "ioapicSendMsi"; 1275 1276 IoApicReg.pszSetEoiRC = "ioapicSetEoi"; 1277 IoApicReg.pszSetEoiR0 = "ioapicSetEoi"; 1278 } 1279 rc = PDMDevHlpIOAPICRegister(pDevIns, &IoApicReg, &pThis->pIoApicHlpR3); 1280 if (RT_FAILURE(rc)) 1281 { 1282 AssertMsgFailed(("IOAPIC: PDMDevHlpIOAPICRegister failed! rc=%Rrc\n", rc)); 1283 return rc; 1284 } 1256 IoApicReg.pfnSetIrq = ioapicSetIrq; 1257 IoApicReg.pfnSendMsi = ioapicSendMsi; 1258 IoApicReg.pfnSetEoi = ioapicSetEoi; 1259 IoApicReg.u32TheEnd = PDM_IOAPICREG_VERSION; 1260 rc = PDMDevHlpIoApicRegister(pDevIns, &IoApicReg, &pThis->pIoApicHlpR3); 1261 AssertRCReturn(rc, rc); 1285 1262 1286 1263 /* … … 1290 1267 IOMMMIO_FLAGS_READ_DWORD | IOMMMIO_FLAGS_WRITE_DWORD_ZEROED, ioapicMmioWrite, ioapicMmioRead, 1291 1268 "I/O APIC"); 1292 if (RT_SUCCESS(rc)) 1269 AssertRCReturn(rc, rc); 1270 if (pDevIns->fR0Enabled | pDevIns->fRCEnabled) 1293 1271 { 1294 if (fRZEnabled) 1295 { 1296 pThis->pIoApicHlpRC = pThis->pIoApicHlpR3->pfnGetRCHelpers(pDevIns); 1297 rc = PDMDevHlpMMIORegisterRC(pDevIns, IOAPIC_MMIO_BASE_PHYSADDR, IOAPIC_MMIO_SIZE, NIL_RTRCPTR /* pvUser */, 1298 "ioapicMmioWrite", "ioapicMmioRead"); 1299 AssertRCReturn(rc, rc); 1300 1301 pThis->pIoApicHlpR0 = pThis->pIoApicHlpR3->pfnGetR0Helpers(pDevIns); 1302 rc = PDMDevHlpMMIORegisterR0(pDevIns, IOAPIC_MMIO_BASE_PHYSADDR, IOAPIC_MMIO_SIZE, NIL_RTR0PTR /* pvUser */, 1303 "ioapicMmioWrite", "ioapicMmioRead"); 1304 AssertRCReturn(rc, rc); 1305 } 1306 } 1307 else 1308 { 1309 LogRel(("IOAPIC: PDMDevHlpMMIORegister failed! rc=%Rrc\n", rc)); 1310 return rc; 1272 rc = PDMDevHlpMMIORegisterRC(pDevIns, IOAPIC_MMIO_BASE_PHYSADDR, IOAPIC_MMIO_SIZE, NIL_RTRCPTR /* pvUser */, 1273 "ioapicMmioWrite", "ioapicMmioRead"); 1274 AssertRCReturn(rc, rc); 1275 1276 rc = PDMDevHlpMMIORegisterR0(pDevIns, IOAPIC_MMIO_BASE_PHYSADDR, IOAPIC_MMIO_SIZE, NIL_RTR0PTR /* pvUser */, 1277 "ioapicMmioWrite", "ioapicMmioRead"); 1278 AssertRCReturn(rc, rc); 1311 1279 } 1312 1280 … … 1315 1283 */ 1316 1284 rc = PDMDevHlpSSMRegister(pDevIns, IOAPIC_SAVED_STATE_VERSION, sizeof(*pThis), ioapicR3SaveExec, ioapicR3LoadExec); 1317 if (RT_FAILURE(rc)) 1318 { 1319 LogRel(("IOAPIC: PDMDevHlpSSMRegister failed! rc=%Rrc\n", rc)); 1320 return rc; 1321 } 1285 AssertRCReturn(rc, rc); 1322 1286 1323 1287 /* … … 1337 1301 * Statistics. 1338 1302 */ 1339 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioReadRZ, STAMTYPE_COUNTER, " /Devices/IOAPIC/RZ/MmioReadRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO reads in RZ.");1340 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioWriteRZ, STAMTYPE_COUNTER, " /Devices/IOAPIC/RZ/MmioWriteRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO writes in RZ.");1341 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetIrqRZ, STAMTYPE_COUNTER, " /Devices/IOAPIC/RZ/SetIrqRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC SetIrq calls in RZ.");1342 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetEoiRZ, STAMTYPE_COUNTER, " /Devices/IOAPIC/RZ/SetEoiRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC SetEoi calls in RZ.");1343 1344 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioReadR3, STAMTYPE_COUNTER, " /Devices/IOAPIC/R3/MmioReadR3", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO reads in R3");1345 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioWriteR3, STAMTYPE_COUNTER, " /Devices/IOAPIC/R3/MmioWriteR3", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO writes in R3.");1346 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetIrqR3, STAMTYPE_COUNTER, " /Devices/IOAPIC/R3/SetIrqR3", STAMUNIT_OCCURENCES, "Number of IOAPIC SetIrq calls in R3.");1347 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetEoiR3, STAMTYPE_COUNTER, " /Devices/IOAPIC/R3/SetEoiR3", STAMUNIT_OCCURENCES, "Number of IOAPIC SetEoi calls in R3.");1348 1349 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRedundantEdgeIntr, STAMTYPE_COUNTER, " /Devices/IOAPIC/RedundantEdgeIntr", STAMUNIT_OCCURENCES, "Number of redundant edge-triggered interrupts (no IRR change).");1350 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRedundantLevelIntr, STAMTYPE_COUNTER, " /Devices/IOAPIC/RedundantLevelIntr", STAMUNIT_OCCURENCES, "Number of redundant level-triggered interrupts (no IRR change).");1351 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSuppressedLevelIntr, STAMTYPE_COUNTER, " /Devices/IOAPIC/SuppressedLevelIntr", STAMUNIT_OCCURENCES, "Number of suppressed level-triggered interrupts by remote IRR.");1352 1353 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatEoiContention, STAMTYPE_COUNTER, " /Devices/IOAPIC/CritSect/ContentionSetEoi", STAMUNIT_OCCURENCES, "Number of times the critsect is busy during EOI writes causing trips to R3.");1354 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetRteContention, STAMTYPE_COUNTER, " /Devices/IOAPIC/CritSect/ContentionSetRte", STAMUNIT_OCCURENCES, "Number of times the critsect is busy during RTE writes causing trips to R3.");1355 1356 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatLevelIrqSent, STAMTYPE_COUNTER, " /Devices/IOAPIC/LevelIntr/Sent", STAMUNIT_OCCURENCES, "Number of level-triggered interrupts sent to the local APIC(s).");1357 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatEoiReceived, STAMTYPE_COUNTER, " /Devices/IOAPIC/LevelIntr/Recv", STAMUNIT_OCCURENCES, "Number of EOIs received for level-triggered interrupts from the local APIC(s).");1303 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioReadRZ, STAMTYPE_COUNTER, "RZ/MmioReadRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO reads in RZ."); 1304 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioWriteRZ, STAMTYPE_COUNTER, "RZ/MmioWriteRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO writes in RZ."); 1305 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetIrqRZ, STAMTYPE_COUNTER, "RZ/SetIrqRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC SetIrq calls in RZ."); 1306 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetEoiRZ, STAMTYPE_COUNTER, "RZ/SetEoiRZ", STAMUNIT_OCCURENCES, "Number of IOAPIC SetEoi calls in RZ."); 1307 1308 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioReadR3, STAMTYPE_COUNTER, "R3/MmioReadR3", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO reads in R3"); 1309 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatMmioWriteR3, STAMTYPE_COUNTER, "R3/MmioWriteR3", STAMUNIT_OCCURENCES, "Number of IOAPIC MMIO writes in R3."); 1310 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetIrqR3, STAMTYPE_COUNTER, "R3/SetIrqR3", STAMUNIT_OCCURENCES, "Number of IOAPIC SetIrq calls in R3."); 1311 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetEoiR3, STAMTYPE_COUNTER, "R3/SetEoiR3", STAMUNIT_OCCURENCES, "Number of IOAPIC SetEoi calls in R3."); 1312 1313 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRedundantEdgeIntr, STAMTYPE_COUNTER, "RedundantEdgeIntr", STAMUNIT_OCCURENCES, "Number of redundant edge-triggered interrupts (no IRR change)."); 1314 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRedundantLevelIntr, STAMTYPE_COUNTER, "RedundantLevelIntr", STAMUNIT_OCCURENCES, "Number of redundant level-triggered interrupts (no IRR change)."); 1315 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSuppressedLevelIntr, STAMTYPE_COUNTER, "SuppressedLevelIntr", STAMUNIT_OCCURENCES, "Number of suppressed level-triggered interrupts by remote IRR."); 1316 1317 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatEoiContention, STAMTYPE_COUNTER, "CritSect/ContentionSetEoi", STAMUNIT_OCCURENCES, "Number of times the critsect is busy during EOI writes causing trips to R3."); 1318 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatSetRteContention, STAMTYPE_COUNTER, "CritSect/ContentionSetRte", STAMUNIT_OCCURENCES, "Number of times the critsect is busy during RTE writes causing trips to R3."); 1319 1320 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatLevelIrqSent, STAMTYPE_COUNTER, "LevelIntr/Sent", STAMUNIT_OCCURENCES, "Number of level-triggered interrupts sent to the local APIC(s)."); 1321 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatEoiReceived, STAMTYPE_COUNTER, "LevelIntr/Recv", STAMUNIT_OCCURENCES, "Number of EOIs received for level-triggered interrupts from the local APIC(s)."); 1358 1322 # endif 1359 1323 … … 1367 1331 } 1368 1332 1369 #endif /* IN_RING3 */ 1333 #else /* !IN_RING3 */ 1334 1335 /** 1336 * @callback_method_impl{PDMDEVREGR0,pfnConstruct} 1337 */ 1338 static DECLCALLBACK(int) ioapicRZConstruct(PPDMDEVINS pDevIns) 1339 { 1340 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns); 1341 PIOAPIC pThis = PDMDEVINS_2_DATA(pDevIns, PIOAPIC); 1342 1343 int rc = PDMDevHlpSetDeviceCritSect(pDevIns, PDMDevHlpCritSectGetNop(pDevIns)); 1344 AssertRCReturn(rc, rc); 1345 1346 PDMIOAPICREG IoApicReg; 1347 IoApicReg.u32Version = PDM_IOAPICREG_VERSION; 1348 IoApicReg.pfnSetIrq = ioapicSetIrq; 1349 IoApicReg.pfnSendMsi = ioapicSendMsi; 1350 IoApicReg.pfnSetEoi = ioapicSetEoi; 1351 IoApicReg.u32TheEnd = PDM_IOAPICREG_VERSION; 1352 rc = PDMDevHlpIoApicSetUpContext(pDevIns, &IoApicReg, &pThis->CTX_SUFF(pIoApicHlp)); 1353 AssertRCReturn(rc, rc); 1354 1355 return VINF_SUCCESS; 1356 } 1357 1358 #endif /* !IN_RING3 */ 1370 1359 1371 1360 /** … … 1414 1403 #elif defined(IN_RING0) 1415 1404 /* .pfnEarlyConstruct = */ NULL, 1416 /* .pfnConstruct = */ NULL,1405 /* .pfnConstruct = */ ioapicRZConstruct, 1417 1406 /* .pfnDestruct = */ NULL, 1418 1407 /* .pfnFinalDestruct = */ NULL, … … 1427 1416 /* .pfnReserved7 = */ NULL, 1428 1417 #elif defined(IN_RC) 1429 /* .pfnConstruct = */ NULL,1418 /* .pfnConstruct = */ ioapicRZConstruct, 1430 1419 /* .pfnReserved0 = */ NULL, 1431 1420 /* .pfnReserved1 = */ NULL,
Note:
See TracChangeset
for help on using the changeset viewer.