VirtualBox

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


Ignore:
Timestamp:
Feb 22, 2024 3:50:36 AM (12 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
161856
Message:

VMM/IEM: The vex3 & vex2 byte prefixes must set the IEM_OP_PRF_REX_R/X/B flags so IEM_GET_MODRM_EX will work correctly for vex instructions. bugref:10370

File:
1 edited

Legend:

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

    r103350 r103513  
    85638563            uint8_t bOpcode; IEM_OPCODE_GET_NEXT_U8(&bOpcode);
    85648564            pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_VEX;
    8565             if ((bVex2 & 0x80 /* VEX.W */) && IEM_IS_64BIT_CODE(pVCpu))
    8566                 pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SIZE_REX_W;
     8565            if (IEM_IS_64BIT_CODE(pVCpu))
     8566            {
     8567#if 1
     8568                AssertCompile(IEM_OP_PRF_SIZE_REX_W == RT_BIT_32(9));
     8569                pVCpu->iem.s.fPrefixes |= (uint32_t)(bVex2 & 0x80) << (9 - 7);
     8570                AssertCompile(IEM_OP_PRF_REX_B == RT_BIT_32(25) && IEM_OP_PRF_REX_X == RT_BIT_32(26) && IEM_OP_PRF_REX_R == RT_BIT_32(27));
     8571                pVCpu->iem.s.fPrefixes |= (uint32_t)(~bRm & 0xe0) << (25 - 5);
     8572#else
     8573                if (bVex2 & 0x80 /* VEX.W */)
     8574                    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SIZE_REX_W;
     8575                if (~bRm & 0x20 /* VEX.~B */)
     8576                    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SIZE_REX_B;
     8577                if (~bRm & 0x40 /* VEX.~X */)
     8578                    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SIZE_REX_X;
     8579                if (~bRm & 0x80 /* VEX.~R */)
     8580                    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SIZE_REX_R;
     8581#endif
     8582            }
    85678583            pVCpu->iem.s.uRexReg    = (~bRm >> (7 - 3)) & 0x8;
    85688584            pVCpu->iem.s.uRexIndex  = (~bRm >> (6 - 3)) & 0x8;
     
    86348650            uint8_t bOpcode; IEM_OPCODE_GET_NEXT_U8(&bOpcode);
    86358651            pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_VEX;
     8652            AssertCompile(IEM_OP_PRF_REX_R == RT_BIT_32(27));
     8653            pVCpu->iem.s.fPrefixes |= (uint32_t)(~bRm & 0x80) << (27 - 7);
    86368654            pVCpu->iem.s.uRexReg    = (~bRm >> (7 - 3)) & 0x8;
    86378655            pVCpu->iem.s.uVex3rdReg = (~bRm >> 3) & 0xf;
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