Changeset 82302 in vbox
- Timestamp:
- Nov 30, 2019 5:41:46 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 135126
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevHDA.cpp
r82301 r82302 3452 3452 static int hdaR3SaveStream(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, PHDASTREAM pStream) 3453 3453 { 3454 RT_NOREF(pDevIns);3454 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 3455 3455 # ifdef LOG_ENABLED 3456 3456 PHDASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PHDASTATE); … … 3460 3460 3461 3461 /* Save stream ID. */ 3462 int rc = SSMR3PutU8(pSSM, pStream->u8SD);3462 int rc = pHlp->pfnSSMPutU8(pSSM, pStream->u8SD); 3463 3463 AssertRCReturn(rc, rc); 3464 3464 Assert(pStream->u8SD < HDA_MAX_STREAMS); 3465 3465 3466 rc = SSMR3PutStructEx(pSSM, &pStream->State, sizeof(HDASTREAMSTATE), 0 /*fFlags*/, g_aSSMStreamStateFields7, NULL);3466 rc = pHlp->pfnSSMPutStructEx(pSSM, &pStream->State, sizeof(HDASTREAMSTATE), 0 /*fFlags*/, g_aSSMStreamStateFields7, NULL); 3467 3467 AssertRCReturn(rc, rc); 3468 3468 3469 rc = SSMR3PutStructEx(pSSM, &pStream->State.BDLE.Desc, sizeof(HDABDLEDESC), 0 /*fFlags*/, g_aSSMBDLEDescFields7, NULL);3469 rc = pHlp->pfnSSMPutStructEx(pSSM, &pStream->State.BDLE.Desc, sizeof(HDABDLEDESC), 0 /*fFlags*/, g_aSSMBDLEDescFields7, NULL); 3470 3470 AssertRCReturn(rc, rc); 3471 3471 3472 rc = SSMR3PutStructEx(pSSM, &pStream->State.BDLE.State, sizeof(HDABDLESTATE), 0 /*fFlags*/, g_aSSMBDLEStateFields7, NULL);3472 rc = pHlp->pfnSSMPutStructEx(pSSM, &pStream->State.BDLE.State, sizeof(HDABDLESTATE), 0 /*fFlags*/, g_aSSMBDLEStateFields7, NULL); 3473 3473 AssertRCReturn(rc, rc); 3474 3474 3475 rc = SSMR3PutStructEx(pSSM, &pStream->State.Period, sizeof(HDASTREAMPERIOD), 0 /* fFlags */, g_aSSMStreamPeriodFields7, NULL);3475 rc = pHlp->pfnSSMPutStructEx(pSSM, &pStream->State.Period, sizeof(HDASTREAMPERIOD), 0 /* fFlags */, g_aSSMStreamPeriodFields7, NULL); 3476 3476 AssertRCReturn(rc, rc); 3477 3477 … … 3485 3485 } 3486 3486 3487 rc = SSMR3PutU32(pSSM, cbCircBufSize);3487 rc = pHlp->pfnSSMPutU32(pSSM, cbCircBufSize); 3488 3488 AssertRCReturn(rc, rc); 3489 3489 3490 rc = SSMR3PutU32(pSSM, cbCircBufUsed);3490 rc = pHlp->pfnSSMPutU32(pSSM, cbCircBufUsed); 3491 3491 AssertRCReturn(rc, rc); 3492 3492 … … 3507 3507 if (cbBuf) 3508 3508 { 3509 rc = SSMR3PutMem(pSSM, pvBuf, cbBuf);3509 rc = pHlp->pfnSSMPutMem(pSSM, pvBuf, cbBuf); 3510 3510 AssertRC(rc); 3511 3511 if ( RT_SUCCESS(rc) 3512 3512 && cbBuf < cbCircBufUsed) 3513 3513 { 3514 rc = SSMR3PutMem(pSSM, (uint8_t *)pvBuf - offBuf, cbCircBufUsed - cbBuf);3514 rc = pHlp->pfnSSMPutMem(pSSM, (uint8_t *)pvBuf - offBuf, cbCircBufUsed - cbBuf); 3515 3515 } 3516 3516 } … … 3534 3534 static DECLCALLBACK(int) hdaR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 3535 3535 { 3536 PHDASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PHDASTATE); 3536 PHDASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PHDASTATE); 3537 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 3537 3538 3538 3539 /* Save Codec nodes states. */ … … 3540 3541 3541 3542 /* Save MMIO registers. */ 3542 SSMR3PutU32(pSSM, RT_ELEMENTS(pThis->au32Regs));3543 SSMR3PutMem(pSSM, pThis->au32Regs, sizeof(pThis->au32Regs));3543 pHlp->pfnSSMPutU32(pSSM, RT_ELEMENTS(pThis->au32Regs)); 3544 pHlp->pfnSSMPutMem(pSSM, pThis->au32Regs, sizeof(pThis->au32Regs)); 3544 3545 3545 3546 /* Save controller-specifc internals. */ 3546 SSMR3PutU64(pSSM, pThis->u64WalClk);3547 SSMR3PutU8(pSSM, pThis->u8IRQL);3547 pHlp->pfnSSMPutU64(pSSM, pThis->u64WalClk); 3548 pHlp->pfnSSMPutU8(pSSM, pThis->u8IRQL); 3548 3549 3549 3550 /* Save number of streams. */ 3550 SSMR3PutU32(pSSM, HDA_MAX_STREAMS);3551 pHlp->pfnSSMPutU32(pSSM, HDA_MAX_STREAMS); 3551 3552 3552 3553 /* Save stream states. */ … … 3622 3623 * Handles loading of all saved state versions older than the current one. 3623 3624 * 3624 * @param pThis Pointer to HDA state. 3625 * @param pSSM Pointer to SSM handle. 3626 * @param uVersion Saved state version to load. 3627 * @param uPass Loading stage to handle. 3628 */ 3629 static int hdaR3LoadExecLegacy(PHDASTATE pThis, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 3630 { 3631 RT_NOREF(uPass); 3632 3633 int rc = VINF_SUCCESS; 3625 * @param pDevIns The device instance. 3626 * @param pThis Pointer to HDA state. 3627 * @param pSSM Pointer to SSM handle. 3628 * @param uVersion Saved state version to load. 3629 */ 3630 static int hdaR3LoadExecLegacy(PPDMDEVINS pDevIns, PHDASTATE pThis, PSSMHANDLE pSSM, uint32_t uVersion) 3631 { 3632 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 3633 int rc; 3634 3634 3635 3635 /* … … 3644 3644 builds in the 4.1 development period. */ 3645 3645 cRegs = 113; 3646 if ( SSMR3HandleRevision(pSSM) >= 71199)3646 if (pHlp->pfnSSMHandleRevision(pSSM) >= 71199) 3647 3647 { 3648 uint32_t uVer = SSMR3HandleVersion(pSSM);3648 uint32_t uVer = pHlp->pfnSSMHandleVersion(pSSM); 3649 3649 if ( VBOX_FULL_VERSION_GET_MAJOR(uVer) == 4 3650 3650 && VBOX_FULL_VERSION_GET_MINOR(uVer) == 0 … … 3664 3664 case HDA_SSM_VERSION_5: 3665 3665 case HDA_SSM_VERSION_6: 3666 rc = SSMR3GetU32(pSSM, &cRegs); AssertRCReturn(rc, rc);3666 rc = pHlp->pfnSSMGetU32(pSSM, &cRegs); AssertRCReturn(rc, rc); 3667 3667 if (cRegs != RT_ELEMENTS(pThis->au32Regs)) 3668 3668 LogRel(("HDA: SSM version cRegs is %RU32, expected %RU32\n", cRegs, RT_ELEMENTS(pThis->au32Regs))); … … 3676 3676 if (cRegs >= RT_ELEMENTS(pThis->au32Regs)) 3677 3677 { 3678 SSMR3GetMem(pSSM, pThis->au32Regs, sizeof(pThis->au32Regs));3679 SSMR3Skip(pSSM, sizeof(uint32_t) * (cRegs - RT_ELEMENTS(pThis->au32Regs)));3678 pHlp->pfnSSMGetMem(pSSM, pThis->au32Regs, sizeof(pThis->au32Regs)); 3679 pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t) * (cRegs - RT_ELEMENTS(pThis->au32Regs))); 3680 3680 } 3681 3681 else 3682 SSMR3GetMem(pSSM, pThis->au32Regs, sizeof(uint32_t) * cRegs);3682 pHlp->pfnSSMGetMem(pSSM, pThis->au32Regs, sizeof(uint32_t) * cRegs); 3683 3683 3684 3684 /* Make sure to update the base addresses first before initializing any streams down below. */ … … 3700 3700 * according to the spec). 3701 3701 */ 3702 #define HDA_SSM_LOAD_BDLE_STATE_PRE_V5(v, x) \ 3703 { \ 3704 rc = SSMR3Skip(pSSM, sizeof(uint32_t)); /* Begin marker */ \ 3705 AssertRCReturn(rc, rc); \ 3706 rc = SSMR3GetU64(pSSM, &x.Desc.u64BufAddr); /* u64BdleCviAddr */ \ 3707 AssertRCReturn(rc, rc); \ 3708 rc = SSMR3Skip(pSSM, sizeof(uint32_t)); /* u32BdleMaxCvi */ \ 3709 AssertRCReturn(rc, rc); \ 3710 rc = SSMR3GetU32(pSSM, &x.State.u32BDLIndex); /* u32BdleCvi */ \ 3711 AssertRCReturn(rc, rc); \ 3712 rc = SSMR3GetU32(pSSM, &x.Desc.u32BufSize); /* u32BdleCviLen */ \ 3713 AssertRCReturn(rc, rc); \ 3714 rc = SSMR3GetU32(pSSM, &x.State.u32BufOff); /* u32BdleCviPos */ \ 3715 AssertRCReturn(rc, rc); \ 3716 bool fIOC; \ 3717 rc = SSMR3GetBool(pSSM, &fIOC); /* fBdleCviIoc */ \ 3718 AssertRCReturn(rc, rc); \ 3719 x.Desc.fFlags = fIOC ? HDA_BDLE_FLAG_IOC : 0; \ 3720 rc = SSMR3GetU32(pSSM, &x.State.cbBelowFIFOW); /* cbUnderFifoW */ \ 3721 AssertRCReturn(rc, rc); \ 3722 rc = SSMR3Skip(pSSM, sizeof(uint8_t) * 256); /* FIFO */ \ 3723 AssertRCReturn(rc, rc); \ 3724 rc = SSMR3Skip(pSSM, sizeof(uint32_t)); /* End marker */ \ 3725 AssertRCReturn(rc, rc); \ 3702 #define HDA_SSM_LOAD_BDLE_STATE_PRE_V5(v, x) \ 3703 { \ 3704 pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t)); /* Begin marker */ \ 3705 pHlp->pfnSSMGetU64(pSSM, &x.Desc.u64BufAddr); /* u64BdleCviAddr */ \ 3706 pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t)); /* u32BdleMaxCvi */ \ 3707 pHlp->pfnSSMGetU32(pSSM, &x.State.u32BDLIndex); /* u32BdleCvi */ \ 3708 pHlp->pfnSSMGetU32(pSSM, &x.Desc.u32BufSize); /* u32BdleCviLen */ \ 3709 pHlp->pfnSSMGetU32(pSSM, &x.State.u32BufOff); /* u32BdleCviPos */ \ 3710 bool fIOC; \ 3711 rc = pHlp->pfnSSMGetBool(pSSM, &fIOC); /* fBdleCviIoc */ \ 3712 AssertRCReturn(rc, rc); \ 3713 x.Desc.fFlags = fIOC ? HDA_BDLE_FLAG_IOC : 0; \ 3714 pHlp->pfnSSMGetU32(pSSM, &x.State.cbBelowFIFOW); /* cbUnderFifoW */ \ 3715 pHlp->pfnSSMSkip(pSSM, sizeof(uint8_t) * 256); /* FIFO */ \ 3716 rc = pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t)); /* End marker */ \ 3717 AssertRCReturn(rc, rc); \ 3726 3718 } 3727 3719 … … 3745 3737 PHDASTREAM pStream = &pThis->aStreams[4]; 3746 3738 rc = hdaR3StreamInit(pStream, 4 /* Stream descriptor, hardcoded */); 3747 if (RT_FAILURE(rc)) 3748 break; 3739 AssertRCReturn(rc, rc); 3749 3740 HDA_SSM_LOAD_BDLE_STATE_PRE_V5(uVersion, pStream->State.BDLE); 3750 3741 pStream->State.uCurBDLE = pStream->State.BDLE.State.u32BDLIndex; … … 3753 3744 pStream = &pThis->aStreams[2]; 3754 3745 rc = hdaR3StreamInit(pStream, 2 /* Stream descriptor, hardcoded */); 3755 if (RT_FAILURE(rc)) 3756 break; 3746 AssertRCReturn(rc, rc); 3757 3747 HDA_SSM_LOAD_BDLE_STATE_PRE_V5(uVersion, pStream->State.BDLE); 3758 3748 pStream->State.uCurBDLE = pStream->State.BDLE.State.u32BDLIndex; … … 3761 3751 pStream = &pThis->aStreams[0]; 3762 3752 rc = hdaR3StreamInit(pStream, 0 /* Stream descriptor, hardcoded */); 3763 if (RT_FAILURE(rc)) 3764 break; 3753 AssertRCReturn(rc, rc); 3765 3754 HDA_SSM_LOAD_BDLE_STATE_PRE_V5(uVersion, pStream->State.BDLE); 3766 3755 pStream->State.uCurBDLE = pStream->State.BDLE.State.u32BDLIndex; … … 3773 3762 { 3774 3763 uint32_t cStreams; 3775 rc = SSMR3GetU32(pSSM, &cStreams); 3776 if (RT_FAILURE(rc)) 3777 break; 3764 rc = pHlp->pfnSSMGetU32(pSSM, &cStreams); 3765 AssertRCReturn(rc, rc); 3778 3766 3779 3767 if (cStreams > HDA_MAX_STREAMS) … … 3784 3772 { 3785 3773 uint8_t uStreamID; 3786 rc = SSMR3GetU8(pSSM, &uStreamID); 3787 if (RT_FAILURE(rc)) 3788 break; 3774 rc = pHlp->pfnSSMGetU8(pSSM, &uStreamID); 3775 AssertRCReturn(rc, rc); 3789 3776 3790 3777 PHDASTREAM pStream = hdaGetStreamFromSD(pThis, uStreamID); … … 3807 3794 * Load BDLEs (Buffer Descriptor List Entries) and DMA counters. 3808 3795 */ 3809 3810 3796 if (uVersion == HDA_SSM_VERSION_5) 3811 3797 { 3812 3798 /* Get the current BDLE entry and skip the rest. */ 3799 pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t)); /* Begin marker */ 3813 3800 uint16_t cBDLE; 3814 3815 rc = SSMR3Skip(pSSM, sizeof(uint32_t)); /* Begin marker */ 3816 AssertRC(rc); 3817 rc = SSMR3GetU16(pSSM, &cBDLE); /* cBDLE */ 3818 AssertRC(rc); 3819 rc = SSMR3GetU16(pSSM, &pStream->State.uCurBDLE); /* uCurBDLE */ 3820 AssertRC(rc); 3821 rc = SSMR3Skip(pSSM, sizeof(uint32_t)); /* End marker */ 3822 AssertRC(rc); 3823 3824 uint32_t u32BDLEIndex; 3801 pHlp->pfnSSMGetU16(pSSM, &cBDLE); /* cBDLE */ 3802 pHlp->pfnSSMGetU16(pSSM, &pStream->State.uCurBDLE); /* uCurBDLE */ 3803 rc = pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t)); /* End marker */ 3804 AssertRCReturn(rc, rc); 3805 3825 3806 for (uint16_t a = 0; a < cBDLE; a++) 3826 3807 { 3827 rc = SSMR3Skip(pSSM, sizeof(uint32_t));/* Begin marker */3828 AssertRC(rc);3829 rc = SSMR3GetU32(pSSM, &u32BDLEIndex); /* u32BDLIndex */3830 AssertRC (rc);3808 pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t)); /* Begin marker */ 3809 uint32_t u32BDLEIndex; 3810 rc = pHlp->pfnSSMGetU32(pSSM, &u32BDLEIndex); /* u32BDLIndex */ 3811 AssertRCReturn(rc, rc); 3831 3812 3832 3813 /* Does the current BDLE index match the current BDLE to process? */ 3833 3814 if (u32BDLEIndex == pStream->State.uCurBDLE) 3834 3815 { 3835 rc = SSMR3GetU32(pSSM, &pStream->State.BDLE.State.cbBelowFIFOW); /* cbBelowFIFOW */ 3836 AssertRC(rc); 3837 rc = SSMR3Skip(pSSM, sizeof(uint8_t) * 256); /* FIFO, deprecated */ 3838 AssertRC(rc); 3839 rc = SSMR3GetU32(pSSM, &pStream->State.BDLE.State.u32BufOff); /* u32BufOff */ 3840 AssertRC(rc); 3841 rc = SSMR3Skip(pSSM, sizeof(uint32_t)); /* End marker */ 3842 AssertRC(rc); 3816 pHlp->pfnSSMGetU32(pSSM, &pStream->State.BDLE.State.cbBelowFIFOW); /* cbBelowFIFOW */ 3817 pHlp->pfnSSMSkip(pSSM, sizeof(uint8_t) * 256); /* FIFO, deprecated */ 3818 pHlp->pfnSSMGetU32(pSSM, &pStream->State.BDLE.State.u32BufOff); /* u32BufOff */ 3819 rc = pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t)); /* End marker */ 3820 AssertRCReturn(rc, rc); 3843 3821 } 3844 3822 else /* Skip not current BDLEs. */ 3845 3823 { 3846 rc = SSMR3Skip(pSSM, sizeof(uint32_t) /* cbBelowFIFOW */3847 + sizeof(uint8_t) * 256 /* au8FIFO */3848 + sizeof(uint32_t) /* u32BufOff */3849 + sizeof(uint32_t)); /* End marker */3850 AssertRC (rc);3824 rc = pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t) /* cbBelowFIFOW */ 3825 + sizeof(uint8_t) * 256 /* au8FIFO */ 3826 + sizeof(uint32_t) /* u32BufOff */ 3827 + sizeof(uint32_t)); /* End marker */ 3828 AssertRCReturn(rc, rc); 3851 3829 } 3852 3830 } … … 3854 3832 else 3855 3833 { 3856 rc = SSMR3GetStructEx(pSSM, &pStream->State, sizeof(HDASTREAMSTATE), 3857 0 /* fFlags */, g_aSSMStreamStateFields6, NULL); 3858 if (RT_FAILURE(rc)) 3859 break; 3834 rc = pHlp->pfnSSMGetStructEx(pSSM, &pStream->State, sizeof(HDASTREAMSTATE), 3835 0 /* fFlags */, g_aSSMStreamStateFields6, NULL); 3836 AssertRCReturn(rc, rc); 3860 3837 3861 3838 /* Get HDABDLEDESC. */ 3839 /** 3840 * 3841 * @todo r=bird: This is all wrong. Appalling. There is no reason for anyone to 3842 * mess around with SSM internal magic values ever! Define a structure and(/or) 3843 * associated SSM descriptor and let SSM keep its internals to itself. 3844 * struct { uint32_t cbBuf; bool fIoc; } 3845 * 3846 */ 3862 3847 uint32_t uMarker; 3863 rc = SSMR3GetU32(pSSM, &uMarker); /* Begin marker. */ 3864 AssertRC(rc); 3865 Assert(uMarker == UINT32_C(0x19200102) /* SSMR3STRUCT_BEGIN */); 3866 rc = SSMR3GetU64(pSSM, &pStream->State.BDLE.Desc.u64BufAddr); 3867 AssertRC(rc); 3868 rc = SSMR3GetU32(pSSM, &pStream->State.BDLE.Desc.u32BufSize); 3869 AssertRC(rc); 3848 rc = pHlp->pfnSSMGetU32(pSSM, &uMarker); /* Begin marker. */ 3849 AssertRCReturn(rc, rc); 3850 AssertReturn(uMarker == UINT32_C(0x19200102) /* SSMR3STRUCT_BEGIN */, VERR_SSM_DATA_UNIT_FORMAT_CHANGED); 3851 pHlp->pfnSSMGetU64(pSSM, &pStream->State.BDLE.Desc.u64BufAddr); 3852 rc = pHlp->pfnSSMGetU32(pSSM, &pStream->State.BDLE.Desc.u32BufSize); 3853 AssertRCReturn(rc, rc); 3870 3854 bool fFlags = false; 3871 rc = SSMR3GetBool(pSSM, &fFlags); /* Saved states < v7 only stored the IOC as boolean flag. */3872 AssertRC (rc);3855 rc = pHlp->pfnSSMGetBool(pSSM, &fFlags); /* Saved states < v7 only stored the IOC as boolean flag. */ 3856 AssertRCReturn(rc, rc); 3873 3857 pStream->State.BDLE.Desc.fFlags = fFlags ? HDA_BDLE_FLAG_IOC : 0; 3874 rc = SSMR3GetU32(pSSM, &uMarker); /* End marker. */ 3875 AssertRC(rc); 3876 Assert(uMarker == UINT32_C(0x19920406) /* SSMR3STRUCT_END */); 3877 3878 rc = SSMR3GetStructEx(pSSM, &pStream->State.BDLE.State, sizeof(HDABDLESTATE), 3879 0 /* fFlags */, g_aSSMBDLEStateFields6, NULL); 3880 if (RT_FAILURE(rc)) 3881 break; 3882 3883 Log2Func(("[SD%RU8] LPIB=%RU32, CBL=%RU32, LVI=%RU32\n", 3884 uStreamID, 3885 HDA_STREAM_REG(pThis, LPIB, uStreamID), HDA_STREAM_REG(pThis, CBL, uStreamID), HDA_STREAM_REG(pThis, LVI, uStreamID))); 3858 rc = pHlp->pfnSSMGetU32(pSSM, &uMarker); /* End marker. */ 3859 AssertRCReturn(rc, rc); 3860 AssertReturn(uMarker == UINT32_C(0x19920406) /* SSMR3STRUCT_END */, VERR_SSM_DATA_UNIT_FORMAT_CHANGED); 3861 3862 rc = pHlp->pfnSSMGetStructEx(pSSM, &pStream->State.BDLE.State, sizeof(HDABDLESTATE), 3863 0 /* fFlags */, g_aSSMBDLEStateFields6, NULL); 3864 AssertRCReturn(rc, rc); 3865 3866 Log2Func(("[SD%RU8] LPIB=%RU32, CBL=%RU32, LVI=%RU32\n", uStreamID, HDA_STREAM_REG(pThis, LPIB, uStreamID), 3867 HDA_STREAM_REG(pThis, CBL, uStreamID), HDA_STREAM_REG(pThis, LVI, uStreamID))); 3886 3868 #ifdef LOG_ENABLED 3887 3869 hdaR3BDLEDumpAll(pThis, pStream->u64BDLBase, pStream->u16LVI + 1); … … 3902 3884 static DECLCALLBACK(int) hdaR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 3903 3885 { 3904 PHDASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PHDASTATE); 3886 PHDASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PHDASTATE); 3887 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 3905 3888 3906 3889 Assert(uPass == SSM_PASS_FINAL); NOREF(uPass); … … 3920 3903 if (uVersion < HDA_SSM_VERSION) /* Handle older saved states? */ 3921 3904 { 3922 rc = hdaR3LoadExecLegacy(p This, pSSM, uVersion, uPass);3905 rc = hdaR3LoadExecLegacy(pDevIns, pThis, pSSM, uVersion); 3923 3906 if (RT_SUCCESS(rc)) 3924 3907 rc = hdaR3LoadExecPost(pThis); 3925 3926 3908 return rc; 3927 3909 } … … 3931 3913 */ 3932 3914 uint32_t cRegs; 3933 rc = SSMR3GetU32(pSSM, &cRegs); AssertRCReturn(rc, rc);3915 rc = pHlp->pfnSSMGetU32(pSSM, &cRegs); AssertRCReturn(rc, rc); 3934 3916 if (cRegs != RT_ELEMENTS(pThis->au32Regs)) 3935 3917 LogRel(("HDA: SSM version cRegs is %RU32, expected %RU32\n", cRegs, RT_ELEMENTS(pThis->au32Regs))); … … 3937 3919 if (cRegs >= RT_ELEMENTS(pThis->au32Regs)) 3938 3920 { 3939 SSMR3GetMem(pSSM, pThis->au32Regs, sizeof(pThis->au32Regs));3940 SSMR3Skip(pSSM, sizeof(uint32_t) * (cRegs - RT_ELEMENTS(pThis->au32Regs)));3921 pHlp->pfnSSMGetMem(pSSM, pThis->au32Regs, sizeof(pThis->au32Regs)); 3922 pHlp->pfnSSMSkip(pSSM, sizeof(uint32_t) * (cRegs - RT_ELEMENTS(pThis->au32Regs))); 3941 3923 } 3942 3924 else 3943 SSMR3GetMem(pSSM, pThis->au32Regs, sizeof(uint32_t) * cRegs);3925 pHlp->pfnSSMGetMem(pSSM, pThis->au32Regs, sizeof(uint32_t) * cRegs); 3944 3926 3945 3927 /* Make sure to update the base addresses first before initializing any streams down below. */ … … 3955 3937 * Don't annoy other team mates (forgot this for state v7). 3956 3938 */ 3957 if ( SSMR3HandleRevision(pSSM) >= 116273 3958 || SSMR3HandleVersion(pSSM) >= VBOX_FULL_VERSION_MAKE(5, 2, 0)) 3959 { 3960 rc = SSMR3GetU64(pSSM, &pThis->u64WalClk); 3961 AssertRC(rc); 3962 3963 rc = SSMR3GetU8(pSSM, &pThis->u8IRQL); 3964 AssertRC(rc); 3939 if ( pHlp->pfnSSMHandleRevision(pSSM) >= 116273 3940 || pHlp->pfnSSMHandleVersion(pSSM) >= VBOX_FULL_VERSION_MAKE(5, 2, 0)) 3941 { 3942 rc = pHlp->pfnSSMGetU64(pSSM, &pThis->u64WalClk); 3943 AssertRCReturn(rc, rc); 3944 rc = pHlp->pfnSSMGetU8(pSSM, &pThis->u8IRQL); 3945 AssertRCReturn(rc, rc); 3965 3946 } 3966 3947 … … 3969 3950 */ 3970 3951 uint32_t cStreams; 3971 rc = SSMR3GetU32(pSSM, &cStreams); 3972 AssertRC(rc); 3973 3952 rc = pHlp->pfnSSMGetU32(pSSM, &cStreams); 3953 AssertRCReturn(rc, rc); 3954 3955 /** @todo r=bird: Sanity? No, insanity. You'll end up failing later on 3956 * because you don't load all your state, so what's the point. Just 3957 * admit to a problem immediately, there is no hiding it! */ 3974 3958 if (cStreams > HDA_MAX_STREAMS) 3975 3959 cStreams = HDA_MAX_STREAMS; /* Sanity. */ … … 3980 3964 for (uint32_t i = 0; i < cStreams; i++) 3981 3965 { 3982 uint8_t uStreamID;3983 rc = SSMR3GetU8(pSSM, &uStreamID);3984 AssertRC (rc);3985 3986 PHDASTREAM pStream = hdaGetStreamFromSD(pThis, uStreamID);3966 uint8_t idStream; 3967 rc = pHlp->pfnSSMGetU8(pSSM, &idStream); 3968 AssertRCReturn(rc, rc); 3969 3970 PHDASTREAM pStream = hdaGetStreamFromSD(pThis, idStream); 3987 3971 HDASTREAM StreamDummy; 3988 3972 3989 3973 if (!pStream) 3990 3974 { 3975 RT_ZERO(StreamDummy); 3991 3976 pStream = &StreamDummy; 3992 LogRel2(("HDA: Warning: Loading of stream #%RU8 not supported, skipping to load ...\n", uStreamID));3993 } 3994 3995 rc = hdaR3StreamInit(pStream, uStreamID);3977 LogRel2(("HDA: Warning: Loading of stream #%RU8 not supported, skipping to load ...\n", idStream)); 3978 } 3979 3980 rc = hdaR3StreamInit(pStream, idStream); 3996 3981 if (RT_FAILURE(rc)) 3997 3982 { 3998 LogRel(("HDA: Stream #%RU8: Loading initialization failed, rc=%Rrc\n", uStreamID, rc));3983 LogRel(("HDA: Stream #%RU8: Loading initialization failed, rc=%Rrc\n", idStream, rc)); 3999 3984 /* Continue. */ 4000 3985 } 4001 3986 4002 rc = SSMR3GetStructEx(pSSM, &pStream->State, sizeof(HDASTREAMSTATE),4003 0 /* fFlags */, g_aSSMStreamStateFields7, NULL);4004 AssertRC (rc);3987 rc = pHlp->pfnSSMGetStructEx(pSSM, &pStream->State, sizeof(HDASTREAMSTATE), 3988 0 /* fFlags */, g_aSSMStreamStateFields7, NULL); 3989 AssertRCReturn(rc, rc); 4005 3990 4006 3991 /* 4007 3992 * Load BDLEs (Buffer Descriptor List Entries) and DMA counters. 4008 3993 */ 4009 rc = SSMR3GetStructEx(pSSM, &pStream->State.BDLE.Desc, sizeof(HDABDLEDESC),4010 0 /* fFlags */, g_aSSMBDLEDescFields7, NULL);4011 AssertRC (rc);4012 4013 rc = SSMR3GetStructEx(pSSM, &pStream->State.BDLE.State, sizeof(HDABDLESTATE),4014 0 /* fFlags */, g_aSSMBDLEStateFields7, NULL);4015 AssertRC (rc);3994 rc = pHlp->pfnSSMGetStructEx(pSSM, &pStream->State.BDLE.Desc, sizeof(HDABDLEDESC), 3995 0 /* fFlags */, g_aSSMBDLEDescFields7, NULL); 3996 AssertRCReturn(rc, rc); 3997 3998 rc = pHlp->pfnSSMGetStructEx(pSSM, &pStream->State.BDLE.State, sizeof(HDABDLESTATE), 3999 0 /* fFlags */, g_aSSMBDLEStateFields7, NULL); 4000 AssertRCReturn(rc, rc); 4016 4001 4017 4002 Log2Func(("[SD%RU8] %R[bdle]\n", pStream->u8SD, &pStream->State.BDLE)); … … 4023 4008 pStream->u8SD, pStream->u16LVI, pStream->u32CBL, &pStream->State.Cfg); 4024 4009 4025 rc = SSMR3GetStructEx(pSSM, &pStream->State.Period, sizeof(HDASTREAMPERIOD),4026 0 /* fFlags */, g_aSSMStreamPeriodFields7, NULL);4027 AssertRC (rc);4010 rc = pHlp->pfnSSMGetStructEx(pSSM, &pStream->State.Period, sizeof(HDASTREAMPERIOD), 4011 0 /* fFlags */, g_aSSMStreamPeriodFields7, NULL); 4012 AssertRCReturn(rc, rc); 4028 4013 4029 4014 /* … … 4031 4016 */ 4032 4017 uint32_t cbCircBufSize = 0; 4033 rc = SSMR3GetU32(pSSM, &cbCircBufSize); /* cbCircBuf */ 4034 AssertRC(rc); 4035 4018 rc = pHlp->pfnSSMGetU32(pSSM, &cbCircBufSize); /* cbCircBuf */ 4036 4019 uint32_t cbCircBufUsed = 0; 4037 rc = SSMR3GetU32(pSSM, &cbCircBufUsed); /* cbCircBuf */4038 AssertRC (rc);4020 rc = pHlp->pfnSSMGetU32(pSSM, &cbCircBufUsed); /* cbCircBuf */ 4021 AssertRCReturn(rc, rc); 4039 4022 4040 4023 if (cbCircBufSize) /* If 0, skip the buffer. */ 4041 4024 { 4042 4025 /* Paranoia. */ 4043 AssertReleaseMsg(cbCircBufSize <= _1M, 4044 ("HDA: Saved state contains bogus DMA buffer size (%RU32) for stream #%RU8", 4045 cbCircBufSize, uStreamID)); 4046 AssertReleaseMsg(cbCircBufUsed <= cbCircBufSize, 4047 ("HDA: Saved state contains invalid DMA buffer usage (%RU32/%RU32) for stream #%RU8", 4048 cbCircBufUsed, cbCircBufSize, uStreamID)); 4026 AssertLogRelMsgReturn(cbCircBufSize <= _1M, 4027 ("HDA: Saved state contains bogus DMA buffer size (%RU32) for stream #%RU8", 4028 cbCircBufSize, idStream), 4029 VERR_SSM_DATA_UNIT_FORMAT_CHANGED); 4030 AssertLogRelMsgReturn(cbCircBufUsed <= cbCircBufSize, 4031 ("HDA: Saved state contains invalid DMA buffer usage (%RU32/%RU32) for stream #%RU8", 4032 cbCircBufUsed, cbCircBufSize, idStream), 4033 VERR_SSM_DATA_UNIT_FORMAT_CHANGED); 4049 4034 4050 4035 /* Do we need to cre-create the circular buffer do fit the data size? */ … … 4057 4042 4058 4043 rc = RTCircBufCreate(&pStream->State.pCircBuf, cbCircBufSize); 4059 AssertRC(rc); 4060 4061 if ( RT_SUCCESS(rc) 4062 && cbCircBufUsed) 4044 AssertRCReturn(rc, rc); 4045 4046 if (cbCircBufUsed) 4063 4047 { 4064 4048 void *pvBuf; 4065 4049 size_t cbBuf; 4066 4067 4050 RTCircBufAcquireWriteBlock(pStream->State.pCircBuf, cbCircBufUsed, &pvBuf, &cbBuf); 4068 4051 4069 if (cbBuf) 4070 { 4071 rc = SSMR3GetMem(pSSM, pvBuf, cbBuf); 4072 AssertRC(rc); 4073 } 4052 AssertLogRelMsgReturn(cbBuf == cbCircBufUsed, ("cbBuf=%zu cbCircBufUsed=%zu\n", cbBuf, cbCircBufUsed), 4053 VERR_INTERNAL_ERROR_3); 4054 rc = pHlp->pfnSSMGetMem(pSSM, pvBuf, cbBuf); 4055 AssertRCReturn(rc, rc); 4074 4056 4075 4057 RTCircBufReleaseWriteBlock(pStream->State.pCircBuf, cbBuf); … … 4079 4061 } 4080 4062 4081 Log2Func(("[SD%RU8] LPIB=%RU32, CBL=%RU32, LVI=%RU32\n", 4082 uStreamID, 4083 HDA_STREAM_REG(pThis, LPIB, uStreamID), HDA_STREAM_REG(pThis, CBL, uStreamID), HDA_STREAM_REG(pThis, LVI, uStreamID))); 4063 Log2Func(("[SD%RU8] LPIB=%RU32, CBL=%RU32, LVI=%RU32\n", idStream, HDA_STREAM_REG(pThis, LPIB, idStream), 4064 HDA_STREAM_REG(pThis, CBL, idStream), HDA_STREAM_REG(pThis, LVI, idStream))); 4084 4065 #ifdef LOG_ENABLED 4085 4066 hdaR3BDLEDumpAll(pThis, pStream->u64BDLBase, pStream->u16LVI + 1);
Note:
See TracChangeset
for help on using the changeset viewer.