VirtualBox

Changeset 108401 in vbox


Ignore:
Timestamp:
Feb 26, 2025 5:21:24 PM (8 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
167768
Message:

Devices/PC/DevQemuFwCfg.cpp: Add saved state handling for the RAM based framebuffer, bugref:10392

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevQemuFwCfg.cpp

    r107459 r108401  
    8888*   Defined Constants And Macros                                                                                                 *
    8989*********************************************************************************************************************************/
     90/** Saved state version for the device. */
     91#define QEMU_FW_CFG_SAVED_STATE_VERSION             1
    9092
    9193/** Start of the I/O port region. */
     
    11641166    LogFlowFunc((" -> rc=%Rrc\n", rc));
    11651167    return rc;
     1168}
     1169
     1170
     1171
     1172/* -=-=-=-=-=-=-=-=- Saved State -=-=-=-=-=-=-=-=- */
     1173
     1174/**
     1175 * @callback_method_impl{FNSSMDEVLIVEEXEC}
     1176 */
     1177static DECLCALLBACK(int) qemuFwCfgR3LiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
     1178{
     1179    PDEVQEMUFWCFG pThis = PDMDEVINS_2_DATA(pDevIns, PDEVQEMUFWCFG);
     1180    PCPDMDEVHLPR3 pHlp  = pDevIns->pHlpR3;
     1181    RT_NOREF(uPass);
     1182
     1183    pHlp->pfnSSMPutBool(pSSM, pThis->fRamfbSupported);
     1184    return VINF_SSM_DONT_CALL_AGAIN;
     1185}
     1186
     1187
     1188/**
     1189 * @callback_method_impl{FNSSMDEVSAVEEXEC}
     1190 */
     1191static DECLCALLBACK(int) qemuFwCfgR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
     1192{
     1193    PDEVQEMUFWCFG pThis = PDMDEVINS_2_DATA(pDevIns, PDEVQEMUFWCFG);
     1194    PCPDMDEVHLPR3 pHlp  = pDevIns->pHlpR3;
     1195
     1196    /* The config. */
     1197    qemuFwCfgR3LiveExec(pDevIns, pSSM, SSM_PASS_FINAL);
     1198
     1199    /* The state. */
     1200    pHlp->pfnSSMPutGCPhys(pSSM, pThis->RamfbCfg.GCPhysRamfbBase);
     1201    pHlp->pfnSSMPutU32(   pSSM, pThis->RamfbCfg.cbStride);
     1202    pHlp->pfnSSMPutU32(   pSSM, pThis->RamfbCfg.cWidth);
     1203    pHlp->pfnSSMPutU32(   pSSM, pThis->RamfbCfg.cHeight);
     1204    pHlp->pfnSSMPutU32(   pSSM, pThis->RamfbCfg.u32FourCC);
     1205    pHlp->pfnSSMPutU32(   pSSM, pThis->RamfbCfg.u32Flags);
     1206
     1207    return pHlp->pfnSSMPutU32(pSSM, UINT32_MAX); /* sanity/terminator */
     1208}
     1209
     1210
     1211/**
     1212 * @callback_method_impl{FNSSMDEVLOADEXEC}
     1213 */
     1214static DECLCALLBACK(int) qemuFwCfgR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
     1215{
     1216    PDEVQEMUFWCFG pThis = PDMDEVINS_2_DATA(pDevIns, PDEVQEMUFWCFG);
     1217    PCPDMDEVHLPR3 pHlp  = pDevIns->pHlpR3;
     1218    int rc;
     1219
     1220    if (uVersion != QEMU_FW_CFG_SAVED_STATE_VERSION)
     1221        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
     1222
     1223    /* The config. */
     1224    bool fRamfbSupported;
     1225    rc = pHlp->pfnSSMGetBool(pSSM, &fRamfbSupported);
     1226    AssertRCReturn(rc, rc);
     1227    if (fRamfbSupported != pThis->fRamfbSupported)
     1228        return pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - fRamfbSupported: saved=%RTbool config=%RTbool"),
     1229                                                            fRamfbSupported, pThis->fRamfbSupported);
     1230
     1231    if (uPass != SSM_PASS_FINAL)
     1232        return VINF_SUCCESS;
     1233
     1234    pHlp->pfnSSMGetGCPhys(pSSM, &pThis->RamfbCfg.GCPhysRamfbBase);
     1235    pHlp->pfnSSMGetU32(   pSSM, &pThis->RamfbCfg.cbStride);
     1236    pHlp->pfnSSMGetU32(   pSSM, &pThis->RamfbCfg.cWidth);
     1237    pHlp->pfnSSMGetU32(   pSSM, &pThis->RamfbCfg.cHeight);
     1238    pHlp->pfnSSMGetU32(   pSSM, &pThis->RamfbCfg.u32FourCC);
     1239    pHlp->pfnSSMGetU32(   pSSM, &pThis->RamfbCfg.u32Flags);
     1240
     1241    /* The marker. */
     1242    uint32_t u32;
     1243    rc = pHlp->pfnSSMGetU32(pSSM, &u32);
     1244    AssertRCReturn(rc, rc);
     1245    AssertMsgReturn(u32 == UINT32_MAX, ("%#x\n", u32), VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
     1246
     1247    return VINF_SUCCESS;
     1248}
     1249
     1250
     1251/**
     1252 * @callback_method_impl{FNSSMDEVLOADDONE}
     1253 */
     1254static DECLCALLBACK(int) qemuFwCfgR3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
     1255{
     1256    PDEVQEMUFWCFG pThis = PDMDEVINS_2_DATA(pDevIns, PDEVQEMUFWCFG);
     1257    RT_NOREF(pSSM);
     1258
     1259    if (   pThis->pDrvL0
     1260        && pThis->RamfbCfg.GCPhysRamfbBase)
     1261    {
     1262        int rc = pThis->pDrvL0->pfnResize(pThis->pDrvL0, QEMU_RAMFB_CFG_BPP * 8, NULL /*pvVRAM*/,
     1263                                          pThis->RamfbCfg.cbStride,
     1264                                          pThis->RamfbCfg.cWidth,
     1265                                          pThis->RamfbCfg.cHeight);
     1266        AssertRC(rc);
     1267    }
     1268
     1269    return VINF_SUCCESS;
    11661270}
    11671271
     
    21172221        AssertRCReturn(rc, rc);
    21182222    }
     2223
     2224    /*
     2225     * Register saved state callbacks.
     2226     */
     2227    rc = PDMDevHlpSSMRegisterEx(pDevIns, QEMU_FW_CFG_SAVED_STATE_VERSION, 0 /*cbGuess*/, NULL,
     2228                                NULL, qemuFwCfgR3LiveExec, NULL,
     2229                                NULL, qemuFwCfgR3SaveExec, NULL,
     2230                                NULL, qemuFwCfgR3LoadExec, qemuFwCfgR3LoadDone);
     2231    AssertRCReturn(rc, rc);
    21192232
    21202233    rc = qemuFwCfgInitrdMaybeCreate(pThis);
Note: See TracChangeset for help on using the changeset viewer.

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