VirtualBox

Changeset 106768 in vbox


Ignore:
Timestamp:
Oct 29, 2024 11:16:24 AM (5 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
165656
Message:

Disassembler: Decode ldr/ldrsw (literal) instructions, bugref:10394

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

Legend:

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

    r106760 r106768  
    198198DECLINLINE(int32_t) disArmV8ExtractBitVecFromInsnSignExtend(uint32_t u32Insn, uint8_t idxBitStart, uint8_t cBits)
    199199{
    200     uint32_t fMask = RT_BIT_32(idxBitStart + cBits) - 1;
    201     uint32_t fSign = ~(UINT32_MAX & (RT_BIT_32(cBits - 1) - 1));
    202     uint32_t fValue = (u32Insn & fMask) >> idxBitStart;
    203     if (fValue & fSign)
    204         return (int32_t)(fValue | fSign);
    205 
    206     return (int32_t)fValue;
     200    uint32_t const fMask = RT_BIT_32(cBits) - 1;
     201    uint32_t const fSignBit = RT_BIT_32(cBits - 1);
     202    uint32_t const u32 = (u32Insn >> idxBitStart) & fMask;
     203    return (int32_t)((u32 ^ fSignBit) - fSignBit);
    207204}
    208205
  • trunk/src/VBox/Disassembler/DisasmTables-armv8-a64-ld-st.cpp.h

    r106767 r106768  
    997997
    998998
     999/* LDR/LDRSW/PRFM - literal variant. */
     1000DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdRegLiteralGpr)
     1001    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr,           0,  5, 0 /*idxParam*/),
     1002    DIS_ARMV8_INSN_DECODE(kDisParmParseImmRel,          5, 19, 1 /*idxParam*/),
     1003DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdRegLiteralGpr)
     1004 DIS_ARMV8_OP_EX(0x18000000, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_32BIT),
     1005 DIS_ARMV8_OP_EX(0x58000000, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_64BIT),
     1006 DIS_ARMV8_OP_EX(0x98000000, "ldrsw",           OP_ARMV8_A64_LDRSW,     DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_64BIT),
     1007    INVALID_OPCODE, /** @todo PRFM */
     1008DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdRegLiteralGpr, 0xff000000 /*fFixedInsn*/,
     1009                                       kDisArmV8OpcDecodeNop,
     1010                                       RT_BIT_32(30) | RT_BIT_32(31), 30);
     1011
     1012
     1013/* SIMD LDR - literal variant. */
     1014DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdRegLiteralSimd)
     1015    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegSize32,       0,  0, DIS_ARMV8_INSN_PARAM_UNSET),
     1016    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegScalar,       0,  5, 0 /*idxParam*/),
     1017    DIS_ARMV8_INSN_DECODE(kDisParmParseImmRel,              5, 19, 1 /*idxParam*/),
     1018DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdRegLiteralSimd64)
     1019    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegSize64,       0,  0, DIS_ARMV8_INSN_PARAM_UNSET),
     1020    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegScalar,       0,  5, 0 /*idxParam*/),
     1021    DIS_ARMV8_INSN_DECODE(kDisParmParseImmRel,              5, 19, 1 /*idxParam*/),
     1022DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdRegLiteralSimd128)
     1023    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegSize128,      0,  0, DIS_ARMV8_INSN_PARAM_UNSET),
     1024    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegScalar,       0,  5, 0 /*idxParam*/),
     1025    DIS_ARMV8_INSN_DECODE(kDisParmParseImmRel,              5, 19, 1 /*idxParam*/),
     1026DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdRegLiteralSimd)
     1027    DIS_ARMV8_OP(           0x1c000000, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS),
     1028    DIS_ARMV8_OP_ALT_DECODE(0x5c000000, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS, LdRegLiteralSimd64),
     1029    DIS_ARMV8_OP_ALT_DECODE(0x9c000000, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS, LdRegLiteralSimd128),
     1030DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdRegLiteralSimd, 0xff000000 /*fFixedInsn*/,
     1031                                       kDisArmV8OpcDecodeNop,
     1032                                       RT_BIT_32(30) | RT_BIT_32(31), 30);
     1033
     1034
     1035/*
     1036 * C4.1.94.19 - Loads and Stores - Load register (literal) variants
     1037 *
     1038 * Differentiate further based on the VR field.
     1039 *
     1040 *     Bit  26
     1041 *     +-------------------------------------------
     1042 *           0 GPR variants.
     1043 *           1 SIMD/FP variants
     1044 */
     1045DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdRegLiteral)
     1046    DIS_ARMV8_DECODE_MAP_ENTRY(LdRegLiteralGpr),
     1047    DIS_ARMV8_DECODE_MAP_ENTRY(LdRegLiteralSimd),
     1048DIS_ARMV8_DECODE_MAP_DEFINE_END(LdRegLiteral, RT_BIT_32(26), 26);
     1049
     1050
     1051/**
     1052 * C4.1.94 - Loads and Stores
     1053 *
     1054 * Differentiate between Load register (literal) and the other classes based on op2<14> (bit 24).
     1055 */
     1056DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStBit28_1_Bit29_0)
     1057    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 */
     1059DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_1_Bit29_0, 24);
     1060
     1061
    9991062/*
    10001063 * C4.1.94 - Loads and Stores
     
    10141077DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStOp0Lo)
    10151078    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo */
    1016     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo */
     1079    DIS_ARMV8_DECODE_MAP_ENTRY(LdStBit28_1_Bit29_0),
    10171080    DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegPair),
    10181081    DIS_ARMV8_DECODE_MAP_ENTRY(LdStReg),
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S

    r106767 r106768  
    35733573
    35743574        ;
     3575        ; LDR literal variants
     3576        ;
     3577
     3578        ldr w0, #0
     3579        ldr wzr, #0xffffc
     3580        ldr wzr, #-0xffffc
     3581
     3582        ldr x0, #0
     3583        ldr xzr, #0xffffc
     3584        ldr xzr, #-0xffffc
     3585
     3586        ldrsw x0, #0
     3587        ldrsw xzr, #0xffffc
     3588        ldrsw xzr, #-0xffffc
     3589
     3590        ldr s0, #0
     3591        ldr s31, #0xffffc
     3592        ldr s31, #-0xffffc
     3593
     3594        ldr d0, #0
     3595        ldr d31, #0xffffc
     3596        ldr d31, #-0xffffc
     3597
     3598        ldr q0, #0
     3599        ldr q31, #0xffffc
     3600        ldr q31, #-0xffffc
     3601
     3602        ;
    35753603        ; Keep last so the testcase can catch errors in
    35763604        ; the disassembly of the last instruction.
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