VirtualBox

Changeset 66700 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Apr 27, 2017 4:48:12 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115094
Message:

VMM: Nested Hw.virt: SVM bits.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/HMSVMAll.cpp

    r66604 r66700  
    216216{
    217217    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))
    218226        return SVM_EVENT_EXCEPTION;
     227
    219228    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
    221231    if (fIemXcptFlags & IEM_XCPT_FLAGS_T_SOFT_INT)
    222232        return SVM_EVENT_SOFTWARE_INT;
     233
    223234    AssertMsgFailed(("hmSvmEventTypeFromIemEvent: Invalid IEM xcpt/int. type %#x, uVector=%#x\n", fIemXcptFlags, uVector));
    224235    return UINT8_MAX;
     
    506517             */
    507518            PCSVMEVENT pEventInject = &pVmcbCtrl->EventInject;
     519            pCtx->hwvirt.svm.fInterceptEvents = !pEventInject->n.u1Valid;
    508520            if (pEventInject->n.u1Valid)
    509521            {
     
    588600        || uExitCode == SVM_EXIT_INVALID)
    589601    {
    590         RT_NOREF(pVCpu);
    591 
    592602        /*
    593603         * Disable the global interrupt flag to prevent interrupts during the 'atomic' world switch.
     
    10001010     * we need 3 extra bits beyond the second 4K page.
    10011011     */
     1012    static const uint16_t s_auSizeMasks[] = { 0, 1, 3, 0, 0xf, 0, 0, 0 };
    10021013    uint8_t const *pbIopm = (uint8_t *)pCtx->hwvirt.svm.CTX_SUFF(pvIoBitmap);
    10031014
    10041015    uint16_t const u16Port   = pIoExitInfo->n.u16Port;
    10051016    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];
    10071018    uint8_t  const cShift    = u16Port - (offIopm << 3);
    10081019    uint16_t const fIopmMask = (1 << cShift) | (fSizeMask << cShift);
    10091020
    10101021    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)
    10131024        return HMSvmNstGstVmExit(pVCpu, pCtx, SVM_EXIT_IOIO, pIoExitInfo->u, uNextRip);
    10141025
Note: See TracChangeset for help on using the changeset viewer.

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