VirtualBox

Ignore:
Timestamp:
Apr 17, 2017 3:00:00 AM (8 years ago)
Author:
vboxsync
Message:

VMM: Nested Hw.virt: Implemented various SVM intercepts in IEM, addressed some todos.

File:
1 edited

Legend:

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

    r62478 r66581  
    12181218    }
    12191219
     1220    /*
     1221     * Check SVM nested-guest IO intercept.
     1222     */
     1223    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT))
     1224    {
     1225        rcStrict = iemSvmHandleIOIntercept(pVCpu, pCtx->dx, SVMIOIOTYPE_IN, OP_SIZE / 8, ADDR_SIZE, X86_SREG_ES, false /* fRep */,
     1226                                           true /* fStrIo */, cbInstr);
     1227        if (rcStrict == VINF_SVM_VMEXIT)
     1228            return VINF_SUCCESS;
     1229        if (rcStrict != VINF_HM_INTERCEPT_NOT_ACTIVE)
     1230        {
     1231            Log(("iemCImpl_ins_op: iemSvmHandleIOIntercept failed (u16Port=%#x, cbReg=%u) rc=%Rrc\n", pCtx->dx, OP_SIZE / 8,
     1232                 VBOXSTRICTRC_VAL(rcStrict)));
     1233            return rcStrict;
     1234        }
     1235    }
     1236
    12201237    OP_TYPE        *puMem;
    12211238    rcStrict = iemMemMap(pVCpu, (void **)&puMem, OP_SIZE / 8, X86_SREG_ES, pCtx->ADDR_rDI, IEM_ACCESS_DATA_W);
     
    12691286        if (rcStrict != VINF_SUCCESS)
    12701287            return rcStrict;
     1288    }
     1289
     1290    /*
     1291     * Check SVM nested-guest IO intercept.
     1292     */
     1293    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT))
     1294    {
     1295        rcStrict = iemSvmHandleIOIntercept(pVCpu, u16Port, SVMIOIOTYPE_IN, OP_SIZE / 8, ADDR_SIZE, X86_SREG_ES, true /* fRep */,
     1296                                           true /* fStrIo */, cbInstr);
     1297        if (rcStrict == VINF_SVM_VMEXIT)
     1298            return VINF_SUCCESS;
     1299        if (rcStrict != VINF_HM_INTERCEPT_NOT_ACTIVE)
     1300        {
     1301            Log(("iemCImpl_rep_ins_op: iemSvmHandleIOIntercept failed (u16Port=%#x, cbReg=%u) rc=%Rrc\n", u16Port, OP_SIZE / 8,
     1302                 VBOXSTRICTRC_VAL(rcStrict)));
     1303            return rcStrict;
     1304        }
    12711305    }
    12721306
     
    14551489    }
    14561490
     1491    /*
     1492     * Check SVM nested-guest IO intercept.
     1493     */
     1494    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT))
     1495    {
     1496        rcStrict = iemSvmHandleIOIntercept(pVCpu, pCtx->dx, SVMIOIOTYPE_OUT, OP_SIZE / 8, ADDR_SIZE, iEffSeg, false /* fRep */,
     1497                                           true /* fStrIo */, cbInstr);
     1498        if (rcStrict == VINF_SVM_VMEXIT)
     1499            return VINF_SUCCESS;
     1500        if (rcStrict != VINF_HM_INTERCEPT_NOT_ACTIVE)
     1501        {
     1502            Log(("iemCImpl_outs_op: iemSvmHandleIOIntercept failed (u16Port=%#x, cbReg=%u) rc=%Rrc\n", pCtx->dx, OP_SIZE / 8,
     1503                 VBOXSTRICTRC_VAL(rcStrict)));
     1504            return rcStrict;
     1505        }
     1506    }
     1507
    14571508    OP_TYPE uValue;
    14581509    rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue, iEffSeg, pCtx->ADDR_rSI);
     
    14961547        if (rcStrict != VINF_SUCCESS)
    14971548            return rcStrict;
     1549    }
     1550
     1551    /*
     1552     * Check SVM nested-guest IO intercept.
     1553     */
     1554    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT))
     1555    {
     1556        rcStrict = iemSvmHandleIOIntercept(pVCpu, u16Port, SVMIOIOTYPE_OUT, OP_SIZE / 8, ADDR_SIZE, iEffSeg, true /* fRep */,
     1557                                           true /* fStrIo */, cbInstr);
     1558        if (rcStrict == VINF_SVM_VMEXIT)
     1559            return VINF_SUCCESS;
     1560        if (rcStrict != VINF_HM_INTERCEPT_NOT_ACTIVE)
     1561        {
     1562            Log(("iemCImpl_rep_outs_op: iemSvmHandleIOIntercept failed (u16Port=%#x, cbReg=%u) rc=%Rrc\n", u16Port, OP_SIZE / 8,
     1563                 VBOXSTRICTRC_VAL(rcStrict)));
     1564            return rcStrict;
     1565        }
    14981566    }
    14991567
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