VirtualBox

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


Ignore:
Timestamp:
Oct 24, 2024 12:42:39 PM (4 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
165504
Message:

Disassembler: Decode pre-indexed load instructions, bugref:10394

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmFormatArmV8.cpp

    r106616 r106657  
    817817                            PUT_STR(pszReg, cchReg);
    818818                        }
    819                         else if (pParam->armv8.u.offBase)
     819                        else if (   pParam->armv8.u.offBase
     820                                 || (pParam->fUse & (DISUSE_POST_INDEXED | DISUSE_PRE_INDEXED)))
    820821                        {
    821822                            PUT_SZ(", #");
  • trunk/src/VBox/Disassembler/DisasmTables-armv8-a64.cpp

    r106652 r106657  
    976976
    977977/*
     978 * STRB/LDRB/LDRSB/STRH/LDRH/LDRSH/STR/LDR/LDRSW/STR/LDR
     979 *
     980 * Note: The size,opc bitfields are concatenated to form an index.
     981 */
     982DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdStRegImmPreIndexGpr)
     983    DIS_ARMV8_INSN_DECODE(kDisParmParseSize,               30,  2, DIS_ARMV8_INSN_PARAM_UNSET),
     984    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr,               0,  5, 0 /*idxParam*/),
     985    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,           5,  5, 1 /*idxParam*/),
     986    DIS_ARMV8_INSN_DECODE(kDisParmParseSImmMemOffUnscaled, 12,  9, 1 /*idxParam*/),
     987    DIS_ARMV8_INSN_DECODE(kDisParmParseSetPreIndexed,       0,  0, 1 /*idxParam*/),
     988DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdStRegImmPreIndexGpr)
     989    DIS_ARMV8_OP(0x38000c00, "strb",            OP_ARMV8_A64_STRB,      DISOPTYPE_HARMLESS),
     990    DIS_ARMV8_OP(0x38400c00, "ldrb",            OP_ARMV8_A64_LDRB,      DISOPTYPE_HARMLESS),
     991 DIS_ARMV8_OP_EX(0x38800c00, "ldrsb",           OP_ARMV8_A64_LDRSB,     DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_64BIT),
     992 DIS_ARMV8_OP_EX(0x38c00c00, "ldrsb",           OP_ARMV8_A64_LDRSB,     DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_32BIT),
     993    DIS_ARMV8_OP(0x78000c00, "strh",            OP_ARMV8_A64_STRH,      DISOPTYPE_HARMLESS),
     994    DIS_ARMV8_OP(0x78400c00, "ldrh",            OP_ARMV8_A64_LDRH,      DISOPTYPE_HARMLESS),
     995 DIS_ARMV8_OP_EX(0x78800c00, "ldrsh",           OP_ARMV8_A64_LDURSH,    DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_64BIT),
     996 DIS_ARMV8_OP_EX(0x78c00c00, "ldrsh",           OP_ARMV8_A64_LDURSH,    DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_32BIT),
     997    DIS_ARMV8_OP(0xb8000c00, "str",             OP_ARMV8_A64_STR,       DISOPTYPE_HARMLESS),
     998    DIS_ARMV8_OP(0xb8400c00, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS),
     999 DIS_ARMV8_OP_EX(0xb8800c00, "ldrsw",           OP_ARMV8_A64_LDURSW,    DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_64BIT),
     1000    INVALID_OPCODE,
     1001    DIS_ARMV8_OP(0xf8000c00, "str",             OP_ARMV8_A64_STR,       DISOPTYPE_HARMLESS),
     1002    DIS_ARMV8_OP(0xf8400c00, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS),
     1003    INVALID_OPCODE,
     1004    INVALID_OPCODE,
     1005DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdStRegImmPreIndexGpr, 0xffe00c00 /*fFixedInsn*/,
     1006                                       kDisArmV8OpcDecodeCollate,
     1007                                       RT_BIT_32(22) | RT_BIT_32(23) | RT_BIT_32(30) | RT_BIT_32(31), 22);
     1008
     1009
     1010/*
     1011 * C4.1.94.28 - Loads and Stores - Load/Store register (immediate pre-indexed) variants
     1012 *
     1013 * Differentiate further based on the VR field.
     1014 *
     1015 *     Bit  26
     1016 *     +-------------------------------------------
     1017 *           0 GPR variants.
     1018 *           1 SIMD/FP variants
     1019 */
     1020DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStRegImmPreIndex)
     1021    DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegImmPreIndexGpr),
     1022    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo */
     1023DIS_ARMV8_DECODE_MAP_DEFINE_END(LdStRegImmPreIndex, RT_BIT_32(26), 26);
     1024
     1025
     1026/*
    9781027 * C4.1.94 - Loads and Stores - Load/Store register variants
    9791028 *
     
    9911040    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,         /** @todo */
    9921041    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,         /** @todo */
    993     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,         /** @todo */
     1042    DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegImmPreIndex),
    9941043DIS_ARMV8_DECODE_MAP_DEFINE_END(LdStRegOp2_11_0, RT_BIT_32(10) | RT_BIT_32(11), 10);
    9951044
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S

    r106649 r106657  
    570570        ldrsw x0, [sp, #16380]
    571571
     572        ldrb w0, [x28, #0]!
     573        ldrb w0, [x28, #-256]!
     574        ldrb w0, [x28, #255]!
     575
     576        ldrb w0, [sp, #0]!
     577        ldrb w0, [sp, #-256]!
     578        ldrb w0, [sp, #255]!
     579
     580        ldrsb w0, [x28, #0]!
     581        ldrsb w0, [x28, #-256]!
     582        ldrsb w0, [x28, #255]!
     583
     584        ldrsb w0, [sp, #0]!
     585        ldrsb w0, [sp, #-256]!
     586        ldrsb w0, [sp, #255]!
     587
     588        ldrsb x0, [x28, #0]!
     589        ldrsb x0, [x28, #-256]!
     590        ldrsb x0, [x28, #255]!
     591
     592        ldrsb x0, [sp, #0]!
     593        ldrsb x0, [sp, #-256]!
     594        ldrsb x0, [sp, #255]!
     595
     596        ldrh w0, [x28, #0]!
     597        ldrh w0, [x28, #-256]!
     598        ldrh w0, [x28, #255]!
     599
     600        ldrh w0, [sp, #0]!
     601        ldrh w0, [sp, #-256]!
     602        ldrh w0, [sp, #255]!
     603
     604        ldrsh w0, [x28, #0]!
     605        ldrsh w0, [x28, #-256]!
     606        ldrsh w0, [x28, #255]!
     607
     608        ldrsh w0, [sp, #0]!
     609        ldrsh w0, [sp, #-256]!
     610        ldrsh w0, [sp, #255]!
     611
     612        ldrsh x0, [x28, #0]!
     613        ldrsh x0, [x28, #-256]!
     614        ldrsh x0, [x28, #255]!
     615
     616        ldrsh x0, [sp, #0]!
     617        ldrsh x0, [sp, #-256]!
     618        ldrsh x0, [sp, #255]!
     619
     620        ldr x0, [x28, #0]!
     621        ldr x0, [x28, #-256]!
     622        ldr x0, [x28, #255]!
     623
     624        ldr x0, [sp, #0]!
     625        ldr x0, [sp, #-256]!
     626        ldr x0, [sp, #255]!
     627
     628        ldr w0, [x28, #0]!
     629        ldr w0, [x28, #-256]!
     630        ldr w0, [x28, #255]!
     631
     632        ldr w0, [sp, #0]!
     633        ldr w0, [sp, #-256]!
     634        ldr w0, [sp, #255]!
     635
     636        ldrsw x0, [x28, #0]!
     637        ldrsw x0, [x28, #-256]!
     638        ldrsw x0, [x28, #255]!
     639
     640        ldrsw x0, [sp, #0]!
     641        ldrsw x0, [sp, #-256]!
     642        ldrsw x0, [sp, #255]!
     643
     644
    572645        ldurb w0, [x28]
    573646        ldurb w0, [x28, #-256]
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