Changeset 89906 in vbox
- Timestamp:
- Jun 24, 2021 8:03:28 PM (3 years ago)
- Location:
- trunk/src/VBox/Devices/Audio
- Files:
-
- 2 edited
-
DevHda.cpp (modified) (43 diffs)
-
DevHda.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevHda.cpp
r89904 r89906 235 235 { 236 236 /** Register offset in the register space. */ 237 uint32_t off set;237 uint32_t off; 238 238 /** Size in bytes. Registers of size > 4 are in fact tables. */ 239 uint8_t size;239 uint8_t cb; 240 240 /** Register descriptor (RD) flags of type HDA_RD_F_XXX. These are used to 241 241 * specify the read/write handling policy of the register. */ 242 242 uint8_t fFlags; 243 /** Index into the register storage array . */244 uint8_t mem_idx;243 /** Index into the register storage array (HDASTATE::au32Regs). */ 244 uint8_t idxReg; 245 245 uint8_t bUnused; 246 246 /** Readable bits. */ 247 uint32_t readable;247 uint32_t fReadableMask; 248 248 /** Writable bits. */ 249 uint32_t writable;249 uint32_t fWritableMask; 250 250 /** Read callback. */ 251 251 FNHDAREGREAD *pfnRead; … … 254 254 #if defined(IN_RING3) || defined(LOG_ENABLED) /* Saves 0x2f23 - 0x1888 = 0x169B (5787) bytes in VBoxDDR0. */ 255 255 /** Abbreviated name. */ 256 const char *abbrev; 257 /** Descripton. */ 258 const char *desc; 256 const char *pszName; 257 # ifdef IN_RING3 258 /** Description (for stats). */ 259 const char *pszDesc; 260 # endif 259 261 #endif 260 262 } HDAREGDESC; … … 357 359 #define HDA_RD_F_SD_WRITE_RUN RT_BIT(0) 358 360 361 /** @def HDA_REG_ENTRY_EX 362 * Maps the entry values to the actual HDAREGDESC layout, which is differs 363 * depending on context and build type. */ 359 364 #if defined(IN_RING3) || defined(LOG_ENABLED) 360 # define HDA_REG_ENTRY_EX(a_offBar, a_cbReg, a_fReadMask, a_fWriteMask, a_fFlags, a_pfnRead, a_pfnWrite, a_idxMap, a_szName, a_szDesc) \ 365 # ifdef IN_RING3 366 # define HDA_REG_ENTRY_EX(a_offBar, a_cbReg, a_fReadMask, a_fWriteMask, a_fFlags, a_pfnRead, a_pfnWrite, a_idxMap, a_szName, a_szDesc) \ 361 367 { a_offBar, a_cbReg, a_fFlags, a_idxMap, 0, a_fReadMask, a_fWriteMask, a_pfnRead, a_pfnWrite, a_szName, a_szDesc } 368 # else 369 # define HDA_REG_ENTRY_EX(a_offBar, a_cbReg, a_fReadMask, a_fWriteMask, a_fFlags, a_pfnRead, a_pfnWrite, a_idxMap, a_szName, a_szDesc) \ 370 { a_offBar, a_cbReg, a_fFlags, a_idxMap, 0, a_fReadMask, a_fWriteMask, a_pfnRead, a_pfnWrite, a_szName } 371 # endif 362 372 #else 363 373 # define HDA_REG_ENTRY_EX(a_offBar, a_cbReg, a_fReadMask, a_fWriteMask, a_fFlags, a_pfnRead, a_pfnWrite, a_idxMap, a_szName, a_szDesc) \ 364 374 { a_offBar, a_cbReg, a_fFlags, a_idxMap, 0, a_fReadMask, a_fWriteMask, a_pfnRead, a_pfnWrite } 365 375 #endif 376 366 377 #define HDA_REG_ENTRY(a_offBar, a_cbReg, a_fReadMask, a_fWriteMask, a_fFlags, a_pfnRead, a_pfnWrite, a_ShortRegNm, a_szDesc) \ 367 378 HDA_REG_ENTRY_EX(a_offBar, a_cbReg, a_fReadMask, a_fWriteMask, a_fFlags, a_pfnRead, a_pfnWrite, HDA_MEM_IND_NAME(a_ShortRegNm), #a_ShortRegNm, a_szDesc) … … 573 584 { 574 585 Assert(idxMap < RT_ELEMENTS(g_aHdaRegMap)); 575 AssertMsg(idxReg == g_aHdaRegMap[idxMap]. mem_idx, ("idxReg=%d\n", idxReg));586 AssertMsg(idxReg == g_aHdaRegMap[idxMap].idxReg, ("idxReg=%d\n", idxReg)); 576 587 return &pThis->au32Regs[idxReg]; 577 588 } … … 585 596 Assert(idxMap0 < RT_ELEMENTS(g_aHdaRegMap)); 586 597 AssertMsg(idxStream < RT_ELEMENTS(pThis->aStreams), ("%#zx\n", idxStream)); 587 AssertMsg(idxReg0 + idxStream * 10 == g_aHdaRegMap[idxMap0 + idxStream * 10]. mem_idx,598 AssertMsg(idxReg0 + idxStream * 10 == g_aHdaRegMap[idxMap0 + idxStream * 10].idxReg, 588 599 ("idxReg0=%d idxStream=%zx\n", idxReg0, idxStream)); 589 600 return &pThis->au32Regs[idxReg0 + idxStream * 10]; … … 696 707 if (offReg == g_aHdaRegAliases[i].offReg) 697 708 return g_aHdaRegAliases[i].idxAlias; 698 Assert(g_aHdaRegMap[RT_ELEMENTS(g_aHdaRegMap) - 1].off set< offReg);709 Assert(g_aHdaRegMap[RT_ELEMENTS(g_aHdaRegMap) - 1].off < offReg); 699 710 return -1; 700 711 } … … 708 719 { 709 720 int idxMiddle = idxLow + (idxEnd - idxLow) / 2; 710 if (offReg < g_aHdaRegMap[idxMiddle].off set)721 if (offReg < g_aHdaRegMap[idxMiddle].off) 711 722 { 712 723 if (idxLow == idxMiddle) … … 714 725 idxEnd = idxMiddle; 715 726 } 716 else if (offReg > g_aHdaRegMap[idxMiddle].off set)727 else if (offReg > g_aHdaRegMap[idxMiddle].off) 717 728 { 718 729 idxLow = idxMiddle + 1; … … 726 737 #ifdef RT_STRICT 727 738 for (unsigned i = 0; i < RT_ELEMENTS(g_aHdaRegMap); i++) 728 Assert(g_aHdaRegMap[i].off set!= offReg);739 Assert(g_aHdaRegMap[i].off != offReg); 729 740 #endif 730 741 return -1; … … 749 760 { 750 761 uint32_t off = offReg - g_aHdaRegAliases[i].offReg; 751 if (off < 4 && off < g_aHdaRegMap[g_aHdaRegAliases[i].idxAlias]. size)762 if (off < 4 && off < g_aHdaRegMap[g_aHdaRegAliases[i].idxAlias].cb) 752 763 return g_aHdaRegAliases[i].idxAlias; 753 764 } 754 Assert(g_aHdaRegMap[RT_ELEMENTS(g_aHdaRegMap) - 1].off set< offReg);765 Assert(g_aHdaRegMap[RT_ELEMENTS(g_aHdaRegMap) - 1].off < offReg); 755 766 return -1; 756 767 } … … 764 775 { 765 776 int idxMiddle = idxLow + (idxEnd - idxLow) / 2; 766 if (offReg < g_aHdaRegMap[idxMiddle].off set)777 if (offReg < g_aHdaRegMap[idxMiddle].off) 767 778 { 768 779 if (idxLow == idxMiddle) … … 770 781 idxEnd = idxMiddle; 771 782 } 772 else if (offReg >= g_aHdaRegMap[idxMiddle].off set + g_aHdaRegMap[idxMiddle].size)783 else if (offReg >= g_aHdaRegMap[idxMiddle].off + g_aHdaRegMap[idxMiddle].cb) 773 784 { 774 785 idxLow = idxMiddle + 1; … … 782 793 # ifdef RT_STRICT 783 794 for (unsigned i = 0; i < RT_ELEMENTS(g_aHdaRegMap); i++) 784 Assert(offReg - g_aHdaRegMap[i].off set >= g_aHdaRegMap[i].size);795 Assert(offReg - g_aHdaRegMap[i].off >= g_aHdaRegMap[i].cb); 785 796 # endif 786 797 return -1; … … 1049 1060 static VBOXSTRICTRC hdaRegReadU8(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value) 1050 1061 { 1051 Assert(((pThis->au32Regs[g_aHdaRegMap[iReg]. mem_idx] & g_aHdaRegMap[iReg].readable) & 0xffffff00) == 0);1062 Assert(((pThis->au32Regs[g_aHdaRegMap[iReg].idxReg] & g_aHdaRegMap[iReg].fReadableMask) & UINT32_C(0xffffff00)) == 0); 1052 1063 return hdaRegReadU32(pDevIns, pThis, iReg, pu32Value); 1053 1064 } … … 1062 1073 static VBOXSTRICTRC hdaRegReadU16(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value) 1063 1074 { 1064 Assert(((pThis->au32Regs[g_aHdaRegMap[iReg]. mem_idx] & g_aHdaRegMap[iReg].readable) & 0xffff0000) == 0);1075 Assert(((pThis->au32Regs[g_aHdaRegMap[iReg].idxReg] & g_aHdaRegMap[iReg].fReadableMask) & UINT32_C(0xffff0000)) == 0); 1065 1076 return hdaRegReadU32(pDevIns, pThis, iReg, pu32Value); 1066 1077 } … … 1075 1086 static VBOXSTRICTRC hdaRegReadU24(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value) 1076 1087 { 1077 Assert(((pThis->au32Regs[g_aHdaRegMap[iReg]. mem_idx] & g_aHdaRegMap[iReg].readable) & 0xff000000) == 0);1088 Assert(((pThis->au32Regs[g_aHdaRegMap[iReg].idxReg] & g_aHdaRegMap[iReg].fReadableMask) & UINT32_C(0xff000000)) == 0); 1078 1089 return hdaRegReadU32(pDevIns, pThis, iReg, pu32Value); 1079 1090 } … … 1092 1103 RT_NOREF(pDevIns); 1093 1104 1094 uint32_t const iRegMem = g_aHdaRegMap[iReg]. mem_idx;1095 *pu32Value = pThis->au32Regs[iRegMem] & g_aHdaRegMap[iReg]. readable;1105 uint32_t const iRegMem = g_aHdaRegMap[iReg].idxReg; 1106 *pu32Value = pThis->au32Regs[iRegMem] & g_aHdaRegMap[iReg].fReadableMask; 1096 1107 return VINF_SUCCESS; 1097 1108 } … … 1101 1112 RT_NOREF(pDevIns); 1102 1113 1103 uint32_t const iRegMem = g_aHdaRegMap[iReg]. mem_idx;1104 pThis->au32Regs[iRegMem] = (u32Value & g_aHdaRegMap[iReg]. writable)1105 | (pThis->au32Regs[iRegMem] & ~g_aHdaRegMap[iReg]. writable);1114 uint32_t const iRegMem = g_aHdaRegMap[iReg].idxReg; 1115 pThis->au32Regs[iRegMem] = (u32Value & g_aHdaRegMap[iReg].fWritableMask) 1116 | (pThis->au32Regs[iRegMem] & ~g_aHdaRegMap[iReg].fWritableMask); 1106 1117 return VINF_SUCCESS; 1107 1118 } … … 1362 1373 */ 1363 1374 uint32_t const fOld = HDA_REG(pThis, SSYNC); 1364 uint32_t const fNew = (u32Value & g_aHdaRegMap[iReg]. writable)1365 | (fOld & ~g_aHdaRegMap[iReg]. writable);1375 uint32_t const fNew = (u32Value & g_aHdaRegMap[iReg].fWritableMask) 1376 | (fOld & ~g_aHdaRegMap[iReg].fWritableMask); 1366 1377 uint32_t const fChanged = (fNew ^ fOld) & (RT_BIT_32(HDA_MAX_STREAMS) - 1); 1367 1378 if (fChanged) … … 2244 2255 AssertRCSuccess(VBOXSTRICTRC_VAL(rc)); 2245 2256 2246 uint32_t const iRegMem = g_aHdaRegMap[iReg]. mem_idx;2257 uint32_t const iRegMem = g_aHdaRegMap[iReg].idxReg; 2247 2258 switch (iReg) 2248 2259 { … … 2995 3006 else 2996 3007 { 2997 Log4(("hdaIsMultiReadSafeInRZ: idxRegDsc=%u %s\n", idxRegDsc, g_aHdaRegMap[idxRegDsc]. abbrev));3008 Log4(("hdaIsMultiReadSafeInRZ: idxRegDsc=%u %s\n", idxRegDsc, g_aHdaRegMap[idxRegDsc].pszName)); 2998 3009 return false; 2999 3010 } … … 3001 3012 idxRegDsc++; 3002 3013 if (idxRegDsc < RT_ELEMENTS(g_aHdaRegMap)) 3003 cbLeft -= g_aHdaRegMap[idxRegDsc].off set - g_aHdaRegMap[idxRegDsc - 1].offset;3014 cbLeft -= g_aHdaRegMap[idxRegDsc].off - g_aHdaRegMap[idxRegDsc - 1].off; 3004 3015 else 3005 3016 break; … … 3056 3067 { 3057 3068 /* ASSUMES gapless DWORD at end of map. */ 3058 if (g_aHdaRegMap[idxRegDsc]. size== 4)3069 if (g_aHdaRegMap[idxRegDsc].cb == 4) 3059 3070 { 3060 3071 /* … … 3062 3073 */ 3063 3074 rc = g_aHdaRegMap[idxRegDsc].pfnRead(pDevIns, pThis, idxRegDsc, (uint32_t *)pv); 3064 Log3Func((" Read %s => %x (%Rrc)\n", g_aHdaRegMap[idxRegDsc]. abbrev, *(uint32_t *)pv, VBOXSTRICTRC_VAL(rc)));3075 Log3Func((" Read %s => %x (%Rrc)\n", g_aHdaRegMap[idxRegDsc].pszName, *(uint32_t *)pv, VBOXSTRICTRC_VAL(rc))); 3065 3076 STAM_COUNTER_INC(&pThis->aStatRegReads[idxRegDsc]); 3066 3077 } … … 3080 3091 */ 3081 3092 STAM_COUNTER_INC(&pThis->CTX_SUFF_Z(StatRegMultiReads)); 3082 Log4(("hdaMmioRead: multi read: %#x LB %#x %s\n", off, cb, g_aHdaRegMap[idxRegDsc]. abbrev));3093 Log4(("hdaMmioRead: multi read: %#x LB %#x %s\n", off, cb, g_aHdaRegMap[idxRegDsc].pszName)); 3083 3094 uint32_t u32Value = 0; 3084 3095 unsigned cbLeft = 4; 3085 3096 do 3086 3097 { 3087 uint32_t const cbReg = g_aHdaRegMap[idxRegDsc]. size;3098 uint32_t const cbReg = g_aHdaRegMap[idxRegDsc].cb; 3088 3099 uint32_t u32Tmp = 0; 3089 3100 3090 3101 rc = g_aHdaRegMap[idxRegDsc].pfnRead(pDevIns, pThis, idxRegDsc, &u32Tmp); 3091 Log4Func((" Read %s[%db] => %x (%Rrc)*\n", g_aHdaRegMap[idxRegDsc]. abbrev, cbReg, u32Tmp, VBOXSTRICTRC_VAL(rc)));3102 Log4Func((" Read %s[%db] => %x (%Rrc)*\n", g_aHdaRegMap[idxRegDsc].pszName, cbReg, u32Tmp, VBOXSTRICTRC_VAL(rc))); 3092 3103 STAM_COUNTER_INC(&pThis->aStatRegReads[idxRegDsc]); 3093 3104 #ifdef IN_RING3 … … 3102 3113 off += cbReg; 3103 3114 idxRegDsc++; 3104 } while (cbLeft > 0 && g_aHdaRegMap[idxRegDsc].off set== off);3115 } while (cbLeft > 0 && g_aHdaRegMap[idxRegDsc].off == off); 3105 3116 3106 3117 if (rc == VINF_SUCCESS) … … 3148 3159 else 3149 3160 { 3150 Log(("hdaWriteReg: Warning: Access to %s is blocked while controller is in reset mode\n", g_aHdaRegMap[idxRegDsc]. abbrev));3161 Log(("hdaWriteReg: Warning: Access to %s is blocked while controller is in reset mode\n", g_aHdaRegMap[idxRegDsc].pszName)); 3151 3162 #if defined(IN_RING3) || defined(LOG_ENABLED) 3152 3163 LogRel2(("HDA: Warning: Access to register %s is blocked while controller is in reset mode\n", 3153 g_aHdaRegMap[idxRegDsc]. abbrev));3164 g_aHdaRegMap[idxRegDsc].pszName)); 3154 3165 #endif 3155 3166 STAM_COUNTER_INC(&pThis->StatRegWritesBlockedByReset); … … 3174 3185 else 3175 3186 { 3176 Log(("hdaWriteReg: Warning: Access to %s is blocked! %R[sdctl]\n", g_aHdaRegMap[idxRegDsc]. abbrev, uSDCTL));3187 Log(("hdaWriteReg: Warning: Access to %s is blocked! %R[sdctl]\n", g_aHdaRegMap[idxRegDsc].pszName, uSDCTL)); 3177 3188 #if defined(IN_RING3) || defined(LOG_ENABLED) 3178 3189 LogRel2(("HDA: Warning: Access to register %s is blocked while the stream's RUN bit is set\n", 3179 g_aHdaRegMap[idxRegDsc]. abbrev));3190 g_aHdaRegMap[idxRegDsc].pszName)); 3180 3191 #endif 3181 3192 STAM_COUNTER_INC(&pThis->StatRegWritesBlockedByRun); … … 3185 3196 3186 3197 #ifdef LOG_ENABLED 3187 uint32_t const idxRegMem = g_aHdaRegMap[idxRegDsc]. mem_idx;3198 uint32_t const idxRegMem = g_aHdaRegMap[idxRegDsc].idxReg; 3188 3199 uint32_t const u32OldValue = pThis->au32Regs[idxRegMem]; 3189 3200 #endif 3190 3201 VBOXSTRICTRC rc = g_aHdaRegMap[idxRegDsc].pfnWrite(pDevIns, pThis, idxRegDsc, u32Value); 3191 Log3Func(("Written value %#x to %s[%d byte]; %x => %x%s, rc=%d\n", u32Value, g_aHdaRegMap[idxRegDsc]. abbrev,3192 g_aHdaRegMap[idxRegDsc]. size, u32OldValue, pThis->au32Regs[idxRegMem], pszLog, VBOXSTRICTRC_VAL(rc)));3202 Log3Func(("Written value %#x to %s[%d byte]; %x => %x%s, rc=%d\n", u32Value, g_aHdaRegMap[idxRegDsc].pszName, 3203 g_aHdaRegMap[idxRegDsc].cb, u32OldValue, pThis->au32Regs[idxRegMem], pszLog, VBOXSTRICTRC_VAL(rc))); 3193 3204 #ifndef IN_RING3 3194 3205 if (rc == VINF_IOM_R3_MMIO_WRITE) … … 3218 3229 int idxRegDsc = hdaRegLookup(off); 3219 3230 #if defined(IN_RING3) || defined(LOG_ENABLED) 3220 uint32_t idxRegMem = idxRegDsc != -1 ? g_aHdaRegMap[idxRegDsc]. mem_idx: UINT32_MAX;3231 uint32_t idxRegMem = idxRegDsc != -1 ? g_aHdaRegMap[idxRegDsc].idxReg : UINT32_MAX; 3221 3232 #endif 3222 3233 uint64_t u64Value; … … 3251 3262 */ 3252 3263 VBOXSTRICTRC rc; 3253 if (idxRegDsc >= 0 && g_aHdaRegMap[idxRegDsc]. size== cb)3264 if (idxRegDsc >= 0 && g_aHdaRegMap[idxRegDsc].cb == cb) 3254 3265 { 3255 3266 DEVHDA_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_MMIO_WRITE); 3256 3267 3257 Log3Func(("@%#05x u%u=%#0*RX64 %s\n", (uint32_t)off, cb * 8, 2 + cb * 2, u64Value, g_aHdaRegMap[idxRegDsc]. abbrev));3268 Log3Func(("@%#05x u%u=%#0*RX64 %s\n", (uint32_t)off, cb * 8, 2 + cb * 2, u64Value, g_aHdaRegMap[idxRegDsc].pszName)); 3258 3269 rc = hdaWriteReg(pDevIns, pThis, idxRegDsc, u64Value, ""); 3259 3270 Log3Func((" %#x -> %#x\n", u32LogOldValue, idxRegMem != UINT32_MAX ? pThis->au32Regs[idxRegMem] : UINT32_MAX)); … … 3265 3276 */ 3266 3277 else if ( idxRegDsc >= 0 3267 && cb < g_aHdaRegMap[idxRegDsc]. size)3278 && cb < g_aHdaRegMap[idxRegDsc].cb) 3268 3279 { 3269 3280 DEVHDA_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_MMIO_WRITE); 3270 3281 3271 u64Value |= pThis->au32Regs[g_aHdaRegMap[idxRegDsc]. mem_idx]3272 & g_afMasks[g_aHdaRegMap[idxRegDsc]. size]3282 u64Value |= pThis->au32Regs[g_aHdaRegMap[idxRegDsc].idxReg] 3283 & g_afMasks[g_aHdaRegMap[idxRegDsc].cb] 3273 3284 & ~g_afMasks[cb]; 3274 3285 Log4Func(("@%#05x u%u=%#0*RX64 cb=%#x cbReg=%x %s\n" 3275 3286 "hdaMmioWrite: Supplying missing bits (%#x): %#llx -> %#llx ...\n", 3276 (uint32_t)off, cb * 8, 2 + cb * 2, u64Value, cb, g_aHdaRegMap[idxRegDsc]. size, g_aHdaRegMap[idxRegDsc].abbrev,3277 g_afMasks[g_aHdaRegMap[idxRegDsc]. size] & ~g_afMasks[cb], u64Value & g_afMasks[cb], u64Value));3287 (uint32_t)off, cb * 8, 2 + cb * 2, u64Value, cb, g_aHdaRegMap[idxRegDsc].cb, g_aHdaRegMap[idxRegDsc].pszName, 3288 g_afMasks[g_aHdaRegMap[idxRegDsc].cb] & ~g_afMasks[cb], u64Value & g_afMasks[cb], u64Value)); 3278 3289 rc = hdaWriteReg(pDevIns, pThis, idxRegDsc, u64Value, ""); 3279 3290 Log4Func((" %#x -> %#x\n", u32LogOldValue, idxRegMem != UINT32_MAX ? pThis->au32Regs[idxRegMem] : UINT32_MAX)); … … 3292 3303 if (idxRegDsc == -1) 3293 3304 Log4Func(("@%#05x u32=%#010x cb=%d\n", (uint32_t)off, *(uint32_t const *)pv, cb)); 3294 else if (g_aHdaRegMap[idxRegDsc]. size== cb)3295 Log4Func(("@%#05x u%u=%#0*RX64 %s\n", (uint32_t)off, cb * 8, 2 + cb * 2, u64Value, g_aHdaRegMap[idxRegDsc]. abbrev));3305 else if (g_aHdaRegMap[idxRegDsc].cb == cb) 3306 Log4Func(("@%#05x u%u=%#0*RX64 %s\n", (uint32_t)off, cb * 8, 2 + cb * 2, u64Value, g_aHdaRegMap[idxRegDsc].pszName)); 3296 3307 else 3297 3308 Log4Func(("@%#05x u%u=%#0*RX64 %s - mismatch cbReg=%u\n", (uint32_t)off, cb * 8, 2 + cb * 2, u64Value, 3298 g_aHdaRegMap[idxRegDsc]. abbrev, g_aHdaRegMap[idxRegDsc].size));3309 g_aHdaRegMap[idxRegDsc].pszName, g_aHdaRegMap[idxRegDsc].cb)); 3299 3310 3300 3311 /* … … 3309 3320 if (idxRegDsc != -1) 3310 3321 { 3311 uint32_t const cbBefore = (uint32_t)off - g_aHdaRegMap[idxRegDsc].off set;3322 uint32_t const cbBefore = (uint32_t)off - g_aHdaRegMap[idxRegDsc].off; 3312 3323 Assert(cbBefore > 0 && cbBefore < 4); 3313 3324 off -= cbBefore; 3314 idxRegMem = g_aHdaRegMap[idxRegDsc]. mem_idx;3325 idxRegMem = g_aHdaRegMap[idxRegDsc].idxReg; 3315 3326 u64Value <<= cbBefore * 8; 3316 3327 u64Value |= pThis->au32Regs[idxRegMem] & g_afMasks[cbBefore]; … … 3324 3335 else 3325 3336 { 3326 Log4(("hdaMmioWrite: multi write: %s\n", g_aHdaRegMap[idxRegDsc]. abbrev));3337 Log4(("hdaMmioWrite: multi write: %s\n", g_aHdaRegMap[idxRegDsc].pszName)); 3327 3338 STAM_COUNTER_INC(&pThis->CTX_SUFF_Z(StatRegMultiWrites)); 3328 3339 } … … 3335 3346 if (idxRegDsc >= 0) 3336 3347 { 3337 idxRegMem = g_aHdaRegMap[idxRegDsc]. mem_idx;3338 cbReg = g_aHdaRegMap[idxRegDsc]. size;3348 idxRegMem = g_aHdaRegMap[idxRegDsc].idxReg; 3349 cbReg = g_aHdaRegMap[idxRegDsc].cb; 3339 3350 if (cb < cbReg) 3340 3351 { … … 3369 3380 idxRegDsc++; 3370 3381 if ( (unsigned)idxRegDsc >= RT_ELEMENTS(g_aHdaRegMap) 3371 || g_aHdaRegMap[idxRegDsc].off set!= off)3382 || g_aHdaRegMap[idxRegDsc].off != off) 3372 3383 idxRegDsc = -1; 3373 3384 } … … 4180 4191 if (pszArgs && *pszArgs != '\0') 4181 4192 for (int iReg = 0; iReg < HDA_NUM_REGS; ++iReg) 4182 if (!RTStrICmp(g_aHdaRegMap[iReg]. abbrev, pszArgs))4193 if (!RTStrICmp(g_aHdaRegMap[iReg].pszName, pszArgs)) 4183 4194 return iReg; 4184 4195 return -1; … … 4188 4199 static void hdaR3DbgPrintRegister(PPDMDEVINS pDevIns, PHDASTATE pThis, PCDBGFINFOHLP pHlp, int iHdaIndex) 4189 4200 { 4190 /** @todo HDA_REG_IDX_NOMEM & GCAP both uses mem_idx zero, no flag or anything to tell them appart. */ 4191 if (g_aHdaRegMap[iHdaIndex].mem_idx != 0 || g_aHdaRegMap[iHdaIndex].pfnRead != hdaRegReadWALCLK) 4192 pHlp->pfnPrintf(pHlp, "%s: 0x%x\n", g_aHdaRegMap[iHdaIndex].abbrev, pThis->au32Regs[g_aHdaRegMap[iHdaIndex].mem_idx]); 4201 /** @todo HDA_REG_IDX_NOMEM & GCAP both uses idxReg zero, no flag or anything 4202 * to tell them appart. */ 4203 if (g_aHdaRegMap[iHdaIndex].idxReg != 0 || g_aHdaRegMap[iHdaIndex].pfnRead != hdaRegReadWALCLK) 4204 pHlp->pfnPrintf(pHlp, "%s: 0x%x\n", g_aHdaRegMap[iHdaIndex].pszName, pThis->au32Regs[g_aHdaRegMap[iHdaIndex].idxReg]); 4193 4205 else 4194 4206 { 4195 4207 uint64_t uWallNow = 0; 4196 4208 hdaQueryWallClock(pDevIns, pThis, false /*fDoDma*/, &uWallNow); 4197 pHlp->pfnPrintf(pHlp, "%s: 0x%RX64\n", g_aHdaRegMap[iHdaIndex]. abbrev, uWallNow);4209 pHlp->pfnPrintf(pHlp, "%s: 0x%RX64\n", g_aHdaRegMap[iHdaIndex].pszName, uWallNow); 4198 4210 } 4199 4211 } … … 5062 5074 * Asserting sanity. 5063 5075 */ 5064 AssertCompile(RT_ELEMENTS(pThis->au32Regs) < 256 /* assumption by HDAREGDESC:: mem_idx*/);5076 AssertCompile(RT_ELEMENTS(pThis->au32Regs) < 256 /* assumption by HDAREGDESC::idxReg */); 5065 5077 for (unsigned i = 0; i < RT_ELEMENTS(g_aHdaRegMap); i++) 5066 5078 { … … 5069 5081 5070 5082 /* binary search order. */ 5071 AssertReleaseMsg(!pNextReg || pReg->off set + pReg->size <= pNextReg->offset,5083 AssertReleaseMsg(!pNextReg || pReg->off + pReg->cb <= pNextReg->off, 5072 5084 ("[%#x] = {%#x LB %#x} vs. [%#x] = {%#x LB %#x}\n", 5073 i, pReg->off set, pReg->size, i + 1, pNextReg->offset, pNextReg->size));5085 i, pReg->off, pReg->cb, i + 1, pNextReg->off, pNextReg->cb)); 5074 5086 5075 5087 /* alignment. */ 5076 AssertReleaseMsg( pReg-> size== 15077 || (pReg-> size == 2 && (pReg->offset& 1) == 0)5078 || (pReg-> size == 3 && (pReg->offset& 3) == 0)5079 || (pReg-> size == 4 && (pReg->offset& 3) == 0),5080 ("[%#x] = {%#x LB %#x}\n", i, pReg->off set, pReg->size));5088 AssertReleaseMsg( pReg->cb == 1 5089 || (pReg->cb == 2 && (pReg->off & 1) == 0) 5090 || (pReg->cb == 3 && (pReg->off & 3) == 0) 5091 || (pReg->cb == 4 && (pReg->off & 3) == 0), 5092 ("[%#x] = {%#x LB %#x}\n", i, pReg->off, pReg->cb)); 5081 5093 5082 5094 /* registers are packed into dwords - with 3 exceptions with gaps at the end of the dword. */ 5083 AssertRelease(((pReg->off set + pReg->size) & 3) == 0 || pNextReg);5084 if (pReg->off set& 3)5095 AssertRelease(((pReg->off + pReg->cb) & 3) == 0 || pNextReg); 5096 if (pReg->off & 3) 5085 5097 { 5086 5098 struct HDAREGDESC const *pPrevReg = i > 0 ? &g_aHdaRegMap[i - 1] : NULL; 5087 AssertReleaseMsg(pPrevReg, ("[%#x] = {%#x LB %#x}\n", i, pReg->off set, pReg->size));5099 AssertReleaseMsg(pPrevReg, ("[%#x] = {%#x LB %#x}\n", i, pReg->off, pReg->cb)); 5088 5100 if (pPrevReg) 5089 AssertReleaseMsg(pPrevReg->off set + pPrevReg->size == pReg->offset,5101 AssertReleaseMsg(pPrevReg->off + pPrevReg->cb == pReg->off, 5090 5102 ("[%#x] = {%#x LB %#x} vs. [%#x] = {%#x LB %#x}\n", 5091 i - 1, pPrevReg->off set, pPrevReg->size, i + 1, pReg->offset, pReg->size));5103 i - 1, pPrevReg->off, pPrevReg->cb, i + 1, pReg->off, pReg->cb)); 5092 5104 } 5093 5105 #if 0 … … 5102 5114 #endif 5103 5115 /* The final entry is a full DWORD, no gaps! Allows shortcuts. */ 5104 AssertReleaseMsg(pNextReg || ((pReg->off set + pReg->size) & 3) == 0,5105 ("[%#x] = {%#x LB %#x}\n", i, pReg->off set, pReg->size));5116 AssertReleaseMsg(pNextReg || ((pReg->off + pReg->cb) & 3) == 0, 5117 ("[%#x] = {%#x LB %#x}\n", i, pReg->off, pReg->cb)); 5106 5118 } 5107 5119 … … 5127 5139 { 5128 5140 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aStatRegReads[i], STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, 5129 g_aHdaRegMap[i]. desc, "Regs/%03x-%s-Reads", g_aHdaRegMap[i].offset, g_aHdaRegMap[i].abbrev);5141 g_aHdaRegMap[i].pszDesc, "Regs/%03x-%s-Reads", g_aHdaRegMap[i].off, g_aHdaRegMap[i].pszName); 5130 5142 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aStatRegReadsToR3[i], STAMTYPE_COUNTER, STAMVISIBILITY_USED, STAMUNIT_OCCURENCES, 5131 g_aHdaRegMap[i]. desc, "Regs/%03x-%s-Reads-ToR3", g_aHdaRegMap[i].offset, g_aHdaRegMap[i].abbrev);5143 g_aHdaRegMap[i].pszDesc, "Regs/%03x-%s-Reads-ToR3", g_aHdaRegMap[i].off, g_aHdaRegMap[i].pszName); 5132 5144 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aStatRegWrites[i], STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, 5133 g_aHdaRegMap[i]. desc, "Regs/%03x-%s-Writes", g_aHdaRegMap[i].offset, g_aHdaRegMap[i].abbrev);5145 g_aHdaRegMap[i].pszDesc, "Regs/%03x-%s-Writes", g_aHdaRegMap[i].off, g_aHdaRegMap[i].pszName); 5134 5146 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aStatRegWritesToR3[i], STAMTYPE_COUNTER, STAMVISIBILITY_USED, STAMUNIT_OCCURENCES, 5135 g_aHdaRegMap[i]. desc, "Regs/%03x-%s-Writes-ToR3", g_aHdaRegMap[i].offset, g_aHdaRegMap[i].abbrev);5147 g_aHdaRegMap[i].pszDesc, "Regs/%03x-%s-Writes-ToR3", g_aHdaRegMap[i].off, g_aHdaRegMap[i].pszName); 5136 5148 } 5137 5149 PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRegMultiReadsR3, STAMTYPE_COUNTER, "RegMultiReadsR3", STAMUNIT_OCCURENCES, "Register read not targeting just one register, handled in ring-3"); -
trunk/src/VBox/Devices/Audio/DevHda.h
r89900 r89906 135 135 #endif 136 136 137 /** Indirect register access via g_aHdaRegMap[]. mem_idx. */138 #define HDA_REG_IND(a_pThis, a_idxMap) HDA_REG_BY_IDX(a_pThis, g_aHdaRegMap[(a_idxMap)]. mem_idx)137 /** Indirect register access via g_aHdaRegMap[].idxReg. */ 138 #define HDA_REG_IND(a_pThis, a_idxMap) HDA_REG_BY_IDX(a_pThis, g_aHdaRegMap[(a_idxMap)].idxReg) 139 139 140 140
Note:
See TracChangeset
for help on using the changeset viewer.

