VirtualBox

Changeset 95319 in vbox


Ignore:
Timestamp:
Jun 21, 2022 9:53:39 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
151909
Message:

DIS: Treat VEX.L=1 as illegal opcode in group 17. bugref:9898 bugref:6251

Location:
trunk/src/VBox/Disassembler
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r95314 r95319  
    24852485
    24862486    uint8_t const bRm = disReadByte(pDis, offInstr);
    2487     pOp = &g_aMapX86_Group17[MODRM_REG(bRm)];
     2487    pOp = &g_aMapX86_Group17[(MODRM_REG(bRm) << 1) | (pDis->bVexDestReg & 1)];
    24882488
    24892489    return disParseInstruction(offInstr, pOp, pDis);
  • trunk/src/VBox/Disassembler/DisasmInternal.h

    r95314 r95319  
    187187extern const DISOPCODE g_aMapX86_Group15_mod11_rm000[8];
    188188extern const DISOPCODE g_aMapX86_Group16[8];
    189 extern const DISOPCODE g_aMapX86_Group17[8];
     189extern const DISOPCODE g_aMapX86_Group17[8*2];
    190190extern const DISOPCODE g_aMapX86_NopPause[2];
    191191/** @} */
  • trunk/src/VBox/Disassembler/DisasmTables.cpp

    r95314 r95319  
    37853785const DISOPMAPDESC g_DisasVexMap1F3Range = { &g_aDisasVexMap1F3[0], 0x10, RT_ELEMENTS(g_aDisasVexMap1F3) };
    37863786
    3787 const DISOPCODE g_aMapX86_Group17[8] =
    3788 {
    3789     INVALID_OPCODE,
     3787/** Indexed by: (/r << 1) | VEX.L */
     3788const DISOPCODE g_aMapX86_Group17[8*2] =
     3789{
     3790    INVALID_OPCODE_MOD_RM(0x00),
     3791    INVALID_OPCODE_MOD_RM(0x01),
    37903792    OPVEX("blsr %By,%Ey",        IDX_ParseVexDest,  IDX_ParseModRM,     0,                           0,  OP_BLSR,      OP_PARM_By,   OP_PARM_Ey,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3793    INVALID_OPCODE_MOD_RM(0x03),
    37913794    OPVEX("blsmsk %By,%Ey",      IDX_ParseVexDest,  IDX_ParseModRM,     0,                           0,  OP_BLSMSK,    OP_PARM_By,   OP_PARM_Ey,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3795    INVALID_OPCODE_MOD_RM(0x05),
    37923796    OPVEX("blsi %By,%Ey",        IDX_ParseVexDest,  IDX_ParseModRM,     0,                           0,  OP_BLSI,      OP_PARM_By,   OP_PARM_Ey,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
    3793     INVALID_OPCODE,
    3794     INVALID_OPCODE,
    3795     INVALID_OPCODE,
    3796     INVALID_OPCODE,
     3797    INVALID_OPCODE_MOD_RM(0x07),
     3798    INVALID_OPCODE_MOD_RM(0x08),
     3799    INVALID_OPCODE_MOD_RM(0x09),
     3800    INVALID_OPCODE_MOD_RM(0x0a),
     3801    INVALID_OPCODE_MOD_RM(0x0b),
     3802    INVALID_OPCODE_MOD_RM(0x0c),
     3803    INVALID_OPCODE_MOD_RM(0x0d),
     3804    INVALID_OPCODE_MOD_RM(0x0e),
     3805    INVALID_OPCODE_MOD_RM(0x0f),
    37973806};
    37983807
  • trunk/src/VBox/Disassembler/testcase/tstDisasm-1A.asm

    r95314 r95319  
    427427        blsi eax, [rbx]
    428428        blsi rax, [rbx]
     429        db 0c4h, 0e2h, 0f8h | 4, 0f3h, 01bh ; blsi rax, [rbx] with VEX.L=1 - should be invalid
    429430        blsmsk eax, [rbx+rdi*2]
    430431        blsmsk rax, [rbx+rdi*2]
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