VirtualBox

Changeset 70145 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 15, 2017 12:52:29 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119705
Message:

VMM/IEM: Update the address size field for basic IN/OUT instr. and don't leave it 0. Real hardware doesn't, and
I think using the effective address size is the right thing to do here given the instructions only have an immediate
or register operand and question of address size is kind of moot, so just follow real hardware here.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r70057 r70145  
    60596059    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT))
    60606060    {
    6061         rcStrict = iemSvmHandleIOIntercept(pVCpu, u16Port, SVMIOIOTYPE_IN, cbReg, 0 /* N/A - cAddrSizeBits */,
    6062                                            0 /* N/A - iEffSeg */, false /* fRep */, false /* fStrIo */, cbInstr);
     6061        uint8_t cAddrSizeBits;
     6062        switch (pVCpu->iem.s.enmEffAddrMode)
     6063        {
     6064            case IEMMODE_16BIT: cAddrSizeBits = 16; break;
     6065            case IEMMODE_32BIT: cAddrSizeBits = 32; break;
     6066            case IEMMODE_64BIT: cAddrSizeBits = 64; break;
     6067            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     6068        }
     6069        rcStrict = iemSvmHandleIOIntercept(pVCpu, u16Port, SVMIOIOTYPE_IN, cbReg, cAddrSizeBits, 0 /* N/A - iEffSeg */,
     6070                                           false /* fRep */, false /* fStrIo */, cbInstr);
    60636071        if (rcStrict == VINF_SVM_VMEXIT)
    60646072            return VINF_SUCCESS;
     
    61486156    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT))
    61496157    {
    6150         rcStrict = iemSvmHandleIOIntercept(pVCpu, u16Port, SVMIOIOTYPE_OUT, cbReg, 0 /* N/A - cAddrSizeBits */,
    6151                                            0 /* N/A - iEffSeg */, false /* fRep */, false /* fStrIo */, cbInstr);
     6158        uint8_t cAddrSizeBits;
     6159        switch (pVCpu->iem.s.enmEffAddrMode)
     6160        {
     6161            case IEMMODE_16BIT: cAddrSizeBits = 16; break;
     6162            case IEMMODE_32BIT: cAddrSizeBits = 32; break;
     6163            case IEMMODE_64BIT: cAddrSizeBits = 64; break;
     6164            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     6165        }
     6166        rcStrict = iemSvmHandleIOIntercept(pVCpu, u16Port, SVMIOIOTYPE_OUT, cbReg, cAddrSizeBits, 0 /* N/A - iEffSeg */,
     6167                                           false /* fRep */, false /* fStrIo */, cbInstr);
    61526168        if (rcStrict == VINF_SVM_VMEXIT)
    61536169            return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplSvmInstr.cpp.h

    r70057 r70145  
    954954{
    955955    Assert(IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT));
    956     Assert(cAddrSizeBits == 0 || cAddrSizeBits == 16 || cAddrSizeBits == 32 || cAddrSizeBits == 64);
     956    Assert(cAddrSizeBits == 16 || cAddrSizeBits == 32 || cAddrSizeBits == 64);
    957957    Assert(cbReg == 1 || cbReg == 2 || cbReg == 4 || cbReg == 8);
    958958
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