@@ -973,6 +973,44 @@ bool GetLowLevelILForThumbInstruction(Architecture* arch, LowLevelILFunction& il
973
973
il.AddInstruction (WriteArithOperand (il, instr, il.LogicalShiftRight (4 , ReadArithOperand (il, instr, 0 ),
974
974
ReadArithOperand (il, instr, 1 ), ifThenBlock ? 0 : IL_FLAGWRITE_CNZ)));
975
975
break ;
976
+ case armv7::ARMV7_MCR:
977
+ case armv7::ARMV7_MCR2:
978
+ {
979
+ int dest_reg_field = instr->fields [instr->format ->operands [2 ].field0 ];
980
+ int dest_reg = GetRegisterByIndex (dest_reg_field, instr->format ->operands [2 ].prefix );
981
+
982
+ il.AddInstruction (
983
+ il.Intrinsic ({ }, ARMV7_INTRIN_COPROC_SENDONEWORD,
984
+ {
985
+ il.Register (4 , dest_reg),
986
+ il.Const (1 , instr->fields [instr->format ->operands [0 ].field0 ]),
987
+ il.Const (1 , instr->fields [instr->format ->operands [1 ].field0 ]),
988
+ il.Const (1 , instr->fields [instr->format ->operands [3 ].field0 ]),
989
+ il.Const (1 , instr->fields [instr->format ->operands [4 ].field0 ]),
990
+ il.Const (1 , instr->fields [instr->format ->operands [5 ].field0 ]),
991
+ }
992
+ )
993
+ );
994
+ break ;
995
+ }
996
+ case ARMV7_MCRR:
997
+ case ARMV7_MCRR2:
998
+ {
999
+ int rt = instr->fields [instr->format ->operands [2 ].field0 ];
1000
+ int rt2 = instr->fields [instr->format ->operands [3 ].field0 ];
1001
+ il.AddInstruction (
1002
+ il.Intrinsic ({ }, ARMV7_INTRIN_COPROC_SENDTWOWORDS,
1003
+ {
1004
+ il.Register (4 , rt2),
1005
+ il.Register (4 , rt),
1006
+ il.Const (1 , instr->fields [instr->format ->operands [0 ].field0 ]),
1007
+ il.Const (1 , instr->fields [instr->format ->operands [1 ].field0 ]),
1008
+ il.Const (1 , instr->fields [instr->format ->operands [4 ].field0 ]),
1009
+ }
1010
+ )
1011
+ );
1012
+ break ;
1013
+ }
976
1014
case armv7::ARMV7_MLA:
977
1015
il.AddInstruction (WriteILOperand (il, instr, 0 , il.Add (4 , ReadILOperand (il, instr, 3 ), il.Mult (4 , ReadILOperand (il, instr, 1 ), ReadILOperand (il, instr, 2 )))));
978
1016
break ;
@@ -993,6 +1031,66 @@ bool GetLowLevelILForThumbInstruction(Architecture* arch, LowLevelILFunction& il
993
1031
il.ShiftLeft (4 , il.Const (2 , instr->fields [instr->format ->operands [1 ].field0 ]), il.Const (1 , 16 )),
994
1032
il.And (4 , il.Const (4 , 0x0000ffff ), ReadILOperand (il, instr, 0 )))));
995
1033
break ;
1034
+ case armv7::ARMV7_MRC:
1035
+ case armv7::ARMV7_MRC2:
1036
+ {
1037
+ auto params = {
1038
+ il.Const (1 , instr->fields [instr->format ->operands [0 ].field0 ]), /* cp */
1039
+ il.Const (1 , instr->fields [instr->format ->operands [1 ].field0 ]), /* opc1 */
1040
+ il.Const (1 , instr->fields [instr->format ->operands [3 ].field0 ]), /* crn */
1041
+ il.Const (1 , instr->fields [instr->format ->operands [4 ].field0 ]), /* crm */
1042
+ il.Const (1 , instr->fields [instr->format ->operands [5 ].field0 ]), /* opc2 */
1043
+ };
1044
+
1045
+ int dest_reg_field = instr->fields [instr->format ->operands [2 ].field0 ];
1046
+ if (dest_reg_field == 15 )
1047
+ {
1048
+ il.AddInstruction (
1049
+ il.Intrinsic (
1050
+ { RegisterOrFlag::Register (LLIL_TEMP (0 )) },
1051
+ ARMV7_INTRIN_COPROC_GETONEWORD,
1052
+ params
1053
+ )
1054
+ );
1055
+ il.AddInstruction (il.SetFlag (IL_FLAG_N, il.TestBit (4 , il.Register (4 , LLIL_TEMP (0 )), il.Const (1 , 31 ))));
1056
+ il.AddInstruction (il.SetFlag (IL_FLAG_Z, il.TestBit (4 , il.Register (4 , LLIL_TEMP (0 )), il.Const (1 , 30 ))));
1057
+ il.AddInstruction (il.SetFlag (IL_FLAG_C, il.TestBit (4 , il.Register (4 , LLIL_TEMP (0 )), il.Const (1 , 29 ))));
1058
+ il.AddInstruction (il.SetFlag (IL_FLAG_V, il.TestBit (4 , il.Register (4 , LLIL_TEMP (0 )), il.Const (1 , 28 ))));
1059
+ break ;
1060
+ }
1061
+
1062
+ int dest_reg = GetRegisterByIndex (dest_reg_field, instr->format ->operands [2 ].prefix );
1063
+
1064
+ il.AddInstruction (
1065
+ il.Intrinsic (
1066
+ {RegisterOrFlag::Register (dest_reg)}, /* outputs */
1067
+ ARMV7_INTRIN_COPROC_GETONEWORD,
1068
+ params /* inputs */
1069
+ )
1070
+ );
1071
+ break ;
1072
+ }
1073
+
1074
+ case ARMV7_MRRC:
1075
+ case ARMV7_MRRC2:
1076
+ {
1077
+ int rt = instr->fields [instr->format ->operands [2 ].field0 ];
1078
+ int rt2 = instr->fields [instr->format ->operands [3 ].field0 ];
1079
+
1080
+ il.AddInstruction (
1081
+ il.Intrinsic (
1082
+ { RegisterOrFlag::Register (rt2), RegisterOrFlag::Register (rt) },
1083
+ ARMV7_INTRIN_COPROC_GETTWOWORDS,
1084
+ {
1085
+ il.Const (1 , instr->fields [instr->format ->operands [0 ].field0 ]),
1086
+ il.Const (1 , instr->fields [instr->format ->operands [1 ].field0 ]),
1087
+ il.Const (1 , instr->fields [instr->format ->operands [4 ].field0 ]),
1088
+ }
1089
+ )
1090
+ );
1091
+ break ;
1092
+ }
1093
+
996
1094
case armv7::ARMV7_MRS:
997
1095
{
998
1096
int dest_reg = GetRegisterByIndex (instr->fields [instr->format ->operands [0 ].field0 ], instr->format ->operands [0 ].prefix );
0 commit comments