VirtualBox

Changeset 70408 in vbox for trunk/src


Ignore:
Timestamp:
Jan 2, 2018 4:56:56 AM (7 years ago)
Author:
vboxsync
Message:

VMM/HMSVMR0: Clean up.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp

    r70380 r70408  
    343343static FNSVMEXITHANDLER hmR0SvmExitXcptAC;
    344344static FNSVMEXITHANDLER hmR0SvmExitXcptBP;
     345static FNSVMEXITHANDLER hmR0SvmExitXcptGeneric;
    345346#ifdef VBOX_WITH_NESTED_HWVIRT
    346347static FNSVMEXITHANDLER hmR0SvmExitXcptPFNested;
     
    351352static FNSVMEXITHANDLER hmR0SvmExitInvlpga;
    352353static FNSVMEXITHANDLER hmR0SvmExitVmrun;
    353 static FNSVMEXITHANDLER hmR0SvmExitXcptGeneric;
    354354static FNSVMEXITHANDLER hmR0SvmNestedExitXcptDB;
    355355static FNSVMEXITHANDLER hmR0SvmNestedExitXcptBP;
     
    822822        AssertMsgReturn(pVmcb, ("Invalid pVmcb for vcpu[%u]\n", i), VERR_SVM_INVALID_PVMCB);
    823823
    824        /* Initialize the #VMEXIT history array with end-of-array markers (UINT16_MAX). */
     824        /* Initialize the #VMEXIT history array with end-of-array markers (UINT16_MAX). */
    825825        Assert(!pVCpu->hm.s.idxExitHistoryFree);
    826826        HMCPU_EXIT_HISTORY_RESET(pVCpu);
     
    35323532#ifdef VBOX_WITH_NESTED_HWVIRT
    35333533        /*
    3534          * If IEM emulated VMRUN and injected an event it would not clear the EVENTINJ::Valid bit
     3534         * If IEM emulated VMRUN and injected an event, it would not clear the EVENTINJ::Valid bit
    35353535         * as a physical CPU clears it in the VMCB as part of the #VMEXIT (if the AMD spec. is to
    35363536         * believed, real behavior might differ). Regardless, IEM does it only on #VMEXIT for now
     
    51245124                    if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, uVector))
    51255125                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
    5126 #if 0
    5127                     /* Debugging DOS6 triple-fault nested-VM. */
    5128                     unsigned    cbInstr;
    5129                     DISCPUSTATE Dis;
    5130                     int rc = EMInterpretDisasCurrent(pVCpu->CTX_SUFF(pVM), pVCpu, &Dis, &cbInstr);
    5131                     if (RT_SUCCESS(rc))
    5132                     {
    5133                         RT_NOREF(cbInstr);
    5134                         if (   Dis.pCurInstr->uOpcode == OP_IRET
    5135                             && uVector == X86_XCPT_GP)
    5136                         {
    5137                             Log4(("#GP on IRET detected!\n"));
    5138                             return VERR_SVM_UNKNOWN_EXIT;
    5139                         }
    5140                     }
    5141                     else
    5142                         Log4(("hmR0SvmExitXcptGeneric: failed to disassemble instr. rc=%Rrc\n", rc));
    5143 #endif
    51445126                    return hmR0SvmExitXcptGeneric(pVCpu, pCtx, pSvmTransient);
    51455127                }
     
    52775259     * normal workloads (for some definition of "normal").
    52785260     */
    5279     uint32_t u32ExitCode = pSvmTransient->u64ExitCode;
    5280     switch (pSvmTransient->u64ExitCode)
     5261    uint64_t const uExitCode = pSvmTransient->u64ExitCode;
     5262    switch (uExitCode)
    52815263    {
    52825264        case SVM_EXIT_NPF:
     
    54505432                case SVM_EXIT_EXCEPTION_26: case SVM_EXIT_EXCEPTION_27: case SVM_EXIT_EXCEPTION_28:
    54515433                case SVM_EXIT_EXCEPTION_29: case SVM_EXIT_EXCEPTION_30: case SVM_EXIT_EXCEPTION_31:
    5452                 {
    5453                     /** @todo r=ramshankar; We should be doing
    5454                      *        HMSVM_CHECK_EXIT_DUE_TO_EVENT_DELIVERY here! */
    5455                     PSVMVMCB pVmcb   = pVCpu->hm.s.svm.pVmcb;
    5456                     SVMEVENT Event;
    5457                     Event.u          = 0;
    5458                     Event.n.u1Valid  = 1;
    5459                     Event.n.u3Type   = SVM_EVENT_EXCEPTION;
    5460                     Event.n.u8Vector = pSvmTransient->u64ExitCode - SVM_EXIT_EXCEPTION_0;
    5461 
    5462                     switch (Event.n.u8Vector)
    5463                     {
    5464                         case X86_XCPT_DE:
    5465                             STAM_COUNTER_INC(&pVCpu->hm.s.StatExitGuestDE);
    5466                             break;
    5467 
    5468                         case X86_XCPT_NP:
    5469                             Event.n.u1ErrorCodeValid    = 1;
    5470                             Event.n.u32ErrorCode        = pVmcb->ctrl.u64ExitInfo1;
    5471                             STAM_COUNTER_INC(&pVCpu->hm.s.StatExitGuestNP);
    5472                             break;
    5473 
    5474                         case X86_XCPT_SS:
    5475                             Event.n.u1ErrorCodeValid    = 1;
    5476                             Event.n.u32ErrorCode        = pVmcb->ctrl.u64ExitInfo1;
    5477                             STAM_COUNTER_INC(&pVCpu->hm.s.StatExitGuestSS);
    5478                             break;
    5479 
    5480                         case X86_XCPT_GP:
    5481                             Event.n.u1ErrorCodeValid    = 1;
    5482                             Event.n.u32ErrorCode        = pVmcb->ctrl.u64ExitInfo1;
    5483                             STAM_COUNTER_INC(&pVCpu->hm.s.StatExitGuestGP);
    5484                             break;
    5485 
    5486                         default:
    5487                             AssertMsgFailed(("hmR0SvmHandleExit: Unexpected exit caused by exception %#x\n", Event.n.u8Vector));
    5488                             pVCpu->hm.s.u32HMError = Event.n.u8Vector;
    5489                             return VERR_SVM_UNEXPECTED_XCPT_EXIT;
    5490                     }
    5491 
    5492                     Log4(("#Xcpt: Vector=%#x at CS:RIP=%04x:%RGv\n", Event.n.u8Vector, pCtx->cs.Sel, (RTGCPTR)pCtx->rip));
    5493                     hmR0SvmSetPendingEvent(pVCpu, &Event, 0 /* GCPtrFaultAddress */);
    5494                     return VINF_SUCCESS;
    5495                 }
     5434                    return hmR0SvmExitXcptGeneric(pVCpu, pCtx, pSvmTransient);
    54965435#endif  /* HMSVM_ALWAYS_TRAP_ALL_XCPTS */
    54975436
    54985437                default:
    54995438                {
    5500                     AssertMsgFailed(("hmR0SvmHandleExit: Unknown exit code %#x\n", u32ExitCode));
    5501                     pVCpu->hm.s.u32HMError = u32ExitCode;
     5439                    AssertMsgFailed(("hmR0SvmHandleExit: Unknown exit code %#RX64\n", uExitCode));
     5440                    pVCpu->hm.s.u32HMError = uExitCode;
    55025441                    return VERR_SVM_UNKNOWN_EXIT;
    55035442                }
     
    74607399
    74617400
     7401/**
     7402 * \#VMEXIT handler for generic exceptions. Conditional \#VMEXIT.
     7403 */
     7404HMSVM_EXIT_DECL hmR0SvmExitXcptGeneric(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient)
     7405{
     7406    HMSVM_VALIDATE_EXIT_HANDLER_PARAMS();
     7407
     7408    HMSVM_CHECK_EXIT_DUE_TO_EVENT_DELIVERY();
     7409
     7410    PSVMVMCB pVmcb = hmR0SvmGetCurrentVmcb(pVCpu, pCtx);
     7411    uint8_t const  uVector  = pVmcb->ctrl.u64ExitCode - SVM_EXIT_EXCEPTION_0;
     7412    uint32_t const uErrCode = pVmcb->ctrl.u64ExitInfo1;
     7413    Assert(pSvmTransient->u64ExitCode == pVmcb->ctrl.u64ExitCode);
     7414    Assert(uVector <= X86_XCPT_LAST);
     7415    Log4(("hmR0SvmExitXcptGeneric: uVector=%#x uErrCode=%u\n", uVector, uErrCode));
     7416
     7417
     7418    SVMEVENT Event;
     7419    Event.u          = 0;
     7420    Event.n.u1Valid  = 1;
     7421    Event.n.u3Type   = SVM_EVENT_EXCEPTION;
     7422    Event.n.u8Vector = uVector;
     7423    switch (uVector)
     7424    {
     7425        /* Shouldn't be here for reflecting #PFs (among other things, the fault address isn't passed along). */
     7426        case X86_XCPT_PF:   AssertMsgFailed(("hmR0SvmExitXcptGeneric: Unexpected exception")); return VERR_SVM_IPE_5;
     7427        case X86_XCPT_DF:
     7428        case X86_XCPT_TS:
     7429        case X86_XCPT_NP:
     7430        case X86_XCPT_SS:
     7431        case X86_XCPT_GP:
     7432        case X86_XCPT_AC:
     7433        {
     7434            Event.n.u1ErrorCodeValid = 1;
     7435            Event.n.u32ErrorCode     = uErrCode;
     7436            break;
     7437        }
     7438    }
     7439
     7440    hmR0SvmSetPendingEvent(pVCpu, &Event, 0 /* GCPtrFaultAddress */);
     7441    return VINF_SUCCESS;
     7442}
     7443
     7444
    74627445#ifdef VBOX_WITH_NESTED_HWVIRT
    74637446/**
     
    76467629
    76477630/**
    7648  * \#VMEXIT handler for generic exceptions. Conditional \#VMEXIT.
    7649  */
    7650 HMSVM_EXIT_DECL hmR0SvmExitXcptGeneric(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient)
    7651 {
    7652     HMSVM_VALIDATE_EXIT_HANDLER_PARAMS();
    7653 
    7654     /** @todo if triple-fault is returned in nested-guest scenario convert to a
    7655      *        shutdown VMEXIT. */
    7656     HMSVM_CHECK_EXIT_DUE_TO_EVENT_DELIVERY();
    7657 
    7658     PSVMVMCB pVmcb = hmR0SvmGetCurrentVmcb(pVCpu, pCtx);
    7659     uint8_t const  uVector  = pVmcb->ctrl.u64ExitCode - SVM_EXIT_EXCEPTION_0;
    7660     uint32_t const uErrCode = pVmcb->ctrl.u64ExitInfo1;
    7661     Assert(pSvmTransient->u64ExitCode == pVmcb->ctrl.u64ExitCode);
    7662     Assert(uVector <= X86_XCPT_LAST);
    7663     Log4(("hmR0SvmExitXcptGeneric: uVector=%#x uErrCode=%u\n", uVector, uErrCode));
    7664 
    7665     SVMEVENT Event;
    7666     Event.u          = 0;
    7667     Event.n.u1Valid  = 1;
    7668     Event.n.u3Type   = SVM_EVENT_EXCEPTION;
    7669     Event.n.u8Vector = uVector;
    7670     switch (uVector)
    7671     {
    7672         case X86_XCPT_PF:
    7673         case X86_XCPT_DF:
    7674         case X86_XCPT_TS:
    7675         case X86_XCPT_NP:
    7676         case X86_XCPT_SS:
    7677         case X86_XCPT_GP:
    7678         case X86_XCPT_AC:
    7679         {
    7680             Event.n.u1ErrorCodeValid = 1;
    7681             Event.n.u32ErrorCode     = uErrCode;
    7682             break;
    7683         }
    7684     }
    7685 
    7686     hmR0SvmSetPendingEvent(pVCpu, &Event, 0 /* GCPtrFaultAddress */);
    7687     return VINF_SUCCESS;
    7688 }
    7689 
    7690 
    7691 /**
    76927631 * Nested-guest \#VMEXIT handler for debug exceptions (SVM_EXIT_EXCEPTION_1).
    76937632 * Unconditional \#VMEXIT.
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette