VirtualBox

Changeset 60804 in vbox for trunk/src/VBox/VMM/VMMRC


Ignore:
Timestamp:
May 3, 2016 2:13:51 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
107007
Message:

VMM: Introduced the new APIC update force-flag and relevant fixes, Win8.1 SMP boots now.
VMM/HMVMXR0: Fixed the HLT exit to use instruction length and also keep the INHIBIT force-flag
more in sync with the VT-x's guest-interruptibility state.

Location:
trunk/src/VBox/VMM/VMMRC
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp

    r60307 r60804  
    506506    switch (enmType)
    507507    {
     508        case PDMAPICIRQ_UPDATE_PENDING:
     509            VMCPU_FF_SET(pVCpu, VMCPU_FF_UPDATE_APIC);
     510            break;
    508511        case PDMAPICIRQ_HARDWARE:
    509512            VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC);
     
    542545        case PDMAPICIRQ_HARDWARE:
    543546            VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC);
     547            break;
     548        case PDMAPICIRQ_UPDATE_PENDING:
     549            VMCPU_ASSERT_EMT_OR_NOT_RUNNING(pVCpu);
     550            VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_UPDATE_APIC);
    544551            break;
    545552        case PDMAPICIRQ_EXTINT:
  • trunk/src/VBox/VMM/VMMRC/TRPMRCHandlers.cpp

    r60740 r60804  
    214214    if (    rc == VINF_SUCCESS
    215215        &&  (   VM_FF_IS_PENDING(pVM, VM_FF_TM_VIRTUAL_SYNC | VM_FF_REQUEST | VM_FF_PGM_NO_MEMORY | VM_FF_PDM_DMA)
    216              || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_TIMER | VMCPU_FF_TO_R3 | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC
    217                                           | VMCPU_FF_REQUEST | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL
    218                                           | VMCPU_FF_PDM_CRITSECT
    219                                           | VMCPU_FF_IEM
    220                                           | VMCPU_FF_SELM_SYNC_GDT | VMCPU_FF_SELM_SYNC_LDT
    221                                           | VMCPU_FF_SELM_SYNC_TSS | VMCPU_FF_TRPM_SYNC_IDT
     216             || VMCPU_FF_IS_PENDING(pVCpu,  VMCPU_FF_TIMER         | VMCPU_FF_TO_R3
     217                                          | VMCPU_FF_UPDATE_APIC   | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC
     218                                          | VMCPU_FF_REQUEST       | VMCPU_FF_PGM_SYNC_CR3   | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL
     219                                          | VMCPU_FF_PDM_CRITSECT  | VMCPU_FF_IEM            | VMCPU_FF_SELM_SYNC_GDT
     220                                          | VMCPU_FF_SELM_SYNC_LDT | VMCPU_FF_SELM_SYNC_TSS  | VMCPU_FF_TRPM_SYNC_IDT
    222221                                   )
    223222            )
     
    227226        if (RT_UNLIKELY(VM_FF_IS_PENDING(pVM, VM_FF_PGM_NO_MEMORY)))
    228227            rc = VINF_EM_NO_MEMORY;
    229         /* Pending Ring-3 action. */
    230         else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_TO_R3 | VMCPU_FF_PDM_CRITSECT | VMCPU_FF_IEM))
    231         {
    232             VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_TO_R3);
    233             rc = VINF_EM_RAW_TO_R3;
    234         }
    235         /* Pending timer action. */
    236         else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_TIMER))
    237             rc = VINF_EM_RAW_TIMER_PENDING;
    238         /* The Virtual Sync clock has stopped. */
    239         else if (VM_FF_IS_PENDING(pVM, VM_FF_TM_VIRTUAL_SYNC))
    240             rc = VINF_EM_RAW_TO_R3;
    241         /* DMA work pending? */
    242         else if (VM_FF_IS_PENDING(pVM, VM_FF_PDM_DMA))
    243             rc = VINF_EM_RAW_TO_R3;
    244         /* Pending request packets might contain actions that need immediate
    245            attention, such as pending hardware interrupts. */
    246         else if (   VM_FF_IS_PENDING(pVM, VM_FF_REQUEST)
    247                  || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_REQUEST))
    248             rc = VINF_EM_PENDING_REQUEST;
    249         /* Pending GDT/LDT/TSS sync. */
    250         else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_SELM_SYNC_GDT | VMCPU_FF_SELM_SYNC_LDT | VMCPU_FF_SELM_SYNC_TSS))
    251             rc = VINF_SELM_SYNC_GDT;
    252         else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_TRPM_SYNC_IDT))
    253             rc = VINF_EM_RAW_TO_R3;
    254         /* Possibly pending interrupt: dispatch it. */
    255         else if (    VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)
    256                  && !VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS)
    257                  &&  PATMAreInterruptsEnabledByCtx(pVM, CPUMCTX_FROM_CORE(pRegFrame))
    258            )
     228        else
    259229        {
    260230#ifdef VBOX_WITH_NEW_APIC
    261             /* The EFLAGS are checked in TRPMForwardTrap() below. */
    262             if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_APIC))
     231            /* APIC needs updating. */
     232            if (VMCPU_FF_TEST_AND_CLEAR(pVCpu, VMCPU_FF_UPDATE_APIC))
    263233                APICUpdatePendingInterrupts(pVCpu);
    264234#endif
    265             uint8_t u8Interrupt;
    266             rc = PDMGetInterrupt(pVCpu, &u8Interrupt);
    267             Log(("trpmGCExitTrap: u8Interrupt=%d (%#x) rc=%Rrc\n", u8Interrupt, u8Interrupt, rc));
    268             if (RT_SUCCESS(rc))
     235            /* Pending Ring-3 action. */
     236            if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_TO_R3 | VMCPU_FF_PDM_CRITSECT | VMCPU_FF_IEM))
    269237            {
    270                 rc = TRPMForwardTrap(pVCpu, pRegFrame, (uint32_t)u8Interrupt, 0, TRPM_TRAP_NO_ERRORCODE, TRPM_HARDWARE_INT, uOldActiveVector);
    271                 /* can't return if successful */
    272                 Assert(rc != VINF_SUCCESS);
    273 
    274                 /* Stop the profile counter that was started in TRPMRCHandlersA.asm */
    275                 Assert(uOldActiveVector <= 16);
    276                 STAM_PROFILE_ADV_STOP(&pVM->trpm.s.aStatGCTraps[uOldActiveVector], a);
    277 
    278                 /* Assert the trap and go to the recompiler to dispatch it. */
    279                 TRPMAssertTrap(pVCpu, u8Interrupt, TRPM_HARDWARE_INT);
    280 
    281                 STAM_PROFILE_ADV_START(&pVM->trpm.s.aStatGCTraps[uOldActiveVector], a);
    282                 rc = VINF_EM_RAW_INTERRUPT_PENDING;
     238                VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_TO_R3);
     239                rc = VINF_EM_RAW_TO_R3;
    283240            }
    284             else if (   rc == VERR_APIC_INTR_MASKED_BY_TPR  /* Can happen if TPR is too high for the newly arrived interrupt. */
    285                      || rc == VERR_NO_DATA)                 /* Can happen if the APIC is disabled. */
     241            /* Pending timer action. */
     242            else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_TIMER))
     243                rc = VINF_EM_RAW_TIMER_PENDING;
     244            /* The Virtual Sync clock has stopped. */
     245            else if (VM_FF_IS_PENDING(pVM, VM_FF_TM_VIRTUAL_SYNC))
     246                rc = VINF_EM_RAW_TO_R3;
     247            /* DMA work pending? */
     248            else if (VM_FF_IS_PENDING(pVM, VM_FF_PDM_DMA))
     249                rc = VINF_EM_RAW_TO_R3;
     250            /* Pending request packets might contain actions that need immediate
     251               attention, such as pending hardware interrupts. */
     252            else if (   VM_FF_IS_PENDING(pVM, VM_FF_REQUEST)
     253                     || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_REQUEST))
     254                rc = VINF_EM_PENDING_REQUEST;
     255            /* Pending GDT/LDT/TSS sync. */
     256            else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_SELM_SYNC_GDT | VMCPU_FF_SELM_SYNC_LDT | VMCPU_FF_SELM_SYNC_TSS))
     257                rc = VINF_SELM_SYNC_GDT;
     258            else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_TRPM_SYNC_IDT))
     259                rc = VINF_EM_RAW_TO_R3;
     260            /* Possibly pending interrupt: dispatch it. */
     261            else if (    VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC)
     262                     && !VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS)
     263                     &&  PATMAreInterruptsEnabledByCtx(pVM, CPUMCTX_FROM_CORE(pRegFrame))
     264               )
    286265            {
    287                 STAM_PROFILE_ADV_STOP(&pVM->trpm.s.aStatGCTraps[uOldActiveVector], a);
    288                 rc = VINF_SUCCESS;
     266                uint8_t u8Interrupt;
     267                rc = PDMGetInterrupt(pVCpu, &u8Interrupt);
     268                Log(("trpmGCExitTrap: u8Interrupt=%d (%#x) rc=%Rrc\n", u8Interrupt, u8Interrupt, rc));
     269                if (RT_SUCCESS(rc))
     270                {
     271                    rc = TRPMForwardTrap(pVCpu, pRegFrame, (uint32_t)u8Interrupt, 0, TRPM_TRAP_NO_ERRORCODE, TRPM_HARDWARE_INT, uOldActiveVector);
     272                    /* can't return if successful */
     273                    Assert(rc != VINF_SUCCESS);
     274
     275                    /* Stop the profile counter that was started in TRPMRCHandlersA.asm */
     276                    Assert(uOldActiveVector <= 16);
     277                    STAM_PROFILE_ADV_STOP(&pVM->trpm.s.aStatGCTraps[uOldActiveVector], a);
     278
     279                    /* Assert the trap and go to the recompiler to dispatch it. */
     280                    TRPMAssertTrap(pVCpu, u8Interrupt, TRPM_HARDWARE_INT);
     281
     282                    STAM_PROFILE_ADV_START(&pVM->trpm.s.aStatGCTraps[uOldActiveVector], a);
     283                    rc = VINF_EM_RAW_INTERRUPT_PENDING;
     284                }
     285                else if (   rc == VERR_APIC_INTR_MASKED_BY_TPR  /* Can happen if TPR is too high for the newly arrived interrupt. */
     286                         || rc == VERR_NO_DATA)                 /* Can happen if the APIC is disabled. */
     287                {
     288                    STAM_PROFILE_ADV_STOP(&pVM->trpm.s.aStatGCTraps[uOldActiveVector], a);
     289                    rc = VINF_SUCCESS;
     290                }
     291                else
     292                    AssertFatalMsgRC(rc, ("PDMGetInterrupt failed. rc=%Rrc\n", rc));
    289293            }
    290             else
    291                 AssertFatalMsgRC(rc, ("PDMGetInterrupt failed. rc=%Rrc\n", rc));
    292         }
    293         /*
    294          * Try sync CR3?
    295          */
    296         else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL))
    297         {
     294            /*
     295             * Try sync CR3?
     296             */
     297            else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL))
     298            {
    298299#if 1
    299             PGMRZDynMapReleaseAutoSet(pVCpu);
    300             PGMRZDynMapStartAutoSet(pVCpu);
    301             rc = PGMSyncCR3(pVCpu, CPUMGetGuestCR0(pVCpu), CPUMGetGuestCR3(pVCpu), CPUMGetGuestCR4(pVCpu), VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
     300                PGMRZDynMapReleaseAutoSet(pVCpu);
     301                PGMRZDynMapStartAutoSet(pVCpu);
     302                rc = PGMSyncCR3(pVCpu, CPUMGetGuestCR0(pVCpu), CPUMGetGuestCR3(pVCpu), CPUMGetGuestCR4(pVCpu), VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
    302303#else
    303             rc = VINF_PGM_SYNC_CR3;
     304                rc = VINF_PGM_SYNC_CR3;
    304305#endif
     306            }
    305307        }
    306308    }
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