VirtualBox

Changeset 23964 in vbox


Ignore:
Timestamp:
Oct 22, 2009 9:56:01 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
53787
Message:

DevE1000: save config (disabled).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DevE1000.cpp

    r23933 r23964  
    801801
    802802
    803 #define E1K_SAVEDSTATE_VERSION 1
     803/** The current Saved state version. */
     804#define E1K_SAVEDSTATE_VERSION          1 /* 2 - FIXME */
     805/** Saved state version for VirtualBox 3.0 and earlier.
     806 * This did not include the configuration part nor the E1kEEPROM.  */
     807#define E1K_SAVEDSTATE_VERSION_VBOX_30  1
    804808
    805809/**
     
    44024406
    44034407/**
    4404  * Prepares for state saving.
     4408 * Saves the configuration.
     4409 *
     4410 * @param   pState      The E1K state.
     4411 * @param   pSSM        The handle to the saved state.
     4412 */
     4413static void e1kSaveConfig(E1KSTATE *pState, PSSMHANDLE pSSM)
     4414{
     4415    SSMR3PutMem(pSSM, &pState->macAddress, sizeof(pState->macAddress));
     4416    SSMR3PutU32(pSSM, pState->eChip);
     4417}
     4418
     4419/**
     4420 * Live save - save basic configuration.
    44054421 *
    44064422 * @returns VBox status code.
    44074423 * @param   pDevIns     The device instance.
    4408  * @param   pSSMHandle  The handle to save the state to.
    4409  */
    4410 static DECLCALLBACK(int) e1kSavePrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
     4424 * @param   pSSM        The handle to the saved state.
     4425 * @param   uPass
     4426 */
     4427static DECLCALLBACK(int) e1kLiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
     4428{
     4429    E1KSTATE *pState = PDMINS_2_DATA(pDevIns, E1KSTATE*);
     4430    e1kSaveConfig(pState, pSSM);
     4431    return VINF_SSM_DONT_CALL_AGAIN;
     4432}
     4433
     4434/**
     4435 * Prepares for state saving.
     4436 *
     4437 * @returns VBox status code.
     4438 * @param   pDevIns     The device instance.
     4439 * @param   pSSM        The handle to the saved state.
     4440 */
     4441static DECLCALLBACK(int) e1kSavePrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    44114442{
    44124443    E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*);
     
    44484479 * @returns VBox status code.
    44494480 * @param   pDevIns     The device instance.
    4450  * @param   pSSMHandle  The handle to save the state to.
    4451  */
    4452 static DECLCALLBACK(int) e1kSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
     4481 * @param   pSSM        The handle to the saved state.
     4482 */
     4483static DECLCALLBACK(int) e1kSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    44534484{
    44544485    E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*);
    44554486
     4487#if 0 /** @todo FIXME: enable when bumping the version. */
     4488    e1kSaveConfig(pState, pSSM);
     4489#endif
    44564490    e1kDumpState(pState);
    4457     SSMR3PutMem(pSSMHandle, pState->auRegs, sizeof(pState->auRegs));
    4458     SSMR3PutBool(pSSMHandle, pState->fIntRaised);
    4459     Phy::saveState(pSSMHandle, &pState->phy);
    4460     SSMR3PutU32(pSSMHandle, pState->uSelectedReg);
    4461     SSMR3PutMem(pSSMHandle, pState->auMTA, sizeof(pState->auMTA));
    4462     SSMR3PutMem(pSSMHandle, &pState->aRecAddr, sizeof(pState->aRecAddr));
    4463     SSMR3PutMem(pSSMHandle, pState->auVFTA, sizeof(pState->auVFTA));
    4464     SSMR3PutU64(pSSMHandle, pState->u64AckedAt);
    4465     SSMR3PutU16(pSSMHandle, pState->u16RxBSize);
    4466     //SSMR3PutBool(pSSMHandle, pState->fDelayInts);
    4467     //SSMR3PutBool(pSSMHandle, pState->fIntMaskUsed);
    4468     SSMR3PutU16(pSSMHandle, pState->u16TxPktLen);
    4469     SSMR3PutMem(pSSMHandle, pState->aTxPacket, pState->u16TxPktLen);
    4470     SSMR3PutBool(pSSMHandle, pState->fIPcsum);
    4471     SSMR3PutBool(pSSMHandle, pState->fTCPcsum);
    4472     SSMR3PutMem(pSSMHandle, &pState->contextTSE, sizeof(pState->contextTSE));
    4473     SSMR3PutMem(pSSMHandle, &pState->contextNormal, sizeof(pState->contextNormal));
     4491    SSMR3PutMem(pSSM, pState->auRegs, sizeof(pState->auRegs));
     4492    SSMR3PutBool(pSSM, pState->fIntRaised);
     4493    Phy::saveState(pSSM, &pState->phy);
     4494    SSMR3PutU32(pSSM, pState->uSelectedReg);
     4495    SSMR3PutMem(pSSM, pState->auMTA, sizeof(pState->auMTA));
     4496    SSMR3PutMem(pSSM, &pState->aRecAddr, sizeof(pState->aRecAddr));
     4497    SSMR3PutMem(pSSM, pState->auVFTA, sizeof(pState->auVFTA));
     4498    SSMR3PutU64(pSSM, pState->u64AckedAt);
     4499    SSMR3PutU16(pSSM, pState->u16RxBSize);
     4500    //SSMR3PutBool(pSSM, pState->fDelayInts);
     4501    //SSMR3PutBool(pSSM, pState->fIntMaskUsed);
     4502    SSMR3PutU16(pSSM, pState->u16TxPktLen);
     4503    SSMR3PutMem(pSSM, pState->aTxPacket, pState->u16TxPktLen);
     4504    SSMR3PutBool(pSSM, pState->fIPcsum);
     4505    SSMR3PutBool(pSSM, pState->fTCPcsum);
     4506    SSMR3PutMem(pSSM, &pState->contextTSE, sizeof(pState->contextTSE));
     4507    SSMR3PutMem(pSSM, &pState->contextNormal, sizeof(pState->contextNormal));
    44744508    E1kLog(("%s State has been saved\n", INSTANCE(pState)));
    44754509    return VINF_SUCCESS;
     
    44824516 * @returns VBox status code.
    44834517 * @param   pDevIns     The device instance.
    4484  * @param   pSSMHandle  The handle to save the state to.
    4485  */
    4486 static DECLCALLBACK(int) e1kSaveDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
     4518 * @param   pSSM        The handle to the saved state.
     4519 */
     4520static DECLCALLBACK(int) e1kSaveDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    44874521{
    44884522    E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*);
     
    45074541 * @returns VBox status code.
    45084542 * @param   pDevIns     The device instance.
    4509  * @param   pSSMHandle  The handle to the saved state.
    4510  */
    4511 static DECLCALLBACK(int) e1kLoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
     4543 * @param   pSSM        The handle to the saved state.
     4544 */
     4545static DECLCALLBACK(int) e1kLoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    45124546{
    45134547    E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*);
     
    45254559 * @returns VBox status code.
    45264560 * @param   pDevIns     The device instance.
    4527  * @param   pSSMHandle  The handle to the saved state.
     4561 * @param   pSSM        The handle to the saved state.
    45284562 * @param   uVersion    The data unit version number.
    4529  * @param   uPass           The data pass.
    4530  */
    4531 static DECLCALLBACK(int) e1kLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle, uint32_t uVersion, uint32_t uPass)
    4532 {
    4533     if (uVersion != E1K_SAVEDSTATE_VERSION)
     4563 * @param   uPass       The data pass.
     4564 */
     4565static DECLCALLBACK(int) e1kLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
     4566{
     4567    E1KSTATE *pState = PDMINS_2_DATA(pDevIns, E1KSTATE*);
     4568    int       rc;
     4569
     4570    if (    uVersion != E1K_SAVEDSTATE_VERSION
     4571        &&  uVersion != E1K_SAVEDSTATE_VERSION_VBOX_30)
    45344572        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
    4535     Assert(uPass == SSM_PASS_FINAL); NOREF(uPass);
    4536 
    4537     E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*);
    4538     SSMR3GetMem(pSSMHandle, &pState->auRegs, sizeof(pState->auRegs));
    4539     SSMR3GetBool(pSSMHandle, &pState->fIntRaised);
    4540     /** @todo: PHY could be made a separate device with its own versioning */
    4541     Phy::loadState(pSSMHandle, &pState->phy);
    4542     SSMR3GetU32(pSSMHandle, &pState->uSelectedReg);
    4543     SSMR3GetMem(pSSMHandle, &pState->auMTA, sizeof(pState->auMTA));
    4544     SSMR3GetMem(pSSMHandle, &pState->aRecAddr, sizeof(pState->aRecAddr));
    4545     SSMR3GetMem(pSSMHandle, &pState->auVFTA, sizeof(pState->auVFTA));
    4546     SSMR3GetU64(pSSMHandle, &pState->u64AckedAt);
    4547     SSMR3GetU16(pSSMHandle, &pState->u16RxBSize);
    4548     //SSMR3GetBool(pSSMHandle, pState->fDelayInts);
    4549     //SSMR3GetBool(pSSMHandle, pState->fIntMaskUsed);
    4550     SSMR3GetU16(pSSMHandle, &pState->u16TxPktLen);
    4551     SSMR3GetMem(pSSMHandle, &pState->aTxPacket, pState->u16TxPktLen);
    4552     SSMR3GetBool(pSSMHandle, &pState->fIPcsum);
    4553     SSMR3GetBool(pSSMHandle, &pState->fTCPcsum);
    4554     SSMR3GetMem(pSSMHandle, &pState->contextTSE, sizeof(pState->contextTSE));
    4555     SSMR3GetMem(pSSMHandle, &pState->contextNormal, sizeof(pState->contextNormal));
    4556     E1kLog(("%s State has been restored\n", INSTANCE(pState)));
    4557     e1kDumpState(pState);
     4573
     4574    if (   uVersion > E1K_SAVEDSTATE_VERSION_VBOX_30
     4575        || uPass    != SSM_PASS_FINAL)
     4576    {
     4577        /* config checks */
     4578        RTMAC macAddress;
     4579        rc = SSMR3GetMem(pSSM, &macAddress, sizeof(macAddress));
     4580        AssertRCReturn(rc, rc);
     4581        if (   memcmp(&macAddress, &pState->macAddress, sizeof(macAddress))
     4582            && (uPass == 0 || !PDMDevHlpVMTeleportedAndNotFullyResumedYet(pDevIns)) )
     4583            LogRel(("%s: The mac address differs: config=%RTmac saved=%RTmac\n", &pState->macAddress, &macAddress));
     4584
     4585        E1KCHIP eChip;
     4586        rc = SSMR3GetU32(pSSM, &eChip);
     4587        AssertRCReturn(rc, rc);
     4588        if (eChip != pState->eChip)
     4589        {
     4590            LogRel(("%s: The mac address differs: config=%u saved=%u\n", pState->eChip, eChip));
     4591            return VERR_SSM_LOAD_CONFIG_MISMATCH;
     4592        }
     4593    }
     4594
     4595    if (uPass == SSM_PASS_FINAL)
     4596    {
     4597        /* the state */
     4598        SSMR3GetMem(pSSM, &pState->auRegs, sizeof(pState->auRegs));
     4599        SSMR3GetBool(pSSM, &pState->fIntRaised);
     4600        /** @todo: PHY could be made a separate device with its own versioning */
     4601        Phy::loadState(pSSM, &pState->phy);
     4602        SSMR3GetU32(pSSM, &pState->uSelectedReg);
     4603        SSMR3GetMem(pSSM, &pState->auMTA, sizeof(pState->auMTA));
     4604        SSMR3GetMem(pSSM, &pState->aRecAddr, sizeof(pState->aRecAddr));
     4605        SSMR3GetMem(pSSM, &pState->auVFTA, sizeof(pState->auVFTA));
     4606        SSMR3GetU64(pSSM, &pState->u64AckedAt);
     4607        SSMR3GetU16(pSSM, &pState->u16RxBSize);
     4608        //SSMR3GetBool(pSSM, pState->fDelayInts);
     4609        //SSMR3GetBool(pSSM, pState->fIntMaskUsed);
     4610        SSMR3GetU16(pSSM, &pState->u16TxPktLen);
     4611        SSMR3GetMem(pSSM, &pState->aTxPacket, pState->u16TxPktLen);
     4612        SSMR3GetBool(pSSM, &pState->fIPcsum);
     4613        SSMR3GetBool(pSSM, &pState->fTCPcsum);
     4614        SSMR3GetMem(pSSM, &pState->contextTSE, sizeof(pState->contextTSE));
     4615        rc = SSMR3GetMem(pSSM, &pState->contextNormal, sizeof(pState->contextNormal));
     4616        AssertRCReturn(rc, rc);
     4617        E1kLog(("%s State has been restored\n", INSTANCE(pState)));
     4618        e1kDumpState(pState);
     4619    }
    45584620    return VINF_SUCCESS;
    45594621}
     
    45644626 * @returns VBox status code.
    45654627 * @param   pDevIns     The device instance.
    4566  * @param   pSSMHandle  The handle to the saved state.
    4567  */
    4568 static DECLCALLBACK(int) e1kLoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
     4628 * @param   pSSM        The handle to the saved state.
     4629 */
     4630static DECLCALLBACK(int) e1kLoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    45694631{
    45704632    E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*);
     
    47264788     */
    47274789    if (!CFGMR3AreValuesValid(pCfgHandle, "MAC\0" "CableConnected\0" "AdapterType\0" "LineSpeed\0"))
    4728                     return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
    4729                                             N_("Invalid configuraton for E1000 device"));
     4790        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
     4791                                N_("Invalid configuration for E1000 device"));
    47304792
    47314793    /** @todo: LineSpeed unused! */
     
    48144876
    48154877    rc = PDMDevHlpSSMRegisterEx(pDevIns, E1K_SAVEDSTATE_VERSION, sizeof(E1KSTATE), NULL,
    4816                                 NULL, NULL, NULL,
     4878                                NULL,        e1kLiveExec, NULL,
    48174879                                e1kSavePrep, e1kSaveExec, NULL,
    48184880                                e1kLoadPrep, e1kLoadExec, e1kLoadDone);
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