VirtualBox

Changeset 100748 in vbox for trunk/src/VBox/Devices/Misc


Ignore:
Timestamp:
Jul 31, 2023 12:22:51 PM (19 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158618
Message:

Devices/DevPL031: Add saved state support (untested), bugref:10435

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Misc/DevPL031.cpp

    r100143 r100748  
    122122    /** The IRQ value. */
    123123    uint16_t                        u16Irq;
    124     /** Flag whether to preload the load rgeister with the current time. */
     124    /** Flag whether to preload the load register with the current time. */
    125125    bool                            fLoadTime;
    126126    /** Flag whether to use UTC for the time offset. */
     
    379379    RT_NOREF(uPass);
    380380
    381     pHlp->pfnSSMPutU16(pSSM, pThis->u16Irq);
     381    pHlp->pfnSSMPutU16(   pSSM, pThis->u16Irq);
    382382    pHlp->pfnSSMPutGCPhys(pSSM, pThis->GCPhysMmioBase);
     383    pHlp->pfnSSMPutBool(  pSSM, pThis->fUtcOffset);
    383384    return VINF_SSM_DONT_CALL_AGAIN;
    384385}
     
    393394    PCPDMDEVHLPR3   pHlp  = pDevIns->pHlpR3;
    394395
    395     pHlp->pfnSSMPutU16(pSSM, pThis->u16Irq);
    396     pHlp->pfnSSMPutGCPhys(pSSM, pThis->GCPhysMmioBase);
     396    /* The config. */
     397    pl031R3LiveExec(pDevIns, pSSM, SSM_PASS_FINAL);
     398
     399    /* The state. */
     400    pHlp->pfnSSMPutU32( pSSM, pThis->u32RtcDr);
     401    pHlp->pfnSSMPutU32( pSSM, pThis->u32RtcMr);
     402    pHlp->pfnSSMPutU32( pSSM, pThis->u32RtcLr);
     403    pHlp->pfnSSMPutBool(pSSM, pThis->fRtcStarted);
     404    pHlp->pfnSSMPutBool(pSSM, pThis->fRtcIrqMasked);
     405    pHlp->pfnSSMPutBool(pSSM, pThis->fRtcIrqSts);
    397406
    398407    return pHlp->pfnSSMPutU32(pSSM, UINT32_MAX); /* sanity/terminator */
     
    407416    PDEVPL031       pThis = PDMDEVINS_2_DATA(pDevIns, PDEVPL031);
    408417    PCPDMDEVHLPR3   pHlp  = pDevIns->pHlpR3;
    409     uint16_t        u16Irq;
    410     RTGCPHYS        GCPhysMmioBase;
    411418    int rc;
    412419
    413     RT_NOREF(uVersion);
    414 
    415     pHlp->pfnSSMGetU16(   pSSM, &u16Irq);
    416     pHlp->pfnSSMGetGCPhys(pSSM, &GCPhysMmioBase);
    417     if (uPass == SSM_PASS_FINAL)
     420    if (uVersion != PL031_SAVED_STATE_VERSION)
     421        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
     422
     423    /* The config. */
     424    uint16_t u16Irq;
     425    rc = pHlp->pfnSSMGetU16(pSSM, &u16Irq);
     426    AssertRCReturn(rc, rc);
     427    if (u16Irq != pThis->u16Irq)
     428        return pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - u16Irq: saved=%#x config=%#x"), u16Irq, pThis->u16Irq);
     429
     430    RTGCPHYS GCPhysMmioBase;
     431    rc = pHlp->pfnSSMGetGCPhys(pSSM, &GCPhysMmioBase);
     432    AssertRCReturn(rc, rc);
     433    if (GCPhysMmioBase != pThis->GCPhysMmioBase)
     434        return pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - GCPhysMmioBase: saved=%RTiop config=%RTiop"), GCPhysMmioBase, pThis->GCPhysMmioBase);
     435
     436    bool fUtcOffset;
     437    rc = pHlp->pfnSSMGetBool(pSSM, &fUtcOffset);
     438    AssertRCReturn(rc, rc);
     439    if (fUtcOffset != pThis->fUtcOffset)
     440        return pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - fUtcOffset: saved=%RTbool config=%RTbool"), fUtcOffset, pThis->fUtcOffset);
     441
     442    if (uPass != SSM_PASS_FINAL)
     443        return VINF_SUCCESS;
     444
     445    /* The state. */
     446    pHlp->pfnSSMGetU32( pSSM, &pThis->u32RtcDr);
     447    pHlp->pfnSSMGetU32( pSSM, &pThis->u32RtcMr);
     448    pHlp->pfnSSMGetU32( pSSM, &pThis->u32RtcLr);
     449    pHlp->pfnSSMGetBool(pSSM, &pThis->fRtcStarted);
     450    pHlp->pfnSSMGetBool(pSSM, &pThis->fRtcIrqMasked);
     451    pHlp->pfnSSMGetBool(pSSM, &pThis->fRtcIrqSts);
     452
     453    /* The marker. */
     454    uint32_t u32;
     455    rc = pHlp->pfnSSMGetU32(pSSM, &u32);
     456    AssertRCReturn(rc, rc);
     457    AssertMsgReturn(u32 == UINT32_MAX, ("%#x\n", u32), VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
     458
     459    return VINF_SUCCESS;
     460}
     461
     462
     463/**
     464 * @callback_method_impl{FNSSMDEVLOADDONE}
     465 */
     466static DECLCALLBACK(int) pl031R3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
     467{
     468    PDEVPL031 pThis = PDMDEVINS_2_DATA(pDevIns, PDEVPL031);
     469
     470    RT_NOREF(pSSM);
     471    int rc = VINF_SUCCESS;
     472    if (pThis->fRtcStarted)
    418473    {
    419         rc = VERR_NOT_IMPLEMENTED;
    420         AssertRCReturn(rc, rc);
     474        PDMDevHlpTimerLockClock(pDevIns, pThis->hTimerSecond, VERR_IGNORED);
     475        rc = PDMDevHlpTimerSetMillies(pDevIns, pThis->hTimerSecond, RT_MS_1SEC);
     476        PDMDevHlpTimerUnlockClock(pDevIns, pThis->hTimerSecond);
    421477    }
    422 
    423     if (uPass == SSM_PASS_FINAL)
    424     {
    425         /* The marker. */
    426         uint32_t u32;
    427         rc = pHlp->pfnSSMGetU32(pSSM, &u32);
    428         AssertRCReturn(rc, rc);
    429         AssertMsgReturn(u32 == UINT32_MAX, ("%#x\n", u32), VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
    430     }
    431 
    432     /*
    433      * Check the config.
    434      */
    435     if (   pThis->u16Irq         != u16Irq
    436         || pThis->GCPhysMmioBase != GCPhysMmioBase)
    437         return pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS,
    438                                        N_("Config mismatch - saved Irq=%#x GCPhysMmioBase=%#RGp; configured Irq=%#x GCPhysMmioBase=%#RGp"),
    439                                        u16Irq, GCPhysMmioBase, pThis->u16Irq, pThis->GCPhysMmioBase);
    440 
    441     return VINF_SUCCESS;
    442 }
    443 
    444 
    445 /**
    446  * @callback_method_impl{FNSSMDEVLOADDONE}
    447  */
    448 static DECLCALLBACK(int) pl031R3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    449 {
    450     PDEVPL031   pThis   = PDMDEVINS_2_DATA(pDevIns, PDEVPL031);
    451     PDEVPL031CC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PDEVPL031CC);
    452 
    453     RT_NOREF(pThis, pThisCC, pSSM);
    454     return VERR_NOT_IMPLEMENTED;
     478    else
     479        PDMDevHlpTimerStop(pDevIns, pThis->hTimerSecond);
     480
     481    return rc;
    455482}
    456483
     
    471498    pThis->fRtcIrqMasked    = false;
    472499    pThis->fRtcIrqSts       = false;
     500    PDMDevHlpTimerStop(pDevIns, pThis->hTimerSecond);
    473501
    474502    if (pThis->fLoadTime)
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