VirtualBox

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


Ignore:
Timestamp:
Oct 29, 2024 1:09:50 PM (6 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
165658
Message:

Disassembler: Decode load/store memory tags instructions, bugref:10394

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

Legend:

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

    r106768 r106770  
    114114static FNDISPARSEARMV8 disArmV8ParseSf;
    115115static FNDISPARSEARMV8 disArmV8ParseImmX16;
     116static FNDISPARSEARMV8 disArmV8ParseSImmTags;
    116117static FNDISPARSEARMV8 disArmV8ParseLdrPacImm;
    117118static FNDISPARSEARMV8 disArmV8ParseLdrPacW;
     
    175176    disArmV8ParseSf,
    176177    disArmV8ParseImmX16,
     178    disArmV8ParseSImmTags,
    177179    disArmV8ParseLdrPacImm,
    178180    disArmV8ParseLdrPacW
     
    10391041
    10401042
     1043static int disArmV8ParseSImmTags(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8OPCODE pOp, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
     1044{
     1045    RT_NOREF(pDis, pOp, pInsnClass, pf64Bit);
     1046
     1047    AssertReturn(pInsnParm->cBits <= 9, VERR_INTERNAL_ERROR_2);
     1048    Assert(pParam->armv8.enmType != kDisArmv8OpParmNone);
     1049
     1050    pParam->armv8.cb = sizeof(int16_t);
     1051    pParam->armv8.u.offBase = disArmV8ExtractBitVecFromInsnSignExtend(u32Insn, pInsnParm->idxBitStart, pInsnParm->cBits) << 4;
     1052    return VINF_SUCCESS;
     1053}
     1054
     1055
    10411056static int disArmV8ParseLdrPacImm(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8OPCODE pOp, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
    10421057{
  • trunk/src/VBox/Disassembler/DisasmInternal-armv8.h

    r106758 r106770  
    9292    kDisParmParseSf,
    9393    kDisParmParseImmX16,
     94    kDisParmParseSImmTags,
    9495    kDisParmParseLdrPacImm,
    9596    kDisParmParseLdrPacW,
  • trunk/src/VBox/Disassembler/DisasmTables-armv8-a64-ld-st.cpp.h

    r106768 r106770  
    10491049
    10501050
     1051/* STG/STZGM/LDG/STZG/ST2G/STGM/STZ2G/LDGM. */
     1052DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdStMemTags)
     1053    DIS_ARMV8_INSN_DECODE(kDisParmParseGprSp,           0,  5, 0 /*idxParam*/),
     1054    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,       5,  5, 1 /*idxParam*/),
     1055    DIS_ARMV8_INSN_DECODE(kDisParmParseSImmTags,       12,  9, 1 /*idxParam*/),
     1056DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdStMemTagsLdg) /** @todo imm9 == 0 */
     1057    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr,           0,  5, 0 /*idxParam*/),
     1058    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,       5,  5, 1 /*idxParam*/),
     1059    DIS_ARMV8_INSN_DECODE(kDisParmParseSImmTags,       12,  9, 1 /*idxParam*/),
     1060DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdStMemTagsStzgm) /** @todo imm9 == 0 */
     1061    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr,           0,  5, 0 /*idxParam*/),
     1062    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,       5,  5, 1 /*idxParam*/),
     1063DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdStMemTagsPostIndex)
     1064    DIS_ARMV8_INSN_DECODE(kDisParmParseGprSp,           0,  5, 0 /*idxParam*/),
     1065    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,       5,  5, 1 /*idxParam*/),
     1066    DIS_ARMV8_INSN_DECODE(kDisParmParseSImmTags,       12,  9, 1 /*idxParam*/),
     1067    DIS_ARMV8_INSN_DECODE(kDisParmParseSetPostIndexed,  0,  0, 1 /*idxParam*/),
     1068DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdStMemTagsPreIndex)
     1069    DIS_ARMV8_INSN_DECODE(kDisParmParseGprSp,           0,  5, 0 /*idxParam*/),
     1070    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,       5,  5, 1 /*idxParam*/),
     1071    DIS_ARMV8_INSN_DECODE(kDisParmParseSImmTags,       12,  9, 1 /*idxParam*/),
     1072    DIS_ARMV8_INSN_DECODE(kDisParmParseSetPreIndexed,   0,  0, 1 /*idxParam*/),
     1073DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdStMemTags)
     1074    DIS_ARMV8_OP_ALT_DECODE(0xd9200000, "stzgm",           OP_ARMV8_A64_STZGM,     DISOPTYPE_HARMLESS, LdStMemTagsStzgm),     /* FEAT_MTE2 */
     1075    DIS_ARMV8_OP_ALT_DECODE(0xd9200400, "stg",             OP_ARMV8_A64_STG,       DISOPTYPE_HARMLESS, LdStMemTagsPostIndex), /* FEAT_MTE */
     1076    DIS_ARMV8_OP(           0xd9200800, "stg",             OP_ARMV8_A64_STG,       DISOPTYPE_HARMLESS),                       /* FEAT_MTE */
     1077    DIS_ARMV8_OP_ALT_DECODE(0xd9200c00, "stg",             OP_ARMV8_A64_STG,       DISOPTYPE_HARMLESS, LdStMemTagsPreIndex),  /* FEAT_MTE */
     1078    DIS_ARMV8_OP_ALT_DECODE(0xd9600000, "ldg",             OP_ARMV8_A64_LDG,       DISOPTYPE_HARMLESS, LdStMemTagsLdg),       /* FEAT_MTE */
     1079    DIS_ARMV8_OP_ALT_DECODE(0xd9600400, "stzg",            OP_ARMV8_A64_STZG,      DISOPTYPE_HARMLESS, LdStMemTagsPostIndex), /* FEAT_MTE */
     1080    DIS_ARMV8_OP(           0xd9600800, "stzg",            OP_ARMV8_A64_STZG,      DISOPTYPE_HARMLESS),                       /* FEAT_MTE */
     1081    DIS_ARMV8_OP_ALT_DECODE(0xd9600c00, "stzg",            OP_ARMV8_A64_STZG,      DISOPTYPE_HARMLESS, LdStMemTagsPreIndex),  /* FEAT_MTE */
     1082    DIS_ARMV8_OP_ALT_DECODE(0xd9a00000, "stgm",            OP_ARMV8_A64_STGM,      DISOPTYPE_HARMLESS, LdStMemTagsStzgm),     /* FEAT_MTE2 */
     1083    DIS_ARMV8_OP_ALT_DECODE(0xd9a00400, "st2g",            OP_ARMV8_A64_ST2G,      DISOPTYPE_HARMLESS, LdStMemTagsPostIndex), /* FEAT_MTE */
     1084    DIS_ARMV8_OP(           0xd9a00800, "st2g",            OP_ARMV8_A64_ST2G,      DISOPTYPE_HARMLESS),                       /* FEAT_MTE */
     1085    DIS_ARMV8_OP_ALT_DECODE(0xd9a00c00, "st2g",            OP_ARMV8_A64_ST2G,      DISOPTYPE_HARMLESS, LdStMemTagsPreIndex),  /* FEAT_MTE */
     1086    DIS_ARMV8_OP_ALT_DECODE(0xd9e00000, "ldgm",            OP_ARMV8_A64_LDGM,      DISOPTYPE_HARMLESS, LdStMemTagsStzgm),     /* FEAT_MTE2 */
     1087    DIS_ARMV8_OP_ALT_DECODE(0xd9e00400, "stz2g",           OP_ARMV8_A64_STZ2G,     DISOPTYPE_HARMLESS, LdStMemTagsPostIndex), /* FEAT_MTE */
     1088    DIS_ARMV8_OP(           0xd9e00800, "stz2g",           OP_ARMV8_A64_STZ2G,     DISOPTYPE_HARMLESS),                       /* FEAT_MTE */
     1089    DIS_ARMV8_OP_ALT_DECODE(0xd9e00c00, "stz2g",           OP_ARMV8_A64_STZ2G,     DISOPTYPE_HARMLESS, LdStMemTagsPreIndex),  /* FEAT_MTE */
     1090DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdStMemTags, 0xffe00c00 /*fFixedInsn*/,
     1091                                       kDisArmV8OpcDecodeCollate,
     1092                                       RT_BIT_32(10) | RT_BIT_32(11) | RT_BIT_32(22) | RT_BIT_32(23), 10);
     1093
     1094
    10511095/**
    10521096 * C4.1.94 - Loads and Stores
    10531097 *
     1098 * Differentiate between further based on op0<3> (bit 31).
     1099 */
     1100DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStBit28_1_Bit29_0_Bit24_1_Bit21_1)
     1101    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,         /** @todo RCW compare and swap (pair) / 128-bit atomic memory operations */
     1102    DIS_ARMV8_DECODE_MAP_ENTRY(LdStMemTags),
     1103DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_1_Bit29_0_Bit24_1_Bit21_1, 31);
     1104
     1105
     1106/**
     1107 * C4.1.94 - Loads and Stores
     1108 *
     1109 * Differentiate between further based on op2<11> (bit 21).
     1110 */
     1111DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStBit28_1_Bit29_0_Bit24_1)
     1112    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,         /** @todo GCS load/store / LDIAPP/STILP / LDAPR/STLR / Memory Copy and Set */
     1113    DIS_ARMV8_DECODE_MAP_ENTRY(LdStBit28_1_Bit29_0_Bit24_1_Bit21_1),
     1114DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_1_Bit29_0_Bit24_1, 21);
     1115
     1116
     1117/**
     1118 * C4.1.94 - Loads and Stores
     1119 *
    10541120 * Differentiate between Load register (literal) and the other classes based on op2<14> (bit 24).
    10551121 */
    10561122DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStBit28_1_Bit29_0)
    10571123    DIS_ARMV8_DECODE_MAP_ENTRY(LdRegLiteral),
    1058     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,         /** @todo RCW compare and swap / 128-bit atomic memory instructions / GCS load/store / Load/store memory tags / LDIAPP/STILP / LDAPR/STLR / Memory Copy and Set */
     1124    DIS_ARMV8_DECODE_MAP_ENTRY(LdStBit28_1_Bit29_0_Bit24_1),
    10591125DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_1_Bit29_0, 24);
    10601126
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S

    r106768 r106770  
    36013601
    36023602        ;
     3603        ; Load/Store memory tags
     3604        ;
     3605
     3606        ;.cpu generic+mte
     3607
     3608        ;stg x0, [x0]
     3609        ;stg x0, [x0, #-4096]
     3610        ;stg x0, [x0, #4080]
     3611        ;stg sp, [sp]
     3612        ;stg sp, [sp, #-4096]
     3613        ;stg sp, [sp, #4080]
     3614
     3615        ;stg x0, [x0], #0
     3616        ;stg x0, [x0], #-4096
     3617        ;stg x0, [x0], #4080
     3618        ;stg sp, [sp], #0
     3619        ;stg sp, [sp], #-4096
     3620        ;stg sp, [sp], #4080
     3621
     3622        ;stg x0, [x0, #0]!
     3623        ;stg x0, [x0, #-4096]!
     3624        ;stg x0, [x0, #4080]!
     3625        ;stg sp, [sp, #0]!
     3626        ;stg sp, [sp, #-4096]!
     3627        ;stg sp, [sp, #4080]!
     3628
     3629        ;stzgm x1, [x0]
     3630        ;stzgm xzr, [sp]
     3631
     3632        ;ldg x0, [x0]
     3633        ;ldg x0, [x0, #-4096]
     3634        ;ldg x0, [x0, #4080]
     3635        ;ldg xzr, [sp]
     3636        ;ldg xzr, [sp, #-4096]
     3637        ;ldg xzr, [sp, #4080]
     3638
     3639        ;stzg x0, [x0]
     3640        ;stzg x0, [x0, #-4096]
     3641        ;stzg x0, [x0, #4080]
     3642        ;stzg sp, [sp]
     3643        ;stzg sp, [sp, #-4096]
     3644        ;stzg sp, [sp, #4080]
     3645
     3646        ;stzg x0, [x0], #0
     3647        ;stzg x0, [x0], #-4096
     3648        ;stzg x0, [x0], #4080
     3649        ;stzg sp, [sp], #0
     3650        ;stzg sp, [sp], #-4096
     3651        ;stzg sp, [sp], #4080
     3652
     3653        ;stzg x0, [x0, #0]!
     3654        ;stzg x0, [x0, #-4096]!
     3655        ;stzg x0, [x0, #4080]!
     3656        ;stzg sp, [sp, #0]!
     3657        ;stzg sp, [sp, #-4096]!
     3658        ;stzg sp, [sp, #4080]!
     3659
     3660        ;stgm x1, [x0]
     3661        ;stgm xzr, [sp]
     3662
     3663        ;st2g x0, [x0]
     3664        ;st2g x0, [x0, #-4096]
     3665        ;st2g x0, [x0, #4080]
     3666        ;st2g sp, [sp]
     3667        ;st2g sp, [sp, #-4096]
     3668        ;st2g sp, [sp, #4080]
     3669
     3670        ;st2g x0, [x0], #0
     3671        ;st2g x0, [x0], #-4096
     3672        ;st2g x0, [x0], #4080
     3673        ;st2g sp, [sp], #0
     3674        ;st2g sp, [sp], #-4096
     3675        ;st2g sp, [sp], #4080
     3676
     3677        ;st2g x0, [x0, #0]!
     3678        ;st2g x0, [x0, #-4096]!
     3679        ;st2g x0, [x0, #4080]!
     3680        ;st2g sp, [sp, #0]!
     3681        ;st2g sp, [sp, #-4096]!
     3682        ;st2g sp, [sp, #4080]!
     3683
     3684        ;ldgm x1, [x0]
     3685        ;ldgm xzr, [sp]
     3686
     3687        ;stz2g x0, [x0]
     3688        ;stz2g x0, [x0, #-4096]
     3689        ;stz2g x0, [x0, #4080]
     3690        ;stz2g sp, [sp]
     3691        ;stz2g sp, [sp, #-4096]
     3692        ;stz2g sp, [sp, #4080]
     3693
     3694        ;stz2g x0, [x0], #0
     3695        ;stz2g x0, [x0], #-4096
     3696        ;stz2g x0, [x0], #4080
     3697        ;stz2g sp, [sp], #0
     3698        ;stz2g sp, [sp], #-4096
     3699        ;stz2g sp, [sp], #4080
     3700
     3701        ;stz2g x0, [x0, #0]!
     3702        ;stz2g x0, [x0, #-4096]!
     3703        ;stz2g x0, [x0, #4080]!
     3704        ;stz2g sp, [sp, #0]!
     3705        ;stz2g sp, [sp, #-4096]!
     3706        ;stz2g sp, [sp, #4080]!
     3707
     3708        ;
    36033709        ; Keep last so the testcase can catch errors in
    36043710        ; the disassembly of the last instruction.
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1.cpp

    r106003 r106770  
    9090    /* Begin of stuff which will get ignored in the semantic matching. */
    9191    { RT_STR_TUPLE(".private_extern"),          RTSCRIPTLEXTOKTYPE_KEYWORD,    true,  0 },
     92    { RT_STR_TUPLE(".cpu"),                     RTSCRIPTLEXTOKTYPE_KEYWORD,    true,  0 },
     93    { RT_STR_TUPLE("generic+mte"),              RTSCRIPTLEXTOKTYPE_KEYWORD,    true,  0 },
    9294    { RT_STR_TUPLE("_testproca64"),             RTSCRIPTLEXTOKTYPE_KEYWORD,    true,  0 },
    9395    { RT_STR_TUPLE("_testproca64_endproc"),     RTSCRIPTLEXTOKTYPE_KEYWORD,    true,  0 },
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