Skip to content

Commit eff6f96

Browse files
committed
Add integration tests for disassembler
Test both disassembling a file (assembled from source for the test), and disassembling a byte sequence provided on the command line. Source code to be assembled and expected disassembler listings are provided in the tests/fixtures directory.
1 parent 10a5051 commit eff6f96

File tree

7 files changed

+542
-0
lines changed

7 files changed

+542
-0
lines changed

Diff for: .github/workflows/run_tests.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,10 @@ jobs:
9191
export PATH=$PATH:${{ steps.fetch_binutils.outputs.bin_dir }}
9292
cd tests
9393
./02_compat_rtc_tests.sh
94+
95+
- name: Run disassembler tests
96+
id: disassembler_tests
97+
run: |
98+
export PATH=$PATH:${{ steps.build_micropython.outputs.bin_dir }}
99+
cd tests
100+
./03_disassembler_tests.sh

Diff for: tests/03_disassembler_tests.sh

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
test_disassembling_a_file() {
6+
local verbose
7+
if [ "$1" == verbose ]; then
8+
verbose=-v
9+
echo -e "Testing disassembling a file in VERBOSE mode"
10+
else
11+
echo -e "Testing disassembling a file in NORMAL mode"
12+
fi
13+
14+
testname=all_opcodes
15+
fixture=fixtures/${testname}.S
16+
echo -e "\tBuilding $fixture using micropython-esp32-ulp"
17+
18+
log_file="${testname}.log"
19+
ulp_file="fixtures/${testname}.ulp"
20+
micropython -m esp32_ulp $fixture 1>$log_file # generates $ulp_file
21+
22+
lst_file="${testname}.lst"
23+
lst_file_fixture=fixtures/${testname}${verbose}.lst
24+
echo -e "\tDisassembling $ulp_file using micropython-esp32-ulp disassembler"
25+
micropython tools/disassemble.py $verbose $ulp_file > $lst_file
26+
27+
if ! diff $lst_file_fixture $lst_file 1>/dev/null; then
28+
echo -e "\tDisassembled output differs from expected output!"
29+
echo ""
30+
echo "Disassembly test failed for $fixture"
31+
echo "micropython-esp32-ulp log:"
32+
cat $log_file
33+
echo "Diff of disassembly: expected vs actual"
34+
diff -u $lst_file_fixture $lst_file
35+
fi
36+
}
37+
38+
test_disassembling_a_manual_sequence() {
39+
local verbose
40+
if [ "$1" == verbose ]; then
41+
verbose=-v
42+
echo -e "Testing disassembling a manual byte sequence in VERBOSE mode"
43+
else
44+
echo -e "Testing disassembling a manual byte sequence in NORMAL mode"
45+
fi
46+
47+
sequence="e1af 8c72 0100 0068 2705 cc19 0005 681d 0000 00a0 0000 0074"
48+
49+
lst_file="manual_bytes.lst"
50+
lst_file_fixture=fixtures/manual_bytes${verbose}.lst
51+
echo -e "\tDisassembling manual byte sequence using micropython-esp32-ulp disassembler"
52+
micropython tools/disassemble.py $verbose -m $sequence > $lst_file
53+
54+
if ! diff $lst_file_fixture $lst_file 1>/dev/null; then
55+
echo -e "\tDisassembled output differs from expected output!"
56+
echo ""
57+
echo "Disassembly test failed for manual byte sequence"
58+
echo "Diff of disassembly: expected vs actual"
59+
diff -u $lst_file_fixture $lst_file
60+
fi
61+
}
62+
63+
test_disassembling_a_file
64+
test_disassembling_a_file verbose
65+
66+
test_disassembling_a_manual_sequence
67+
test_disassembling_a_manual_sequence verbose

Diff for: tests/fixtures/all_opcodes-v.lst

+313
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,313 @@
1+
header
2+
ULP magic : b'ulp\x00' (0x00706c75)
3+
.text offset : 12 (0x0c)
4+
.text size : 164 (0xa4)
5+
.data offset : 176 (0xb0)
6+
.data size : 8 (0x08)
7+
.bss size : 0 (0x00)
8+
----------------------------------------
9+
.text
10+
0000 230d8810 REG_WR 0x123, 1, 2, 3
11+
addr = 35 (0x23)
12+
data = 3
13+
high = 1
14+
low = 2
15+
opcode = 1
16+
periph_sel = 1
17+
0004 21030421 REG_RD 0x321, 2, 1
18+
addr = 33 (0x21)
19+
high = 2
20+
low = 1
21+
opcode = 2
22+
periph_sel = 3
23+
unused = 0
24+
0008 03001130 I2C_RD 3, 2, 1, 0
25+
data = 0
26+
high = 2
27+
i2c_sel = 0
28+
low = 1
29+
opcode = 3
30+
rw = 0
31+
sub_addr = 3
32+
unused = 0
33+
000c 00011339 I2C_WR 0, 2, 3, 4
34+
data = 1
35+
high = 2
36+
i2c_sel = 4
37+
low = 3
38+
opcode = 3
39+
rw = 1
40+
sub_addr = 0
41+
unused = 0
42+
0010 00000040 NOP
43+
cycles = 0
44+
opcode = 4
45+
unused = 0
46+
0014 07000040 WAIT 7
47+
cycles = 7
48+
opcode = 4
49+
unused = 0
50+
0018 07000050 ADC r3, 1, 0
51+
cycles = 0
52+
dreg = 3
53+
mux = 1
54+
opcode = 5
55+
sar_sel = 0
56+
unused1 = 0
57+
unused2 = 0
58+
001c 0b000068 ST r3, r2, 0
59+
dreg = 2
60+
offset = 0
61+
opcode = 6
62+
sreg = 3
63+
sub_opcode = 4
64+
unused1 = 0
65+
unused2 = 0
66+
0020 06000070 ADD r2, r1, r0
67+
dreg = 2
68+
opcode = 7
69+
sel = 0 (ADD)
70+
sreg = 1
71+
sub_opcode = 0
72+
treg = 0
73+
unused = 0
74+
0024 06002070 SUB r2, r1, r0
75+
dreg = 2
76+
opcode = 7
77+
sel = 1 (SUB)
78+
sreg = 1
79+
sub_opcode = 0
80+
treg = 0
81+
unused = 0
82+
0028 06004070 AND r2, r1, r0
83+
dreg = 2
84+
opcode = 7
85+
sel = 2 (AND)
86+
sreg = 1
87+
sub_opcode = 0
88+
treg = 0
89+
unused = 0
90+
002c 06006070 OR r2, r1, r0
91+
dreg = 2
92+
opcode = 7
93+
sel = 3 (OR)
94+
sreg = 1
95+
sub_opcode = 0
96+
treg = 0
97+
unused = 0
98+
0030 16008070 MOVE r2, r1
99+
dreg = 2
100+
opcode = 7
101+
sel = 4 (MOVE)
102+
sreg = 1
103+
sub_opcode = 0
104+
treg = 1
105+
unused = 0
106+
0034 0600a070 LSH r2, r1, r0
107+
dreg = 2
108+
opcode = 7
109+
sel = 5 (LSH)
110+
sreg = 1
111+
sub_opcode = 0
112+
treg = 0
113+
unused = 0
114+
0038 0600c070 RSH r2, r1, r0
115+
dreg = 2
116+
opcode = 7
117+
sel = 6 (RSH)
118+
sreg = 1
119+
sub_opcode = 0
120+
treg = 0
121+
unused = 0
122+
003c 06000072 ADD r2, r1, 0
123+
dreg = 2
124+
imm = 0
125+
opcode = 7
126+
sel = 0 (ADD)
127+
sreg = 1
128+
sub_opcode = 1
129+
unused = 0
130+
0040 06002072 SUB r2, r1, 0
131+
dreg = 2
132+
imm = 0
133+
opcode = 7
134+
sel = 1 (SUB)
135+
sreg = 1
136+
sub_opcode = 1
137+
unused = 0
138+
0044 06004072 AND r2, r1, 0
139+
dreg = 2
140+
imm = 0
141+
opcode = 7
142+
sel = 2 (AND)
143+
sreg = 1
144+
sub_opcode = 1
145+
unused = 0
146+
0048 06006072 OR r2, r1, 0
147+
dreg = 2
148+
imm = 0
149+
opcode = 7
150+
sel = 3 (OR)
151+
sreg = 1
152+
sub_opcode = 1
153+
unused = 0
154+
004c 01008072 MOVE r1, 0
155+
dreg = 1
156+
imm = 0
157+
opcode = 7
158+
sel = 4 (MOVE)
159+
sreg = 0
160+
sub_opcode = 1
161+
unused = 0
162+
0050 0600a072 LSH r2, r1, 0
163+
dreg = 2
164+
imm = 0
165+
opcode = 7
166+
sel = 5 (LSH)
167+
sreg = 1
168+
sub_opcode = 1
169+
unused = 0
170+
0054 0600c072 RSH r2, r1, 0
171+
dreg = 2
172+
imm = 0
173+
opcode = 7
174+
sel = 6 (RSH)
175+
sreg = 1
176+
sub_opcode = 1
177+
unused = 0
178+
0058 00004074 STAGE_RST
179+
imm = 0
180+
opcode = 7
181+
sel = 2 (STAGE_RST)
182+
sub_opcode = 2
183+
unused1 = 0
184+
unused2 = 0
185+
005c 70000074 STAGE_INC 7
186+
imm = 7
187+
opcode = 7
188+
sel = 0 (STAGE_INC)
189+
sub_opcode = 2
190+
unused1 = 0
191+
unused2 = 0
192+
0060 30002074 STAGE_DEC 3
193+
imm = 3
194+
opcode = 7
195+
sel = 1 (STAGE_DEC)
196+
sub_opcode = 2
197+
unused1 = 0
198+
unused2 = 0
199+
0064 00002080 JUMP r0
200+
addr = 0
201+
dreg = 0
202+
opcode = 8
203+
reg = 1
204+
sub_opcode = 0
205+
type = 0 (--)
206+
unused = 0
207+
0068 01006080 JUMP r1, EQ
208+
addr = 0
209+
dreg = 1
210+
opcode = 8
211+
reg = 1
212+
sub_opcode = 0
213+
type = 1 (EQ)
214+
unused = 0
215+
006c 0200a080 JUMP r2, OV
216+
addr = 0
217+
dreg = 2
218+
opcode = 8
219+
reg = 1
220+
sub_opcode = 0
221+
type = 2 (OV)
222+
unused = 0
223+
0070 00000080 JUMP 0
224+
addr = 0
225+
dreg = 0
226+
opcode = 8
227+
reg = 0
228+
sub_opcode = 0
229+
type = 0 (--)
230+
unused = 0
231+
0074 00004080 JUMP 0, EQ
232+
addr = 0
233+
dreg = 0
234+
opcode = 8
235+
reg = 0
236+
sub_opcode = 0
237+
type = 1 (EQ)
238+
unused = 0
239+
0078 00008080 JUMP 0, OV
240+
addr = 0
241+
dreg = 0
242+
opcode = 8
243+
reg = 0
244+
sub_opcode = 0
245+
type = 2 (OV)
246+
unused = 0
247+
007c 01000082 JUMPR 0, 1, LT
248+
cmp = 0 (LT)
249+
imm = 1
250+
offset = 0
251+
opcode = 8
252+
sign = 0
253+
sub_opcode = 1
254+
0080 05000382 JUMPR 1, 5, GE
255+
cmp = 1 (GE)
256+
imm = 5
257+
offset = 1
258+
opcode = 8
259+
sign = 0
260+
sub_opcode = 1
261+
0084 01000084 JUMPS 0, 1, LT
262+
cmp = 0 (LT)
263+
imm = 1
264+
offset = 0
265+
opcode = 8
266+
sign = 0
267+
sub_opcode = 2
268+
unused = 0
269+
0088 05800284 JUMPS 1, 5, GE
270+
cmp = 1 (GE)
271+
imm = 5
272+
offset = 1
273+
opcode = 8
274+
sign = 0
275+
sub_opcode = 2
276+
unused = 0
277+
008c 09000584 JUMPS 2, 9, LE
278+
cmp = 2 (LE)
279+
imm = 9
280+
offset = 2
281+
opcode = 8
282+
sign = 0
283+
sub_opcode = 2
284+
unused = 0
285+
0090 01000090 WAKE
286+
opcode = 9
287+
sub_opcode = 0
288+
unused = 0
289+
wakeup = 1
290+
0094 07000092 SLEEP 7
291+
cycle_sel = 7
292+
opcode = 9
293+
sub_opcode = 1
294+
unused = 0
295+
0098 090000a0 TSENS r1, 2
296+
delay = 2
297+
dreg = 1
298+
opcode = 10 (0x0a)
299+
unused = 0
300+
009c 000000b0 HALT
301+
opcode = 11 (0x0b)
302+
unused = 0
303+
00a0 060000d0 LD r2, r1, 0
304+
dreg = 2
305+
offset = 0
306+
opcode = 13 (0x0d)
307+
sreg = 1
308+
unused1 = 0
309+
unused2 = 0
310+
----------------------------------------
311+
.data
312+
00a4 00000000 <empty>
313+
00a8 fecadec0 <non-empty>

0 commit comments

Comments
 (0)