Changeset 66700 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Apr 27, 2017 4:48:12 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 115094
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/HMSVMAll.cpp
r66604 r66700 216 216 { 217 217 if (fIemXcptFlags & IEM_XCPT_FLAGS_T_CPU_XCPT) 218 { 219 if (uVector != X86_XCPT_NMI) 220 return SVM_EVENT_EXCEPTION; 221 return SVM_EVENT_NMI; 222 } 223 224 /* See AMD spec. Table 15-1. "Guest Exception or Interrupt Types". */ 225 if (fIemXcptFlags & (IEM_XCPT_FLAGS_BP_INSTR | IEM_XCPT_FLAGS_ICEBP_INSTR | IEM_XCPT_FLAGS_OF_INSTR)) 218 226 return SVM_EVENT_EXCEPTION; 227 219 228 if (fIemXcptFlags & IEM_XCPT_FLAGS_T_EXT_INT) 220 return uVector != X86_XCPT_NMI ? SVM_EVENT_EXTERNAL_IRQ : SVM_EVENT_NMI; 229 return SVM_EVENT_EXTERNAL_IRQ; 230 221 231 if (fIemXcptFlags & IEM_XCPT_FLAGS_T_SOFT_INT) 222 232 return SVM_EVENT_SOFTWARE_INT; 233 223 234 AssertMsgFailed(("hmSvmEventTypeFromIemEvent: Invalid IEM xcpt/int. type %#x, uVector=%#x\n", fIemXcptFlags, uVector)); 224 235 return UINT8_MAX; … … 506 517 */ 507 518 PCSVMEVENT pEventInject = &pVmcbCtrl->EventInject; 519 pCtx->hwvirt.svm.fInterceptEvents = !pEventInject->n.u1Valid; 508 520 if (pEventInject->n.u1Valid) 509 521 { … … 588 600 || uExitCode == SVM_EXIT_INVALID) 589 601 { 590 RT_NOREF(pVCpu);591 592 602 /* 593 603 * Disable the global interrupt flag to prevent interrupts during the 'atomic' world switch. … … 1000 1010 * we need 3 extra bits beyond the second 4K page. 1001 1011 */ 1012 static const uint16_t s_auSizeMasks[] = { 0, 1, 3, 0, 0xf, 0, 0, 0 }; 1002 1013 uint8_t const *pbIopm = (uint8_t *)pCtx->hwvirt.svm.CTX_SUFF(pvIoBitmap); 1003 1014 1004 1015 uint16_t const u16Port = pIoExitInfo->n.u16Port; 1005 1016 uint16_t const offIopm = u16Port >> 3; 1006 uint16_t const fSizeMask = pIoExitInfo->n.u1OP32 ? 0xf : pIoExitInfo->n.u1OP16 ? 3 : 1;1017 uint16_t const fSizeMask = s_auSizeMasks[(pIoExitInfo->u >> SVM_IOIO_OP_SIZE_SHIFT) & 7]; 1007 1018 uint8_t const cShift = u16Port - (offIopm << 3); 1008 1019 uint16_t const fIopmMask = (1 << cShift) | (fSizeMask << cShift); 1009 1020 1010 1021 pbIopm += offIopm; 1011 uint16_t const fIopmBits= *(uint16_t *)pbIopm;1012 if ( fIopmBits& fIopmMask)1022 uint16_t const u16Iopm = *(uint16_t *)pbIopm; 1023 if (u16Iopm & fIopmMask) 1013 1024 return HMSvmNstGstVmExit(pVCpu, pCtx, SVM_EXIT_IOIO, pIoExitInfo->u, uNextRip); 1014 1025
Note:
See TracChangeset
for help on using the changeset viewer.