Changeset 100748 in vbox for trunk/src/VBox/Devices/Misc
- Timestamp:
- Jul 31, 2023 12:22:51 PM (19 months ago)
- svn:sync-xref-src-repo-rev:
- 158618
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Misc/DevPL031.cpp
r100143 r100748 122 122 /** The IRQ value. */ 123 123 uint16_t u16Irq; 124 /** Flag whether to preload the load r geister with the current time. */124 /** Flag whether to preload the load register with the current time. */ 125 125 bool fLoadTime; 126 126 /** Flag whether to use UTC for the time offset. */ … … 379 379 RT_NOREF(uPass); 380 380 381 pHlp->pfnSSMPutU16( pSSM, pThis->u16Irq);381 pHlp->pfnSSMPutU16( pSSM, pThis->u16Irq); 382 382 pHlp->pfnSSMPutGCPhys(pSSM, pThis->GCPhysMmioBase); 383 pHlp->pfnSSMPutBool( pSSM, pThis->fUtcOffset); 383 384 return VINF_SSM_DONT_CALL_AGAIN; 384 385 } … … 393 394 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 394 395 395 pHlp->pfnSSMPutU16(pSSM, pThis->u16Irq); 396 pHlp->pfnSSMPutGCPhys(pSSM, pThis->GCPhysMmioBase); 396 /* The config. */ 397 pl031R3LiveExec(pDevIns, pSSM, SSM_PASS_FINAL); 398 399 /* The state. */ 400 pHlp->pfnSSMPutU32( pSSM, pThis->u32RtcDr); 401 pHlp->pfnSSMPutU32( pSSM, pThis->u32RtcMr); 402 pHlp->pfnSSMPutU32( pSSM, pThis->u32RtcLr); 403 pHlp->pfnSSMPutBool(pSSM, pThis->fRtcStarted); 404 pHlp->pfnSSMPutBool(pSSM, pThis->fRtcIrqMasked); 405 pHlp->pfnSSMPutBool(pSSM, pThis->fRtcIrqSts); 397 406 398 407 return pHlp->pfnSSMPutU32(pSSM, UINT32_MAX); /* sanity/terminator */ … … 407 416 PDEVPL031 pThis = PDMDEVINS_2_DATA(pDevIns, PDEVPL031); 408 417 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 409 uint16_t u16Irq;410 RTGCPHYS GCPhysMmioBase;411 418 int rc; 412 419 413 RT_NOREF(uVersion); 414 415 pHlp->pfnSSMGetU16( pSSM, &u16Irq); 416 pHlp->pfnSSMGetGCPhys(pSSM, &GCPhysMmioBase); 417 if (uPass == SSM_PASS_FINAL) 420 if (uVersion != PL031_SAVED_STATE_VERSION) 421 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION; 422 423 /* The config. */ 424 uint16_t u16Irq; 425 rc = pHlp->pfnSSMGetU16(pSSM, &u16Irq); 426 AssertRCReturn(rc, rc); 427 if (u16Irq != pThis->u16Irq) 428 return pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - u16Irq: saved=%#x config=%#x"), u16Irq, pThis->u16Irq); 429 430 RTGCPHYS GCPhysMmioBase; 431 rc = pHlp->pfnSSMGetGCPhys(pSSM, &GCPhysMmioBase); 432 AssertRCReturn(rc, rc); 433 if (GCPhysMmioBase != pThis->GCPhysMmioBase) 434 return pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - GCPhysMmioBase: saved=%RTiop config=%RTiop"), GCPhysMmioBase, pThis->GCPhysMmioBase); 435 436 bool fUtcOffset; 437 rc = pHlp->pfnSSMGetBool(pSSM, &fUtcOffset); 438 AssertRCReturn(rc, rc); 439 if (fUtcOffset != pThis->fUtcOffset) 440 return pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - fUtcOffset: saved=%RTbool config=%RTbool"), fUtcOffset, pThis->fUtcOffset); 441 442 if (uPass != SSM_PASS_FINAL) 443 return VINF_SUCCESS; 444 445 /* The state. */ 446 pHlp->pfnSSMGetU32( pSSM, &pThis->u32RtcDr); 447 pHlp->pfnSSMGetU32( pSSM, &pThis->u32RtcMr); 448 pHlp->pfnSSMGetU32( pSSM, &pThis->u32RtcLr); 449 pHlp->pfnSSMGetBool(pSSM, &pThis->fRtcStarted); 450 pHlp->pfnSSMGetBool(pSSM, &pThis->fRtcIrqMasked); 451 pHlp->pfnSSMGetBool(pSSM, &pThis->fRtcIrqSts); 452 453 /* The marker. */ 454 uint32_t u32; 455 rc = pHlp->pfnSSMGetU32(pSSM, &u32); 456 AssertRCReturn(rc, rc); 457 AssertMsgReturn(u32 == UINT32_MAX, ("%#x\n", u32), VERR_SSM_DATA_UNIT_FORMAT_CHANGED); 458 459 return VINF_SUCCESS; 460 } 461 462 463 /** 464 * @callback_method_impl{FNSSMDEVLOADDONE} 465 */ 466 static DECLCALLBACK(int) pl031R3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 467 { 468 PDEVPL031 pThis = PDMDEVINS_2_DATA(pDevIns, PDEVPL031); 469 470 RT_NOREF(pSSM); 471 int rc = VINF_SUCCESS; 472 if (pThis->fRtcStarted) 418 473 { 419 rc = VERR_NOT_IMPLEMENTED; 420 AssertRCReturn(rc, rc); 474 PDMDevHlpTimerLockClock(pDevIns, pThis->hTimerSecond, VERR_IGNORED); 475 rc = PDMDevHlpTimerSetMillies(pDevIns, pThis->hTimerSecond, RT_MS_1SEC); 476 PDMDevHlpTimerUnlockClock(pDevIns, pThis->hTimerSecond); 421 477 } 422 423 if (uPass == SSM_PASS_FINAL) 424 { 425 /* The marker. */ 426 uint32_t u32; 427 rc = pHlp->pfnSSMGetU32(pSSM, &u32); 428 AssertRCReturn(rc, rc); 429 AssertMsgReturn(u32 == UINT32_MAX, ("%#x\n", u32), VERR_SSM_DATA_UNIT_FORMAT_CHANGED); 430 } 431 432 /* 433 * Check the config. 434 */ 435 if ( pThis->u16Irq != u16Irq 436 || pThis->GCPhysMmioBase != GCPhysMmioBase) 437 return pHlp->pfnSSMSetCfgError(pSSM, RT_SRC_POS, 438 N_("Config mismatch - saved Irq=%#x GCPhysMmioBase=%#RGp; configured Irq=%#x GCPhysMmioBase=%#RGp"), 439 u16Irq, GCPhysMmioBase, pThis->u16Irq, pThis->GCPhysMmioBase); 440 441 return VINF_SUCCESS; 442 } 443 444 445 /** 446 * @callback_method_impl{FNSSMDEVLOADDONE} 447 */ 448 static DECLCALLBACK(int) pl031R3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 449 { 450 PDEVPL031 pThis = PDMDEVINS_2_DATA(pDevIns, PDEVPL031); 451 PDEVPL031CC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PDEVPL031CC); 452 453 RT_NOREF(pThis, pThisCC, pSSM); 454 return VERR_NOT_IMPLEMENTED; 478 else 479 PDMDevHlpTimerStop(pDevIns, pThis->hTimerSecond); 480 481 return rc; 455 482 } 456 483 … … 471 498 pThis->fRtcIrqMasked = false; 472 499 pThis->fRtcIrqSts = false; 500 PDMDevHlpTimerStop(pDevIns, pThis->hTimerSecond); 473 501 474 502 if (pThis->fLoadTime)
Note:
See TracChangeset
for help on using the changeset viewer.