VirtualBox

Changeset 99334 in vbox for trunk/src


Ignore:
Timestamp:
Apr 7, 2023 10:10:07 AM (22 months ago)
Author:
vboxsync
Message:

Diassembler: Updates to the ARMv8 disassembler, bugref:10394

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

Legend:

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

    r99319 r99334  
    7979static FNDISPARSEARMV8 disArmV8ParseHw;
    8080static FNDISPARSEARMV8 disArmV8ParseCond;
     81static FNDISPARSEARMV8 disArmV8ParsePState;
    8182/** @}  */
    8283
     
    8586 * @{ */
    8687static FNDISDECODEARMV8 disArmV8DecodeIllegal;
     88static FNDISDECODEARMV8 disArmV8DecodeLookup;
    8789/** @} */
    8890
     
    101103    disArmV8ParseImmsImmrN,
    102104    disArmV8ParseHw,
    103     disArmV8ParseCond
     105    disArmV8ParseCond,
     106    disArmV8ParsePState,
    104107};
    105108
     
    109112{
    110113    disArmV8DecodeIllegal,
     114    disArmV8DecodeLookup,
    111115};
    112116
     
    258262
    259263
     264static int disArmV8ParsePState(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool f64Bit)
     265{
     266    RT_NOREF(pDis, u32Insn, pInsnClass, pParam, pInsnParm, f64Bit);
     267    //AssertFailed();
     268    /** @todo */
     269    return VINF_SUCCESS;
     270}
     271
     272
    260273static uint32_t disArmV8DecodeIllegal(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass)
    261274{
     
    266279
    267280
    268 static int disArmV8A64ParseInstruction(PDISSTATE pDis, uint32_t u32Insn, PCDISOPCODE pOp, PCDISARMV8INSNCLASS pInsnClass)
     281static uint32_t disArmV8DecodeLookup(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass)
     282{
     283    RT_NOREF(pDis);
     284
     285    for (uint32_t i = 0; i < pInsnClass->Hdr.cDecode; i++)
     286    {
     287        PCDISARMV8OPCODE pOp = &pInsnClass->paOpcodes[i];
     288        if (u32Insn == pOp->fValue)
     289            return i;
     290    }
     291
     292    return UINT32_MAX;
     293}
     294
     295
     296static int disArmV8A64ParseInstruction(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8OPCODE pOp, PCDISARMV8INSNCLASS pInsnClass)
    269297{
    270298    AssertPtr(pOp);
    271299    AssertPtr(pDis);
     300    Assert((u32Insn & pOp->fMask) == pOp->fValue);
    272301
    273302    /* Should contain the parameter type on input. */
    274     pDis->Param1.arch.armv8.fParam = pOp->fParam1;
    275     pDis->Param2.arch.armv8.fParam = pOp->fParam2;
    276     pDis->Param3.arch.armv8.fParam = pOp->fParam3;
    277     pDis->Param4.arch.armv8.fParam = pOp->fParam4;
    278 
    279     pDis->pCurInstr = pOp;
    280     Assert(pOp != &g_ArmV8A64InvalidOpcode[0]);
     303    pDis->Param1.arch.armv8.fParam = pOp->Opc.fParam1;
     304    pDis->Param2.arch.armv8.fParam = pOp->Opc.fParam2;
     305    pDis->Param3.arch.armv8.fParam = pOp->Opc.fParam3;
     306    pDis->Param4.arch.armv8.fParam = pOp->Opc.fParam4;
     307
     308    pDis->pCurInstr = &pOp->Opc;
     309    Assert(&pOp->Opc != &g_ArmV8A64InvalidOpcode[0]);
    281310
    282311    bool f64Bit = false;
     
    369398
    370399        /* Decode the opcode from the instruction class. */
    371         uint32_t uOpcRaw = (u32Insn & pInsnClass->fMask) >> pInsnClass->cShift;
    372         if (pInsnClass->enmOpcDecode != kDisArmV8OpcDecodeNop)
    373             uOpcRaw = g_apfnOpcDecode[pInsnClass->enmOpcDecode](pDis, u32Insn, pInsnClass);
     400        uint32_t uOpcRaw = 0;
     401        if (pInsnClass->Hdr.cDecode > 1)
     402        {
     403            uOpcRaw = (u32Insn & pInsnClass->fMask) >> pInsnClass->cShift;
     404            if (pInsnClass->enmOpcDecode != kDisArmV8OpcDecodeNop)
     405                uOpcRaw = g_apfnOpcDecode[pInsnClass->enmOpcDecode](pDis, uOpcRaw, pInsnClass);
     406        }
    374407
    375408        if (uOpcRaw < pInsnClass->Hdr.cDecode)
    376409        {
    377             PCDISOPCODE pOp = &pInsnClass->paOpcodes[uOpcRaw];
     410            PCDISARMV8OPCODE pOp = &pInsnClass->paOpcodes[uOpcRaw];
    378411            return disArmV8A64ParseInstruction(pDis, u32Insn, pOp, pInsnClass);
    379412        }
  • trunk/src/VBox/Disassembler/DisasmInternal-armv8.h

    r99320 r99334  
    5858    kDisParmParseHw,
    5959    kDisParmParseCond,
     60    kDisParmParsePState,
    6061    kDisParmParseMax
    6162} DISPARMPARSEIDX;
    6263/** @}  */
     64
     65
     66/**
     67 * Opcode structure.
     68 */
     69typedef struct DISARMV8OPCODE
     70{
     71    /** The mask defining the static bits of the opcode. */
     72    uint32_t            fMask;
     73    /** The value of masked bits of the isntruction. */
     74    uint32_t            fValue;
     75    /** The generic opcode structure. */
     76    DISOPCODE           Opc;
     77} DISARMV8OPCODE;
     78/** Pointer to a const opcode. */
     79typedef const DISARMV8OPCODE *PCDISARMV8OPCODE;
    6380
    6481
     
    86103{
    87104    kDisArmV8OpcDecodeNop = 0,
     105    kDisArmV8OpcDecodeLookup,
    88106    kDisArmV8OpcDecodeMax
    89107} DISARMV8OPCDECODE;
     
    129147    DISARMV8DECODEHDR       Hdr;
    130148    /** Pointer to the arry of opcodes. */
    131     PCDISOPCODE             paOpcodes;
     149    PCDISARMV8OPCODE        paOpcodes;
    132150    /** Some flags for this instruction class. */
    133151    uint32_t                fClass;
     
    153171
    154172#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(a_Name) \
    155     static const DISOPCODE a_Name ## Opcodes[] = {
     173    static const DISARMV8OPCODE a_Name ## Opcodes[] = {
    156174#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift) \
    157175    }; \
  • trunk/src/VBox/Disassembler/DisasmTables-armv8.cpp

    r99319 r99334  
    3939*********************************************************************************************************************************/
    4040
    41 #define DIS_ARMV8_OP(a_szOpcode, a_uOpcode, a_fOpType) \
    42     OP(a_szOpcode, 0, 0, 0, a_uOpcode, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, a_fOpType)
     41#define DIS_ARMV8_OP(a_fMask, a_fValue, a_szOpcode, a_uOpcode, a_fOpType) \
     42    { a_fMask, a_fValue, OP(a_szOpcode, 0, 0, 0, a_uOpcode, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, a_fOpType) }
    4343
    4444#ifndef DIS_CORE_ONLY
     
    4747
    4848#define INVALID_OPCODE  \
    49     DIS_ARMV8_OP(g_szInvalidOpcode,    OP_ARMV8_INVALID, DISOPTYPE_INVALID)
     49    DIS_ARMV8_OP(0xffffffff, 0, g_szInvalidOpcode,    OP_ARMV8_INVALID, DISOPTYPE_INVALID)
    5050
    5151
     
    5353DECL_HIDDEN_CONST(DISOPCODE) g_ArmV8A64InvalidOpcode[1] =
    5454{
    55     INVALID_OPCODE
     55    OP(g_szInvalidOpcode, 0, 0, 0, OP_ARMV8_INVALID, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, DISOPTYPE_INVALID)
    5656};
    5757
     
    5959/* UDF */
    6060DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_aArmV8A64InsnRsvd)
    61     DIS_ARMV8_OP("udf %I" ,                 OP_ARMV8_A64_UDF,   DISOPTYPE_INVALID)
    62 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_aArmV8A64InsnRsvd, 0 /*fClass*/, kDisArmV8OpcDecodeNop, 0xffff0000, 16)
     61    DIS_ARMV8_OP(0xffff0000, 0x00000000, "udf %I" ,                 OP_ARMV8_A64_UDF,       DISOPTYPE_INVALID)
     62DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_aArmV8A64InsnRsvd, 0 /*fClass*/,
     63                                          kDisArmV8OpcDecodeNop, 0xffff0000, 16)
    6364    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,    0, 16),
    6465    DIS_ARMV8_INSN_PARAM_NONE,
     
    7071/* ADR/ADRP */
    7172DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Adr)
    72     DIS_ARMV8_OP("adr %X,%I" ,              OP_ARMV8_A64_ADR,   DISOPTYPE_HARMLESS),
    73     DIS_ARMV8_OP("adrp %X,%I" ,             OP_ARMV8_A64_ADRP,  DISOPTYPE_HARMLESS)
    74 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Adr, DISARMV8INSNCLASS_F_FORCED_64BIT, kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31)
     73    DIS_ARMV8_OP(0x9f000000, 0x10000000, "adr %X,%I" ,              OP_ARMV8_A64_ADR,       DISOPTYPE_HARMLESS),
     74    DIS_ARMV8_OP(0x9f000000, 0x90000000, "adrp %X,%I" ,             OP_ARMV8_A64_ADRP,      DISOPTYPE_HARMLESS)
     75DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Adr, DISARMV8INSNCLASS_F_FORCED_64BIT,
     76                                          kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31)
    7577    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,    0, 5),
    7678    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmAdr, 0, 0),
     
    8284/* ADD/ADDS/SUB/SUBS */
    8385DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64AddSubImm)
    84     DIS_ARMV8_OP("add %X,%X,%I" ,           OP_ARMV8_A64_ADD,   DISOPTYPE_HARMLESS),
    85     DIS_ARMV8_OP("adds %X,%X,%I" ,          OP_ARMV8_A64_ADDS,  DISOPTYPE_HARMLESS),
    86     DIS_ARMV8_OP("sub %X,%X,%I" ,           OP_ARMV8_A64_SUB,   DISOPTYPE_HARMLESS),
    87     DIS_ARMV8_OP("subs %X,%X,%I" ,          OP_ARMV8_A64_SUBS,  DISOPTYPE_HARMLESS),
    88 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64AddSubImm, DISARMV8INSNCLASS_F_SF, kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
     86    DIS_ARMV8_OP(0x7f800000, 0x11000000, "add %X,%X,%I" ,           OP_ARMV8_A64_ADD,       DISOPTYPE_HARMLESS),
     87    DIS_ARMV8_OP(0x7f800000, 0x31000000, "adds %X,%X,%I" ,          OP_ARMV8_A64_ADDS,      DISOPTYPE_HARMLESS),
     88    DIS_ARMV8_OP(0x7f800000, 0x51000000, "sub %X,%X,%I" ,           OP_ARMV8_A64_SUB,       DISOPTYPE_HARMLESS),
     89    DIS_ARMV8_OP(0x7f800000, 0x71000000, "subs %X,%X,%I" ,          OP_ARMV8_A64_SUBS,      DISOPTYPE_HARMLESS),
     90DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64AddSubImm, DISARMV8INSNCLASS_F_SF,
     91                                          kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
    8992    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,    0, 5),
    9093    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,    5, 5),
     
    9699/* AND/ORR/EOR/ANDS */
    97100DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64LogicalImm)
    98     DIS_ARMV8_OP("and %X,%X,%I" ,           OP_ARMV8_A64_AND,   DISOPTYPE_HARMLESS),
    99     DIS_ARMV8_OP("orr %X,%X,%I" ,           OP_ARMV8_A64_ORR,   DISOPTYPE_HARMLESS),
    100     DIS_ARMV8_OP("eor %X,%X,%I" ,           OP_ARMV8_A64_EOR,   DISOPTYPE_HARMLESS),
    101     DIS_ARMV8_OP("ands %X,%X,%I" ,          OP_ARMV8_A64_ANDS,  DISOPTYPE_HARMLESS),
    102 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64LogicalImm, DISARMV8INSNCLASS_F_SF, kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
     101    DIS_ARMV8_OP(0x7f800000, 0x12000000, "and %X,%X,%I" ,           OP_ARMV8_A64_AND,       DISOPTYPE_HARMLESS),
     102    DIS_ARMV8_OP(0x7f800000, 0x32000000, "orr %X,%X,%I" ,           OP_ARMV8_A64_ORR,       DISOPTYPE_HARMLESS),
     103    DIS_ARMV8_OP(0x7f800000, 0x52000000, "eor %X,%X,%I" ,           OP_ARMV8_A64_EOR,       DISOPTYPE_HARMLESS),
     104    DIS_ARMV8_OP(0x7f800000, 0x72000000, "ands %X,%X,%I" ,          OP_ARMV8_A64_ANDS,      DISOPTYPE_HARMLESS),
     105DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64LogicalImm, DISARMV8INSNCLASS_F_SF,
     106                                          kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
    103107    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5),
    104108    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  6),
     
    110114/* MOVN/MOVZ/MOVK */
    111115DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64MoveWide)
    112     DIS_ARMV8_OP("movn %X,%I LSL %I",       OP_ARMV8_A64_MOVN,  DISOPTYPE_HARMLESS),
     116    DIS_ARMV8_OP(0x7f800000, 0x12800000, "movn %X,%I LSL %I",       OP_ARMV8_A64_MOVN,      DISOPTYPE_HARMLESS),
    113117    INVALID_OPCODE,
    114     DIS_ARMV8_OP("movz %X,%I LSL %I" ,      OP_ARMV8_A64_MOVZ,  DISOPTYPE_HARMLESS),
    115     DIS_ARMV8_OP("movk %X,%I LSL %I" ,      OP_ARMV8_A64_MOVK,  DISOPTYPE_HARMLESS),
    116 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64MoveWide, DISARMV8INSNCLASS_F_SF, kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
     118    DIS_ARMV8_OP(0x7f800000, 0x52800000, "movz %X,%I LSL %I" ,      OP_ARMV8_A64_MOVZ,      DISOPTYPE_HARMLESS),
     119    DIS_ARMV8_OP(0x7f800000, 0x72800000, "movk %X,%I LSL %I" ,      OP_ARMV8_A64_MOVK,      DISOPTYPE_HARMLESS),
     120DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64MoveWide, DISARMV8INSNCLASS_F_SF,
     121                                          kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
    117122    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5),
    118123    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5, 16),
     
    124129/* SBFM/BFM/UBFM */
    125130DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Bitfield)
    126     DIS_ARMV8_OP("sbfm %X,%X,%I",  OP_ARMV8_A64_SBFM,  DISOPTYPE_HARMLESS),
    127     DIS_ARMV8_OP("bfm  %X,%X,%I" , OP_ARMV8_A64_BFM,   DISOPTYPE_HARMLESS),
    128     DIS_ARMV8_OP("ubfm %X,%X,%I" , OP_ARMV8_A64_UBFM,  DISOPTYPE_HARMLESS),
     131    DIS_ARMV8_OP(0x7f800000, 0x13000000, "sbfm %X,%X,%I",           OP_ARMV8_A64_SBFM,      DISOPTYPE_HARMLESS),
     132    DIS_ARMV8_OP(0x7f800000, 0x33000000, "bfm  %X,%X,%I",           OP_ARMV8_A64_BFM,       DISOPTYPE_HARMLESS),
     133    DIS_ARMV8_OP(0x7f800000, 0x23000000, "ubfm %X,%X,%I",           OP_ARMV8_A64_UBFM,      DISOPTYPE_HARMLESS),
    129134    INVALID_OPCODE,
    130135DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Bitfield, DISARMV8INSNCLASS_F_SF | DISARMV8INSNCLASS_F_N_FORCED_1_ON_64BIT,
     
    165170/* B.cond/BC.cond */
    166171DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64CondBr)
    167     DIS_ARMV8_OP("b.%C   %J",  OP_ARMV8_A64_B,         DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
    168     DIS_ARMV8_OP("bc.%C  %J" , OP_ARMV8_A64_BC,        DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
     172    DIS_ARMV8_OP(0xff000010, 0x54000000, "b.%C   %J",               OP_ARMV8_A64_B,         DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
     173    DIS_ARMV8_OP(0xff000010, 0x54000010, "bc.%C  %J" ,              OP_ARMV8_A64_BC,        DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
    169174DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64CondBr, 0 /*fClass*/,
    170175                                          kDisArmV8OpcDecodeNop, RT_BIT_32(4), 4)
     
    176181
    177182
     183/* SVC/HVC/SMC/BRK/HLT/TCANCEL/DCPS1/DCPS2/DCPS3 */
     184DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Excp)
     185    DIS_ARMV8_OP(0xffe0001f, 0xd4000001, "svc       %I",            OP_ARMV8_A64_SVC,       DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
     186    DIS_ARMV8_OP(0xffe0001f, 0xd4000002, "hvc       %I",            OP_ARMV8_A64_HVC,       DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT | DISOPTYPE_PRIVILEGED),
     187    DIS_ARMV8_OP(0xffe0001f, 0xd4000003, "smc       %I",            OP_ARMV8_A64_SMC,       DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT | DISOPTYPE_PRIVILEGED),
     188    DIS_ARMV8_OP(0xffe0001f, 0xd4200000, "brk       %I",            OP_ARMV8_A64_BRK,       DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
     189    DIS_ARMV8_OP(0xffe0001f, 0xd4400000, "hlt       %I",            OP_ARMV8_A64_HLT,       DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
     190    DIS_ARMV8_OP(0xffe0001f, 0xd4600000, "tcancel   %I",            OP_ARMV8_A64_TCANCEL,   DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT), /* FEAT_TME */
     191    DIS_ARMV8_OP(0xffe0001f, 0xd4a00001, "dcps1     %I",            OP_ARMV8_A64_DCPS1,     DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
     192    DIS_ARMV8_OP(0xffe0001f, 0xd4a00002, "dcps2     %I",            OP_ARMV8_A64_DCPS2,     DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
     193    DIS_ARMV8_OP(0xffe0001f, 0xd4a00003, "dcps3     %I",            OP_ARMV8_A64_DCPS3,     DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
     194DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Excp, 0 /*fClass*/,
     195                                          kDisArmV8OpcDecodeLookup, 0xffe0001f, 0)
     196    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5, 16),
     197    DIS_ARMV8_INSN_PARAM_NONE,
     198    DIS_ARMV8_INSN_PARAM_NONE,
     199    DIS_ARMV8_INSN_PARAM_NONE
     200DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     201
     202
     203/* WFET/WFIT */
     204DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64SysReg)
     205    DIS_ARMV8_OP(0xffffffe0, 0xd5031000, "wfet   %X",  OP_ARMV8_A64_WFET,      DISOPTYPE_HARMLESS), /* FEAT_WFxT */
     206    DIS_ARMV8_OP(0xffffffe0, 0x54000010, "wfit   %X" , OP_ARMV8_A64_WFIT,      DISOPTYPE_HARMLESS), /* FEAT_WFxT */
     207DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64SysReg, DISARMV8INSNCLASS_F_FORCED_64BIT,
     208                                          kDisArmV8OpcDecodeNop, 0xfe0, 5)
     209    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5),
     210    DIS_ARMV8_INSN_PARAM_NONE,
     211    DIS_ARMV8_INSN_PARAM_NONE,
     212    DIS_ARMV8_INSN_PARAM_NONE
     213DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     214
     215
     216/* Various hint instructions */
     217DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Hints)
     218    DIS_ARMV8_OP(0xffffffff, 0xd503201f, "nop",        OP_ARMV8_A64_NOP,       DISOPTYPE_HARMLESS),
     219    DIS_ARMV8_OP(0xffffffff, 0xd503203f, "yield",      OP_ARMV8_A64_YIELD,     DISOPTYPE_HARMLESS),
     220    DIS_ARMV8_OP(0xffffffff, 0xd503205f, "wfe",        OP_ARMV8_A64_WFE,       DISOPTYPE_HARMLESS),
     221    DIS_ARMV8_OP(0xffffffff, 0xd503207f, "wfi",        OP_ARMV8_A64_WFI,       DISOPTYPE_HARMLESS),
     222    DIS_ARMV8_OP(0xffffffff, 0xd503209f, "sev",        OP_ARMV8_A64_SEV,       DISOPTYPE_HARMLESS),
     223    DIS_ARMV8_OP(0xffffffff, 0xd50320bf, "sevl",       OP_ARMV8_A64_SEVL,      DISOPTYPE_HARMLESS),
     224    DIS_ARMV8_OP(0xffffffff, 0xd50320df, "dgh",        OP_ARMV8_A64_DGH,       DISOPTYPE_HARMLESS), /* FEAT_DGH */
     225    DIS_ARMV8_OP(0xffffffff, 0xd50320ff, "xpaclri",    OP_ARMV8_A64_XPACLRI,   DISOPTYPE_HARMLESS), /* FEAT_PAuth */
     226    /** @todo */
     227DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Hints, 0 /*fClass*/,
     228                                          kDisArmV8OpcDecodeNop, 0xfe0, 5)
     229    DIS_ARMV8_INSN_PARAM_NONE,
     230    DIS_ARMV8_INSN_PARAM_NONE,
     231    DIS_ARMV8_INSN_PARAM_NONE,
     232    DIS_ARMV8_INSN_PARAM_NONE
     233DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     234
     235
     236/* CLREX */
     237DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Clrex)
     238    DIS_ARMV8_OP(0xfffff0ff, 0xd503305f, "clrex %I",   OP_ARMV8_A64_CLREX,     DISOPTYPE_HARMLESS),
     239DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Clrex, 0 /*fClass*/,
     240                                          kDisArmV8OpcDecodeNop, 0, 0)
     241    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            8,  4),
     242    DIS_ARMV8_INSN_PARAM_NONE,
     243    DIS_ARMV8_INSN_PARAM_NONE,
     244    DIS_ARMV8_INSN_PARAM_NONE
     245DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     246
     247
     248/* Barrier instructions, we divide these instructions further based on the op2 field. */
     249DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_ArmV8A64DecodeBarriers)
     250    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,
     251    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo DSB - Encoding */
     252    DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64Clrex),    /* CLREX */
     253    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo TCOMMIT */
     254    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo DSB - Encoding */
     255    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo DMB */
     256    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo ISB */
     257    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY              /** @todo SB */
     258DIS_ARMV8_DECODE_MAP_DEFINE_END(g_ArmV8A64DecodeBarriers, RT_BIT_32(5) | RT_BIT_32(6) | RT_BIT_32(7), 5);
     259
     260
     261/* MSR (and potentially CFINV,XAFLAG,AXFLAG) */
     262DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64PState)
     263    DIS_ARMV8_OP(0xfffff0ff, 0xd503305f, "msr %P, %I", OP_ARMV8_A64_MSR,       DISOPTYPE_PRIVILEGED),
     264DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64PState, 0 /*fClass*/,
     265                                          kDisArmV8OpcDecodeNop, 0, 0)
     266    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParsePState,         0,  0), /* This is special for the MSR instruction. */
     267    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            8,  4), /* CRm field encodes the immediate value */
     268    DIS_ARMV8_INSN_PARAM_NONE,
     269    DIS_ARMV8_INSN_PARAM_NONE
     270DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     271
     272
     273/* TSTART/TTEST */
     274DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64SysResult)
     275    DIS_ARMV8_OP(0xfffffffe, 0xd5233060, "tstart %X",  OP_ARMV8_A64_TSTART,    DISOPTYPE_HARMLESS | DISOPTYPE_PRIVILEGED),  /* FEAT_TME */
     276    DIS_ARMV8_OP(0xfffffffe, 0xd5233160, "ttest  %X",  OP_ARMV8_A64_TTEST,     DISOPTYPE_HARMLESS),                         /* FEAT_TME */
     277DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64SysResult, DISARMV8INSNCLASS_F_FORCED_64BIT,
     278                                          kDisArmV8OpcDecodeNop, RT_BIT_32(8) | RT_BIT_32(9) | RT_BIT_32(10) | RT_BIT_32(11), 8)
     279    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5),
     280    DIS_ARMV8_INSN_PARAM_NONE,
     281    DIS_ARMV8_INSN_PARAM_NONE,
     282    DIS_ARMV8_INSN_PARAM_NONE
     283DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     284
     285
    178286DIS_ARMV8_DECODE_TBL_DEFINE_BEGIN(g_ArmV8A64BrExcpSys)
    179     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xff000000, RT_BIT_32(26) | RT_BIT_32(28) | RT_BIT_32(30), g_ArmV8A64CondBr) /* op0: 010, op1: 0xxxxxxxxxxxxx, op2: - (including o1 from the conditional branch (immediate) class to save us one layer). */
     287    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfe000000, RT_BIT_32(26) | RT_BIT_32(28) | RT_BIT_32(30),                  g_ArmV8A64CondBr),          /* op0: 010, op1: 0xxxxxxxxxxxxx, op2: - (including o1 from the conditional branch (immediate) class to save us one layer). */
     288    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xff000000, RT_BIT_32(26) | RT_BIT_32(28) | RT_BIT_32(30) | RT_BIT_32(31),  g_ArmV8A64Excp),            /* op0: 110, op1: 00xxxxxxxxxxxx, op2: -. */
     289    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff000, 0xd5031000,                                                     g_ArmV8A64SysReg),          /* op0: 110, op1: 01000000110001, op2: -. */
     290    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff01f, 0xd503201f,                                                     g_ArmV8A64Hints),           /* op0: 110, op1: 01000000110010, op2: 11111. */
     291    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff01f, 0xd503301f,                                                     g_ArmV8A64DecodeBarriers),  /* op0: 110, op1: 01000000110011, op2: - (we include Rt:  11111 from the next stage here). */
     292    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff8f01f, 0xd500401f,                                                     g_ArmV8A64PState),          /* op0: 110, op1: 0100000xxx0100, op2: - (we include Rt:  11111 from the next stage here). */
     293    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff0e0, 0xd5233060,                                                     g_ArmV8A64SysResult)        /* op0: 110, op1: 0100100xxxxxxx, op2: - (we include op1, CRn and op2 from the next stage here). */
    180294DIS_ARMV8_DECODE_TBL_DEFINE_END(g_ArmV8A64BrExcpSys);
    181295
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