Skip to content

Commit f024c7e

Browse files
authored
Fix archinfo for c64x for invalid and unaligned instructions ##arch (#24076)
1 parent 6804108 commit f024c7e

File tree

2 files changed

+103
-88
lines changed

2 files changed

+103
-88
lines changed

libr/arch/p/tms320/plugin.c

+16-8
Original file line numberDiff line numberDiff line change
@@ -388,9 +388,14 @@ static bool decode(RArchSession *as, RAnalOp *op, RAnalOpMask mask) {
388388
const ut64 addr = op->addr;
389389
const ut8 *buf = op->bytes;
390390
const int len = op->size;
391-
op->size = 1;
391+
op->size = 2;
392392
const char *cpu = as->config->cpu;
393+
#ifdef CAPSTONE_TMS320C64X_H
394+
// default to c64x if available
395+
TMS_ANAL_OP_FN aop = tms320c64x_analop;
396+
#else
393397
TMS_ANAL_OP_FN aop = tms320_c55x_op;
398+
#endif
394399
if (R_STR_ISNOTEMPTY (cpu)) {
395400
tms320_dasm_t *engine = tms320_engine_for_session (as);
396401
if (!r_str_casecmp (cpu, "c64x")) {
@@ -410,15 +415,16 @@ static bool decode(RArchSession *as, RAnalOp *op, RAnalOpMask mask) {
410415
aop = tms320_c55x_plus_op;
411416
}
412417
}
418+
ut8 mbuf[4];
419+
const ut8 *lbuf = buf;
413420
if (len > 3 && as->config->big_endian & R_SYS_ENDIAN_BIG) {
414-
ut8 mbuf[4];
415421
mbuf[0] = buf[3];
416422
mbuf[1] = buf[2];
417423
mbuf[2] = buf[1];
418424
mbuf[3] = buf[0];
419-
return aop (as, op, addr, mbuf, len, mask) > 0;
425+
lbuf = mbuf;
420426
}
421-
return aop (as, op, addr, buf, len, mask) > 0;
427+
return aop (as, op, addr, lbuf, len, mask) > 0;
422428
}
423429

424430
static bool tms320_init(RArchSession *as) {
@@ -465,16 +471,18 @@ static char *mnemonics(RArchSession *s, int id, bool json) {
465471

466472
static int archinfo(RArchSession *as, ut32 q) {
467473
switch (q) {
474+
case R_ARCH_INFO_DATA_ALIGN:
475+
return 2;
468476
case R_ARCH_INFO_CODE_ALIGN:
469-
return 0;
477+
return 2;
470478
case R_ARCH_INFO_MAXOP_SIZE:
471479
return 8;
472480
case R_ARCH_INFO_INVOP_SIZE:
473-
return 1;
481+
return 2;
474482
case R_ARCH_INFO_MINOP_SIZE:
475-
return 1;
483+
return 2;
476484
}
477-
return -1;
485+
return 4;
478486
}
479487

480488
const RArchPlugin r_arch_plugin_tms320 = {

test/db/anal/tms320.c64x_32

+87-80
Original file line numberDiff line numberDiff line change
@@ -50,123 +50,113 @@ pi~=
5050
EOF
5151
EXPECT=<<EOF
5252
a17 = (half) 0x13cf
53-
a28 = 0 ext a0 .. 0
54-
b23:b22 = (word)*a1++[12]
55-
a4 = 2 ext a0 .. 0x1a
56-
a26 = 0x4988
57-
a4 = 0x12 .bitset a20 .. 0x12
58-
a13:a12 = (word)*-a18[a12]
59-
a17 = a31 avg a0
53+
a0 = 2 .bitset a0 .. 2
54+
a0 = (half)*+b15[0x5a48]
55+
b9 = b17 - 1
56+
*-a18[a4] = (word)b4
57+
a19 = 0xf ext a2 .. 5
58+
a7 = 7 ext a25 .. 0x10
6059
b22 = (word)*+b14[0x3da6]
6160
a4 = (half)*+b15[0x49]
6261
a25 = 8 ext a21 .. 0x10
6362
a = a8 ~ a21
64-
a16 = a23 * a25
65-
b17 = (half)*+b15[0xd15]
63+
a0 = (half)*+b15[0x48]
6664
a16 = (half)*+b14[0x0]
6765
*+b15[0x6c41] = (word)b19
6866
b8 = (byte)*+b14[0x660f]
6967
b12 = (byte)*+b14[0x2e0f]
7068
b12 = (byte)*+b14[0x2e0f]
71-
a0 = 0x1a .bitset a20 .. 0x1a
72-
a22 = 9 .bitclear a17 .. 9
73-
a10 = 0xe ext a12 .. 0
74-
a7 = 0 ext a27 .. 0x10
75-
a22 = 0x18 ext a29 .. 8
76-
*+b14[0x488b] = (byte)b0
69+
b6 = b4 cmpgtu b18
70+
*-a12[a14] = (half)a11:a10
71+
b3 = b2 * b16
72+
b24 = 2 .bitset b4 .. 2
73+
b14 = (half)*-a2[a2]
74+
a17 = 0x19 ext a2 .. 0x1f
7775
a14 = 1 ext a17 .. 4
7876
a17 = (byte)*a3--[10]
7977
b16 = (half) -0x2c00
8078
b4 = (half)*+b15[0x488d]
81-
a6 = (half) 1
79+
*-a0[a7] = (word)a0
8280
a30 = 0 ext a0 .. 0
8381
a23:a22 = 1 + a20:a19
8482
a20 = (half)*-a23[a18]
85-
b8 += 0x2463
86-
*-a1[14] = (word)a17
87-
a16 = 0x1a ext a0 .. 0x11
88-
a23 = 0x1c ext a16 .. 0x10
89-
*+b14[0x5b1] = (word)b26
90-
a4 = 2 ext a0 .. 0x13
91-
b19 = 0x1a .bitset b30 .. 0x1a
92-
b9 = (half)*+b15[0xb05]
93-
a10 = 0x10 ext a8 .. 0
83+
a4 = 0xe ext a12 .. 0x12
84+
b8 = 0x1a .bitset b0 .. 0x1a
85+
a0 += -0x6ffa
86+
b16 += -0x6eee
87+
*+a18[4] = (half)a1:a0
88+
b30 += 0x4400
89+
a17 = (half)*+b14[0x9fb]
90+
b4 = 2 .bitset b0 .. 2
9491
a26 = (byte)*-a5[15]
9592
b0 = 2 .bitset b0 .. 2
9693
a30 = (word)*+b15[0x4883]
97-
*+b15[0x47c1] = (word)b17
98-
*+b15[0x7fff] = (word)b31
99-
a1 = a16 * a15
100-
*-a3[a7] = (word)b1
101-
a10 = 8 ext a0 .. 0
102-
a18 = max(a24, a16)
103-
b20 = (half)*+b14[0x5bc3]
104-
b30 = (word)*-a16[0]
94+
*+b15[0x41ff] = (word)b15
95+
a0 = (half) 0x119
96+
a12 = a8 * a13
97+
a17 = 0xa ext a2 .. 3
98+
b16 = b22 - 0x12
99+
b0 = (byte)*+b14[0x66]
105100
a0 = 0x10 ext a15 .. 0
106-
a2 = 8 ext a29 .. 0x18
107-
a23:a22 = (word)*-a1[12]
108-
b4 = 2 .bitset b0 .. 2
101+
b10 = 2 .bitset b6 .. 2
102+
a0 = 4 ext a18 .. 0xb
109103
*+b14[0xd05] = (half)b17
110104
a14 = 8 ext a0 .. 0
111105
b11 = (half)*+b14[0x4948]
112106
a9 = (half)*+b15[0x4848]
113-
a17 = a24 * a29
114-
a1:a0 = a0 * a0
115-
a26 = a0 * a1
116-
b30 = (word)*-a7[24]
107+
*+b15[0x100] = (byte)b14
108+
*+b14[0x40e9] = (word)a3
109+
b8 = (half)*+b14[0x100]
110+
b30 = (byte)*+b14[0x66]
117111
a17 = 0x18 ext a2 .. 5
118112
a10 = 0x10 ext a8 .. 0
119113
a19 = (half)*+b15[0x5048]
120-
a15 = a24 * a29
121-
a17 = 0xf ext a2 .. 0x11
122-
*a13--(a9) = (half)b27:b26
123-
b2 = 5 * b0
124-
a0 = 0 ext a0 .. 0
125-
a22 = (half)*-a0[a2]
126-
a30 = 6 ext a17 .. 2
114+
a14 = 8 ext a0 .. 0
115+
a19 = (half)*+b15[0x7148]
116+
*+b15[0x100] = (byte)b14
117+
b0 = 2 .bitset b0 .. 2
118+
b11 = (half)*+b14[0x4048]
119+
a9 = 0x12 .bitset a16 .. 0x12
127120
a4 = (half) 0x6381
128121
a24 = a0 * a1
129122
b13 = (byte)*+b14[0x1066]
130-
*a16++[10] = (half)a0
131-
b19 += 0x13fc
132-
a17 = 0xe ext a2 .. 0x15
133-
a26 = 0xc * a3
134-
b0 = b2 * b0
135-
a24 = (byte)*+b14[0x508b]
123+
a2 = 0x12 ext a21 .. 0x15
124+
a19 = 0x12 ext a31 .. 0x13
125+
a19 = (half)*+b15[0x5548]
126+
a0 = 0 ext a0 .. 0
127+
b7 = 2 .bitset b27 .. 2
136128
a28 = 0x10 ext a8 .. 0
137129
a18 = 1 ext a31 .. 4
138130
a17 = (byte)*a2--[9]
139-
a26 = a1 * a17
140-
a28 = 1 ext a17 .. 4
141-
a17 = (byte)*a3--[10]
142-
a30 = (half)*a3++[24]
143-
a17 = (byte)*a3--[11]
144-
*+b14[0x488d] = (word)a16
145-
b8 = (half)*-a8[a2]
131+
*+b14[0x730f] = (word)b1
132+
a8 = 0 ext a9 .. 8
133+
b26 = (byte)*+b14[0x5424]
134+
a8 = (half)*+b15[0x2448]
135+
a8 = 1 ext a9 .. 8
136+
b0 = (half)*-a0[0]
146137
a18 = a1 * a17
147138
*+b15[0x63fc] = (word)b16
148139
*+a19[a4] = (half)a31:a30
149140
*-a1[14] = (word)a27
150-
a3 = (byte)*+b14[0x4039]
141+
a0 = 8 .bitclear a14 .. 8
151142
b26 = (half)*+b14[0x2200]
152143
b11 = b2 * b16
153144
*+b14[0x505b] = (half)a8
154145
b2 = (half)*+b14[0x5ec3]
155-
a8 = 0 ext a0 .. 0
146+
a0 = (half)*+b15[0x48]
156147
a14 = 0x10 ext a0 .. 0
157148
a19 = 0xa .bitset a26 .. 0xa
158149
*+b15[0x31c0] = (byte)b4
159-
a0 = (half) 1
160-
a14 = a24 * a0
161-
a17 += 0x788
162-
*+b14[0x405b] = (half)a3
163-
b3:b2 = (word)*+a23[22]
164-
b0 = (half)*+b14[0x662e]
165-
b0 = 0x1a .bitset b20 .. 0x1a
166-
a14 = 2 .bitset a4 .. 2
167-
b22 = b4 - b18
168-
a17 = 0x1b ext a2 .. 0x1f
169-
a3 = a18 * a20
150+
b0 = (byte)*-a0[a7]
151+
a6 = 8 ext a0 .. 0
152+
a8:a7 = a2 * a17
153+
a0 = a22 + 0x1a
154+
b12 = (byte)*+b14[0x2e0f]
155+
*+a17[a4] = (half)b7:b6
156+
b0 = b4 cmpgtu b18
157+
a17 = 0x19 ext a2 .. 0x13
158+
a = a24 ~ a31
159+
a4 = a12 - a16
170160
a31 = (half)*+a5[14]
171161
a3 = 9 .bitclear a18 .. 9
172162
a20 = 0 ext a0 .. 0
@@ -189,18 +179,35 @@ a15 = a25 - a26
189179
a20 = (half)*+b15[0x348]
190180
a16 = 0xe ext a0 .. 0
191181
a19 = (half)*-a16[a10]
192-
a2 = (half)*a3++[29]
193-
a26 = 2 .bitset a0 .. 2
194-
a12 = 0xe ext a29 .. 0x18
182+
a31 = (half)*+b14[0x3644]
183+
a0 += -0x6eed
184+
a11 = (half)*+b15[0x5849]
195185
a12 = 5 .bitclear a5 .. 5
196186
a0 = (half)*+b14[0x0]
197187
a16 = (half)*+b14[0x29f0]
198188
*+b14[0x7f48] = (byte)a19
189+
b0 = (half)*+b14[0x48]
190+
a15 = a20 - a16
191+
a16 = a16 - 0xc
192+
a4 = a2 - 4
193+
b17 += 0x4a63
194+
a0 = 3 ext a1 .. 0x14
195+
a0 = zero
196+
*+a16[0] = (word)a13
197+
a24 = (half)*+b14[0xfb7]
198+
a12 = (half)*+b14[0x6689]
199+
*-a24[0] = (half)a7:a6
200+
a14 = (half)*+b14[0xfb6]
201+
a24 = 0x1d .bitclear a5 .. 0x1d
202+
a0 = 0 ext a0 .. 0
203+
a26 = 0 ext a13 .. 7
204+
*a11++[a11] = (word)a26
205+
a2 = 0x90
206+
b4 = b4 - b18
207+
a16 += -0x6eed
199208
a0 = 0 ext a0 .. 0
200209
b30 = b30 * b17
201-
a16 = 2 .bitset a2 .. 2
202-
a0 = 0x10 .bitset a28 .. 0x10
203-
b3 = b15 * b16
204-
a7:a6 = a5 * a18
210+
b16 = b2 - 4
211+
a0 = (half)*-a0[a5]
205212
EOF
206213
RUN

0 commit comments

Comments
 (0)