VirtualBox

Changeset 105736 in vbox for trunk/src/VBox/Disassembler


Ignore:
Timestamp:
Aug 19, 2024 5:41:36 PM (6 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164441
Message:

Disassembler/ARMv8: Build fix and add support conditionals, bugref:10388

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

Legend:

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

    r105734 r105736  
    273273static int disArmV8ParseCond(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
    274274{
     275    RT_NOREF(pInsnClass, pParam, pf64Bit);
     276    pDis->armv8.enmCond = (ARMV8INSTRCOND)disArmV8ExtractBitVecFromInsn(u32Insn, pInsnParm->idxBitStart, pInsnParm->cBits);
     277    return VINF_SUCCESS;
     278}
     279
     280
     281static int disArmV8ParsePState(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
     282{
    275283    RT_NOREF(pDis, u32Insn, pInsnClass, pParam, pInsnParm, pf64Bit);
    276284    //AssertFailed();
     
    280288
    281289
    282 static int disArmV8ParsePState(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
    283 {
    284     RT_NOREF(pDis, u32Insn, pInsnClass, pParam, pInsnParm, pf64Bit);
    285     //AssertFailed();
    286     /** @todo */
    287     return VINF_SUCCESS;
    288 }
    289 
    290 
    291290static int disArmV8ParseSysReg(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
    292291{
     
    296295    /* Assumes a op0:op1:CRn:CRm:op2 encoding in the instruction starting at the given bit position. */
    297296    uint32_t u32ImmRaw = disArmV8ExtractBitVecFromInsn(u32Insn, pInsnParm->idxBitStart, pInsnParm->cBits);
    298     pParam->armv8.Reg.idSysReg = ARMV8_AARCH64_SYSREG_ID_CREATE_DYN(2 + ((u32ImmRaw >> 14) & 0x1),
    299                                                                     (u32ImmRaw >> 11) & 0x7,
    300                                                                     (u32ImmRaw >> 7) & 0xf,
    301                                                                     (u32ImmRaw >> 3) & 0xf,
    302                                                                     u32ImmRaw & 0x7);
     297    pParam->armv8.Reg.idSysReg = ARMV8_AARCH64_SYSREG_ID_CREATE(2 + ((u32ImmRaw >> 14) & 0x1),
     298                                                                (u32ImmRaw >> 11) & 0x7,
     299                                                                (u32ImmRaw >> 7) & 0xf,
     300                                                                (u32ImmRaw >> 3) & 0xf,
     301                                                                u32ImmRaw & 0x7);
    303302    pParam->armv8.cb = 0;
    304303    pParam->fUse    |= DISUSE_REG_SYSTEM;
     
    341340    pDis->aParams[2].armv8.fParam = pOp->Opc.fParam3;
    342341    pDis->aParams[3].armv8.fParam = pOp->Opc.fParam4;
    343     pDis->armv8.pInsnClass    = pInsnClass;
     342    pDis->armv8.pInsnClass        = pInsnClass;
     343    pDis->armv8.enmCond           = kArmv8InstrCond_Al;
    344344
    345345    pDis->pCurInstr = &pOp->Opc;
  • trunk/src/VBox/Disassembler/DisasmFormatArmV8.cpp

    r105731 r105736  
    5555    "x16",   "x17",   "x18",   "x19",   "x20",   "x21",   "x22",   "x23",   "x24",   "x25",   "x26",  "x27",  "x28",  "x29",  "x30",  "xzr"
    5656};
     57static const char g_aszArmV8Cond[16][4] =
     58{
     59    "eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc", "hi", "ls", "ge", "lt", "gt", "le", "al", "al"
     60};
     61
    5762
    5863/**
     
    583588        PUT_PSZ(pOp->pszOpcode);
    584589
     590        /* Add any conditionals. */
     591        if (pDis->armv8.enmCond != kArmv8InstrCond_Al)
     592        {
     593            PUT_C('.');
     594            Assert((uint16_t)pDis->armv8.enmCond < RT_ELEMENTS(g_aszArmV8Cond));
     595            PUT_STR(g_aszArmV8Cond[pDis->armv8.enmCond], sizeof(g_aszArmV8Cond[0]) - 1);
     596        }
     597
    585598        /*
    586599         * Format the parameters.
  • trunk/src/VBox/Disassembler/DisasmTables-armv8-a64.cpp

    r105731 r105736  
    170170/* B.cond/BC.cond */
    171171DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64CondBr)
    172     DIS_ARMV8_OP(0xff000010, 0x54000000, "b.",              OP_ARMV8_A64_B,         DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
    173     DIS_ARMV8_OP(0xff000010, 0x54000010, "bc." ,            OP_ARMV8_A64_BC,        DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
     172    DIS_ARMV8_OP(0xff000010, 0x54000000, "b",               OP_ARMV8_A64_B,         DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
     173    DIS_ARMV8_OP(0xff000010, 0x54000010, "bc" ,             OP_ARMV8_A64_BC,        DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
    174174DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64CondBr, 0 /*fClass*/,
    175175                                          kDisArmV8OpcDecodeNop, RT_BIT_32(4), 4)
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