VirtualBox

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


Ignore:
Timestamp:
Oct 29, 2024 2:40:06 PM (3 months ago)
Author:
vboxsync
Message:

Disassembler: Decode Load/Store exclusive register instructions, bugref:10394

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmTables-armv8-a64-ld-st.cpp.h

    r106773 r106777  
    11701170
    11711171
     1172/* C4.1.94.14 - Loads and Stores - Compare and swap */
     1173DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdStExclusiveReg)
     1174    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr32,       16,  5, 0 /*idxParam*/),
     1175    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr32,        0,  5, 1 /*idxParam*/),
     1176    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,      5,  5, 2 /*idxParam*/),
     1177DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdStExclusiveRegLd32)
     1178    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr32,        0,  5, 0 /*idxParam*/),
     1179    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,      5,  5, 1 /*idxParam*/),
     1180DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdStExclusiveRegLd64)
     1181    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr64,        0,  5, 0 /*idxParam*/),
     1182    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,      5,  5, 1 /*idxParam*/),
     1183DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdStExclusiveRegSt64)
     1184    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr32,       16,  5, 0 /*idxParam*/),
     1185    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr64,        0,  5, 1 /*idxParam*/),
     1186    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,      5,  5, 2 /*idxParam*/),
     1187DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdStExclusiveReg)
     1188    DIS_ARMV8_OP(           0x08000000, "stxrb",           OP_ARMV8_A64_STXRB,     DISOPTYPE_HARMLESS),
     1189    DIS_ARMV8_OP(           0x08008000, "stlxrb",          OP_ARMV8_A64_STLXRB,    DISOPTYPE_HARMLESS),
     1190    DIS_ARMV8_OP_ALT_DECODE(0x08400000, "ldxrb",           OP_ARMV8_A64_LDXRB,     DISOPTYPE_HARMLESS, LdStExclusiveRegLd32),
     1191    DIS_ARMV8_OP_ALT_DECODE(0x08408000, "ldaxrb",          OP_ARMV8_A64_LDAXRB,    DISOPTYPE_HARMLESS, LdStExclusiveRegLd32),
     1192    DIS_ARMV8_OP(           0x48000000, "stxrh",           OP_ARMV8_A64_STXRH,     DISOPTYPE_HARMLESS),
     1193    DIS_ARMV8_OP(           0x48008000, "stlxrh",          OP_ARMV8_A64_STLXRH,    DISOPTYPE_HARMLESS),
     1194    DIS_ARMV8_OP_ALT_DECODE(0x48400000, "ldxrh",           OP_ARMV8_A64_LDXRH,     DISOPTYPE_HARMLESS, LdStExclusiveRegLd32),
     1195    DIS_ARMV8_OP_ALT_DECODE(0x48408000, "ldaxrh",          OP_ARMV8_A64_LDAXRH,    DISOPTYPE_HARMLESS, LdStExclusiveRegLd32),
     1196    DIS_ARMV8_OP(           0x88000000, "stxr",            OP_ARMV8_A64_STXR,      DISOPTYPE_HARMLESS),
     1197    DIS_ARMV8_OP(           0x88008000, "stlxr",           OP_ARMV8_A64_STLXR,     DISOPTYPE_HARMLESS),
     1198    DIS_ARMV8_OP_ALT_DECODE(0x88400000, "ldxr",            OP_ARMV8_A64_LDXR,      DISOPTYPE_HARMLESS, LdStExclusiveRegLd32),
     1199    DIS_ARMV8_OP_ALT_DECODE(0x88408000, "ldaxr",           OP_ARMV8_A64_LDAXR,     DISOPTYPE_HARMLESS, LdStExclusiveRegLd32),
     1200    DIS_ARMV8_OP_ALT_DECODE(0xc8000000, "stxr",            OP_ARMV8_A64_STXR,      DISOPTYPE_HARMLESS, LdStExclusiveRegSt64),
     1201    DIS_ARMV8_OP_ALT_DECODE(0xc8008000, "stlxr",           OP_ARMV8_A64_STLXR,     DISOPTYPE_HARMLESS, LdStExclusiveRegSt64),
     1202    DIS_ARMV8_OP_ALT_DECODE(0xc8400000, "ldxr",            OP_ARMV8_A64_LDXR,      DISOPTYPE_HARMLESS, LdStExclusiveRegLd64),
     1203    DIS_ARMV8_OP_ALT_DECODE(0xc8408000, "ldaxr",           OP_ARMV8_A64_LDAXR,     DISOPTYPE_HARMLESS, LdStExclusiveRegLd64),
     1204DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdStExclusiveReg, 0xffe08000 /*fFixedInsn*/,
     1205                                       kDisArmV8OpcDecodeCollate,
     1206                            /* o0 */     RT_BIT_32(15)
     1207                            /* L  */   | RT_BIT_32(22)
     1208                            /* size */ | RT_BIT_32(30) | RT_BIT_32(31), 15);
     1209
     1210
    11721211/**
    11731212 * C4.1.94 - Loads and Stores
    11741213 *
     1214 * Differentiate between Load/Store exclusive register and pair instruction classes based on op2<11> (bit 21).
     1215 */
     1216DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStExclusive)
     1217    DIS_ARMV8_DECODE_MAP_ENTRY(LdStExclusiveReg),
     1218    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY, /** @todo DIS_ARMV8_DECODE_MAP_ENTRY(LdStExclusivePair), */
     1219DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStExclusive, 21);
     1220
     1221
     1222/**
     1223 * C4.1.94 - Loads and Stores
     1224 *
    11751225 * Differentiate between Advanced SIMD load/stores and the rest based on op2<13> (bit 23).
    11761226 */
    11771227DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStBit28_1_Bit29_0_Bit26_1)
    1178     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY, /** @todo  Load/store exclusive register */
     1228    DIS_ARMV8_DECODE_MAP_ENTRY(LdStExclusive),
    11791229    DIS_ARMV8_DECODE_MAP_ENTRY(LdStOrdered_Cas),
    11801230DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_1_Bit29_0_Bit26_1, 23);
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S

    r106774 r106777  
    37593759
    37603760        ;
     3761        ; Load/store exclusive register
     3762        ;
     3763
     3764        stxrb  w0,   w1, [x2]
     3765        stxrb  w0,  wzr, [sp]
     3766        stxrb  wzr,  w0, [sp]
     3767
     3768        stlxrb  w0,   w1, [x2]
     3769        stlxrb  w0,  wzr, [sp]
     3770        stlxrb  wzr,  w0, [sp]
     3771
     3772        ldxrb  w0,  [x2]
     3773        ldxrb  wzr, [sp]
     3774
     3775        ldaxrb  w0,  [x2]
     3776        ldaxrb  wzr, [sp]
     3777
     3778        stxrh  w0,   w1, [x2]
     3779        stxrh  w0,  wzr, [sp]
     3780        stxrh  wzr,  w0, [sp]
     3781
     3782        stlxrh  w0,   w1, [x2]
     3783        stlxrh  w0,  wzr, [sp]
     3784        stlxrh  wzr,  w0, [sp]
     3785
     3786        ldxrh  w0,  [x2]
     3787        ldxrh  wzr, [sp]
     3788
     3789        ldaxrh  w0,  [x2]
     3790        ldaxrh  wzr, [sp]
     3791
     3792        stxr  w0,   w1, [x2]
     3793        stxr  w0,  wzr, [sp]
     3794        stxr  wzr,  w0, [sp]
     3795
     3796        stlxr  w0,   w1, [x2]
     3797        stlxr  w0,  wzr, [sp]
     3798        stlxr  wzr,  w0, [sp]
     3799
     3800        ldxr  w0,  [x2]
     3801        ldxr  wzr, [sp]
     3802
     3803        ldaxr  w0,  [x2]
     3804        ldaxr  wzr, [sp]
     3805
     3806        stxr  w0,   x1, [x2]
     3807        stxr  w0,  xzr, [sp]
     3808        stxr  wzr,  x0, [sp]
     3809
     3810        stlxr  w0,   x1, [x2]
     3811        stlxr  w0,  xzr, [sp]
     3812        stlxr  wzr,  x0, [sp]
     3813
     3814        ldxr  x0,  [x2]
     3815        ldxr  xzr, [sp]
     3816
     3817        ldaxr  x0,  [x2]
     3818        ldaxr  xzr, [sp]
     3819
     3820        ;
    37613821        ; Keep last so the testcase can catch errors in
    37623822        ; the disassembly of the last instruction.
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