Changeset 60605 in vbox
- Timestamp:
- Apr 20, 2016 3:56:04 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 106747
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/APICAll.cpp
r60601 r60605 1481 1481 * @thread Any. 1482 1482 */ 1483 staticvoid apicHintTimerFreq(PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift)1483 void apicHintTimerFreq(PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift) 1484 1484 { 1485 1485 Assert(pApicCpu); 1486 Assert(TMTimerIsLockOwner(pApicCpu->CTX_SUFF(pTimer)));1487 1486 1488 1487 if ( pApicCpu->uHintedTimerInitialCount != uInitialCount -
trunk/src/VBox/VMM/VMMR3/APIC.cpp
r60602 r60605 632 632 633 633 /** 634 * Worker for loading per-VM APIC data. 635 * 636 * @returns VBox status code. 637 * @param pVM The cross context VM structure. 638 * @param pSSM The SSM handle. 639 */ 640 static int apicR3LoadVMData(PVM pVM, PSSMHANDLE pSSM) 641 { 642 PAPIC pApic = VM_TO_APIC(pVM); 643 644 /* Load and verify number of CPUs. */ 645 uint32_t cCpus; 646 int rc = SSMR3GetU32(pSSM, &cCpus); 647 AssertRCReturn(rc, rc); 648 if (cCpus != pVM->cCpus) 649 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - cCpus: saved=%u config=%u"), cCpus, pVM->cCpus); 650 651 /* Load and verify I/O APIC presence. */ 652 bool fIoApicPresent; 653 rc = SSMR3GetBool(pSSM, &fIoApicPresent); 654 AssertRCReturn(rc, rc); 655 if (fIoApicPresent != pApic->fIoApicPresent) 656 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - fIoApicPresent: saved=%RTbool config=%RTbool"), 657 fIoApicPresent, pApic->fIoApicPresent); 658 659 /* Load and verify configured APIC mode. */ 660 uint32_t uLegacyApicMode; 661 rc = SSMR3GetU32(pSSM, &uLegacyApicMode); 662 AssertRCReturn(rc, rc); 663 APICMODE const enmApicMode = apicR3ConvertFromLegacyApicMode((PDMAPICMODE)uLegacyApicMode); 664 if (enmApicMode != pApic->enmOriginalMode) 665 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - uApicMode: saved=%#x(%#x) config=%#x(%#x)"), 666 uLegacyApicMode, enmApicMode, apicR3ConvertToLegacyApicMode(pApic->enmOriginalMode), 667 pApic->enmOriginalMode); 668 return VINF_SUCCESS; 669 } 670 671 672 /** 634 673 * @copydoc FNSSMDEVLIVEEXEC 635 674 */ … … 671 710 /* Save the APIC page. */ 672 711 if (XAPIC_IN_X2APIC_MODE(pVCpu)) 673 SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPageR3, g_aX2ApicPageFields);712 SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPageR3, &g_aX2ApicPageFields[0]); 674 713 else 675 SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPageR3, g_aXApicPageFields);714 SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPageR3, &g_aXApicPageFields[0]); 676 715 677 716 /* Save the PIBs: In theory, we could push them to vIRR and avoid saving them here, but 678 717 with posted-interrupts we can't at this point as HM is paralyzed, so just save PIBs always. */ 679 SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPibR3, g_aApicPibFields);680 SSMR3PutStruct(pSSM, (const void *)&pApicCpu->ApicPibLevel, g_aApicPibFields);718 SSMR3PutStruct(pSSM, (const void *)pApicCpu->pvApicPibR3, &g_aApicPibFields[0]); 719 SSMR3PutStruct(pSSM, (const void *)&pApicCpu->ApicPibLevel, &g_aApicPibFields[0]); 681 720 682 721 /* Save the timer. */ 683 722 TMR3TimerSave(pApicCpu->pTimerR3, pSSM); 684 723 SSMR3PutU64(pSSM, pApicCpu->u64TimerInitial); 685 686 /** @todo anything else? */687 724 } 688 725 … … 703 740 /* Weed out invalid versions. */ 704 741 if ( uVersion != APIC_SAVED_STATE_VERSION 742 && uVersion != APIC_SAVED_STATE_VERSION_VBOX_50 705 743 && uVersion != APIC_SAVED_STATE_VERSION_VBOX_30 706 744 && uVersion != APIC_SAVED_STATE_VERSION_ANCIENT) … … 711 749 if (uVersion > APIC_SAVED_STATE_VERSION_VBOX_30) 712 750 { 713 /* Verify number of CPUs. */ 714 uint32_t cCpus; 715 int rc = SSMR3GetU32(pSSM, &cCpus); 716 AssertRCReturn(rc, rc); 717 if (cCpus != pVM->cCpus) 718 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - cCpus: saved=%u config=%u"), cCpus, pVM->cCpus); 719 720 /* Verify I/O APIC presence. */ 721 bool fIoApicPresent; 722 rc = SSMR3GetBool(pSSM, &fIoApicPresent); 723 AssertRCReturn(rc, rc); 724 if (fIoApicPresent != pApic->fIoApicPresent) 725 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - fIoApicPresent: saved=%RTbool config=%RTbool"), 726 fIoApicPresent, pApic->fIoApicPresent); 727 728 /* Verify configured APIC mode. */ 729 uint32_t uLegacyApicMode; 730 rc = SSMR3GetU32(pSSM, &uLegacyApicMode); 731 AssertRCReturn(rc, rc); 732 APICMODE const enmApicMode = apicR3ConvertFromLegacyApicMode((PDMAPICMODE)uLegacyApicMode); 733 if (enmApicMode != pApic->enmOriginalMode) 734 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - uApicMode: saved=%#x(%#x) config=%#x(%#x)"), 735 uLegacyApicMode, enmApicMode, apicR3ConvertToLegacyApicMode(pApic->enmOriginalMode), 736 pApic->enmOriginalMode); 751 int rc2 = apicR3LoadVMData(pVM, pSSM); 752 AssertRCReturn(rc2, rc2); 753 754 if (uVersion == APIC_SAVED_STATE_VERSION) 755 { /* Load any new additional per-VM data. */ } 756 } 757 758 if (uPass != SSM_PASS_FINAL) 759 return VINF_SUCCESS; 760 761 int rc = VINF_SUCCESS; 762 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++) 763 { 764 PVMCPU pVCpu = &pVM->aCpus[idCpu]; 765 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 737 766 738 767 if (uVersion == APIC_SAVED_STATE_VERSION) 739 768 { 740 /** @todo load any new additional per-VM data. */ 741 } 742 } 743 744 if (uPass != SSM_PASS_FINAL) 745 return VINF_SUCCESS; 746 747 int rc = VINF_SUCCESS; 748 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++) 749 { 750 PVMCPU pVCpu = &pVM->aCpus[idCpu]; 751 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 752 753 if (uVersion == APIC_SAVED_STATE_VERSION) 754 { 755 /** @todo load new per-VCPU data. */ 769 /* Load the auxiliary data. */ 770 SSMR3GetU64(pSSM, (uint64_t *)&pApicCpu->uApicBaseMsr); 771 SSMR3GetU32(pSSM, &pApicCpu->uEsrInternal); 772 773 /* Load the APIC page. */ 774 if (XAPIC_IN_X2APIC_MODE(pVCpu)) 775 SSMR3GetStruct(pSSM, (void *)pApicCpu->pvApicPageR3, &g_aX2ApicPageFields[0]); 776 else 777 SSMR3GetStruct(pSSM, (void *)pApicCpu->pvApicPageR3, &g_aXApicPageFields[0]); 778 779 /* Load the PIBs. */ 780 SSMR3GetStruct(pSSM, (void *)pApicCpu->pvApicPibR3, &g_aApicPibFields[0]); 781 SSMR3GetStruct(pSSM, (void *)&pApicCpu->ApicPibLevel, &g_aApicPibFields[0]); 782 783 /* Load the timer. */ 784 rc = TMR3TimerLoad(pApicCpu->pTimerR3, pSSM); AssertRCReturn(rc, rc); 785 rc = SSMR3GetU64(pSSM, &pApicCpu->u64TimerInitial); AssertRCReturn(rc, rc); 786 Assert(pApicCpu->uHintedTimerShift == 0); 787 Assert(pApicCpu->uHintedTimerInitialCount == 0); 788 if (TMTimerIsActive(pApicCpu->pTimerR3)) 789 { 790 PCXAPICPAGE pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu); 791 uint32_t const uInitialCount = pXApicPage->timer_icr.u32InitialCount; 792 uint8_t const uTimerShift = apicGetTimerShift(pXApicPage); 793 apicHintTimerFreq(pApicCpu, uInitialCount, uTimerShift); 794 } 756 795 } 757 796 else -
trunk/src/VBox/VMM/include/APICInternal.h
r60593 r60605 514 514 * @{ */ 515 515 /** The error status register's internal state. */ 516 uint32_t volatileuEsrInternal;516 uint32_t uEsrInternal; 517 517 /** The APIC base MSR.*/ 518 518 uint64_t volatile uApicBaseMsr; … … 626 626 const char *apicGetDestShorthandName(XAPICDESTSHORTHAND enmDestShorthand); 627 627 const char *apicGetTimerModeName(XAPICTIMERMODE enmTimerMode); 628 void apicHintTimerFreq(PAPICCPU pApicCpu, uint32_t uInitialCount, uint8_t uTimerShift); 628 629 629 630 VMMDECL(uint64_t) APICGetBaseMsr(PPDMDEVINS pDevIns, PVMCPU pVCpu);
Note:
See TracChangeset
for help on using the changeset viewer.