VirtualBox

Changeset 68301 in vbox for trunk


Ignore:
Timestamp:
Aug 4, 2017 11:49:23 AM (7 years ago)
Author:
vboxsync
Message:

VMM/HMSVMR0: Nested Hw.virt bits.

File:
1 edited

Legend:

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

    r68293 r68301  
    43274327    Assert(pSvmTransient->u64ExitCode <= SVM_EXIT_MAX);
    43284328
     4329#define HM_SVM_HANDLE_XCPT_EXIT_NESTED(a_uXcpt, a_XcptExitFn) \
     4330    do \
     4331    { \
     4332        if (pVmcbNstGstCache->u32InterceptXcpt & RT_BIT(a_uXcpt)) \
     4333            return hmR0SvmExecVmexit(pVCpu, pCtx); \
     4334        return a_XcptExitFn(pVCpu, pCtx, pSvmTransient); \
     4335    } while (0) \
     4336
    43294337    /*
    43304338     * For all the #VMEXITs here we primarily figure out if the #VMEXIT is expected
     
    43634371                return hmR0SvmExecVmexit(pVCpu, pCtx);
    43644372            return hmR0SvmExitRdtscp(pVCpu, pCtx, pSvmTransient);
     4373        }
     4374
     4375
     4376        case SVM_EXIT_MONITOR:
     4377        {
     4378            if (pVmcbNstGstCache->u64InterceptCtrl & SVM_CTRL_INTERCEPT_MONITOR)
     4379                return hmR0SvmExecVmexit(pVCpu, pCtx);
     4380            return hmR0SvmExitMonitor(pVCpu, pCtx, pSvmTransient);
     4381        }
     4382
     4383        case SVM_EXIT_MWAIT:
     4384        {
     4385            if (pVmcbNstGstCache->u64InterceptCtrl & SVM_CTRL_INTERCEPT_MWAIT)
     4386                return hmR0SvmExecVmexit(pVCpu, pCtx);
     4387            return hmR0SvmExitMwait(pVCpu, pCtx, pSvmTransient);
     4388        }
     4389
     4390        case SVM_EXIT_HLT:
     4391        {
     4392            if (pVmcbNstGstCache->u64InterceptCtrl & SVM_CTRL_INTERCEPT_HLT)
     4393                return hmR0SvmExecVmexit(pVCpu, pCtx);
     4394            return hmR0SvmExitHlt(pVCpu, pCtx, pSvmTransient);
    43654395        }
    43664396
     
    44154445        }
    44164446
    4417         /** @todo Exceptions. */
    44184447        case SVM_EXIT_EXCEPTION_14:  /* X86_XCPT_PF */
    4419             return hmR0SvmExitXcptPF(pVCpu, pCtx, pSvmTransient);
     4448        {
     4449            Assert(!pVmcbNstGstCtrl->NestedPaging.n.u1NestedPaging);
     4450            return hmR0SvmExecVmexit(pVCpu, pCtx);
     4451        }
    44204452
    44214453        case SVM_EXIT_EXCEPTION_7:   /* X86_XCPT_NM */
    4422             return hmR0SvmExitXcptNM(pVCpu, pCtx, pSvmTransient);
     4454            HM_SVM_HANDLE_XCPT_EXIT_NESTED(X86_XCPT_NM, hmR0SvmExitXcptNM);
    44234455
    44244456        case SVM_EXIT_EXCEPTION_6:   /* X86_XCPT_UD */
    4425             return hmR0SvmExitXcptUD(pVCpu, pCtx, pSvmTransient);
     4457            HM_SVM_HANDLE_XCPT_EXIT_NESTED(X86_XCPT_UD, hmR0SvmExitXcptUD);
    44264458
    44274459        case SVM_EXIT_EXCEPTION_16:  /* X86_XCPT_MF */
    4428             return hmR0SvmExitXcptMF(pVCpu, pCtx, pSvmTransient);
     4460            HM_SVM_HANDLE_XCPT_EXIT_NESTED(X86_XCPT_MF, hmR0SvmExitXcptMF);
    44294461
    44304462        case SVM_EXIT_EXCEPTION_1:   /* X86_XCPT_DB */
    4431             return hmR0SvmExitXcptDB(pVCpu, pCtx, pSvmTransient);
     4463            HM_SVM_HANDLE_XCPT_EXIT_NESTED(X86_XCPT_DB, hmR0SvmExitXcptDB);
    44324464
    44334465        case SVM_EXIT_EXCEPTION_17:  /* X86_XCPT_AC */
    4434             return hmR0SvmExitXcptAC(pVCpu, pCtx, pSvmTransient);
     4466            HM_SVM_HANDLE_XCPT_EXIT_NESTED(X86_XCPT_AC, hmR0SvmExitXcptAC);
    44354467
    44364468        case SVM_EXIT_EXCEPTION_3:   /* X86_XCPT_BP */
    4437             return hmR0SvmExitXcptBP(pVCpu, pCtx, pSvmTransient);
    4438 
    4439         case SVM_EXIT_MONITOR:
    4440             return hmR0SvmExitMonitor(pVCpu, pCtx, pSvmTransient);
    4441 
    4442         case SVM_EXIT_MWAIT:
    4443             return hmR0SvmExitMwait(pVCpu, pCtx, pSvmTransient);
    4444 
    4445         case SVM_EXIT_HLT:
    4446             return hmR0SvmExitHlt(pVCpu, pCtx, pSvmTransient);
     4469            HM_SVM_HANDLE_XCPT_EXIT_NESTED(X86_XCPT_BP, hmR0SvmExitXcptBP);
    44474470
    44484471        case SVM_EXIT_READ_CR0:
    44494472        case SVM_EXIT_READ_CR3:
    44504473        case SVM_EXIT_READ_CR4:
     4474        {
     4475            if (pVmcbNstGstCache->u16InterceptRdCRx & (1U << (uint16_t)(pSvmTransient->u64ExitCode - SVM_EXIT_READ_CR0)))
     4476                hmR0SvmExecVmexit(pVCpu, pCtx);
    44514477            return hmR0SvmExitReadCRx(pVCpu, pCtx, pSvmTransient);
     4478        }
    44524479
    44534480        case SVM_EXIT_WRITE_CR0:
     
    44554482        case SVM_EXIT_WRITE_CR4:
    44564483        case SVM_EXIT_WRITE_CR8:
     4484        {
     4485            if (pVmcbNstGstCache->u16InterceptWrCRx & (1U << (uint16_t)(pSvmTransient->u64ExitCode - SVM_EXIT_WRITE_CR0)))
     4486                hmR0SvmExecVmexit(pVCpu, pCtx);
    44574487            return hmR0SvmExitWriteCRx(pVCpu, pCtx, pSvmTransient);
     4488        }
    44584489
    44594490        case SVM_EXIT_PAUSE:
     
    46244655    }
    46254656    /* not reached */
     4657
     4658#undef HM_SVM_HANDLE_XCPT_EXIT_NESTED
    46264659}
    46274660#endif
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