VirtualBox

Changeset 71751 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 8, 2018 11:05:36 PM (7 years ago)
Author:
vboxsync
Message:

DevIchAc97: Do simple stuff (most stuff actually) in ring-0 / rawmode context.

Location:
trunk/src/VBox/Devices
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/DevIchAc97.cpp

    r71750 r71751  
    197197#define AC97_AD_MISC_HPSEL       RT_BIT(10)  /**< PCM (front) goes to headphone outputs. */
    198198
    199 #define ICHAC97STATE_2_DEVINS(a_pAC97)   ((a_pAC97)->pDevInsR3)
     199#define ICHAC97STATE_2_DEVINS(a_pAC97)   ((a_pAC97)->CTX_SUFF(pDevIns))
    200200
    201201enum
     
    396396    /** Critical section protecting the AC'97 state. */
    397397    PDMCRITSECT             CritSect;
    398     /** R3 Pointer to the device instance. */
     398    /** R3 pointer to the device instance. */
    399399    PPDMDEVINSR3            pDevInsR3;
     400    /** R0 pointer to the device instance. */
     401    PPDMDEVINSR0            pDevInsR0;
     402    /** RC pointer to the device instance. */
     403    PPDMDEVINSRC            pDevInsRC;
     404    /** Set if R0/RC is enabled. */
     405    bool                    fRZEnabled;
    400406    /** Global Control (Bus Master Control Register). */
    401407    uint32_t                glob_cnt;
     
    415421    uint8_t                 cStreamsActive;
    416422#ifndef VBOX_WITH_AUDIO_AC97_CALLBACKS
    417     /** The timer for pumping data thru the attached LUN drivers. */
    418     PTMTIMERR3              pTimer;
    419 # if HC_ARCH_BITS == 32
     423    /** The timer for pumping data thru the attached LUN drivers - R3Ptr. */
     424    PTMTIMERR3              pTimerR3;
     425    /** The timer for pumping data thru the attached LUN drivers - R0Ptr. */
     426    PTMTIMERR0              pTimerR0;
     427    /** The timer for pumping data thru the attached LUN drivers - RCPtr. */
     428    PTMTIMERRC              pTimerRC;
    420429    uint32_t                Padding0;
    421 # endif
    422430    /** Flag indicating whether the timer is active or not. */
    423431    bool                    fTimerActive;
     
    437445#endif
    438446    /** List of associated LUN drivers (AC97DRIVER). */
    439     RTLISTANCHOR            lstDrv;
     447    RTLISTANCHORR3          lstDrv;
    440448    /** The device's software mixer. */
    441449    R3PTRTYPE(PAUDIOMIXER)  pMixer;
     
    502510#define DEVAC97_LOCK_BOTH_RETURN_VOID(a_pThis) \
    503511    do { \
    504         int rcLock = TMTimerLock((a_pThis)->pTimer, VERR_IGNORED); \
     512        int rcLock = TMTimerLock((a_pThis)->CTX_SUFF(pTimer), VERR_IGNORED); \
    505513        if (rcLock != VINF_SUCCESS) \
    506514        { \
     
    512520        { \
    513521            AssertRC(rcLock); \
    514             TMTimerUnlock((a_pThis)->pTimer); \
     522            TMTimerUnlock((a_pThis)->CTX_SUFF(pTimer)); \
    515523            return; \
    516524        } \
     
    522530#define DEVAC97_LOCK_BOTH_RETURN(a_pThis, a_rcBusy) \
    523531    do { \
    524         int rcLock = TMTimerLock((a_pThis)->pTimer, (a_rcBusy)); \
     532        int rcLock = TMTimerLock((a_pThis)->CTX_SUFF(pTimer), (a_rcBusy)); \
    525533        if (rcLock != VINF_SUCCESS) \
    526534            return rcLock; \
     
    529537        { \
    530538            AssertRC(rcLock); \
    531             TMTimerUnlock((a_pThis)->pTimer); \
     539            TMTimerUnlock((a_pThis)->CTX_SUFF(pTimer)); \
    532540            return rcLock; \
    533541        } \
     
    540548    do { \
    541549        PDMCritSectLeave(&(a_pThis)->CritSect); \
    542         TMTimerUnlock((a_pThis)->pTimer); \
     550        TMTimerUnlock((a_pThis)->CTX_SUFF(pTimer)); \
    543551    } while (0)
    544552
     
    607615}
    608616
     617#ifdef IN_RING3
     618
    609619/**
    610620 * Retrieves the audio mixer sink of a corresponding AC'97 stream index.
     
    648658    PDMDevHlpPhysRead(pDevIns, pRegs->bdbar + pRegs->civ * 8, &u32[0], sizeof(u32));
    649659    pRegs->bd_valid   = 1;
    650 #if !defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)
    651 # error Please adapt the code (audio buffers are little endian)!
     660#ifndef RT_LITTLE_ENDIAN
     661# error "Please adapt the code (audio buffers are little endian)!"
    652662#else
    653663    pRegs->bd.addr    = RT_H2LE_U32(u32[0] & ~3);
     
    661671}
    662672
     673#endif /* IN_RING3 */
     674
    663675/**
    664676 * Updates the status register (SR) of an AC'97 audio stream.
     
    716728    }
    717729}
     730
     731#ifdef IN_RING3
    718732
    719733/**
     
    14051419}
    14061420
     1421#endif /* IN_RING3 */
     1422
    14071423/**
    14081424 * Sets a AC'97 mixer control to a specific value.
     
    14351451    return RT_MAKE_U16(pThis->mixer_data[uMixerIdx + 0], pThis->mixer_data[uMixerIdx + 1]);
    14361452}
     1453
     1454#ifdef IN_RING3
    14371455
    14381456/**
     
    19601978}
    19611979
     1980#endif /* IN_RING3 */
     1981
    19621982/**
    19631983 * Retrieves an AC'97 audio stream from an AC'97 stream index.
     
    19781998
    19791999}
     2000
     2001#ifdef IN_RING3
    19802002
    19812003/**
     
    21232145    DEVAC97_LOCK_BOTH_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
    21242146
    2125     AssertPtr(pThis->pTimer);
     2147    AssertPtr(pThis->CTX_SUFF(pTimer));
    21262148
    21272149    if (!pThis->fTimerActive)
     
    21502172    LogFlowFuncEnter();
    21512173
    2152     if (!pThis->pTimer)
     2174    if (!pThis->CTX_SUFF(pTimer))
    21532175        return VERR_WRONG_ORDER;
    21542176
     
    21722194    LogFlowFuncEnter();
    21732195
    2174     if (!pThis->pTimer) /* Only can happen on device construction time, so no locking needed here. */
     2196    if (!pThis->CTX_SUFF(pTimer)) /* Only can happen on device construction time, so no locking needed here. */
    21752197        return VINF_SUCCESS;
    21762198
     
    22052227    LogFlowFuncEnter();
    22062228
    2207     if (!pThis->pTimer)
     2229    if (!pThis->CTX_SUFF(pTimer))
    22082230        return VERR_WRONG_ORDER;
    22092231
     
    22302252    DEVAC97_LOCK_BOTH_RETURN_VOID(pThis);
    22312253
    2232     uint64_t cTicksNow = TMTimerGet(pThis->pTimer);
     2254    uint64_t cTicksNow = TMTimerGet(pThis->CTX_SUFF(pTimer));
    22332255
    22342256    /* Update current time timestamp. */
    22352257    pThis->uTimerTS = cTicksNow;
    22362258
    2237     /* Flag indicating whether to kick the timer again for the next DMA transfer or sink processing. */
    2238     bool fKickTimer = false;
     2259    /* Flag indicating whether to arm the timer again for the next DMA transfer or sink processing. */
     2260    bool fArmTimer = false;
    22392261
    22402262    ichac97DoTransfers(pThis);
    22412263
    2242     /* Do we need to kick the timer again? */
     2264    /* Do we need to arm the timer again? */
    22432265    if (   AudioMixerSinkIsActive(ichac97IndexToSink(pThis, pThis->StreamLineIn.u8SD))
    22442266        || AudioMixerSinkIsActive(ichac97IndexToSink(pThis, pThis->StreamMicIn.u8SD))
    22452267        || AudioMixerSinkIsActive(ichac97IndexToSink(pThis, pThis->StreamOut.u8SD)))
    22462268    {
    2247         fKickTimer = true;
    2248     }
    2249 
    2250     if (   ASMAtomicReadBool(&pThis->fTimerActive)
    2251         || fKickTimer)
    2252     {
    2253         /* Kick the timer again. */
     2269        fArmTimer = true;
     2270    }
     2271
     2272    if (   ASMAtomicReadBool(&pThis->fTimerActive) /** @todo r=bird: totally unnecessary to do atomic read here, isn't it? */
     2273        || fArmTimer)
     2274    {
     2275/** @todo r=bird: This is simplitic insanity.  Nobody wants a timer running
     2276 *        every 5 ms (see AC97_TIMER_HZ) all the time the VM is up running!
     2277 *
     2278 *        If there isn't a way of detecting that guest is up to something, at
     2279 *        least try lowering the frequency when idle.
     2280 */
     2281        /* Arm the timer again. */
    22542282        uint64_t cTicks = pThis->cTimerTicks;
    22552283        /** @todo adjust cTicks down by now much cbOutMin represents. */
    2256         TMTimerSet(pThis->pTimer, cTicksNow + cTicks);
     2284        TMTimerSet(pThis->CTX_SUFF(pTimer), cTicksNow + cTicks);
    22572285    }
    22582286    else
     
    25202548}
    25212549
     2550#endif /* IN_RING3 */
     2551
     2552
    25222553/**
    25232554 * Port I/O Handler for IN operations.
     
    25332564 * @param   cbVal       Number of bytes read.
    25342565 */
    2535 static DECLCALLBACK(int) ichac97IOPortNABMRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort,
    2536                                                uint32_t *pu32Val, unsigned cbVal)
    2537 {
    2538     RT_NOREF(pDevIns);
    2539 
    2540     PAC97STATE pThis = (PAC97STATE)pvUser;
    2541 
    2542     DEVAC97_LOCK(pThis);
     2566PDMBOTHCBDECL(int) ichac97IOPortNABMRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t *pu32Val, unsigned cbVal)
     2567{
     2568    PAC97STATE pThis = PDMINS_2_DATA(pDevIns, PAC97STATE);
     2569    RT_NOREF(pvUser);
     2570
     2571    DEVAC97_LOCK_RETURN(pThis, VINF_IOM_R3_IOPORT_READ);
    25432572
    25442573    /* Get the index of the NABMBAR port. */
     
    27062735 * @param   cbVal       The value size in bytes.
    27072736 */
    2708 static DECLCALLBACK(int) ichac97IOPortNABMWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort,
    2709                                                 uint32_t u32Val, unsigned cbVal)
    2710 {
    2711     RT_NOREF(pDevIns);
    2712 
    2713     PAC97STATE pThis = (PAC97STATE)pvUser;
     2737PDMBOTHCBDECL(int) ichac97IOPortNABMWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t u32Val, unsigned cbVal)
     2738{
     2739    PAC97STATE pThis = PDMINS_2_DATA(pDevIns, PAC97STATE);
     2740    RT_NOREF(pvUser);
    27142741
    27152742    DEVAC97_LOCK_BOTH_RETURN(pThis, VINF_IOM_R3_IOPORT_WRITE);
     
    27242751        pRegs = &pStream->Regs;
    27252752
     2753    int rc = VINF_SUCCESS;
    27262754    switch (cbVal)
    27272755    {
     
    27402768                        && (pRegs->sr & AC97_SR_DCH))
    27412769                    {
     2770#ifdef IN_RING3
    27422771                        pRegs->sr &= ~(AC97_SR_DCH | AC97_SR_CELV);
    27432772                        pRegs->civ = pRegs->piv;
     
    27452774
    27462775                        ichac97StreamFetchBDLE(pThis, pStream);
     2776#else
     2777                        rc = VINF_IOM_R3_IOPORT_WRITE;
     2778#endif
    27472779                    }
    27482780                    pRegs->lvi = u32Val % AC97_MAX_BDLE;
     
    27582790                case MC_CR:
    27592791                {
     2792#ifdef IN_RING3
    27602793                    Log3Func(("[SD%RU8] CR <- %#x (cr %#x)\n", pStream->u8SD, u32Val, pRegs->cr));
    2761 
    27622794                    if (u32Val & AC97_CR_RR) /* Busmaster reset. */
    27632795                    {
     
    27992831                        }
    28002832                    }
     2833#else /* !IN_RING3 */
     2834                    rc = VINF_IOM_R3_IOPORT_WRITE;
     2835#endif
    28012836                    break;
    28022837                }
     
    28822917    DEVAC97_UNLOCK_BOTH(pThis);
    28832918
    2884     return VINF_SUCCESS;
     2919    return rc;
    28852920}
    28862921
     
    28982933 * @param   cbVal       Number of bytes read.
    28992934 */
    2900 static DECLCALLBACK(int) ichac97IOPortNAMRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t *pu32Val, unsigned cbVal)
    2901 {
    2902     RT_NOREF(pDevIns);
    2903     PAC97STATE pThis = (PAC97STATE)pvUser;
    2904 
    2905     DEVAC97_LOCK(pThis);
     2935PDMBOTHCBDECL(int) ichac97IOPortNAMRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t *pu32Val, unsigned cbVal)
     2936{
     2937    PAC97STATE pThis = PDMINS_2_DATA(pDevIns, PAC97STATE);
     2938    RT_NOREF(pvUser);
     2939
     2940    DEVAC97_LOCK_RETURN(pThis, VINF_IOM_R3_IOPORT_READ);
    29062941
    29072942    int rc = VINF_SUCCESS;
     
    29592994 * @remarks Caller enters the device critical section.
    29602995 */
    2961 static DECLCALLBACK(int) ichac97IOPortNAMWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t u32Val, unsigned cbVal)
    2962 {
    2963     RT_NOREF(pDevIns);
    2964     PAC97STATE pThis = (PAC97STATE)pvUser;
     2996PDMBOTHCBDECL(int) ichac97IOPortNAMWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t u32Val, unsigned cbVal)
     2997{
     2998    PAC97STATE pThis = PDMINS_2_DATA(pDevIns, PAC97STATE);
     2999    RT_NOREF(pvUser);
    29653000
    29663001    DEVAC97_LOCK_BOTH_RETURN(pThis, VINF_IOM_R3_IOPORT_WRITE);
    29673002
    29683003    uint32_t uPortIdx = uPort - pThis->IOPortBase[0];
    2969 
     3004    int rc = VINF_SUCCESS;
    29703005    switch (cbVal)
    29713006    {
     
    29833018            {
    29843019                case AC97_Reset:
     3020#ifdef IN_RING3
    29853021                    ichac97Reset(pThis->CTX_SUFF(pDevIns));
     3022#else
     3023                    rc = VINF_IOM_R3_IOPORT_WRITE;
     3024#endif
    29863025                    break;
    29873026                case AC97_Powerdown_Ctrl_Stat:
     
    29963035                            break; /* Register controls surround (rear), do nothing. */
    29973036                    }
     3037#ifdef IN_RING3
    29983038                    ichac97MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_VOLUME_MASTER, u32Val);
     3039#else
     3040                    rc = VINF_IOM_R3_IOPORT_WRITE;
     3041#endif
    29993042                    break;
    30003043                case AC97_Headphone_Volume_Mute:
     
    30043047                        {
    30053048                            /* Register controls PCM (front) outputs. */
     3049#ifdef IN_RING3
    30063050                            ichac97MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_VOLUME_MASTER, u32Val);
     3051#else
     3052                            rc = VINF_IOM_R3_IOPORT_WRITE;
     3053#endif
    30073054                        }
    30083055                    }
    30093056                    break;
    30103057                case AC97_PCM_Out_Volume_Mute:
     3058#ifdef IN_RING3
    30113059                    ichac97MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_FRONT, u32Val);
     3060#else
     3061                    rc = VINF_IOM_R3_IOPORT_WRITE;
     3062#endif
    30123063                    break;
    30133064                case AC97_Line_In_Volume_Mute:
     3065#ifdef IN_RING3
    30143066                    ichac97MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_LINE_IN, u32Val);
     3067#else
     3068                    rc = VINF_IOM_R3_IOPORT_WRITE;
     3069#endif
    30153070                    break;
    30163071                case AC97_Record_Select:
     3072#ifdef IN_RING3
    30173073                    ichac97MixerRecordSelect(pThis, u32Val);
     3074#else
     3075                    rc = VINF_IOM_R3_IOPORT_WRITE;
     3076#endif
    30183077                    break;
    30193078                case AC97_Record_Gain_Mute:
     3079#ifdef IN_RING3
    30203080                    /* Newer Ubuntu guests rely on that when controlling gain and muting
    30213081                     * the recording (capturing) levels. */
    30223082                    ichac97MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_LINE_IN, u32Val);
     3083#else
     3084                    rc = VINF_IOM_R3_IOPORT_WRITE;
     3085#endif
    30233086                    break;
    30243087                case AC97_Record_Gain_Mic_Mute:
     3088#ifdef IN_RING3
    30253089                    /* Ditto; see note above. */
    30263090                    ichac97MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_MIC_IN,  u32Val);
     3091#else
     3092                    rc = VINF_IOM_R3_IOPORT_WRITE;
     3093#endif
    30273094                    break;
    30283095                case AC97_Vendor_ID1:
     
    30343101                    break;
    30353102                case AC97_Extended_Audio_Ctrl_Stat:
     3103#ifdef IN_RING3
    30363104                    if (!(u32Val & AC97_EACS_VRA))
    30373105                    {
     
    30553123                    LogFunc(("Setting extended audio control to %#x\n", u32Val));
    30563124                    ichac97MixerSet(pThis, AC97_Extended_Audio_Ctrl_Stat, u32Val);
     3125#else
     3126                    rc = VINF_IOM_R3_IOPORT_WRITE;
     3127#endif
    30573128                    break;
    30583129                case AC97_PCM_Front_DAC_Rate:
    30593130                    if (ichac97MixerGet(pThis, AC97_Extended_Audio_Ctrl_Stat) & AC97_EACS_VRA)
    30603131                    {
     3132#ifdef IN_RING3
    30613133                        ichac97MixerSet(pThis, uPortIdx, u32Val);
    30623134                        LogFunc(("Set front DAC rate to %RU32\n", u32Val));
    30633135                        ichac97StreamReOpen(pThis, &pThis->StreamOut);
     3136#else
     3137                        rc = VINF_IOM_R3_IOPORT_WRITE;
     3138#endif
    30643139                    }
    30653140                    else
     
    30693144                    if (ichac97MixerGet(pThis, AC97_Extended_Audio_Ctrl_Stat) & AC97_EACS_VRM)
    30703145                    {
     3146#ifdef IN_RING3
    30713147                        ichac97MixerSet(pThis, uPortIdx, u32Val);
    30723148                        LogFunc(("Set MIC ADC rate to %RU32\n", u32Val));
    30733149                        ichac97StreamReOpen(pThis, &pThis->StreamMicIn);
     3150#else
     3151                        rc = VINF_IOM_R3_IOPORT_WRITE;
     3152#endif
    30743153                    }
    30753154                    else
     
    30793158                    if (ichac97MixerGet(pThis, AC97_Extended_Audio_Ctrl_Stat) & AC97_EACS_VRA)
    30803159                    {
     3160#ifdef IN_RING3
    30813161                        ichac97MixerSet(pThis, uPortIdx, u32Val);
    30823162                        LogFunc(("Set front LR ADC rate to %RU32\n", u32Val));
    30833163                        ichac97StreamReOpen(pThis, &pThis->StreamLineIn);
     3164#else
     3165                        rc = VINF_IOM_R3_IOPORT_WRITE;
     3166#endif
    30843167                    }
    30853168                    else
     
    31083191    DEVAC97_UNLOCK_BOTH(pThis);
    31093192
    3110     return VINF_SUCCESS;
    3111 }
    3112 
     3193    return rc;
     3194}
     3195
     3196#ifdef IN_RING3
    31133197
    31143198/**
     
    31313215    int rc;
    31323216    if (iRegion == 0)
    3133         rc = PDMDevHlpIOPortRegister(pDevIns, Port, 256, pThis,
    3134                                     ichac97IOPortNAMWrite, ichac97IOPortNAMRead,
     3217    {
     3218        rc = PDMDevHlpIOPortRegister(pDevIns, Port, 256, NULL, ichac97IOPortNAMWrite, ichac97IOPortNAMRead,
    31353219                                     NULL, NULL, "ICHAC97 NAM");
     3220        AssertRCReturn(rc, rc);
     3221        if (pThis->fRZEnabled)
     3222        {
     3223            rc = PDMDevHlpIOPortRegisterR0(pDevIns, Port, 256, NIL_RTR0PTR, "ichac97IOPortNAMWrite", "ichac97IOPortNAMRead",
     3224                                           NULL, NULL, "ICHAC97 NAM");
     3225            AssertRCReturn(rc, rc);
     3226            rc = PDMDevHlpIOPortRegisterRC(pDevIns, Port, 256, NIL_RTRCPTR, "ichac97IOPortNAMWrite", "ichac97IOPortNAMRead",
     3227                                           NULL, NULL, "ICHAC97 NAM");
     3228            AssertRCReturn(rc, rc);
     3229        }
     3230    }
    31363231    else
    3137         rc = PDMDevHlpIOPortRegister(pDevIns, Port, 64, pThis,
    3138                                     ichac97IOPortNABMWrite, ichac97IOPortNABMRead,
     3232    {
     3233        rc = PDMDevHlpIOPortRegister(pDevIns, Port, 64, NULL, ichac97IOPortNABMWrite, ichac97IOPortNABMRead,
    31393234                                     NULL, NULL, "ICHAC97 NABM");
    3140     if (RT_FAILURE(rc))
    3141         return rc;
     3235        AssertRCReturn(rc, rc);
     3236        if (pThis->fRZEnabled)
     3237        {
     3238            rc = PDMDevHlpIOPortRegisterR0(pDevIns, Port, 64, NIL_RTR0PTR, "ichac97IOPortNABMWrite", "ichac97IOPortNABMRead",
     3239                                           NULL, NULL, "ICHAC97 NABM");
     3240            AssertRCReturn(rc, rc);
     3241            rc = PDMDevHlpIOPortRegisterRC(pDevIns, Port, 64, NIL_RTRCPTR, "ichac97IOPortNABMWrite", "ichac97IOPortNABMRead",
     3242                                           NULL, NULL, "ICHAC97 NABM");
     3243            AssertRCReturn(rc, rc);
     3244
     3245        }
     3246    }
    31423247
    31433248    pThis->IOPortBase[iRegion] = Port;
     
    31453250}
    31463251
    3147 #ifdef IN_RING3
     3252
    31483253/**
    31493254 * Saves (serializes) an AC'97 stream using SSM.
     
    36193724
    36203725/**
     3726 * @interface_method_impl{PDMDEVREG,pfnRelocate}
     3727 */
     3728static DECLCALLBACK(void) ichac97Relocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta)
     3729{
     3730    NOREF(offDelta);
     3731    PAC97STATE pThis = PDMINS_2_DATA(pDevIns, PAC97STATE);
     3732    pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);
     3733#ifndef VBOX_WITH_AUDIO_AC97_CALLBACKS
     3734    pThis->pTimerRC = TMTimerRCPtr(pThis->pTimerR3);
     3735#endif
     3736}
     3737
     3738/**
    36213739 * @interface_method_impl{PDMDEVREG,pfnDestruct}
    36223740 */
     
    36533771     * Initialize data so we can run the destructor without scewing up.
    36543772     */
     3773    pThis->pDevInsR3                = pDevIns;
     3774    pThis->pDevInsR0                = PDMDEVINS_2_R0PTR(pDevIns);
     3775    pThis->pDevInsRC                = PDMDEVINS_2_RCPTR(pDevIns);
     3776    pThis->IBase.pfnQueryInterface  = ichac97QueryInterface;
    36553777    RTListInit(&pThis->lstDrv);
    3656 
    36573778
    36583779    /*
     
    36603781     */
    36613782    if (!CFGMR3AreValuesValid(pCfg,
     3783                              "RZEnabled\0"
    36623784                              "Codec\0"
    36633785                              "TimerHz\0"))
     
    36683790     * Read config data.
    36693791     */
     3792    int rc = CFGMR3QueryBoolDef(pCfg, "RZEnabled", &pThis->fRZEnabled, true);
     3793    if (RT_FAILURE(rc))
     3794        return PDMDEV_SET_ERROR(pDevIns, rc,
     3795                                N_("HDA configuration error: failed to read RCEnabled as boolean"));
     3796
    36703797    char szCodec[20];
    3671     int rc = CFGMR3QueryStringDef(pCfg, "Codec", &szCodec[0], sizeof(szCodec), "STAC9700");
     3798    rc = CFGMR3QueryStringDef(pCfg, "Codec", &szCodec[0], sizeof(szCodec), "STAC9700");
    36723799    if (RT_FAILURE(rc))
    36733800        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
     
    37113838     * Initialize data (most of it anyway).
    37123839     */
    3713     pThis->pDevInsR3                = pDevIns;
    3714     /* IBase */
    3715     pThis->IBase.pfnQueryInterface  = ichac97QueryInterface;
    3716 
    37173840    /* PCI Device */
    37183841    PCIDevSetVendorId     (&pThis->PciDev, 0x8086); /* 00 ro - intel. */               Assert(pThis->PciDev.abConfig[0x00] == 0x86); Assert(pThis->PciDev.abConfig[0x01] == 0x80);
     
    39374060         */
    39384061        rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, ichac97Timer, pThis,
    3939                                     TMTIMER_FLAGS_NO_CRIT_SECT, "AC'97 Timer", &pThis->pTimer);
     4062                                    TMTIMER_FLAGS_NO_CRIT_SECT, "AC'97 Timer", &pThis->pTimerR3);
    39404063        AssertRCReturn(rc, rc);
     4064        pThis->pTimerR0 = TMTimerR0Ptr(pThis->pTimerR3);
     4065        pThis->pTimerRC = TMTimerRCPtr(pThis->pTimerR3);
    39414066
    39424067        /* Use our own critcal section for the device timer.
    39434068         * That way we can control more fine-grained when to lock what. */
    3944         rc = TMR3TimerSetCritSect(pThis->pTimer, &pThis->CritSect);
     4069        rc = TMR3TimerSetCritSect(pThis->pTimerR3, &pThis->CritSect);
    39454070        AssertRCReturn(rc, rc);
    39464071
    3947         pThis->cTimerTicks = TMTimerGetFreq(pThis->pTimer) / uTimerHz;
    3948         pThis->uTimerTS    = TMTimerGet(pThis->pTimer);
     4072        pThis->cTimerTicks = TMTimerGetFreq(pThis->pTimerR3) / uTimerHz;
     4073        pThis->uTimerTS    = TMTimerGet(pThis->pTimerR3);
    39494074        LogFunc(("Timer ticks=%RU64 (%RU16 Hz)\n", pThis->cTimerTicks, uTimerHz));
    39504075    }
     
    40164141    "ichac97",
    40174142    /* szRCMod */
    4018     "",
     4143    "VBoxDDRC.rc",
    40194144    /* szR0Mod */
    4020     "",
     4145    "VBoxDDR0.r0",
    40214146    /* pszDescription */
    40224147    "ICH AC'97 Audio Controller",
    40234148    /* fFlags */
    4024     PDM_DEVREG_FLAGS_DEFAULT_BITS,
     4149    PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RC | PDM_DEVREG_FLAGS_R0,
    40254150    /* fClass */
    40264151    PDM_DEVREG_CLASS_AUDIO,
     
    40344159    ichac97Destruct,
    40354160    /* pfnRelocate */
    4036     NULL,
     4161    ichac97Relocate,
    40374162    /* pfnMemSetup */
    40384163    NULL,
  • trunk/src/VBox/Devices/Makefile.kmk

    r71721 r71751  
    934934  VBoxDDRC_SOURCES      += \
    935935        Audio/DevHDA.cpp \
    936         Audio/DevHDACommon.cpp
     936        Audio/DevHDACommon.cpp \
     937        Audio/DevIchAc97.cpp
    937938
    938939  VBoxDDRC_DEFS         += \
     
    11181119 VBoxDDR0_SOURCES += \
    11191120        Audio/DevHDA.cpp \
    1120         Audio/DevHDACommon.cpp
     1121        Audio/DevHDACommon.cpp \
     1122        Audio/DevIchAc97.cpp
    11211123
    11221124 ifdef VBOX_WITH_E1000
  • trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp

    r71732 r71751  
    132132#undef LOG_GROUP
    133133#include "../PC/DevHPET.cpp"
    134 # undef LOG_GROUP
    135 # include "../Audio/DevIchAc97.cpp"
    136 # undef LOG_GROUP
    137 # include "../Audio/DevHDA.cpp"
     134#undef LOG_GROUP
     135#include "../Audio/DevIchAc97.cpp"
     136#undef LOG_GROUP
     137#include "../Audio/DevHDA.cpp"
    138138#ifdef VBOX_WITH_NVME_IMPL
    139139# undef LOG_GROUP
     
    18611861    GEN_CHECK_OFF(AC97DRIVER, Out);
    18621862
     1863    GEN_CHECK_SIZE(AC97STATE);
     1864    GEN_CHECK_OFF(AC97STATE, CritSect);
     1865    GEN_CHECK_OFF(AC97STATE, pDevInsR3);
     1866    GEN_CHECK_OFF(AC97STATE, pDevInsR0);
     1867    GEN_CHECK_OFF(AC97STATE, pDevInsRC);
     1868    GEN_CHECK_OFF(AC97STATE, fRZEnabled);
     1869    GEN_CHECK_OFF(AC97STATE, glob_cnt);
     1870    GEN_CHECK_OFF(AC97STATE, glob_sta);
     1871    GEN_CHECK_OFF(AC97STATE, cas);
     1872    GEN_CHECK_OFF(AC97STATE, last_samp);
     1873    GEN_CHECK_OFF(AC97STATE, mixer_data);
     1874    GEN_CHECK_OFF(AC97STATE, StreamLineIn);
     1875    GEN_CHECK_OFF(AC97STATE, StreamMicIn);
     1876    GEN_CHECK_OFF(AC97STATE, StreamOut);
     1877    GEN_CHECK_OFF(AC97STATE, cStreamsActive);
     1878#ifndef VBOX_WITH_AUDIO_AC97_CALLBACKS
     1879    GEN_CHECK_OFF(AC97STATE, pTimerR3);
     1880    GEN_CHECK_OFF(AC97STATE, pTimerR0);
     1881    GEN_CHECK_OFF(AC97STATE, pTimerRC);
     1882    GEN_CHECK_OFF(AC97STATE, Padding0);
     1883    GEN_CHECK_OFF(AC97STATE, fTimerActive);
     1884    GEN_CHECK_OFF(AC97STATE, u8Padding1);
     1885    GEN_CHECK_OFF(AC97STATE, cTimerTicks);
     1886    GEN_CHECK_OFF(AC97STATE, uTimerTS);
     1887#endif
     1888#ifdef VBOX_WITH_STATISTICS
     1889    GEN_CHECK_OFF(AC97STATE, StatTimer);
     1890    GEN_CHECK_OFF(AC97STATE, StatIn);
     1891    GEN_CHECK_OFF(AC97STATE, StatOut);
     1892    GEN_CHECK_OFF(AC97STATE, StatBytesRead);
     1893    GEN_CHECK_OFF(AC97STATE, StatBytesWritten);
     1894#endif
     1895    GEN_CHECK_OFF(AC97STATE, lstDrv);
     1896    GEN_CHECK_OFF(AC97STATE, pMixer);
     1897    GEN_CHECK_OFF(AC97STATE, pSinkOut);
     1898    GEN_CHECK_OFF(AC97STATE, pSinkLineIn);
     1899    GEN_CHECK_OFF(AC97STATE, pSinkMicIn);
     1900    GEN_CHECK_OFF(AC97STATE, silence);
     1901    GEN_CHECK_OFF(AC97STATE, bup_flag);
     1902    GEN_CHECK_OFF(AC97STATE, IBase);
     1903    GEN_CHECK_OFF(AC97STATE, IOPortBase);
     1904    GEN_CHECK_OFF(AC97STATE, uCodecModel);
     1905
    18631906    GEN_CHECK_SIZE(HDADRIVERSTREAM);
    18641907    GEN_CHECK_OFF(HDADRIVERSTREAM, DestSource);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette