Changeset 89778 in vbox
- Timestamp:
- Jun 18, 2021 1:20:11 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 145231
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevIchAc97.cpp
r89776 r89778 443 443 typedef struct AC97STREAM 444 444 { 445 /** Bus master registers of this stream. */ 446 AC97BMREGS Regs; 445 447 /** Stream number (SDn). */ 446 448 uint8_t u8SD; 447 449 uint8_t abPadding0[7]; 448 /** Bus master registers of this stream. */449 AC97BMREGS Regs;450 450 451 451 /** The timer for pumping data thru the attached LUN drivers. */ … … 1018 1018 ichac97R3StreamLock(pStreamCC); 1019 1019 1020 PAC97BMREGS pRegs = &pStream->Regs;1021 1022 1020 /* 1023 1021 * Check that the controller is not halted (DCH) and that the buffer … … 1042 1040 * I just wish there was some clear reasoning in the source code for 1043 1041 * weird shit like this. This is just random voodoo. Sigh^3! */ 1044 if (!(p Regs->sr & (AC97_SR_DCH | AC97_SR_BCIS))) /* Controller halted? */1042 if (!(pStream->Regs.sr & (AC97_SR_DCH | AC97_SR_BCIS))) /* Controller halted? */ 1045 1043 { /* not halted nor does it have pending interrupt - likely */ } 1046 1044 else 1047 1045 { 1048 1046 /** @todo Stop DMA timer when DCH is set. */ 1049 if (p Regs->sr & AC97_SR_DCH)1047 if (pStream->Regs.sr & AC97_SR_DCH) 1050 1048 { 1051 1049 STAM_REL_COUNTER_INC(&pStreamCC->State.StatDmaSkippedDch); 1052 1050 LogFunc(("[SD%RU8] DCH set\n", pStream->u8SD)); 1053 1051 } 1054 if (p Regs->sr & AC97_SR_BCIS)1052 if (pStream->Regs.sr & AC97_SR_BCIS) 1055 1053 { 1056 1054 STAM_REL_COUNTER_INC(&pStreamCC->State.StatDmaSkippedPendingBcis); 1057 1055 LogFunc(("[SD%RU8] BCIS set\n", pStream->u8SD)); 1058 1056 } 1059 if ((p Regs->cr & AC97_CR_RPBM) /* Bus master operation started. */ && !fInput)1057 if ((pStream->Regs.cr & AC97_CR_RPBM) /* Bus master operation started. */ && !fInput) 1060 1058 { 1061 1059 /*ichac97R3WriteBUP(pThis, cbToProcess);*/ … … 1075 1073 PRTCIRCBUF pCircBuf = pStreamCC->State.pCircBuf; 1076 1074 AssertReturnStmt(pCircBuf, ichac97R3StreamUnlock(pStreamCC), VINF_SUCCESS); 1077 Assert((uint32_t)p Regs->picb * PDMAudioPropsSampleSize(&pStreamCC->State.Cfg.Props) >= cbToProcess);1078 Log3Func(("[SD%RU8] cbToProcess=%#x PICB=%#x/%#x\n", 1079 pStream-> u8SD, cbToProcess, pRegs->picb, pRegs->picb * PDMAudioPropsSampleSize(&pStreamCC->State.Cfg.Props)));1075 Assert((uint32_t)pStream->Regs.picb * PDMAudioPropsSampleSize(&pStreamCC->State.Cfg.Props) >= cbToProcess); 1076 Log3Func(("[SD%RU8] cbToProcess=%#x PICB=%#x/%#x\n", pStream->u8SD, cbToProcess, 1077 pStream->Regs.picb, pStream->Regs.picb * PDMAudioPropsSampleSize(&pStreamCC->State.Cfg.Props))); 1080 1078 1081 1079 while (cbToProcess > 0) … … 1094 1092 if (cbDst) 1095 1093 { 1096 int rc2 = PDMDevHlpPCIPhysRead(pDevIns, p Regs->bd.addr, pvDst, cbDst);1094 int rc2 = PDMDevHlpPCIPhysRead(pDevIns, pStream->Regs.bd.addr, pvDst, cbDst); 1097 1095 AssertRC(rc2); 1098 1096 … … 1118 1116 if (cbSrc) 1119 1117 { 1120 int rc2 = PDMDevHlpPCIPhysWrite(pDevIns, p Regs->bd.addr, pvSrc, cbSrc);1118 int rc2 = PDMDevHlpPCIPhysWrite(pDevIns, pStream->Regs.bd.addr, pvSrc, cbSrc); 1121 1119 AssertRC(rc2); 1122 1120 … … 1138 1136 cbChunk = PDMAudioPropsFloorBytesToFrame(&pStreamCC->State.Cfg.Props, cbChunk); 1139 1137 1140 int rc2 = PDMDevHlpPCIPhysWrite(pDevIns, p Regs->bd.addr, g_abRTZero64K, cbChunk);1138 int rc2 = PDMDevHlpPCIPhysWrite(pDevIns, pStream->Regs.bd.addr, g_abRTZero64K, cbChunk); 1141 1139 AssertRC(rc2); 1142 1140 } … … 1148 1146 * Advance. 1149 1147 */ 1150 p Regs->picb-= cbChunk / PDMAudioPropsSampleSize(&pStreamCC->State.Cfg.Props);1151 p Regs->bd.addr+= cbChunk;1152 cbToProcess -= cbChunk;1148 pStream->Regs.picb -= cbChunk / PDMAudioPropsSampleSize(&pStreamCC->State.Cfg.Props); 1149 pStream->Regs.bd.addr += cbChunk; 1150 cbToProcess -= cbChunk; 1153 1151 #ifdef LOG_ENABLED 1154 cbProcessedTotal += cbChunk;1152 cbProcessedTotal += cbChunk; 1155 1153 #endif 1156 1154 LogFlowFunc(("[SD%RU8] cbChunk=%#x, cbToProcess=%#x, cbTotal=%#x picb=%#x\n", 1157 pStream->u8SD, cbChunk, cbToProcess, cbProcessedTotal, p Regs->picb));1155 pStream->u8SD, cbChunk, cbToProcess, cbProcessedTotal, pStream->Regs.picb)); 1158 1156 } 1159 1157 … … 1161 1159 * Fetch a new buffer descriptor if we've exhausted the current one. 1162 1160 */ 1163 if (!p Regs->picb)1164 { 1165 uint32_t fNewSr = p Regs->sr & ~AC97_SR_CELV;1166 1167 if (p Regs->bd.ctl_len & AC97_BD_IOC)1161 if (!pStream->Regs.picb) 1162 { 1163 uint32_t fNewSr = pStream->Regs.sr & ~AC97_SR_CELV; 1164 1165 if (pStream->Regs.bd.ctl_len & AC97_BD_IOC) 1168 1166 fNewSr |= AC97_SR_BCIS; 1169 1167 1170 if (p Regs->civ != pRegs->lvi)1168 if (pStream->Regs.civ != pStream->Regs.lvi) 1171 1169 fNewSr |= ichac97R3StreamFetchNextBdle(pDevIns, pStream, pStreamCC); 1172 1170 else 1173 1171 { 1174 LogFunc(("Underrun CIV (%RU8) == LVI (%RU8)\n", p Regs->civ, pRegs->lvi));1172 LogFunc(("Underrun CIV (%RU8) == LVI (%RU8)\n", pStream->Regs.civ, pStream->Regs.lvi)); 1175 1173 fNewSr |= AC97_SR_LVBCI | AC97_SR_DCH | AC97_SR_CELV; 1176 pThis->bup_flag = (p Regs->bd.ctl_len & AC97_BD_BUP) ? BUP_LAST : 0;1174 pThis->bup_flag = (pStream->Regs.bd.ctl_len & AC97_BD_BUP) ? BUP_LAST : 0; 1177 1175 /** @todo r=bird: The bup_flag isn't cleared anywhere else. We should probably 1178 1176 * do what the spec says, and keep writing zeros (silence). … … 1636 1634 static void ichac97StreamUpdateSR(PPDMDEVINS pDevIns, PAC97STATE pThis, PAC97STREAM pStream, uint32_t new_sr) 1637 1635 { 1638 PAC97BMREGS pRegs = &pStream->Regs;1639 1640 1636 bool fSignal = false; 1641 1637 int iIRQL = 0; 1642 1638 1643 1639 uint32_t new_mask = new_sr & AC97_SR_INT_MASK; 1644 uint32_t old_mask = p Regs->sr& AC97_SR_INT_MASK;1640 uint32_t old_mask = pStream->Regs.sr & AC97_SR_INT_MASK; 1645 1641 1646 1642 if (new_mask ^ old_mask) … … 1652 1648 iIRQL = 0; 1653 1649 } 1654 else if ((new_mask & AC97_SR_LVBCI) && (p Regs->cr & AC97_CR_LVBIE))1650 else if ((new_mask & AC97_SR_LVBCI) && (pStream->Regs.cr & AC97_CR_LVBIE)) 1655 1651 { 1656 1652 fSignal = true; 1657 1653 iIRQL = 1; 1658 1654 } 1659 else if ((new_mask & AC97_SR_BCIS) && (p Regs->cr & AC97_CR_IOCE))1655 else if ((new_mask & AC97_SR_BCIS) && (pStream->Regs.cr & AC97_CR_IOCE)) 1660 1656 { 1661 1657 fSignal = true; … … 1664 1660 } 1665 1661 1666 p Regs->sr = new_sr;1662 pStream->Regs.sr = new_sr; 1667 1663 1668 1664 LogFlowFunc(("IOC%d, LVB%d, sr=%#x, fSignal=%RTbool, IRQL=%d\n", 1669 p Regs->sr & AC97_SR_BCIS, pRegs->sr & AC97_SR_LVBCI, pRegs->sr, fSignal, iIRQL));1665 pStream->Regs.sr & AC97_SR_BCIS, pStream->Regs.sr & AC97_SR_LVBCI, pStream->Regs.sr, fSignal, iIRQL)); 1670 1666 1671 1667 if (fSignal) … … 1693 1689 static void ichac97StreamWriteSR(PPDMDEVINS pDevIns, PAC97STATE pThis, PAC97STREAM pStream, uint32_t u32Val) 1694 1690 { 1695 PAC97BMREGS pRegs = &pStream->Regs; 1696 1697 Log3Func(("[SD%RU8] SR <- %#x (sr %#x)\n", pStream->u8SD, u32Val, pRegs->sr)); 1698 1699 pRegs->sr |= u32Val & ~(AC97_SR_RO_MASK | AC97_SR_WCLEAR_MASK); 1700 ichac97StreamUpdateSR(pDevIns, pThis, pStream, pRegs->sr & ~(u32Val & AC97_SR_WCLEAR_MASK)); 1691 Log3Func(("[SD%RU8] SR <- %#x (sr %#x)\n", pStream->u8SD, u32Val, pStream->Regs.sr)); 1692 1693 pStream->Regs.sr |= u32Val & ~(AC97_SR_RO_MASK | AC97_SR_WCLEAR_MASK); 1694 ichac97StreamUpdateSR(pDevIns, pThis, pStream, pStream->Regs.sr & ~(u32Val & AC97_SR_WCLEAR_MASK)); 1701 1695 } 1702 1696 … … 1719 1713 RTCircBufReset(pStreamCC->State.pCircBuf); 1720 1714 1721 PAC97BMREGS pRegs = &pStream->Regs; 1722 1723 pRegs->bdbar = 0; 1724 pRegs->civ = 0; 1725 pRegs->lvi = 0; 1726 1727 pRegs->picb = 0; 1728 pRegs->piv = 0; /* Note! Because this is also zero, we will actually start transferring with BDLE00. */ 1729 pRegs->cr &= AC97_CR_DONT_CLEAR_MASK; 1730 pRegs->bd_valid = 0; 1715 pStream->Regs.bdbar = 0; 1716 pStream->Regs.civ = 0; 1717 pStream->Regs.lvi = 0; 1718 1719 pStream->Regs.picb = 0; 1720 pStream->Regs.piv = 0; /* Note! Because this is also zero, we will actually start transferring with BDLE00. */ 1721 pStream->Regs.cr &= AC97_CR_DONT_CLEAR_MASK; 1722 pStream->Regs.bd_valid = 0; 1731 1723 1732 1724 RT_ZERO(pThis->silence); … … 2485 2477 { 2486 2478 PAC97STREAM pStream = &pThis->aStreams[AC97_PORT2IDX(offPort)]; 2487 PAC97BMREGS pRegs = &pStream->Regs;2488 2479 2489 2480 switch (cb) … … 2494 2485 case AC97_NABM_OFF_CIV: 2495 2486 /* Current Index Value Register */ 2496 *pu32 = p Regs->civ;2487 *pu32 = pStream->Regs.civ; 2497 2488 Log3Func(("CIV[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32)); 2498 2489 break; 2499 2490 case AC97_NABM_OFF_LVI: 2500 2491 /* Last Valid Index Register */ 2501 *pu32 = p Regs->lvi;2492 *pu32 = pStream->Regs.lvi; 2502 2493 Log3Func(("LVI[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32)); 2503 2494 break; 2504 2495 case AC97_NABM_OFF_PIV: 2505 2496 /* Prefetched Index Value Register */ 2506 *pu32 = p Regs->piv;2497 *pu32 = pStream->Regs.piv; 2507 2498 Log3Func(("PIV[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32)); 2508 2499 break; 2509 2500 case AC97_NABM_OFF_CR: 2510 2501 /* Control Register */ 2511 *pu32 = p Regs->cr;2502 *pu32 = pStream->Regs.cr; 2512 2503 Log3Func(("CR[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32)); 2513 2504 break; 2514 2505 case AC97_NABM_OFF_SR: 2515 2506 /* Status Register (lower part) */ 2516 *pu32 = RT_LO_U8(p Regs->sr);2507 *pu32 = RT_LO_U8(pStream->Regs.sr); 2517 2508 Log3Func(("SRb[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32)); 2518 2509 break; … … 2530 2521 case AC97_NABM_OFF_SR: 2531 2522 /* Status Register */ 2532 *pu32 = p Regs->sr;2523 *pu32 = pStream->Regs.sr; 2533 2524 Log3Func(("SR[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32)); 2534 2525 break; … … 2545 2536 * not sure if it's worth it, as it'll be a big complication... */ 2546 2537 #if 1 2547 *pu32 = p Regs->picb;2538 *pu32 = pStream->Regs.picb; 2548 2539 # ifdef LOG_ENABLED 2549 2540 if (LogIs3Enabled()) … … 2574 2565 else 2575 2566 cSamples = 0; 2576 *pu32 = p Regs->picb - cSamples;2567 *pu32 = pStream->Regs.picb - cSamples; 2577 2568 Log3Func(("PICB[%d] -> %#x (PICB=%#x cSamples=%#x offPeriod=%RU64 of %RU64 / %RU64%%)\n", 2578 AC97_PORT2IDX(offPort), *pu32, p Regs->picb, cSamples, offPeriod, pStream->cDmaPeriodTicks,2579 offPeriod * 100 / pStream->cDmaPeriodTicks));2569 AC97_PORT2IDX(offPort), *pu32, pStream->Regs.picb, cSamples, offPeriod, 2570 pStream->cDmaPeriodTicks, offPeriod * 100 / pStream->cDmaPeriodTicks)); 2580 2571 } 2581 2572 else 2582 2573 { 2583 *pu32 = p Regs->picb;2574 *pu32 = pStream->Regs.picb; 2584 2575 Log3Func(("PICB[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32)); 2585 2576 } … … 2599 2590 case AC97_NABM_OFF_BDBAR: 2600 2591 /* Buffer Descriptor Base Address Register */ 2601 *pu32 = p Regs->bdbar;2592 *pu32 = pStream->Regs.bdbar; 2602 2593 Log3Func(("BMADDR[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32)); 2603 2594 break; … … 2606 2597 * Last Valid Index Register + 2607 2598 * Status Register */ 2608 *pu32 = p Regs->civ | ((uint32_t)pRegs->lvi << 8) | ((uint32_t)pRegs->sr << 16);2599 *pu32 = pStream->Regs.civ | ((uint32_t)pStream->Regs.lvi << 8) | ((uint32_t)pStream->Regs.sr << 16); 2609 2600 Log3Func(("CIV LVI SR[%d] -> %#x, %#x, %#x\n", 2610 AC97_PORT2IDX(offPort), p Regs->civ, pRegs->lvi, pRegs->sr));2601 AC97_PORT2IDX(offPort), pStream->Regs.civ, pStream->Regs.lvi, pStream->Regs.sr)); 2611 2602 break; 2612 2603 case AC97_NABM_OFF_PICB: … … 2614 2605 * Prefetched Index Value Register + 2615 2606 * Control Register */ 2616 *pu32 = p Regs->picb | ((uint32_t)pRegs->piv << 16) | ((uint32_t)pRegs->cr << 24);2607 *pu32 = pStream->Regs.picb | ((uint32_t)pStream->Regs.piv << 16) | ((uint32_t)pStream->Regs.cr << 24); 2617 2608 Log3Func(("PICB PIV CR[%d] -> %#x %#x %#x %#x\n", 2618 AC97_PORT2IDX(offPort), *pu32, p Regs->picb, pRegs->piv, pRegs->cr));2609 AC97_PORT2IDX(offPort), *pu32, pStream->Regs.picb, pStream->Regs.piv, pStream->Regs.cr)); 2619 2610 break; 2620 2611 … … 2713 2704 #endif 2714 2705 PAC97STREAM pStream = &pThis->aStreams[AC97_PORT2IDX(offPort)]; 2715 PAC97BMREGS pRegs = &pStream->Regs;2716 2706 2717 2707 switch (cb) … … 2726 2716 DEVAC97_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_IOPORT_WRITE); 2727 2717 2728 if ( !(p Regs->sr & AC97_SR_DCH)2729 || !(p Regs->cr & AC97_CR_RPBM))2718 if ( !(pStream->Regs.sr & AC97_SR_DCH) 2719 || !(pStream->Regs.cr & AC97_CR_RPBM)) 2730 2720 { 2731 p Regs->lvi = u32 % AC97_MAX_BDLE;2721 pStream->Regs.lvi = u32 % AC97_MAX_BDLE; 2732 2722 STAM_REL_COUNTER_INC(&pStream->StatWriteLvi); 2733 2723 DEVAC97_UNLOCK(pDevIns, pThis); … … 2742 2732 we cannot do this from ring-3 as much of the BDLE state is 2743 2733 ring-3 only. */ 2744 p Regs->sr &= ~(AC97_SR_DCH | AC97_SR_CELV);2745 p Regs->lvi = u32 % AC97_MAX_BDLE;2734 pStream->Regs.sr &= ~(AC97_SR_DCH | AC97_SR_CELV); 2735 pStream->Regs.lvi = u32 % AC97_MAX_BDLE; 2746 2736 if (ichac97R3StreamFetchNextBdle(pDevIns, pStream, pStreamCC)) 2747 ichac97StreamUpdateSR(pDevIns, pThis, pStream, p Regs->sr | AC97_SR_BCIS);2737 ichac97StreamUpdateSR(pDevIns, pThis, pStream, pStream->Regs.sr | AC97_SR_BCIS); 2748 2738 2749 2739 /* We now have to re-arm the DMA timer according to the new BDLE length. … … 2758 2748 2759 2749 LogFunc(("[SD%RU8] LVI <- %#x; CIV=%#x PIV=%#x SR=%#x cTicksToDeadline=%#RX64 [recovering]\n", 2760 pStream->u8SD, u32, p Regs->civ, pRegs->piv, pRegs->sr, cTicksToDeadline));2750 pStream->u8SD, u32, pStream->Regs.civ, pStream->Regs.piv, pStream->Regs.sr, cTicksToDeadline)); 2761 2751 2762 2752 int rc2 = PDMDevHlpTimerSetRelative(pDevIns, pStream->hTimer, cTicksToDeadline, &pStream->uArmedTs); … … 2777 2767 STAM_REL_COUNTER_INC(&pStreamCC->State.StatWriteCr); 2778 2768 2779 uint32_t const fCrChanged = p Regs->cr ^ u32;2780 Log3Func(("[SD%RU8] CR <- %#x (was %#x; changed %#x)\n", pStream->u8SD, u32, p Regs->cr, fCrChanged));2769 uint32_t const fCrChanged = pStream->Regs.cr ^ u32; 2770 Log3Func(("[SD%RU8] CR <- %#x (was %#x; changed %#x)\n", pStream->u8SD, u32, pStream->Regs.cr, fCrChanged)); 2781 2771 2782 2772 /* … … 2791 2781 3.2.7 in 302349-003 says RPBM be must be clear when resetting 2792 2782 and that behavior is undefined if it's set. */ 2793 ASSERT_GUEST_STMT((p Regs->cr & AC97_CR_RPBM) == 0,2783 ASSERT_GUEST_STMT((pStream->Regs.cr & AC97_CR_RPBM) == 0, 2794 2784 ichac97R3StreamEnable(pDevIns, pThis, pThisCC, pStream, 2795 2785 pStreamCC, false /* fEnable */)); … … 2807 2797 * Write the new value to the register and if RPBM didn't change we're done. 2808 2798 */ 2809 p Regs->cr = u32 & AC97_CR_VALID_MASK;2799 pStream->Regs.cr = u32 & AC97_CR_VALID_MASK; 2810 2800 2811 2801 if (!(fCrChanged & AC97_CR_RPBM)) … … 2814 2804 * Pause busmaster. 2815 2805 */ 2816 else if (!(p Regs->cr & AC97_CR_RPBM))2806 else if (!(pStream->Regs.cr & AC97_CR_RPBM)) 2817 2807 { 2818 2808 STAM_REL_PROFILE_START_NS(&pStreamCC->State.StatStop, p); 2819 2809 LogFunc(("[SD%RU8] Pause busmaster (disable stream) SR=%#x -> %#x\n", 2820 pStream->u8SD, p Regs->sr, pRegs->sr | AC97_SR_DCH));2810 pStream->u8SD, pStream->Regs.sr, pStream->Regs.sr | AC97_SR_DCH)); 2821 2811 ichac97R3StreamEnable(pDevIns, pThis, pThisCC, pStream, pStreamCC, false /* fEnable */); 2822 p Regs->sr |= AC97_SR_DCH;2812 pStream->Regs.sr |= AC97_SR_DCH; 2823 2813 2824 2814 DEVAC97_UNLOCK(pDevIns, pThis); … … 2832 2822 STAM_REL_PROFILE_START_NS(&pStreamCC->State.StatStart, r); 2833 2823 LogFunc(("[SD%RU8] Run busmaster (enable stream) SR=%#x -> %#x\n", 2834 pStream->u8SD, p Regs->sr, pRegs->sr & ~AC97_SR_DCH));2835 p Regs->sr &= ~AC97_SR_DCH;2824 pStream->u8SD, pStream->Regs.sr, pStream->Regs.sr & ~AC97_SR_DCH)); 2825 pStream->Regs.sr &= ~AC97_SR_DCH; 2836 2826 2837 2827 if (ichac97R3StreamFetchNextBdle(pDevIns, pStream, pStreamCC)) 2838 ichac97StreamUpdateSR(pDevIns, pThis, pStream, p Regs->sr | AC97_SR_BCIS);2828 ichac97StreamUpdateSR(pDevIns, pThis, pStream, pStream->Regs.sr | AC97_SR_BCIS); 2839 2829 # ifdef LOG_ENABLED 2840 2830 if (LogIsFlowEnabled()) … … 2907 2897 DEVAC97_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_IOPORT_WRITE); 2908 2898 /* Buffer Descriptor list Base Address Register */ 2909 p Regs->bdbar = u32 & ~(uint32_t)3;2910 Log3Func(("[SD%RU8] BDBAR <- %#x (bdbar %#x)\n", AC97_PORT2IDX(offPort), u32, p Regs->bdbar));2899 pStream->Regs.bdbar = u32 & ~(uint32_t)3; 2900 Log3Func(("[SD%RU8] BDBAR <- %#x (bdbar %#x)\n", AC97_PORT2IDX(offPort), u32, pStream->Regs.bdbar)); 2911 2901 STAM_REL_COUNTER_INC(&pStream->StatWriteBdBar); 2912 2902 DEVAC97_UNLOCK(pDevIns, pThis); … … 3661 3651 static void ichac97R3SaveStream(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, PAC97STREAM pStream) 3662 3652 { 3663 PAC97BMREGS pRegs = &pStream->Regs;3664 3653 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 3665 3654 3666 pHlp->pfnSSMPutU32(pSSM, p Regs->bdbar);3667 pHlp->pfnSSMPutU8( pSSM, p Regs->civ);3668 pHlp->pfnSSMPutU8( pSSM, p Regs->lvi);3669 pHlp->pfnSSMPutU16(pSSM, p Regs->sr);3670 pHlp->pfnSSMPutU16(pSSM, p Regs->picb);3671 pHlp->pfnSSMPutU8( pSSM, p Regs->piv);3672 pHlp->pfnSSMPutU8( pSSM, p Regs->cr);3673 pHlp->pfnSSMPutS32(pSSM, p Regs->bd_valid);3674 pHlp->pfnSSMPutU32(pSSM, p Regs->bd.addr);3675 pHlp->pfnSSMPutU32(pSSM, p Regs->bd.ctl_len);3655 pHlp->pfnSSMPutU32(pSSM, pStream->Regs.bdbar); 3656 pHlp->pfnSSMPutU8( pSSM, pStream->Regs.civ); 3657 pHlp->pfnSSMPutU8( pSSM, pStream->Regs.lvi); 3658 pHlp->pfnSSMPutU16(pSSM, pStream->Regs.sr); 3659 pHlp->pfnSSMPutU16(pSSM, pStream->Regs.picb); 3660 pHlp->pfnSSMPutU8( pSSM, pStream->Regs.piv); 3661 pHlp->pfnSSMPutU8( pSSM, pStream->Regs.cr); 3662 pHlp->pfnSSMPutS32(pSSM, pStream->Regs.bd_valid); 3663 pHlp->pfnSSMPutU32(pSSM, pStream->Regs.bd.addr); 3664 pHlp->pfnSSMPutU32(pSSM, pStream->Regs.bd.ctl_len); 3676 3665 } 3677 3666 … … 3723 3712 static int ichac97R3LoadStream(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, PAC97STREAM pStream) 3724 3713 { 3725 PAC97BMREGS pRegs = &pStream->Regs;3726 3714 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 3727 3715 3728 pHlp->pfnSSMGetU32(pSSM, &p Regs->bdbar);3729 pHlp->pfnSSMGetU8( pSSM, &p Regs->civ);3730 pHlp->pfnSSMGetU8( pSSM, &p Regs->lvi);3731 pHlp->pfnSSMGetU16(pSSM, &p Regs->sr);3732 pHlp->pfnSSMGetU16(pSSM, &p Regs->picb);3733 pHlp->pfnSSMGetU8( pSSM, &p Regs->piv);3734 pHlp->pfnSSMGetU8( pSSM, &p Regs->cr);3735 pHlp->pfnSSMGetS32(pSSM, &p Regs->bd_valid);3736 pHlp->pfnSSMGetU32(pSSM, &p Regs->bd.addr);3737 return pHlp->pfnSSMGetU32(pSSM, &p Regs->bd.ctl_len);3716 pHlp->pfnSSMGetU32(pSSM, &pStream->Regs.bdbar); 3717 pHlp->pfnSSMGetU8( pSSM, &pStream->Regs.civ); 3718 pHlp->pfnSSMGetU8( pSSM, &pStream->Regs.lvi); 3719 pHlp->pfnSSMGetU16(pSSM, &pStream->Regs.sr); 3720 pHlp->pfnSSMGetU16(pSSM, &pStream->Regs.picb); 3721 pHlp->pfnSSMGetU8( pSSM, &pStream->Regs.piv); 3722 pHlp->pfnSSMGetU8( pSSM, &pStream->Regs.cr); 3723 pHlp->pfnSSMGetS32(pSSM, &pStream->Regs.bd_valid); 3724 pHlp->pfnSSMGetU32(pSSM, &pStream->Regs.bd.addr); 3725 return pHlp->pfnSSMGetU32(pSSM, &pStream->Regs.bd.ctl_len); 3738 3726 } 3739 3727
Note:
See TracChangeset
for help on using the changeset viewer.