VirtualBox

Changeset 23989 in vbox


Ignore:
Timestamp:
Oct 22, 2009 2:42:12 PM (15 years ago)
Author:
vboxsync
Message:

DevParallel: verify config on load.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Parallel/DevParallel.cpp

    r22793 r23989  
    561561#ifdef IN_RING3
    562562/**
    563  * Saves a state of the serial port device.
    564  *
    565  * @returns VBox status code.
    566  * @param   pDevIns     The device instance.
    567  * @param   pSSMHandle  The handle to save the state to.
     563 * @copydoc FNSSMDEVLIVEEXEC
     564 */
     565static DECLCALLBACK(int) parallelLiveExec(PPDMDEVINS pDevIns,
     566                                          PSSMHANDLE pSSMHandle,
     567                                          uint32_t uPass)
     568{
     569    ParallelState *pThis = PDMINS_2_DATA(pDevIns, ParallelState *);
     570
     571    SSMR3PutS32(pSSMHandle, pThis->irq);
     572    SSMR3PutU32(pSSMHandle, pThis->base);
     573    SSMR3PutU32(pSSMHandle, ~0); /* sanity/terminator */
     574    return VINF_SSM_DONT_CALL_AGAIN;
     575}
     576
     577/**
     578 * @copydoc FNSSMDEVSAVEEXEC
    568579 */
    569580static DECLCALLBACK(int) parallelSaveExec(PPDMDEVINS pDevIns,
     
    575586    SSMR3PutU8(pSSMHandle, pThis->reg_status);
    576587    SSMR3PutU8(pSSMHandle, pThis->reg_control);
    577     SSMR3PutS32(pSSMHandle, pThis->irq);
    578     SSMR3PutU32(pSSMHandle, pThis->base);
    579 
    580     return SSMR3PutU32(pSSMHandle, ~0); /* sanity/terminator */
    581 }
    582 
    583 /**
    584  * Loads a saved serial port device state.
    585  *
    586  * @returns VBox status code.
    587  * @param   pDevIns     The device instance.
    588  * @param   pSSMHandle  The handle to the saved state.
    589  * @param   uVersion    The data unit version number.
    590  * @param   uPass       The data pass.
     588
     589    parallelLiveExec(pDevIns, pSSMHandle, 0);
     590    return VINF_SUCCESS;
     591}
     592
     593/**
     594 * @copydoc FNSSMDEVLOADEXEC
    591595 */
    592596static DECLCALLBACK(int) parallelLoadExec(PPDMDEVINS pDevIns,
     
    599603    AssertMsgReturn(uVersion == PARALLEL_SAVED_STATE_VERSION, ("%d\n", uVersion), VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION);
    600604    Assert(uPass == SSM_PASS_FINAL); NOREF(uPass);
    601 
    602     SSMR3GetU8(pSSMHandle, &pThis->reg_data);
    603     SSMR3GetU8(pSSMHandle, &pThis->reg_status);
    604     SSMR3GetU8(pSSMHandle, &pThis->reg_control);
    605     SSMR3GetS32(pSSMHandle, &pThis->irq);
    606     SSMR3GetU32(pSSMHandle, &pThis->base);
    607 
     605    if (uPass == SSM_PASS_FINAL)
     606    {
     607        SSMR3GetU8(pSSMHandle, &pThis->reg_data);
     608        SSMR3GetU8(pSSMHandle, &pThis->reg_status);
     609        SSMR3GetU8(pSSMHandle, &pThis->reg_control);
     610    }
     611
     612    /* the config */
     613    int32_t  iIrq;
     614    SSMR3GetS32(pSSMHandle, &iIrq);
     615    uint32_t uIoBase;
     616    SSMR3GetU32(pSSMHandle, &uIoBase);
    608617    uint32_t u32;
    609618    int rc = SSMR3GetU32(pSSMHandle, &u32);
     
    611620        return rc;
    612621    AssertMsgReturn(u32 == ~0U, ("%#x\n", u32), VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
     622
     623    if (pThis->irq != iIrq)
     624    {
     625        LogRel(("Parallel: IRQ changed: config=%#x state=%#x\n", pThis->irq, iIrq));
     626        return VERR_SSM_LOAD_CONFIG_MISMATCH;
     627    }
     628
     629    if (pThis->base != uIoBase)
     630    {
     631        LogRel(("Parallel: IOBase changed: config=%#x state=%#x\n", pThis->base, uIoBase));
     632        return VERR_SSM_LOAD_CONFIG_MISMATCH;
     633    }
    613634
    614635    /* not necessary... but it doesn't harm. */
     
    802823    }
    803824
    804     rc = PDMDevHlpSSMRegister(pDevIns, PARALLEL_SAVED_STATE_VERSION, sizeof(*pThis), parallelSaveExec, parallelLoadExec);
     825    rc = PDMDevHlpSSMRegister3(pDevIns, PARALLEL_SAVED_STATE_VERSION, sizeof(*pThis),
     826                               parallelLiveExec, parallelSaveExec, parallelLoadExec);
    805827    if (RT_FAILURE(rc))
    806828        return rc;
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