Changeset 108941 in vbox
- Timestamp:
- Apr 11, 2025 8:30:04 AM (9 days ago)
- svn:sync-xref-src-repo-rev:
- 168452
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/gic-its.h
r108919 r108941 320 320 /** GITS_BASER: Mask of valid read-write bits. */ 321 321 #define GITS_CTRL_REG_BASER_RW_MASK (UINT64_MAX & ~( GITS_BF_CTRL_REG_BASER_ENTRY_SIZE_MASK \ 322 | GITS_BF_CTRL_REG_BASER_TYPE_MASK)) 322 | GITS_BF_CTRL_REG_BASER_TYPE_MASK \ 323 | GITS_BF_CTRL_REG_BASER_INDIRECT_MASK)) 323 324 324 325 /** GITS_BASER: Table type - Unimplemented (not a table). */ -
trunk/src/VBox/VMM/VMMAll/GICAll.cpp
r108882 r108941 3102 3102 pGicDev->fAffRoutingEnabled = true; /* GICv2 backwards compatibility is not implemented, so this is RA1/WI. */ 3103 3103 3104 /* LPIs. */3105 RT_ZERO(pGicDev->bmLpiPending);3106 RT_ZERO(pGicDev->abLpiConfig);3107 pGicDev->uLpiConfigBaseReg.u = 0;3108 pGicDev->fEnableLpis = false;3109 3110 3104 /* GITS. */ 3111 3105 PGITSDEV pGitsDev = &pGicDev->Gits; 3112 3106 gitsInit(pGitsDev); 3107 3108 /* LPIs. */ 3109 RT_ZERO(pGicDev->abLpiConfig); 3110 RT_ZERO(pGicDev->bmLpiPending); 3111 pGicDev->uLpiConfigBaseReg.u = 0; 3112 pGicDev->fEnableLpis = false; 3113 3113 } 3114 3114 -
trunk/src/VBox/VMM/VMMAll/GITSAll.cpp
r108918 r108941 69 69 * during compile time. */ 70 70 #define GITSDIAG_DESC(a_Name) RT_CONCAT(kGitsDiag_, a_Name) < kGitsDiag_End ? RT_STR(a_Name) : "Ignored" 71 /** @} */ 71 72 /** @def GITS_SET_REG_U64_FULL 73 * Sets a 64-bit GITS register. 74 * @param a_uReg The 64-bit register to set. 75 * @param a_uValue The 64-bit value being written. 76 * @param a_fRwMask The 64-bit mask of valid read-write bits. 77 */ 78 #define GITS_SET_REG_U64_FULL(a_uReg, a_uValue, a_fRwMask) \ 79 do \ 80 { \ 81 AssertCompile(sizeof(a_uReg) == sizeof(uint64_t)); \ 82 AssertCompile(sizeof(a_fRwMask) == sizeof(uint64_t)); \ 83 (a_uReg) = ((a_uReg) & ~(a_fRwMask)) | ((a_uValue) & (a_fRwMask)); \ 84 } while (0) 85 86 /** @def GITS_SET_REG_U64_LO 87 * Sets the lower half of a 64-bit GITS register. 88 * @param a_uReg The lower half of a 64-bit register to set. 89 * @param a_uValue The value being written (only lower 32-bits are used). 90 * @param a_fRwMask The 64-bit mask of valid read-write bits. 91 */ 92 #define GITS_SET_REG_U64_LO(a_uReg, a_uValue, a_fRwMask) \ 93 do \ 94 { \ 95 AssertCompile(sizeof(a_uReg) == sizeof(uint32_t)); \ 96 AssertCompile(sizeof(a_fRwMask) == sizeof(uint64_t)); \ 97 (a_uReg) = ((a_uReg) & ~(RT_LO_U32(a_fRwMask))) | ((uint32_t)(a_uValue) & (RT_LO_U32(a_fRwMask))); \ 98 } while (0) 99 100 /** @def GITS_SET_REG_U64_HI 101 * Sets the upper half of a 64-bit GITS register. 102 * @param a_uReg The upper half of the 64-bit register to set. 103 * @param a_uValue The value being written (only lower 32-bits are used). 104 * @param a_fRwMask The 64-bit mask of valid read-write bits. 105 */ 106 #define GITS_SET_REG_U64_HI(a_uReg, a_uValue, a_fRwMask) \ 107 do \ 108 { \ 109 AssertCompile(sizeof(a_uReg) == sizeof(uint32_t)); \ 110 AssertCompile(sizeof(a_fRwMask) == sizeof(uint64_t)); \ 111 (a_uReg) = ((a_uReg) & ~(RT_HI_U32(a_fRwMask))) | ((uint32_t)(a_uValue) & (RT_HI_U32(a_fRwMask))); \ 112 } while (0) 113 114 /** @def GITS_SET_REG_U32_FULL 115 * Sets a 32-bit GITS register. 116 * @param a_uReg The 32-bit register to set. 117 * @param a_uValue The 32-bit value being written (only lower 32-bits are 118 * used). 119 * @param a_fRwMask The mask of valid read-write bits (only lower 32-bits are 120 * used). 121 */ 122 #define GITS_SET_REG_U32(a_uReg, a_uValue, a_fRwMask) \ 123 do \ 124 { \ 125 AssertCompile(sizeof(a_uReg) == sizeof(uint32_t)); \ 126 (a_uReg) = ((a_uReg) & ~(a_fRwMask)) | ((uint32_t)(a_uValue) & (uint32_t)(a_fRwMask)); \ 127 } while (0) 72 128 73 129 … … 311 367 if (GITS_IS_REG_IN_RANGE(offReg, GITS_CTRL_REG_BASER_OFF_FIRST, GITS_CTRL_REG_BASER_RANGE_SIZE)) 312 368 { 313 uint16_t const cbReg = sizeof(uint64_t); 314 uint16_t const idxReg = (offReg - GITS_CTRL_REG_BASER_OFF_FIRST) / cbReg; 369 uint16_t const cbReg = sizeof(uint64_t); 370 uint16_t const idxReg = (offReg - GITS_CTRL_REG_BASER_OFF_FIRST) / cbReg; 371 uint64_t const fRwMask = GITS_CTRL_REG_BASER_RW_MASK; 315 372 if (!(offReg & 7)) 316 373 { 317 374 if (cb == 8) 318 pGitsDev->aItsTableRegs[idxReg].u = uValue & GITS_CTRL_REG_BASER_RW_MASK;375 GITS_SET_REG_U64_FULL(pGitsDev->aItsTableRegs[idxReg].u, uValue, fRwMask); 319 376 else 320 pGitsDev->aItsTableRegs[idxReg].s.Lo = uValue & RT_LO_U32(GITS_CTRL_REG_BASER_RW_MASK);377 GITS_SET_REG_U64_LO(pGitsDev->aItsTableRegs[idxReg].s.Lo, uValue, fRwMask); 321 378 } 322 379 else 323 380 { 324 381 Assert(cb == 4); 325 pGitsDev->aItsTableRegs[idxReg].s.Hi = uValue & RT_HI_U32(GITS_CTRL_REG_BASER_RW_MASK);382 GITS_SET_REG_U64_HI(pGitsDev->aItsTableRegs[idxReg].s.Hi, uValue, fRwMask); 326 383 } 327 384 return; … … 333 390 Assert(cb == 4); 334 391 Assert(!(pGitsDev->uTypeReg.u & GITS_BF_CTRL_REG_TYPER_UMSI_IRQ_MASK)); 335 pGitsDev->uCtrlReg = uValue & GITS_BF_CTRL_REG_CTLR_RW_MASK;392 GITS_SET_REG_U32(pGitsDev->uCtrlReg, uValue, GITS_BF_CTRL_REG_CTLR_RW_MASK); 336 393 if (RT_BF_GET(uValue, GITS_BF_CTRL_REG_CTLR_ENABLED)) 337 394 pGitsDev->uCtrlReg &= GITS_BF_CTRL_REG_CTLR_QUIESCENT_MASK; … … 340 397 341 398 case GITS_CTRL_REG_CBASER_OFF: 342 uValue &= GITS_CTRL_REG_CBASER_RW_MASK;343 399 if (cb == 8) 344 pGitsDev->uCmdBaseReg.u = uValue;400 GITS_SET_REG_U64_FULL(pGitsDev->uCmdBaseReg.u, uValue, GITS_CTRL_REG_CBASER_RW_MASK); 345 401 else 346 pGitsDev->uCmdBaseReg.s.Lo = (uint32_t)uValue;402 GITS_SET_REG_U64_LO(pGitsDev->uCmdBaseReg.s.Lo, uValue, GITS_CTRL_REG_CBASER_RW_MASK); 347 403 gitsCmdQueueThreadWakeUpIfNeeded(pDevIns, pGitsDev); 348 404 break; … … 350 406 case GITS_CTRL_REG_CBASER_OFF + 4: 351 407 Assert(cb == 4); 352 pGitsDev->uCmdBaseReg.s.Hi = uValue & RT_HI_U32(GITS_CTRL_REG_CBASER_RW_MASK);408 GITS_SET_REG_U64_HI(pGitsDev->uCmdBaseReg.s.Hi, uValue, GITS_CTRL_REG_CBASER_RW_MASK); 353 409 gitsCmdQueueThreadWakeUpIfNeeded(pDevIns, pGitsDev); 354 410 break; 355 411 356 412 case GITS_CTRL_REG_CWRITER_OFF: 357 pGitsDev->uCmdWriteReg = uValue & RT_LO_U32(GITS_CTRL_REG_CWRITER_RW_MASK);413 GITS_SET_REG_U32(pGitsDev->uCmdWriteReg, uValue, GITS_CTRL_REG_CWRITER_RW_MASK); 358 414 gitsCmdQueueThreadWakeUpIfNeeded(pDevIns, pGitsDev); 359 415 break; … … 387 443 Log4Func(("\n")); 388 444 389 pGitsDev->uCtrlReg = RT_BF_MAKE(GITS_BF_CTRL_REG_CTLR_QUIESCENT, 1); 445 /* GITS_CTLR.*/ 446 pGitsDev->uCtrlReg = RT_BF_MAKE(GITS_BF_CTRL_REG_CTLR_QUIESCENT, 1); 447 448 /* GITS_TYPER. */ 390 449 pGitsDev->uTypeReg.u = RT_BF_MAKE(GITS_BF_CTRL_REG_TYPER_PHYSICAL, 1) /* Physical LPIs supported. */ 391 450 /*| RT_BF_MAKE(GITS_BF_CTRL_REG_TYPER_VIRTUAL, 0) */ /* Virtual LPIs not supported. */ … … 410 469 GITS_CTLR.Enabled and GITS_BASER<n>.Valid. */ 411 470 Assert(RT_ELEMENTS(pGitsDev->auCtes) >= RT_BF_GET(pGitsDev->uTypeReg.u, GITS_BF_CTRL_REG_TYPER_HCC)); 471 472 /* GITS_BASER<n>. */ 412 473 RT_ZERO(pGitsDev->aItsTableRegs); 413 414 474 pGitsDev->aItsTableRegs[0].u = RT_BF_MAKE(GITS_BF_CTRL_REG_BASER_ENTRY_SIZE, GITS_ITE_SIZE - 1) 415 475 | RT_BF_MAKE(GITS_BF_CTRL_REG_BASER_TYPE, GITS_BASER_TYPE_DEVICES) 416 476 | RT_BF_MAKE(GITS_BF_CTRL_REG_BASER_VALID, 1); 417 477 418 pGitsDev->uCmdBaseReg.u = 0; 419 pGitsDev->uCmdReadReg = 0; 420 pGitsDev->uCmdWriteReg = 0; 478 /* GITS_CBASER, GITS_CREADR, GITS_CWRITER. */ 479 pGitsDev->uCmdBaseReg.u = 0; 480 pGitsDev->uCmdReadReg = 0; 481 pGitsDev->uCmdWriteReg = 0; 482 483 /* Collection Table. */ 421 484 RT_ZERO(pGitsDev->auCtes); 422 485 486 /* Misc. stuff. */ 423 487 pGitsDev->cCmdQueueErrors = 0; 424 488 } … … 426 490 427 491 #ifdef IN_RING3 428 DECL_HIDDEN_CALLBACK(void) gitsR3DbgInfo(PCGITSDEV pGitsDev, PCDBGFINFOHLP pHlp, const char *pszArgs) 429 { 430 RT_NOREF(pszArgs); 431 492 DECL_HIDDEN_CALLBACK(void) gitsR3DbgInfo(PCGITSDEV pGitsDev, PCDBGFINFOHLP pHlp) 493 { 432 494 pHlp->pfnPrintf(pHlp, "GIC ITS:\n"); 433 495 -
trunk/src/VBox/VMM/VMMR3/GICR3.cpp
r108884 r108941 287 287 static DECLCALLBACK(void) gicR3DbgInfoIts(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs) 288 288 { 289 PGIC pGic = VM_TO_GIC(pVM); 289 NOREF(pszArgs); 290 PGIC pGic = VM_TO_GIC(pVM); 291 PPDMDEVINS pDevIns = pGic->CTX_SUFF(pDevIns); 292 PCGICDEV pGicDev = PDMDEVINS_2_DATA(pDevIns, PCGICDEV); 293 if (pGicDev->hMmioGits != NIL_IOMMMIOHANDLE) 294 gitsR3DbgInfo(&pGicDev->Gits, pHlp); 295 else 296 pHlp->pfnPrintf(pHlp, "GIC ITS is not mapped/configured for the VM\n"); 297 } 298 299 300 /** 301 * Dumps the GIC LPI information. 302 * 303 * @param pVM The cross context VM structure. 304 * @param pHlp The info helpers. 305 * @param pszArgs Arguments, ignored. 306 */ 307 static DECLCALLBACK(void) gicR3DbgInfoLpi(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs) 308 { 309 NOREF(pszArgs); 310 PGIC pGic = VM_TO_GIC(pVM); 290 311 PPDMDEVINS pDevIns = pGic->CTX_SUFF(pDevIns); 291 312 PCGICDEV pGicDev = PDMDEVINS_2_DATA(pDevIns, PCGICDEV); 292 if (pGicDev->hMmioGits != NIL_IOMMMIOHANDLE) 293 gitsR3DbgInfo(&pGicDev->Gits, pHlp, pszArgs); 294 else 295 pHlp->pfnPrintf(pHlp, "GIC ITS is not mapped/configured for the VM\n"); 313 if (!pGicDev->fLpi) 314 { 315 pHlp->pfnPrintf(pHlp, "GIC LPI support is not enabled for the VM\n"); 316 return; 317 } 318 pHlp->pfnPrintf(pHlp, "GIC LPIs:\n"); 319 pHlp->pfnPrintf(pHlp, " Enabled = %RTbool\n", pGicDev->fEnableLpis); 320 321 /* GICR_PENDBASER. */ 322 { 323 uint64_t const uReg = pGicDev->uLpiPendingBaseReg.u; 324 pHlp->pfnPrintf(pHlp, " uLpiPendingBaseReg = %#RX64\n", uReg); 325 pHlp->pfnPrintf(pHlp, " Inner cache = %#x\n", RT_BF_GET(uReg, GIC_BF_REDIST_REG_PENDBASER_INNER_CACHE)); 326 pHlp->pfnPrintf(pHlp, " Shareability = %#x\n", RT_BF_GET(uReg, GIC_BF_REDIST_REG_PENDBASER_SHAREABILITY)); 327 pHlp->pfnPrintf(pHlp, " Phys addr = %#RX64\n", uReg & GIC_BF_REDIST_REG_PENDBASER_PHYS_ADDR_MASK); 328 pHlp->pfnPrintf(pHlp, " Outer cache = %#x\n", RT_BF_GET(uReg, GIC_BF_REDIST_REG_PENDBASER_OUTER_CACHE)); 329 pHlp->pfnPrintf(pHlp, " Pending Table Zero = %RTbool\n", RT_BF_GET(uReg, GIC_BF_REDIST_REG_PENDBASER_PTZ)); 330 } 331 332 /* GICR_PROPBASER. */ 333 { 334 uint64_t const uReg = pGicDev->uLpiConfigBaseReg.u; 335 uint8_t const cIdBits = RT_BF_GET(uReg, GIC_BF_REDIST_REG_PROPBASER_ID_BITS); 336 pHlp->pfnPrintf(pHlp, " uLpiConfigBaseReg = %#RX64\n", uReg); 337 pHlp->pfnPrintf(pHlp, " ID bits = %#x (%u bits)\n", cIdBits, cIdBits); 338 pHlp->pfnPrintf(pHlp, " Inner cache = %#x\n", RT_BF_GET(uReg, GIC_BF_REDIST_REG_PROPBASER_INNER_CACHE)); 339 pHlp->pfnPrintf(pHlp, " Shareability = %#x\n", RT_BF_GET(uReg, GIC_BF_REDIST_REG_PROPBASER_SHAREABILITY)); 340 pHlp->pfnPrintf(pHlp, " Phys addr = %#RX64\n", uReg & GIC_BF_REDIST_REG_PROPBASER_PHYS_ADDR_MASK); 341 pHlp->pfnPrintf(pHlp, " Outer cache = %#x\n", RT_BF_GET(uReg, GIC_BF_REDIST_REG_PROPBASER_OUTER_CACHE)); 342 } 343 /** @todo Dump LPI config and LPI pending registers. */ 296 344 } 297 345 … … 957 1005 DBGFR3InfoRegisterInternalEx(pVM, "gicredist", "Dumps GIC redistributor information.", gicR3DbgInfoReDist, DBGFINFO_FLAGS_ALL_EMTS); 958 1006 DBGFR3InfoRegisterInternalEx(pVM, "gicits", "Dumps GIC ITS information.", gicR3DbgInfoIts, DBGFINFO_FLAGS_ALL_EMTS); 1007 DBGFR3InfoRegisterInternalEx(pVM, "giclpi", "Dumps GIC LPI information.", gicR3DbgInfoLpi, DBGFINFO_FLAGS_ALL_EMTS); 959 1008 960 1009 /* -
trunk/src/VBox/VMM/include/GITSInternal.h
r108914 r108941 202 202 203 203 #ifdef IN_RING3 204 DECL_HIDDEN_CALLBACK(void) gitsR3DbgInfo(PCGITSDEV pGitsDev, PCDBGFINFOHLP pHlp , const char *pszArgs);204 DECL_HIDDEN_CALLBACK(void) gitsR3DbgInfo(PCGITSDEV pGitsDev, PCDBGFINFOHLP pHlp); 205 205 DECL_HIDDEN_CALLBACK(int) gitsR3CmdQueueProcess(PPDMDEVINS pDevIns, PGITSDEV pGitsDev, void *pvBuf, uint32_t cbBuf); 206 206 #endif
Note:
See TracChangeset
for help on using the changeset viewer.