VirtualBox

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


Ignore:
Timestamp:
Oct 28, 2024 3:54:21 PM (6 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
165643
Message:

Disassembler: Decode ldraa/ldrab instructions, bugref:10394

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

Legend:

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

    r106754 r106758  
    114114static FNDISPARSEARMV8 disArmV8ParseSf;
    115115static FNDISPARSEARMV8 disArmV8ParseImmX16;
     116static FNDISPARSEARMV8 disArmV8ParseLdrPacImm;
     117static FNDISPARSEARMV8 disArmV8ParseLdrPacW;
    116118/** @}  */
    117119
     
    172174    disArmV8ParseImmHImmB,
    173175    disArmV8ParseSf,
    174     disArmV8ParseImmX16
     176    disArmV8ParseImmX16,
     177    disArmV8ParseLdrPacImm,
     178    disArmV8ParseLdrPacW
    175179};
    176180
     
    10301034
    10311035
     1036static int disArmV8ParseLdrPacImm(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8OPCODE pOp, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
     1037{
     1038    RT_NOREF(pDis, pOp, pInsnClass, pParam, pInsnParm, pf64Bit);
     1039
     1040    Assert(pInsnParm->cBits == 0);
     1041    Assert(pInsnParm->idxBitStart == 0);
     1042    Assert(pParam->armv8.enmType != kDisArmv8OpParmNone);
     1043
     1044    uint32_t u32 = disArmV8ExtractBitVecFromInsn(u32Insn, 12, 9) | ((u32Insn & RT_BIT_32(22)) >> 13);
     1045    pParam->armv8.cb = sizeof(int16_t);
     1046    pParam->armv8.u.offBase = disArmV8ExtractBitVecFromInsnSignExtend(u32, 0, 10) << 3;
     1047    return VINF_SUCCESS;
     1048}
     1049
     1050
     1051static int disArmV8ParseLdrPacW(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8OPCODE pOp, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
     1052{
     1053    RT_NOREF(pDis, pOp, pInsnClass, pParam, pInsnParm, pf64Bit);
     1054
     1055    Assert(pInsnParm->cBits == 1);
     1056    Assert(pInsnParm->idxBitStart == 11);
     1057    if (u32Insn & RT_BIT_32(11))
     1058        pParam->fUse |= DISUSE_PRE_INDEXED;
     1059    return VINF_SUCCESS;
     1060}
     1061
     1062
    10321063static uint32_t disArmV8DecodeIllegal(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass)
    10331064{
  • trunk/src/VBox/Disassembler/DisasmInternal-armv8.h

    r106754 r106758  
    9292    kDisParmParseSf,
    9393    kDisParmParseImmX16,
     94    kDisParmParseLdrPacImm,
     95    kDisParmParseLdrPacW,
    9496    kDisParmParseMax
    9597} DISPARMPARSEIDX;
  • trunk/src/VBox/Disassembler/DisasmTables-armv8-a64-ld-st.cpp.h

    r106757 r106758  
    170170
    171171
     172/* LDRAA/LDRAB */
     173DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdStRegPac)
     174    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr,          0,  5, 0 /*idxParam*/),
     175    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,      5,  5, 1 /*idxParam*/),
     176    DIS_ARMV8_INSN_DECODE(kDisParmParseLdrPacImm,      0,  0, 1 /*idxParam*/), /* Hardcoded */
     177    DIS_ARMV8_INSN_DECODE(kDisParmParseLdrPacW,       11,  1, 1 /*idxParam*/),
     178DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdStRegPac)
     179    DIS_ARMV8_OP(0xf8200400, "ldraa",           OP_ARMV8_A64_LDRAA,     DISOPTYPE_HARMLESS),
     180    DIS_ARMV8_OP(0xf8a00400, "ldrab",           OP_ARMV8_A64_LDRAB,     DISOPTYPE_HARMLESS),
     181DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdStRegPac, 0xffa00400 /*fFixedInsn*/,
     182                                       kDisArmV8OpcDecodeNop,
     183                                       RT_BIT_32(23), 23);
     184
     185
    172186/*
    173187 * C4.1.94 - Loads and Stores - Load/Store register variants
     
    184198DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStRegOp2_11_1)
    185199    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,         /** @todo */
    186     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,         /** @todo */
     200    DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegPac),
    187201    DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegOff),
    188     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,         /** @todo */
     202    DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegPac),
    189203DIS_ARMV8_DECODE_MAP_DEFINE_END(LdStRegOp2_11_1, RT_BIT_32(10) | RT_BIT_32(11), 10);
    190204
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S

    r106757 r106758  
    10801080        ldrsw x0, [sp, w2, SXTW #2]
    10811081
     1082
     1083        ; FEAT_PAuth memory loads
     1084
     1085        ldraa x0, [x1]
     1086        ldraa x0, [x1, #-1024]
     1087        ldraa x0, [x1, #-4096]
     1088        ldraa x0, [x1, #4088]
     1089
     1090        ldraa xzr, [sp]
     1091        ldraa xzr, [sp, #-1024]
     1092        ldraa xzr, [sp, #-4096]
     1093        ldraa xzr, [sp, #4088]
     1094
     1095        ldraa x0, [x1, #0]!
     1096        ldraa x0, [x1, #-1024]!
     1097        ldraa x0, [x1, #-4096]!
     1098        ldraa x0, [x1, #4088]!
     1099
     1100        ldraa xzr, [sp, #0]!
     1101        ldraa xzr, [sp, #-1024]!
     1102        ldraa xzr, [sp, #-4096]!
     1103        ldraa xzr, [sp, #4088]!
     1104
     1105
     1106        ldrab x0, [x1]
     1107        ldrab x0, [x1, #-1024]
     1108        ldrab x0, [x1, #-4096]
     1109        ldrab x0, [x1, #4088]
     1110
     1111        ldrab xzr, [sp]
     1112        ldrab xzr, [sp, #-1024]
     1113        ldrab xzr, [sp, #-4096]
     1114        ldrab xzr, [sp, #4088]
     1115
     1116        ldrab x0, [x1, #0]!
     1117        ldrab x0, [x1, #-1024]!
     1118        ldrab x0, [x1, #-4096]!
     1119        ldrab x0, [x1, #4088]!
     1120
     1121        ldrab xzr, [sp, #0]!
     1122        ldrab xzr, [sp, #-1024]!
     1123        ldrab xzr, [sp, #-4096]!
     1124        ldrab xzr, [sp, #4088]!
     1125
     1126
    10821127        ; Memory stores
    10831128        strb w0, [x28]
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