Changeset 23964 in vbox
- Timestamp:
- Oct 22, 2009 9:56:01 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 53787
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevE1000.cpp
r23933 r23964 801 801 802 802 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 804 808 805 809 /** … … 4402 4406 4403 4407 /** 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 */ 4413 static 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. 4405 4421 * 4406 4422 * @returns VBox status code. 4407 4423 * @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 */ 4427 static 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 */ 4441 static DECLCALLBACK(int) e1kSavePrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 4411 4442 { 4412 4443 E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*); … … 4448 4479 * @returns VBox status code. 4449 4480 * @param pDevIns The device instance. 4450 * @param pSSM Handle The handle to save the state to.4451 */ 4452 static DECLCALLBACK(int) e1kSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM Handle)4481 * @param pSSM The handle to the saved state. 4482 */ 4483 static DECLCALLBACK(int) e1kSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 4453 4484 { 4454 4485 E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*); 4455 4486 4487 #if 0 /** @todo FIXME: enable when bumping the version. */ 4488 e1kSaveConfig(pState, pSSM); 4489 #endif 4456 4490 e1kDumpState(pState); 4457 SSMR3PutMem(pSSM Handle, pState->auRegs, sizeof(pState->auRegs));4458 SSMR3PutBool(pSSM Handle, pState->fIntRaised);4459 Phy::saveState(pSSM Handle, &pState->phy);4460 SSMR3PutU32(pSSM Handle, pState->uSelectedReg);4461 SSMR3PutMem(pSSM Handle, pState->auMTA, sizeof(pState->auMTA));4462 SSMR3PutMem(pSSM Handle, &pState->aRecAddr, sizeof(pState->aRecAddr));4463 SSMR3PutMem(pSSM Handle, pState->auVFTA, sizeof(pState->auVFTA));4464 SSMR3PutU64(pSSM Handle, pState->u64AckedAt);4465 SSMR3PutU16(pSSM Handle, pState->u16RxBSize);4466 //SSMR3PutBool(pSSM Handle, pState->fDelayInts);4467 //SSMR3PutBool(pSSM Handle, pState->fIntMaskUsed);4468 SSMR3PutU16(pSSM Handle, pState->u16TxPktLen);4469 SSMR3PutMem(pSSM Handle, pState->aTxPacket, pState->u16TxPktLen);4470 SSMR3PutBool(pSSM Handle, pState->fIPcsum);4471 SSMR3PutBool(pSSM Handle, pState->fTCPcsum);4472 SSMR3PutMem(pSSM Handle, &pState->contextTSE, sizeof(pState->contextTSE));4473 SSMR3PutMem(pSSM Handle, &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)); 4474 4508 E1kLog(("%s State has been saved\n", INSTANCE(pState))); 4475 4509 return VINF_SUCCESS; … … 4482 4516 * @returns VBox status code. 4483 4517 * @param pDevIns The device instance. 4484 * @param pSSM Handle The handle to save the state to.4485 */ 4486 static DECLCALLBACK(int) e1kSaveDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM Handle)4518 * @param pSSM The handle to the saved state. 4519 */ 4520 static DECLCALLBACK(int) e1kSaveDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 4487 4521 { 4488 4522 E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*); … … 4507 4541 * @returns VBox status code. 4508 4542 * @param pDevIns The device instance. 4509 * @param pSSM HandleThe handle to the saved state.4510 */ 4511 static DECLCALLBACK(int) e1kLoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM Handle)4543 * @param pSSM The handle to the saved state. 4544 */ 4545 static DECLCALLBACK(int) e1kLoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 4512 4546 { 4513 4547 E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*); … … 4525 4559 * @returns VBox status code. 4526 4560 * @param pDevIns The device instance. 4527 * @param pSSM HandleThe handle to the saved state.4561 * @param pSSM The handle to the saved state. 4528 4562 * @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 */ 4565 static 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) 4534 4572 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 } 4558 4620 return VINF_SUCCESS; 4559 4621 } … … 4564 4626 * @returns VBox status code. 4565 4627 * @param pDevIns The device instance. 4566 * @param pSSM HandleThe handle to the saved state.4567 */ 4568 static DECLCALLBACK(int) e1kLoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM Handle)4628 * @param pSSM The handle to the saved state. 4629 */ 4630 static DECLCALLBACK(int) e1kLoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 4569 4631 { 4570 4632 E1KSTATE* pState = PDMINS_2_DATA(pDevIns, E1KSTATE*); … … 4726 4788 */ 4727 4789 if (!CFGMR3AreValuesValid(pCfgHandle, "MAC\0" "CableConnected\0" "AdapterType\0" "LineSpeed\0")) 4728 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")); 4730 4792 4731 4793 /** @todo: LineSpeed unused! */ … … 4814 4876 4815 4877 rc = PDMDevHlpSSMRegisterEx(pDevIns, E1K_SAVEDSTATE_VERSION, sizeof(E1KSTATE), NULL, 4816 NULL, NULL, NULL,4878 NULL, e1kLiveExec, NULL, 4817 4879 e1kSavePrep, e1kSaveExec, NULL, 4818 4880 e1kLoadPrep, e1kLoadExec, e1kLoadDone);
Note:
See TracChangeset
for help on using the changeset viewer.