Changeset 108914 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Apr 9, 2025 11:14:15 AM (4 weeks ago)
- svn:sync-xref-src-repo-rev:
- 168389
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/GITSAll.cpp
r108912 r108914 79 79 { 80 80 GITSDIAG_DESC(None), 81 GITSDIAG_DESC(CmdQueue_Unknown_Cmd), 82 GITSDIAG_DESC(CmdQueue_Invalid_PhysAddr), 81 GITSDIAG_DESC(CmdQueue_Basic_Unknown_Cmd), 82 GITSDIAG_DESC(CmdQueue_Basic_Invalid_PhysAddr), 83 GITSDIAG_DESC(CmdQueue_Cmd_Mapc_Icid_Overflow), 83 84 /* kGitsDiag_End */ 84 85 }; … … 161 162 162 163 /* Record the error and stall the queue. */ 163 pGitsDev->uCmdQueueError = enmError; 164 pGitsDev->enmDiag = enmError; 165 pGitsDev->cCmdQueueErrors++; 164 166 if (fStallQueue) 165 167 pGitsDev->uCmdReadReg |= GITS_BF_CTRL_REG_CREADR_STALLED_MASK; … … 415 417 pGitsDev->uCmdWriteReg = 0; 416 418 RT_ZERO(pGitsDev->auCtes); 419 420 pGitsDev->cCmdQueueErrors = 0; 417 421 } 418 422 … … 430 434 const char *const pszDiag = enmDiag < RT_ELEMENTS(g_apszGitsDiagDesc) ? g_apszGitsDiagDesc[enmDiag] : "(Unknown)"; 431 435 uint32_t const uCtrlReg = pGitsDev->uCtrlReg; 432 pHlp->pfnPrintf(pHlp, " Error = %#RX32 (%s)\n", enmDiag, pszDiag); 433 pHlp->pfnPrintf(pHlp, " uArchRev = %u\n", pGitsDev->uArchRev); 434 pHlp->pfnPrintf(pHlp, " uCtrlReg = %#RX32\n", uCtrlReg); 435 pHlp->pfnPrintf(pHlp, " Enabled = %RTbool\n", RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_ENABLED)); 436 pHlp->pfnPrintf(pHlp, " UMSI IRQ = %RTbool\n", RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_UMSI_IRQ)); 437 pHlp->pfnPrintf(pHlp, " Quiescent = %RTbool\n", RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_QUIESCENT)); 436 pHlp->pfnPrintf(pHlp, " uArchRev = %u\n", pGitsDev->uArchRev); 437 pHlp->pfnPrintf(pHlp, " Errors = %RU64\n", pGitsDev->cCmdQueueErrors); 438 pHlp->pfnPrintf(pHlp, " Diagnostic = %#RX32 (%s)\n", enmDiag, pszDiag); 439 pHlp->pfnPrintf(pHlp, " GITS_CTLR = %#RX32\n", uCtrlReg); 440 pHlp->pfnPrintf(pHlp, " Enabled = %RTbool\n", RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_ENABLED)); 441 pHlp->pfnPrintf(pHlp, " UMSI IRQ = %RTbool\n", RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_UMSI_IRQ)); 442 pHlp->pfnPrintf(pHlp, " Quiescent = %RTbool\n", RT_BF_GET(uCtrlReg, GITS_BF_CTRL_REG_CTLR_QUIESCENT)); 438 443 } 439 444 … … 452 457 uint8_t const idxType = RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_TYPE); 453 458 const char *pszType = s_apszType[idxType]; 454 pHlp->pfnPrintf(pHlp, " aItsTableReg[%u]= %#RX64\n", i, uReg);459 pHlp->pfnPrintf(pHlp, " GITS_BASER[%u] = %#RX64\n", i, uReg); 455 460 pHlp->pfnPrintf(pHlp, " Size = %#x (pages=%u total=%.Rhcb)\n", uSize, cPages, cbItsTable); 456 461 pHlp->pfnPrintf(pHlp, " Page size = %#x (%.Rhcb)\n", idxPageSize, s_acbPageSize[idxPageSize]); … … 470 475 uint8_t const uSize = RT_BF_GET(uReg, GITS_BF_CTRL_REG_CBASER_SIZE); 471 476 uint16_t const cPages = uSize > 0 ? uSize + 1 : 0; 472 pHlp->pfnPrintf(pHlp, " uCmdBaseReg= %#RX64\n", uReg);477 pHlp->pfnPrintf(pHlp, " GITS_CBASER = %#RX64\n", uReg); 473 478 pHlp->pfnPrintf(pHlp, " Size = %#x (pages=%u total=%.Rhcb)\n", uSize, cPages, _4K * cPages); 474 479 pHlp->pfnPrintf(pHlp, " Shareability = %#x\n", RT_BF_GET(uReg, GITS_BF_CTRL_REG_CBASER_SHAREABILITY)); … … 482 487 { 483 488 uint32_t const uReg = pGitsDev->uCmdReadReg; 484 pHlp->pfnPrintf(pHlp, " uCmdReadReg= 0x%05RX32 (stalled=%RTbool offset=%RU32)\n", uReg,489 pHlp->pfnPrintf(pHlp, " GITS_CREADR = 0x%05RX32 (stalled=%RTbool offset=%RU32)\n", uReg, 485 490 RT_BF_GET(uReg, GITS_BF_CTRL_REG_CREADR_STALLED), uReg & GITS_BF_CTRL_REG_CREADR_OFFSET_MASK); 486 491 } … … 489 494 { 490 495 uint32_t const uReg = pGitsDev->uCmdWriteReg; 491 pHlp->pfnPrintf(pHlp, " uCmdWriteReg= 0x%05RX32 ( retry=%RTbool offset=%RU32)\n", uReg,496 pHlp->pfnPrintf(pHlp, " GITS_CWRITER = 0x%05RX32 ( retry=%RTbool offset=%RU32)\n", uReg, 492 497 RT_BF_GET(uReg, GITS_BF_CTRL_REG_CWRITER_RETRY), uReg & GITS_BF_CTRL_REG_CWRITER_OFFSET_MASK); 493 498 } … … 565 570 /* Indicate to the guest we've fetched all commands. */ 566 571 GITS_CRIT_SECT_ENTER(pDevIns); 567 pGitsDev->uCmdReadReg 572 pGitsDev->uCmdReadReg = offWrite; 568 573 pGitsDev->uCmdWriteReg &= ~GITS_BF_CTRL_REG_CWRITER_RETRY_MASK; 569 574 … … 584 589 uint16_t const uTargetCpuId = RT_BF_GET(uDw2, GITS_BF_CMD_MAPC_DW2_RDBASE); 585 590 uint16_t const uIntrCollectionId = RT_BF_GET(uDw2, GITS_BF_CMD_MAPC_DW2_IC_ID); 586 AssertRelease(uIntrCollectionId < RT_ELEMENTS(pGitsDev->auCtes)); /** @todo later figure ideal/correct CT size. */587 591 588 592 GITS_CRIT_SECT_ENTER(pDevIns); 589 Assert(!RT_BF_GET(pGitsDev->uTypeReg.u, GITS_BF_CTRL_REG_TYPER_PTA)); 590 pGitsDev->auCtes[uIntrCollectionId] = RT_BF_MAKE(GITS_BF_CTE_VALID, fValid) 591 | RT_BF_MAKE(GITS_BF_CTE_RDBASE, uTargetCpuId); 593 if (RT_LIKELY(uIntrCollectionId < RT_ELEMENTS(pGitsDev->auCtes))) 594 { 595 Assert(!RT_BF_GET(pGitsDev->uTypeReg.u, GITS_BF_CTRL_REG_TYPER_PTA)); 596 pGitsDev->auCtes[uIntrCollectionId] = RT_BF_MAKE(GITS_BF_CTE_VALID, fValid) 597 | RT_BF_MAKE(GITS_BF_CTE_RDBASE, uTargetCpuId); 598 } 599 else 600 gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Cmd_Mapc_Icid_Overflow, 601 false /* fStall */); 592 602 GITS_CRIT_SECT_LEAVE(pDevIns); 593 603 STAM_COUNTER_INC(&pGitsDev->StatCmdMapc); … … 596 606 597 607 case GITS_CMD_ID_SYNC: 598 {599 608 /* Nothing to do since all previous commands have committed their changes to device state. */ 609 STAM_COUNTER_INC(&pGitsDev->StatCmdInvall); 610 break; 611 612 case GITS_CMD_ID_INVALL: 613 /* Nothing to do as we currently do not cache interrupt mappings. */ 600 614 STAM_COUNTER_INC(&pGitsDev->StatCmdSync); 601 615 break; 602 }603 604 case GITS_CMD_ID_INVALL:605 {606 /* Nothing to do as we currently do not cache interrupt mappings. */607 STAM_COUNTER_INC(&pGitsDev->StatCmdInvall);608 break;609 }610 616 611 617 default: 612 618 { 613 gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Unknown_Cmd, true /* fStall */); 619 /* Record an internal error but do NOT stall queue as we have already advanced the read offset. */ 620 gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Basic_Unknown_Cmd, false /* fStall */); 614 621 AssertReleaseMsgFailed(("Cmd=%#x (%s) idxCmd=%u cCmds=%u offRead=%#RX32 offWrite=%#RX32\n", 615 622 uCmdId, gitsGetCommandName(uCmdId), idxCmd, cCmds, offRead, offWrite)); … … 622 629 623 630 /* Failed to read command queue from the physical address specified by the guest, stall queue and retry later. */ 624 gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_ Invalid_PhysAddr, true /* fStall */);631 gitsCmdQueueSetError(pDevIns, pGitsDev, kGitsDiag_CmdQueue_Basic_Invalid_PhysAddr, true /* fStall */); 625 632 return VINF_TRY_AGAIN; 626 633 }
Note:
See TracChangeset
for help on using the changeset viewer.