Changeset 106770 in vbox for trunk/src/VBox/Disassembler
- Timestamp:
- Oct 29, 2024 1:09:50 PM (6 months ago)
- svn:sync-xref-src-repo-rev:
- 165658
- Location:
- trunk/src/VBox/Disassembler
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Disassembler/DisasmCore-armv8.cpp
r106768 r106770 114 114 static FNDISPARSEARMV8 disArmV8ParseSf; 115 115 static FNDISPARSEARMV8 disArmV8ParseImmX16; 116 static FNDISPARSEARMV8 disArmV8ParseSImmTags; 116 117 static FNDISPARSEARMV8 disArmV8ParseLdrPacImm; 117 118 static FNDISPARSEARMV8 disArmV8ParseLdrPacW; … … 175 176 disArmV8ParseSf, 176 177 disArmV8ParseImmX16, 178 disArmV8ParseSImmTags, 177 179 disArmV8ParseLdrPacImm, 178 180 disArmV8ParseLdrPacW … … 1039 1041 1040 1042 1043 static 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 1041 1056 static int disArmV8ParseLdrPacImm(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8OPCODE pOp, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit) 1042 1057 { -
trunk/src/VBox/Disassembler/DisasmInternal-armv8.h
r106758 r106770 92 92 kDisParmParseSf, 93 93 kDisParmParseImmX16, 94 kDisParmParseSImmTags, 94 95 kDisParmParseLdrPacImm, 95 96 kDisParmParseLdrPacW, -
trunk/src/VBox/Disassembler/DisasmTables-armv8-a64-ld-st.cpp.h
r106768 r106770 1049 1049 1050 1050 1051 /* STG/STZGM/LDG/STZG/ST2G/STGM/STZ2G/LDGM. */ 1052 DIS_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*/), 1056 DIS_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*/), 1060 DIS_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*/), 1063 DIS_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*/), 1068 DIS_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*/), 1073 DIS_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 */ 1090 DIS_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 1051 1095 /** 1052 1096 * C4.1.94 - Loads and Stores 1053 1097 * 1098 * Differentiate between further based on op0<3> (bit 31). 1099 */ 1100 DIS_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), 1103 DIS_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 */ 1111 DIS_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), 1114 DIS_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 * 1054 1120 * Differentiate between Load register (literal) and the other classes based on op2<14> (bit 24). 1055 1121 */ 1056 1122 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStBit28_1_Bit29_0) 1057 1123 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), 1059 1125 DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_1_Bit29_0, 24); 1060 1126 -
trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S
r106768 r106770 3601 3601 3602 3602 ; 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 ; 3603 3709 ; Keep last so the testcase can catch errors in 3604 3710 ; the disassembly of the last instruction. -
trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1.cpp
r106003 r106770 90 90 /* Begin of stuff which will get ignored in the semantic matching. */ 91 91 { 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 }, 92 94 { RT_STR_TUPLE("_testproca64"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, 0 }, 93 95 { RT_STR_TUPLE("_testproca64_endproc"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, 0 },
Note:
See TracChangeset
for help on using the changeset viewer.