1 # -------------------------------------------------------------------------------
4 # LeadroyaL (leadroyal@qq.com)
5 # This code is in the public domain
6 # -------------------------------------------------------------------------------
10 from elftools
.ehabi
.decoder
import EHABIBytecodeDecoder
13 class TestEHABIDecoder(unittest
.TestCase
):
14 """ Tests for the EHABI decoder.
18 # Reference: https://github.com/llvm/llvm-project/blob/master/llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s
19 mnemonic_array
= EHABIBytecodeDecoder([0xb1, 0x0f, 0xa7, 0x3f, 0xb0, 0xb0]).mnemonic_array
20 self
.assertEqual(mnemonic_array
[0].mnemonic
, "pop {r0, r1, r2, r3}")
21 self
.assertEqual(mnemonic_array
[1].mnemonic
, "pop {r4, r5, r6, r7, r8, r9, r10, fp}")
22 self
.assertEqual(mnemonic_array
[2].mnemonic
, "vsp = vsp + 256")
23 self
.assertEqual(mnemonic_array
[3].mnemonic
, "finish")
24 self
.assertEqual(mnemonic_array
[4].mnemonic
, "finish")
26 mnemonic_array
= EHABIBytecodeDecoder([0xc9, 0x84, 0xb0]).mnemonic_array
27 self
.assertEqual(mnemonic_array
[0].mnemonic
, "pop {d8, d9, d10, d11, d12}")
28 self
.assertEqual(mnemonic_array
[1].mnemonic
, "finish")
30 mnemonic_array
= EHABIBytecodeDecoder(
31 [0xD7, 0xC9, 0x02, 0xC8, 0x02, 0xC7, 0x03, 0xC6,
32 0x02, 0xC2, 0xBA, 0xB3, 0x12, 0xB2, 0x80, 0x04,
33 0xB1, 0x01, 0xB0, 0xA9, 0xA1, 0x91, 0x84, 0xC0,
34 0x80, 0xC0, 0x80, 0x01, 0x81, 0x00, 0x80, 0x00,
35 0x42, 0x02, ]).mnemonic_array
36 self
.assertEqual(mnemonic_array
[0].mnemonic
, "pop {d8, d9, d10, d11, d12, d13, d14, d15}")
37 self
.assertEqual(mnemonic_array
[1].mnemonic
, "pop {d0, d1, d2}")
38 self
.assertEqual(mnemonic_array
[2].mnemonic
, "pop {d16, d17, d18}")
39 self
.assertEqual(mnemonic_array
[3].mnemonic
, "pop {wCGR0, wCGR1}")
40 self
.assertEqual(mnemonic_array
[4].mnemonic
, "pop {wR0, wR1, wR2}")
41 self
.assertEqual(mnemonic_array
[5].mnemonic
, "pop {wR10, wR11, wR12}")
42 self
.assertEqual(mnemonic_array
[6].mnemonic
, "pop {d8, d9, d10}")
43 self
.assertEqual(mnemonic_array
[7].mnemonic
, "pop {d1, d2, d3}")
44 self
.assertEqual(mnemonic_array
[8].mnemonic
, "vsp = vsp + 2564")
45 self
.assertEqual(mnemonic_array
[9].mnemonic
, "pop {r0}")
46 self
.assertEqual(mnemonic_array
[10].mnemonic
, "finish")
47 self
.assertEqual(mnemonic_array
[11].mnemonic
, "pop {r4, r5, lr}")
48 self
.assertEqual(mnemonic_array
[12].mnemonic
, "pop {r4, r5}")
49 self
.assertEqual(mnemonic_array
[13].mnemonic
, "vsp = r1")
50 self
.assertEqual(mnemonic_array
[14].mnemonic
, "pop {r10, fp, lr}")
51 self
.assertEqual(mnemonic_array
[15].mnemonic
, "pop {r10, fp}")
52 self
.assertEqual(mnemonic_array
[16].mnemonic
, "pop {r4}")
53 self
.assertEqual(mnemonic_array
[17].mnemonic
, "pop {ip}")
54 self
.assertEqual(mnemonic_array
[18].mnemonic
, "refuse to unwind")
55 self
.assertEqual(mnemonic_array
[19].mnemonic
, "vsp = vsp - 12")
56 self
.assertEqual(mnemonic_array
[20].mnemonic
, "vsp = vsp + 12")
58 mnemonic_array
= EHABIBytecodeDecoder(
59 [0xD8, 0xD0, 0xCA, 0xC9, 0x00, 0xC8, 0x00, 0xC7,
60 0x10, 0xC7, 0x01, 0xC7, 0x00, 0xC6, 0x00, 0xC0,
61 0xB8, 0xB4, 0xB3, 0x00, 0xB2, 0x00, 0xB1, 0x10,
62 0xB1, 0x01, 0xB1, 0x00, 0xB0, 0xA8, 0xA0, 0x9F,
63 0x9D, 0x91, 0x88, 0x00, 0x80, 0x00, 0x40, 0x00,
65 self
.assertEqual(mnemonic_array
[0].mnemonic
, "spare")
66 self
.assertEqual(mnemonic_array
[1].mnemonic
, "pop {d8}")
67 self
.assertEqual(mnemonic_array
[2].mnemonic
, "spare")
68 self
.assertEqual(mnemonic_array
[3].mnemonic
, "pop {d0}")
69 self
.assertEqual(mnemonic_array
[4].mnemonic
, "pop {d16}")
70 self
.assertEqual(mnemonic_array
[5].mnemonic
, "spare")
71 self
.assertEqual(mnemonic_array
[6].mnemonic
, "pop {wCGR0}")
72 self
.assertEqual(mnemonic_array
[7].mnemonic
, "spare")
73 self
.assertEqual(mnemonic_array
[8].mnemonic
, "pop {wR0}")
74 self
.assertEqual(mnemonic_array
[9].mnemonic
, "pop {wR10}")
75 self
.assertEqual(mnemonic_array
[10].mnemonic
, "pop {d8}")
76 self
.assertEqual(mnemonic_array
[11].mnemonic
, "spare")
77 self
.assertEqual(mnemonic_array
[12].mnemonic
, "pop {d0}")
78 self
.assertEqual(mnemonic_array
[13].mnemonic
, "vsp = vsp + 516")
79 self
.assertEqual(mnemonic_array
[14].mnemonic
, "spare")
80 self
.assertEqual(mnemonic_array
[15].mnemonic
, "pop {r0}")
81 self
.assertEqual(mnemonic_array
[16].mnemonic
, "spare")
82 self
.assertEqual(mnemonic_array
[17].mnemonic
, "finish")
83 self
.assertEqual(mnemonic_array
[18].mnemonic
, "pop {r4, lr}")
84 self
.assertEqual(mnemonic_array
[19].mnemonic
, "pop {r4}")
85 self
.assertEqual(mnemonic_array
[20].mnemonic
, "reserved (WiMMX MOVrr)")
86 self
.assertEqual(mnemonic_array
[21].mnemonic
, "reserved (ARM MOVrr)")
87 self
.assertEqual(mnemonic_array
[22].mnemonic
, "vsp = r1")
88 self
.assertEqual(mnemonic_array
[23].mnemonic
, "pop {pc}")
89 self
.assertEqual(mnemonic_array
[24].mnemonic
, "refuse to unwind")
90 self
.assertEqual(mnemonic_array
[25].mnemonic
, "vsp = vsp - 4")
91 self
.assertEqual(mnemonic_array
[26].mnemonic
, "vsp = vsp + 4")
94 if __name__
== '__main__':