VirtualBox

Changeset 24019 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Oct 23, 2009 10:14:27 AM (15 years ago)
Author:
vboxsync
Message:

DevSB16: save and verify config (untested).

File:
1 edited

Legend:

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

    r24010 r24019  
    4242}
    4343
    44 #define SB16_SSM_VERSION 1
    45 
    4644#ifndef VBOX
    4745
     
    6058
    6159#else /* VBOX */
     60
     61/** Current saved state version. */
     62#define SB16_SAVE_STATE_VERSION         2
     63/** The version used in VirtualBox version 3.0 and earlier. This didn't include
     64 * the config dump. */
     65#define SB16_SAVE_STATE_VERSION_VBOX_30 1
    6266
    6367DECLINLINE(void) dolog (const char *fmt, ...)
     
    122126#ifndef VBOX
    123127    qemu_irq *pic;
     128#endif
     129#ifdef VBOX /* lazy bird */
     130    int irqCfg;
     131    int dmaCfg;
     132    int hdmaCfg;
     133    int portCfg;
     134    int verCfg;
    124135#endif
    125136    int irq;
     
    14771488}
    14781489
    1479 #ifndef VBOX
    14801490static void SB_save (QEMUFile *f, void *opaque)
    14811491{
     1492#ifndef VBOX
    14821493    SB16State *s = opaque;
    14831494#else
    1484 static DECLCALLBACK(int) sb16SaveExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
    1485 {
    1486     SB16State *s = PDMINS_2_DATA (pDevIns, SB16State *);
    1487     QEMUFile *f = pSSMHandle;
     1495    SB16State *s = (SB16State *)opaque;
    14881496#endif
    14891497
     
    15351543    qemu_put_be32 (f, s->mixer_nreg);
    15361544    qemu_put_buffer (f, s->mixer_regs, 256);
    1537 
    1538 #ifdef VBOX
    1539     return VINF_SUCCESS;
    1540 #endif
    1541 }
    1542 
    1543 #ifndef VBOX
     1545}
     1546
    15441547static int SB_load (QEMUFile *f, void *opaque, int version_id)
    15451548{
     1549#ifndef VBOX
    15461550    SB16State *s = opaque;
    15471551
     
    15491553        return -EINVAL;
    15501554    }
    1551 #else  /* VBOX */
    1552 static DECLCALLBACK(int) sb16LoadExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle,
    1553                                        uint32_t uVersion, uint32_t uPass)
    1554 {
    1555     SB16State *s = PDMINS_2_DATA (pDevIns, SB16State *);
    1556     QEMUFile *f = pSSMHandle;
    1557 
    1558     AssertMsgReturn(uVersion == SB16_SSM_VERSION, ("%d\n", uVersion),  VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION);
    1559     Assert(uPass == SSM_PASS_FINAL); NOREF(uPass);
    1560 #endif /* VBOX */
     1555#else
     1556    SB16State *s = (SB16State *)opaque;
     1557#endif
    15611558
    15621559    s->irq=qemu_get_be32 (f);
     
    15651562    s->port=qemu_get_be32 (f);
    15661563    s->ver=qemu_get_be32 (f);
    1567 
    15681564    s->in_index=qemu_get_be32 (f);
    15691565    s->out_data_len=qemu_get_be32 (f);
     
    17091705#else /* VBOX */
    17101706
     1707
     1708static DECLCALLBACK(int) sb16LiveExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
     1709{
     1710    SB16State *pThis = PDMINS_2_DATA (pDevIns, SB16State *);
     1711
     1712    SSMR3PutS32(pSSM, pThis->irqCfg);
     1713    SSMR3PutS32(pSSM, pThis->dmaCfg);
     1714    SSMR3PutS32(pSSM, pThis->hdmaCfg);
     1715    SSMR3PutS32(pSSM, pThis->portCfg);
     1716    SSMR3PutS32(pSSM, pThis->verCfg);
     1717    return VINF_SSM_DONT_CALL_AGAIN;
     1718}
     1719
     1720static DECLCALLBACK(int) sb16SaveExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
     1721{
     1722    SB16State *pThis = PDMINS_2_DATA (pDevIns, SB16State *);
     1723
     1724    sb16LiveExec (pDevIns, pSSM, 0);
     1725    SB_save (pSSM, pThis);
     1726    return VINF_SUCCESS;
     1727}
     1728
     1729static DECLCALLBACK(int) sb16LoadExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM,
     1730                                       uint32_t uVersion, uint32_t uPass)
     1731{
     1732    SB16State *pThis = PDMINS_2_DATA (pDevIns, SB16State *);
     1733
     1734    AssertMsgReturn(    uVersion == SB16_SAVE_STATE_VERSION
     1735                    ||  uVersion == SB16_SAVE_STATE_VERSION_VBOX_30,
     1736                    ("%u\n", uVersion),
     1737                    VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION);
     1738    if (uVersion > SB16_SAVE_STATE_VERSION_VBOX_30)
     1739    {
     1740        int32_t irq;
     1741        SSMR3GetS32 (pSSM, &irq);
     1742        int32_t dma;
     1743        SSMR3GetS32 (pSSM, &dma);
     1744        int32_t hdma;
     1745        SSMR3GetS32 (pSSM, &hdma);
     1746        int32_t port;
     1747        SSMR3GetS32 (pSSM, &port);
     1748        int32_t ver;
     1749        int rc = SSMR3GetS32 (pSSM, &ver);
     1750        AssertRCReturn (rc, rc);
     1751
     1752        if (   irq  != pThis->irqCfg
     1753            || dma  != pThis->dmaCfg
     1754            || hdma != pThis->hdmaCfg
     1755            || port != pThis->portCfg
     1756            || ver  != pThis->verCfg )
     1757        {
     1758            LogRel(("SB16: config changed: irq=%x/%x dma=%x/%x hdma=%x/%x port=%x/%x ver=%x/%x (saved/config)\n",
     1759                    irq,  pThis->irqCfg,
     1760                    dma,  pThis->dmaCfg,
     1761                    hdma, pThis->hdmaCfg,
     1762                    port, pThis->portCfg,
     1763                    ver,  pThis->verCfg));
     1764            return VERR_SSM_LOAD_CONFIG_MISMATCH;
     1765        }
     1766    }
     1767    if (uPass != SSM_PASS_FINAL)
     1768        return VINF_SUCCESS;
     1769
     1770    SB_load(pSSM, pThis, uVersion);
     1771    return VINF_SUCCESS;
     1772}
     1773
    17111774static DECLCALLBACK(void *) sb16QueryInterface (struct PDMIBASE *pInterface,
    17121775                                                PDMINTERFACE enmInterface)
     
    17491812        return PDMDEV_SET_ERROR(pDevIns, rc,
    17501813                                N_("Configuration error: Failed to get the \"IRQ\" value"));
     1814    s->irqCfg  = s->irq;
    17511815
    17521816    rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA", &s->dma, 1);
     
    17541818        return PDMDEV_SET_ERROR(pDevIns, rc,
    17551819                                N_("Configuration error: Failed to get the \"DMA\" value"));
     1820    s->dmaCfg  = s->dma;
    17561821
    17571822    rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA16", &s->hdma, 5);
     
    17591824        return PDMDEV_SET_ERROR(pDevIns, rc,
    17601825                                N_("Configuration error: Failed to get the \"DMA16\" value"));
     1826    s->hdmaCfg = s->hdma;
    17611827
    17621828    RTIOPORT Port;
     
    17651831        return PDMDEV_SET_ERROR(pDevIns, rc,
    17661832                                N_("Configuration error: Failed to get the \"Port\" value"));
    1767     s->port = Port;
     1833    s->port    = Port;
     1834    s->portCfg = Port;
    17681835
    17691836    uint16_t u16Version;
     
    17721839        return PDMDEV_SET_ERROR(pDevIns, rc,
    17731840                                N_("Configuration error: Failed to get the \"Version\" value"));
    1774     s->ver = u16Version;
     1841    s->ver     = u16Version;
     1842    s->verCfg  = u16Version;
    17751843
    17761844    /*
     
    18161884    s->can_write = 1;
    18171885
    1818     rc = PDMDevHlpSSMRegister(pDevIns, SB16_SSM_VERSION, sizeof(*s), sb16SaveExec, sb16LoadExec);
     1886    rc = PDMDevHlpSSMRegister3(pDevIns, SB16_SAVE_STATE_VERSION, sizeof(*s), sb16LiveExec, sb16SaveExec, sb16LoadExec);
    18191887    if (RT_FAILURE(rc))
    18201888        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