Changeset 73987 in vbox
- Timestamp:
- Aug 31, 2018 9:18:10 AM (6 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r73985 r73987 13418 13418 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 13419 13419 13420 /** @todo NSTVMX: Vmread. */13421 hmR0VmxSetPendingXcptUD(pVCpu);13422 return VINF_SUCCESS;13423 }13424 13425 13426 /**13427 * VM-exit handler for VMRESUME (VMX_EXIT_VMRESUME). Unconditional VM-exit.13428 */13429 HMVMX_EXIT_DECL hmR0VmxExitVmresume(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)13430 {13431 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);13432 13433 /** @todo NSTVMX: Vmresume. */13434 hmR0VmxSetPendingXcptUD(pVCpu);13435 return VINF_SUCCESS;13436 }13437 13438 13439 /**13440 * VM-exit handler for VMWRITE (VMX_EXIT_VMWRITE). Unconditional VM-exit.13441 */13442 HMVMX_EXIT_DECL hmR0VmxExitVmwrite(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)13443 {13444 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);13445 13446 13420 int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient); 13447 13421 rc |= hmR0VmxImportGuestState(pVCpu, CPUMCTX_EXTRN_SREG_MASK | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); … … 13480 13454 } 13481 13455 13482 VBOXSTRICTRC rcStrict = IEMExecDecodedVm write(pVCpu, &ExitInfo);13456 VBOXSTRICTRC rcStrict = IEMExecDecodedVmread(pVCpu, &ExitInfo); 13483 13457 if (RT_LIKELY(rcStrict == VINF_SUCCESS)) 13484 13458 ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS | HM_CHANGED_GUEST_HWVIRT); … … 13489 13463 } 13490 13464 return rcStrict; 13491 } 13492 13493 13494 /** 13495 * VM-exit handler for VMXOFF (VMX_EXIT_VMXOFF). Unconditional VM-exit. 13496 */ 13497 HMVMX_EXIT_DECL hmR0VmxExitVmxoff(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 13465 13466 13467 return VINF_SUCCESS; 13468 } 13469 13470 13471 /** 13472 * VM-exit handler for VMRESUME (VMX_EXIT_VMRESUME). Unconditional VM-exit. 13473 */ 13474 HMVMX_EXIT_DECL hmR0VmxExitVmresume(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 13498 13475 { 13499 13476 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 13500 13477 13501 int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient); 13502 rc |= hmR0VmxImportGuestState(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); 13503 AssertRCReturn(rc, rc); 13504 13505 HMVMX_CHECK_EXIT_DUE_TO_VMX_INSTR(pVCpu, pVmxTransient->uExitReason); 13506 13507 VBOXSTRICTRC rcStrict = IEMExecDecodedVmxoff(pVCpu, pVmxTransient->cbInstr); 13508 if (RT_LIKELY(rcStrict == VINF_SUCCESS)) 13509 { 13510 /* VMXOFF on success changes the internal hwvirt state but not anything that's visible to the guest. */ 13511 ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_HWVIRT); 13512 } 13513 else if (rcStrict == VINF_IEM_RAISED_XCPT) 13514 { 13515 ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK); 13516 rcStrict = VINF_SUCCESS; 13517 } 13518 return rcStrict; 13519 } 13520 13521 13522 /** 13523 * VM-exit handler for VMXON (VMX_EXIT_VMXON). Unconditional VM-exit. 13524 */ 13525 HMVMX_EXIT_DECL hmR0VmxExitVmxon(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 13478 /** @todo NSTVMX: Vmresume. */ 13479 hmR0VmxSetPendingXcptUD(pVCpu); 13480 return VINF_SUCCESS; 13481 } 13482 13483 13484 /** 13485 * VM-exit handler for VMWRITE (VMX_EXIT_VMWRITE). Unconditional VM-exit. 13486 */ 13487 HMVMX_EXIT_DECL hmR0VmxExitVmwrite(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 13526 13488 { 13527 13489 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); … … 13541 13503 ExitInfo.InstrInfo.u = pVmxTransient->ExitInstrInfo.u; 13542 13504 ExitInfo.cbInstr = pVmxTransient->cbInstr; 13505 if (!ExitInfo.InstrInfo.VmreadVmwrite.fIsRegOperand) 13506 { 13507 RTGCPTR GCPtrVal; 13508 VBOXSTRICTRC rcStrict = hmR0VmxDecodeMemOperand(pVCpu, &ExitInfo.InstrInfo, ExitInfo.u64Qual, false /* fIsDstOperand */, 13509 &GCPtrVal); 13510 if (rcStrict == VINF_SUCCESS) 13511 { /* likely */ } 13512 else if (rcStrict == VINF_HM_PENDING_XCPT) 13513 { 13514 Assert(pVCpu->hm.s.Event.fPending); 13515 Log4Func(("Memory operand decoding failed, raising xcpt %#x\n", 13516 VMX_ENTRY_INT_INFO_VECTOR(pVCpu->hm.s.Event.u64IntInfo))); 13517 return VINF_SUCCESS; 13518 } 13519 else 13520 { 13521 Log4Func(("hmR0VmxCheckExitDueToVmxInstr failed. rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 13522 return rcStrict; 13523 } 13524 ExitInfo.GCPtrEffAddr = GCPtrVal; 13525 } 13526 13527 VBOXSTRICTRC rcStrict = IEMExecDecodedVmwrite(pVCpu, &ExitInfo); 13528 if (RT_LIKELY(rcStrict == VINF_SUCCESS)) 13529 ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS | HM_CHANGED_GUEST_HWVIRT); 13530 else if (rcStrict == VINF_IEM_RAISED_XCPT) 13531 { 13532 ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK); 13533 rcStrict = VINF_SUCCESS; 13534 } 13535 return rcStrict; 13536 } 13537 13538 13539 /** 13540 * VM-exit handler for VMXOFF (VMX_EXIT_VMXOFF). Unconditional VM-exit. 13541 */ 13542 HMVMX_EXIT_DECL hmR0VmxExitVmxoff(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 13543 { 13544 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 13545 13546 int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient); 13547 rc |= hmR0VmxImportGuestState(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); 13548 AssertRCReturn(rc, rc); 13549 13550 HMVMX_CHECK_EXIT_DUE_TO_VMX_INSTR(pVCpu, pVmxTransient->uExitReason); 13551 13552 VBOXSTRICTRC rcStrict = IEMExecDecodedVmxoff(pVCpu, pVmxTransient->cbInstr); 13553 if (RT_LIKELY(rcStrict == VINF_SUCCESS)) 13554 { 13555 /* VMXOFF on success changes the internal hwvirt state but not anything that's visible to the guest. */ 13556 ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_HWVIRT); 13557 } 13558 else if (rcStrict == VINF_IEM_RAISED_XCPT) 13559 { 13560 ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK); 13561 rcStrict = VINF_SUCCESS; 13562 } 13563 return rcStrict; 13564 } 13565 13566 13567 /** 13568 * VM-exit handler for VMXON (VMX_EXIT_VMXON). Unconditional VM-exit. 13569 */ 13570 HMVMX_EXIT_DECL hmR0VmxExitVmxon(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient) 13571 { 13572 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 13573 13574 int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient); 13575 rc |= hmR0VmxImportGuestState(pVCpu, CPUMCTX_EXTRN_SREG_MASK | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); 13576 rc |= hmR0VmxReadExitInstrInfoVmcs(pVmxTransient); 13577 rc |= hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient); 13578 AssertRCReturn(rc, rc); 13579 13580 HMVMX_CHECK_EXIT_DUE_TO_VMX_INSTR(pVCpu, pVmxTransient->uExitReason); 13581 13582 VMXVEXITINFO ExitInfo; 13583 RT_ZERO(ExitInfo); 13584 ExitInfo.uReason = pVmxTransient->uExitReason; 13585 ExitInfo.u64Qual = pVmxTransient->uExitQual; 13586 ExitInfo.InstrInfo.u = pVmxTransient->ExitInstrInfo.u; 13587 ExitInfo.cbInstr = pVmxTransient->cbInstr; 13543 13588 13544 13589 RTGCPTR GCPtrVmxon;
Note:
See TracChangeset
for help on using the changeset viewer.

