Changeset 60804 in vbox for trunk/src/VBox/VMM/VMMRC
- Timestamp:
- May 3, 2016 2:13:51 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 107007
- Location:
- trunk/src/VBox/VMM/VMMRC
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp
r60307 r60804 506 506 switch (enmType) 507 507 { 508 case PDMAPICIRQ_UPDATE_PENDING: 509 VMCPU_FF_SET(pVCpu, VMCPU_FF_UPDATE_APIC); 510 break; 508 511 case PDMAPICIRQ_HARDWARE: 509 512 VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC); … … 542 545 case PDMAPICIRQ_HARDWARE: 543 546 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); 544 551 break; 545 552 case PDMAPICIRQ_EXTINT: -
trunk/src/VBox/VMM/VMMRC/TRPMRCHandlers.cpp
r60740 r60804 214 214 if ( rc == VINF_SUCCESS 215 215 && ( 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 222 221 ) 223 222 ) … … 227 226 if (RT_UNLIKELY(VM_FF_IS_PENDING(pVM, VM_FF_PGM_NO_MEMORY))) 228 227 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 259 229 { 260 230 #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)) 263 233 APICUpdatePendingInterrupts(pVCpu); 264 234 #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)) 269 237 { 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; 283 240 } 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 ) 286 265 { 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)); 289 293 } 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 { 298 299 #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)); 302 303 #else 303 rc = VINF_PGM_SYNC_CR3;304 rc = VINF_PGM_SYNC_CR3; 304 305 #endif 306 } 305 307 } 306 308 }
Note:
See TracChangeset
for help on using the changeset viewer.