Changeset 99576 in vbox
- Timestamp:
- May 3, 2023 10:24:27 AM (22 months ago)
- svn:sync-xref-src-repo-rev:
- 157093
- Location:
- trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/cpum-armv8.h
r99385 r99576 274 274 /** @name Guest Register Getters. 275 275 * @{ */ 276 VMMDECL(bool) CPUMGetGuestIrqMasked(PVMCPUCC pVCpu); 277 VMMDECL(bool) CPUMGetGuestFiqMasked(PVMCPUCC pVCpu); 276 278 VMMDECL(VBOXSTRICTRC) CPUMQueryGuestSysReg(PVMCPUCC pVCpu, uint32_t idSysReg, uint64_t *puValue); 279 /** @} */ 280 281 282 /** @name Guest Register Setters. 283 * @{ */ 277 284 VMMDECL(VBOXSTRICTRC) CPUMSetGuestSysReg(PVMCPUCC pVCpu, uint32_t idSysReg, uint64_t uValue); 278 285 /** @} */ -
trunk/include/VBox/vmm/vm.h
r99385 r99576 459 459 460 460 461 #if defined(VBOX_VMM_TARGET_ARMV8) 462 /** This action forces the VM to inject an IRQ into the guest. */ 463 # define VMCPU_FF_INTERRUPT_IRQ RT_BIT_64(VMCPU_FF_INTERRUPT_IRQ_BIT) 464 # define VMCPU_FF_INTERRUPT_IRQ_BIT 0 465 /** This action forces the VM to inject an FIQ into the guest. */ 466 # define VMCPU_FF_INTERRUPT_FIQ RT_BIT_64(VMCPU_FF_INTERRUPT_FIQ_BIT) 467 # define VMCPU_FF_INTERRUPT_FIQ_BIT 1 468 #else 461 469 /** This action forces the VM to check any pending interrupts on the APIC. */ 462 # define VMCPU_FF_INTERRUPT_APIC RT_BIT_64(VMCPU_FF_INTERRUPT_APIC_BIT)463 # define VMCPU_FF_INTERRUPT_APIC_BIT 0470 # define VMCPU_FF_INTERRUPT_APIC RT_BIT_64(VMCPU_FF_INTERRUPT_APIC_BIT) 471 # define VMCPU_FF_INTERRUPT_APIC_BIT 0 464 472 /** This action forces the VM to check any pending interrups on the PIC. */ 465 #define VMCPU_FF_INTERRUPT_PIC RT_BIT_64(VMCPU_FF_INTERRUPT_PIC_BIT) 466 #define VMCPU_FF_INTERRUPT_PIC_BIT 1 473 # define VMCPU_FF_INTERRUPT_PIC RT_BIT_64(VMCPU_FF_INTERRUPT_PIC_BIT) 474 # define VMCPU_FF_INTERRUPT_PIC_BIT 1 475 #endif 467 476 /** This action forces the VM to schedule and run pending timer (TM). 468 477 * @remarks Don't move - PATM compatibility. */ … … 581 590 | VM_FF_PDM_QUEUES | VM_FF_PDM_DMA | VM_FF_EMT_RENDEZVOUS ) 582 591 /** Externally forced VMCPU actions. Used to quit the idle/wait loop. */ 583 #define VMCPU_FF_EXTERNAL_HALTED_MASK ( VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC \ 592 #if defined(VBOX_VMM_TARGET_ARMV8) 593 # define VMCPU_FF_EXTERNAL_HALTED_MASK ( VMCPU_FF_INTERRUPT_IRQ | VMCPU_FF_INTERRUPT_FIQ \ 594 | VMCPU_FF_REQUEST | VMCPU_FF_INTERRUPT_NMI | VMCPU_FF_INTERRUPT_SMI \ 595 | VMCPU_FF_UNHALT | VMCPU_FF_TIMER | VMCPU_FF_DBGF ) 596 #else 597 # define VMCPU_FF_EXTERNAL_HALTED_MASK ( VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC \ 584 598 | VMCPU_FF_REQUEST | VMCPU_FF_INTERRUPT_NMI | VMCPU_FF_INTERRUPT_SMI \ 585 599 | VMCPU_FF_UNHALT | VMCPU_FF_TIMER | VMCPU_FF_DBGF \ 586 600 | VMCPU_FF_INTERRUPT_NESTED_GUEST) 601 #endif 587 602 588 603 /** High priority VM pre-execution actions. */ … … 591 606 | VM_FF_EMT_RENDEZVOUS ) 592 607 /** High priority VMCPU pre-execution actions. */ 593 #define VMCPU_FF_HIGH_PRIORITY_PRE_MASK ( VMCPU_FF_TIMER | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC \ 594 | VMCPU_FF_UPDATE_APIC | VMCPU_FF_DBGF \ 595 | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL \ 596 | VMCPU_FF_INTERRUPT_NESTED_GUEST | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_APIC_WRITE \ 597 | VMCPU_FF_VMX_PREEMPT_TIMER | VMCPU_FF_VMX_NMI_WINDOW | VMCPU_FF_VMX_INT_WINDOW ) 608 #if defined(VBOX_VMM_TARGET_ARMV8) 609 # define VMCPU_FF_HIGH_PRIORITY_PRE_MASK ( VMCPU_FF_TIMER | VMCPU_FF_INTERRUPT_IRQ | VMCPU_FF_INTERRUPT_FIQ \ 610 | VMCPU_FF_DBGF ) 611 #else 612 # define VMCPU_FF_HIGH_PRIORITY_PRE_MASK ( VMCPU_FF_TIMER | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC \ 613 | VMCPU_FF_UPDATE_APIC | VMCPU_FF_DBGF \ 614 | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL \ 615 | VMCPU_FF_INTERRUPT_NESTED_GUEST | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_APIC_WRITE \ 616 | VMCPU_FF_VMX_PREEMPT_TIMER | VMCPU_FF_VMX_NMI_WINDOW | VMCPU_FF_VMX_INT_WINDOW ) 617 #endif 598 618 599 619 /** High priority VM pre raw-mode execution mask. */ … … 636 656 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL | VMCPU_FF_DBGF | VMCPU_FF_VMX_MTF ) 637 657 #endif 658 659 #if !defined(VBOX_VMM_TARGET_ARMV8) 638 660 /** VMCPU flags that cause the REP[|NE|E] STRINS loops to yield, interrupts 639 661 * enabled. */ 640 # define VMCPU_FF_YIELD_REPSTR_MASK ( VMCPU_FF_HIGH_PRIORITY_POST_REPSTR_MASK \641 | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_PIC \642 | VMCPU_FF_INTERRUPT_NMI | VMCPU_FF_INTERRUPT_SMI | VMCPU_FF_PDM_CRITSECT \643 | VMCPU_FF_TIMER | VMCPU_FF_REQUEST \644 | VMCPU_FF_INTERRUPT_NESTED_GUEST )662 # define VMCPU_FF_YIELD_REPSTR_MASK ( VMCPU_FF_HIGH_PRIORITY_POST_REPSTR_MASK \ 663 | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_PIC \ 664 | VMCPU_FF_INTERRUPT_NMI | VMCPU_FF_INTERRUPT_SMI | VMCPU_FF_PDM_CRITSECT \ 665 | VMCPU_FF_TIMER | VMCPU_FF_REQUEST \ 666 | VMCPU_FF_INTERRUPT_NESTED_GUEST ) 645 667 /** VMCPU flags that cause the REP[|NE|E] STRINS loops to yield, interrupts 646 668 * disabled. */ 647 #define VMCPU_FF_YIELD_REPSTR_NOINT_MASK ( VMCPU_FF_YIELD_REPSTR_MASK \ 648 & ~( VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_PIC \ 649 | VMCPU_FF_INTERRUPT_NESTED_GUEST) ) 669 # define VMCPU_FF_YIELD_REPSTR_NOINT_MASK ( VMCPU_FF_YIELD_REPSTR_MASK \ 670 & ~( VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_PIC \ 671 | VMCPU_FF_INTERRUPT_NESTED_GUEST) ) 672 #endif 650 673 651 674 /** VM Flags that cause the HM loops to go back to ring-3. */ -
trunk/include/VBox/vmm/vmapi.h
r98644 r99576 463 463 VMMR3_INT_DECL(void) VMR3NotifyCpuFFU(PUVMCPU pUVMCpu, uint32_t fFlags); 464 464 VMMR3DECL(int) VMR3NotifyCpuDeviceReady(PVM pVM, VMCPUID idCpu); 465 VMMR3_INT_DECL(int) VMR3WaitHalted(PVM pVM, PVMCPU pVCpu, bool fIgnoreInterrupts); 465 466 /** @name Flags for VMR3WaitHalted. 467 * @{ */ 468 /** Flag whether to ignore interrupts. */ 469 #define VMWAITHALTED_F_IGNORE_IRQS RT_BIT_32(0) 470 #if defined(VBOX_VMM_TARGET_ARMV8) 471 /** Flag whether to ignore fast interrupts. */ 472 # define VMWAITHALTED_F_IGNORE_FIQS RT_BIT_32(1) 473 #endif 474 /** @} */ 475 VMMR3_INT_DECL(int) VMR3WaitHalted(PVM pVM, PVMCPU pVCpu, uint32_t fFlags); 476 466 477 VMMR3_INT_DECL(int) VMR3WaitU(PUVMCPU pUVMCpu); 467 478 VMMR3DECL(int) VMR3WaitForDeviceReady(PVM pVM, VMCPUID idCpu); -
trunk/src/VBox/VMM/VMMAll/CPUMAllRegs-armv8.cpp
r99051 r99576 46 46 #include <VBox/vmm/hm.h> 47 47 #include <VBox/vmm/tm.h> 48 49 #include <iprt/armv8.h> 48 50 #include <iprt/assert.h> 49 51 #include <iprt/asm.h> … … 99 101 AssertReleaseFailed(); /** @todo Exception level. */ 100 102 return pVCpu->cpum.s.Guest.aSpReg[0].u64; 103 } 104 105 106 /** 107 * Returns whether IRQs are currently masked. 108 * 109 * @returns true if IRQs are masked as indicated by the PState value. 110 * @param pVCpu The cross context virtual CPU structure. 111 */ 112 VMMDECL(bool) CPUMGetGuestIrqMasked(PVMCPUCC pVCpu) 113 { 114 CPUM_INT_ASSERT_NOT_EXTRN(pVCpu, CPUMCTX_EXTRN_PSTATE); 115 return RT_BOOL(pVCpu->cpum.s.Guest.fPState & ARMV8_SPSR_EL2_AARCH64_I); 116 } 117 118 119 /** 120 * Returns whether FIQs are currently masked. 121 * 122 * @returns true if FIQs are masked as indicated by the PState value. 123 * @param pVCpu The cross context virtual CPU structure. 124 */ 125 VMMDECL(bool) CPUMGetGuestFiqMasked(PVMCPUCC pVCpu) 126 { 127 CPUM_INT_ASSERT_NOT_EXTRN(pVCpu, CPUMCTX_EXTRN_PSTATE); 128 return RT_BOOL(pVCpu->cpum.s.Guest.fPState & ARMV8_SPSR_EL2_AARCH64_F); 101 129 } 102 130 -
trunk/src/VBox/VMM/VMMAll/PDMAll.cpp
r99051 r99576 46 46 47 47 48 48 #if !defined(VBOX_VMM_TARGET_ARMV8) 49 49 /** 50 50 * Gets the pending interrupt. … … 70 70 { 71 71 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC); 72 #if defined(VBOX_VMM_TARGET_ARMV8) 73 AssertReleaseFailed(); 74 #else 72 75 73 uint32_t uTagSrc; 76 74 rc = APICGetInterrupt(pVCpu, pu8Interrupt, &uTagSrc); … … 83 81 /* else if it's masked by TPR/PPR/whatever, go ahead checking the PIC. Such masked 84 82 interrupts shouldn't prevent ExtINT from being delivered. */ 85 #endif86 83 } 87 84 … … 121 118 return rc; 122 119 } 120 #endif 123 121 124 122 -
trunk/src/VBox/VMM/VMMR3/EM.cpp
r99220 r99576 2122 2122 /* check that we got them all */ 2123 2123 AssertCompile(VM_FF_HIGH_PRIORITY_PRE_MASK == (VM_FF_TM_VIRTUAL_SYNC | VM_FF_DBGF | VM_FF_CHECK_VM_STATE | VM_FF_DEBUG_SUSPEND | VM_FF_PGM_NEED_HANDY_PAGES | VM_FF_PGM_NO_MEMORY | VM_FF_EMT_RENDEZVOUS)); 2124 #if defined(VBOX_VMM_TARGET_ARMV8) 2125 AssertCompile(VMCPU_FF_HIGH_PRIORITY_PRE_MASK == (VMCPU_FF_TIMER | VMCPU_FF_INTERRUPT_IRQ | VMCPU_FF_INTERRUPT_FIQ | VMCPU_FF_DBGF)); 2126 #else 2124 2127 AssertCompile(VMCPU_FF_HIGH_PRIORITY_PRE_MASK == (VMCPU_FF_TIMER | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL | VMCPU_FF_DBGF | VMCPU_FF_INTERRUPT_NESTED_GUEST | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_PREEMPT_TIMER | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW)); 2128 #endif 2125 2129 } 2126 2130 … … 2673 2677 { 2674 2678 #if defined(VBOX_VMM_TARGET_ARMV8) 2675 AssertReleaseFailed(); 2679 if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_IRQ | VMCPU_FF_INTERRUPT_FIQ 2680 | VMCPU_FF_INTERRUPT_NMI | VMCPU_FF_INTERRUPT_SMI | VMCPU_FF_UNHALT)) 2681 { 2682 Log(("EMR3ExecuteVM: Triggering reschedule on pending IRQ after MWAIT\n")); 2683 rc = VINF_EM_RESCHEDULE; 2684 } 2676 2685 #else 2677 2686 if (VMCPU_FF_TEST_AND_CLEAR(pVCpu, VMCPU_FF_UPDATE_APIC)) 2678 2687 APICUpdatePendingInterrupts(pVCpu); 2679 #endif2680 2688 2681 2689 if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC … … 2686 2694 rc = VINF_EM_RESCHEDULE; 2687 2695 } 2696 #endif 2688 2697 } 2689 2698 } … … 2691 2700 { 2692 2701 #if defined(VBOX_VMM_TARGET_ARMV8) 2693 bool fIgnoreInterrupts = false;2694 AssertReleaseFailed();2702 uint32_t fWaitHalted = (CPUMGetGuestIrqMasked(pVCpu) ? VMWAITHALTED_F_IGNORE_IRQS : 0) 2703 | (CPUMGetGuestFiqMasked(pVCpu) ? VMWAITHALTED_F_IGNORE_FIQS : 0); 2695 2704 #else 2696 bool fIgnoreInterrupts = !(CPUMGetGuestEFlags(pVCpu) & X86_EFL_IF);2697 #endif 2698 rc = VMR3WaitHalted(pVM, pVCpu, f IgnoreInterrupts);2705 uint32_t fWaitHalted = (CPUMGetGuestEFlags(pVCpu) & X86_EFL_IF) ? 0 : VMWAITHALTED_F_IGNORE_IRQS; 2706 #endif 2707 rc = VMR3WaitHalted(pVM, pVCpu, fWaitHalted); 2699 2708 /* We're only interested in NMI/SMIs here which have their own FFs, so we don't need to 2700 2709 check VMCPU_FF_UPDATE_APIC here. */ -
trunk/src/VBox/VMM/VMMR3/NEMR3Native-darwin-armv8.cpp
r99575 r99576 1084 1084 return nemR3DarwinHandleExitException(pVM, pVCpu, pExit); 1085 1085 case HV_EXIT_REASON_VTIMER_ACTIVATED: 1086 /** @todo Set interrupt. */ 1086 1087 return VINF_EM_RESCHEDULE; 1087 1088 default: … … 1124 1125 { 1125 1126 #ifdef LOG_ENABLED 1127 bool fIrq = false; 1128 bool fFiq = false; 1129 1126 1130 if (LogIs3Enabled()) 1127 1131 nemR3DarwinLogState(pVM, pVCpu); … … 1132 1136 AssertRCReturn(rc, rc); 1133 1137 1134 LogFlowFunc(("Running vCPU\n")); 1138 /* Set the pending interrupt state. */ 1139 if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_IRQ | VMCPU_FF_INTERRUPT_FIQ)) 1140 { 1141 hv_return_t hrc = HV_SUCCESS; 1142 1143 if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_IRQ)) 1144 { 1145 hrc = hv_vcpu_set_pending_interrupt(pVCpu->nem.s.hVCpu, HV_INTERRUPT_TYPE_IRQ, true); 1146 AssertReturn(hrc == HV_SUCCESS, VERR_NEM_IPE_9); 1147 #ifdef LOG_ENABLED 1148 fIrq = true; 1149 #endif 1150 } 1151 1152 if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_FIQ)) 1153 { 1154 hrc = hv_vcpu_set_pending_interrupt(pVCpu->nem.s.hVCpu, HV_INTERRUPT_TYPE_FIQ, true); 1155 AssertReturn(hrc == HV_SUCCESS, VERR_NEM_IPE_9); 1156 #ifdef LOG_ENABLED 1157 fFiq = true; 1158 #endif 1159 } 1160 } 1161 else 1162 { 1163 hv_return_t hrc = hv_vcpu_set_pending_interrupt(pVCpu->nem.s.hVCpu, HV_INTERRUPT_TYPE_IRQ, false); 1164 AssertReturn(hrc == HV_SUCCESS, VERR_NEM_IPE_9); 1165 1166 hrc = hv_vcpu_set_pending_interrupt(pVCpu->nem.s.hVCpu, HV_INTERRUPT_TYPE_FIQ, false); 1167 AssertReturn(hrc == HV_SUCCESS, VERR_NEM_IPE_9); 1168 } 1169 1170 LogFlowFunc(("Running vCPU [%s,%s]\n", fIrq ? "I" : "nI", fFiq ? "F" : "nF")); 1135 1171 pVCpu->nem.s.fEventPending = false; 1136 1172 return VINF_SUCCESS; … … 1254 1290 || RT_FAILURE(rcStrict)) 1255 1291 fImport = CPUMCTX_EXTRN_ALL; 1256 else if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_ PIC | VMCPU_FF_INTERRUPT_APIC1292 else if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_INTERRUPT_IRQ | VMCPU_FF_INTERRUPT_FIQ 1257 1293 | VMCPU_FF_INTERRUPT_NMI | VMCPU_FF_INTERRUPT_SMI)) 1258 1294 fImport |= IEM_CPUMCTX_EXTRN_XCPT_MASK; -
trunk/src/VBox/VMM/VMMR3/PDM.cpp
r98122 r99576 1004 1004 { 1005 1005 PVMCPU pVCpu = pVM->apCpusR3[idCpu]; 1006 #if defined(VBOX_VMM_TARGET_ARMV8) 1007 SSMR3PutU32(pSSM, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_IRQ)); 1008 SSMR3PutU32(pSSM, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_FIQ)); 1009 #else 1006 1010 SSMR3PutU32(pSSM, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC)); 1007 1011 SSMR3PutU32(pSSM, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_PIC)); 1012 #endif 1008 1013 SSMR3PutU32(pSSM, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_NMI)); 1009 1014 SSMR3PutU32(pSSM, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_SMI)); … … 1034 1039 { 1035 1040 PVMCPU pVCpu = pVM->apCpusR3[idCpu]; 1041 #if defined(VBOX_VMM_TARGET_ARMV8) 1042 LogFlow(("pdmR3LoadPrep: VCPU %u %s%s\n", idCpu, 1043 VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_IRQ) ? " VMCPU_FF_INTERRUPT_IRQ" : "", 1044 VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_FIQ) ? " VMCPU_FF_INTERRUPT_FIQ" : "")); 1045 #else 1036 1046 LogFlow(("pdmR3LoadPrep: VCPU %u %s%s\n", idCpu, 1037 1047 VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC) ? " VMCPU_FF_INTERRUPT_APIC" : "", 1038 1048 VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_PIC) ? " VMCPU_FF_INTERRUPT_PIC" : "")); 1049 #endif 1039 1050 } 1040 1051 #endif … … 1052 1063 { 1053 1064 PVMCPU pVCpu = pVM->apCpusR3[idCpu]; 1065 #if defined(VBOX_VMM_TARGET_ARMV8) 1066 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_IRQ); 1067 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_FIQ); 1068 #else 1054 1069 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC); 1055 1070 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_PIC); 1071 #endif 1056 1072 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_NMI); 1057 1073 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_SMI); … … 1104 1120 PVMCPU pVCpu = pVM->apCpusR3[idCpu]; 1105 1121 1106 /* APIC interrupt */1122 /* APIC/IRQ interrupt */ 1107 1123 uint32_t fInterruptPending = 0; 1108 1124 rc = SSMR3GetU32(pSSM, &fInterruptPending); … … 1114 1130 return VERR_SSM_DATA_UNIT_FORMAT_CHANGED; 1115 1131 } 1132 #if defined(VBOX_VMM_TARGET_ARMV8) 1133 AssertLogRelMsg(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_IRQ), 1134 ("VCPU%03u: VMCPU_FF_INTERRUPT_IRQ set! Devices shouldn't set interrupts during state restore...\n", idCpu)); 1135 if (fInterruptPending) 1136 VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_IRQ); 1137 #else 1116 1138 AssertLogRelMsg(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC), 1117 1139 ("VCPU%03u: VMCPU_FF_INTERRUPT_APIC set! Devices shouldn't set interrupts during state restore...\n", idCpu)); 1118 1140 if (fInterruptPending) 1119 1141 VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC); 1120 1121 /* PIC interrupt */ 1142 #endif 1143 1144 /* PIC/FIQ interrupt */ 1122 1145 fInterruptPending = 0; 1123 1146 rc = SSMR3GetU32(pSSM, &fInterruptPending); … … 1129 1152 return VERR_SSM_DATA_UNIT_FORMAT_CHANGED; 1130 1153 } 1154 #if defined(VBOX_VMM_TARGET_ARMV8) 1155 AssertLogRelMsg(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_FIQ), 1156 ("VCPU%03u: VMCPU_FF_INTERRUPT_FIQ set! Devices shouldn't set interrupts during state restore...\n", idCpu)); 1157 if (fInterruptPending) 1158 VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_FIQ); 1159 #else 1131 1160 AssertLogRelMsg(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_PIC), 1132 1161 ("VCPU%03u: VMCPU_FF_INTERRUPT_PIC set! Devices shouldn't set interrupts during state restore...\n", idCpu)); 1133 1162 if (fInterruptPending) 1134 1163 VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_PIC); 1164 #endif 1135 1165 1136 1166 if (uVersion > PDM_SAVED_STATE_VERSION_PRE_NMI_FF) … … 1655 1685 VMMR3_INT_DECL(void) PDMR3ResetCpu(PVMCPU pVCpu) 1656 1686 { 1687 #if defined(VBOX_VMM_TARGET_ARMV8) 1688 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_IRQ); 1689 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_FIQ); 1690 #else 1657 1691 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC); 1658 1692 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_PIC); 1693 #endif 1659 1694 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_NMI); 1660 1695 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_SMI); -
trunk/src/VBox/VMM/VMMR3/VMEmt.cpp
r98103 r99576 1107 1107 * @param pVM The cross context VM structure. 1108 1108 * @param pVCpu The cross context virtual CPU structure. 1109 * @param f IgnoreInterrupts If set the VM_FF_INTERRUPT flags is ignored.1109 * @param fFlags Combination of VMWAITHALTED_F_XXX. 1110 1110 * @thread The emulation thread. 1111 1111 * @remarks Made visible for implementing vmsvga sync register. 1112 1112 * @internal 1113 1113 */ 1114 VMMR3_INT_DECL(int) VMR3WaitHalted(PVM pVM, PVMCPU pVCpu, bool fIgnoreInterrupts)1115 { 1116 LogFlow(("VMR3WaitHalted: f IgnoreInterrupts=%d\n", fIgnoreInterrupts));1114 VMMR3_INT_DECL(int) VMR3WaitHalted(PVM pVM, PVMCPU pVCpu, uint32_t fFlags) 1115 { 1116 LogFlow(("VMR3WaitHalted: fFlags=%#x\n", fFlags)); 1117 1117 1118 1118 /* 1119 1119 * Check Relevant FFs. 1120 1120 */ 1121 const uint32_t fMask = !fIgnoreInterrupts 1121 #if defined(VBOX_VMM_TARGET_ARMV8) 1122 const uint32_t fMaskInterrupts = ((fFlags & VMWAITHALTED_F_IGNORE_IRQS) ? VMCPU_FF_INTERRUPT_IRQ : 0) 1123 | ((fFlags & VMWAITHALTED_F_IGNORE_FIQS) ? VMCPU_FF_INTERRUPT_FIQ : 0); 1124 const uint32_t fMask = VMCPU_FF_EXTERNAL_HALTED_MASK & ~fMaskInterrupts; 1125 #else 1126 const uint32_t fMask = !(fFlags & VMWAITHALTED_F_IGNORE_IRQS) 1122 1127 ? VMCPU_FF_EXTERNAL_HALTED_MASK 1123 1128 : VMCPU_FF_EXTERNAL_HALTED_MASK & ~(VMCPU_FF_UPDATE_APIC | VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC); 1129 #endif 1130 1124 1131 if ( VM_FF_IS_ANY_SET(pVM, VM_FF_EXTERNAL_HALTED_MASK) 1125 1132 || VMCPU_FF_IS_ANY_SET(pVCpu, fMask)) -
trunk/src/VBox/VMM/VMMR3/VMM.cpp
r99385 r99576 2557 2557 c = 0; 2558 2558 f = fLocalForcedActions; 2559 #if defined(VBOX_VMM_TARGET_ARMV8) 2560 PRINT_FLAG(VMCPU_FF_,INTERRUPT_IRQ); 2561 PRINT_FLAG(VMCPU_FF_,INTERRUPT_FIQ); 2562 #else 2559 2563 PRINT_FLAG(VMCPU_FF_,INTERRUPT_APIC); 2560 2564 PRINT_FLAG(VMCPU_FF_,INTERRUPT_PIC); 2565 #endif 2561 2566 PRINT_FLAG(VMCPU_FF_,TIMER); 2562 2567 PRINT_FLAG(VMCPU_FF_,INTERRUPT_NMI);
Note:
See TracChangeset
for help on using the changeset viewer.