1 # SPDX-License-Identifier: LGPLv3+
2 # Copyright (C) 2020, 2021 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
3 # Funded by NLnet http://nlnet.nl
6 from openpower
.decoder
.isa
.mem
import Mem
, MemMMap
7 from openpower
.util
import log
11 class TestMem(unittest
.TestCase
):
12 def test_mem_align_st(self
):
13 m
= Mem(row_bytes
=8, initial_mem
={})
14 m
.st(4, 0x12345678, width
=4, swap
=False)
17 self
.assertEqual(d
, [(0, 0x1234567800000000)])
19 def test_mem_misalign_st(self
):
20 m
= Mem(row_bytes
=8, initial_mem
={}, misaligned_ok
=True)
21 m
.st(3, 0x12345678, width
=4, swap
=False)
24 self
.assertEqual(d
, [(0, 0x0012345678000000)])
26 def test_mem_misalign_st_rollover(self
):
27 m
= Mem(row_bytes
=8, initial_mem
={}, misaligned_ok
=True)
28 m
.st(6, 0x912345678, width
=8, swap
=False)
31 self
.assertEqual(d
, [(0, 0x5678000000000000),
32 (8, 0x0000000000091234)])
35 class TestMemCommon(unittest
.TestCase
):
40 def log_fancy_to_string(m
):
41 def log2(*args
, kind
):
42 text_parts
.append(" ".join(args
))
46 return "\n".join(text_parts
)
48 def test_log_fancy(self
):
49 def log2(*args
, kind
):
50 text_parts
.append(" ".join(args
))
52 m
= self
.MemCls(row_bytes
=8, initial_mem
=(0x58, [
53 0x5DE6DA2A1137745E, 0x6054D17B4C773D2D,
54 0x5B66920D9540B825, 0x7753D053D9854A8F,
55 0x9F2A58E2B5B79829, 0x974AC142D081CE83,
56 0xAA963F95FC566F57, 0xE63A95A3F654A57E,
57 0x103709510CBE0EEF, 0xF6A18DEDFE1B69A5,
58 0x5053575776376ACD, 0xCFDFF67B7C5096C2,
59 0x9F8FC1B06E7868A0, 0x6E7B1D27CCBAF8E7,
60 0xEB91B92FAF546BA1, 0x21FB683F34641876,
63 m
.st(0x7fff_fedc_ba98, 0xabcdef0123456789, width
=8, swap
=False)
65 text
= self
.log_fancy_to_string(m
)
66 self
.assertEqual(text
, """
68 0x00000050: 00 00 00 00 00 00 00 00 5E 74 37 11 2A DA E6 5D |........^t7.*..]|
69 0x00000060: 2D 3D 77 4C 7B D1 54 60 25 B8 40 95 0D 92 66 5B |-=wL{.T`%.@...f[|
70 0x00000070: 8F 4A 85 D9 53 D0 53 77 29 98 B7 B5 E2 58 2A 9F |.J..S.Sw)....X*.|
71 0x00000080: 83 CE 81 D0 42 C1 4A 97 57 6F 56 FC 95 3F 96 AA |....B.J.WoV..?..|
72 0x00000090: 7E A5 54 F6 A3 95 3A E6 EF 0E BE 0C 51 09 37 10 |~.T...:.....Q.7.|
73 0x000000A0: A5 69 1B FE ED 8D A1 F6 CD 6A 37 76 57 57 53 50 |.i.......j7vWWSP|
74 0x000000B0: C2 96 50 7C 7B F6 DF CF A0 68 78 6E B0 C1 8F 9F |..P|{....hxn....|
75 0x000000C0: E7 F8 BA CC 27 1D 7B 6E A1 6B 54 AF 2F B9 91 EB |....'.{n.kT./...|
76 0x000000D0: 76 18 64 34 3F 68 FB 21 00 00 00 00 00 00 00 00 |v.d4?h.!........|
78 0x7FFFFEDCBA90: 00 00 00 00 00 00 00 00 89 67 45 23 01 EF CD AB |.........gE#....|
82 class TestMemMMap(TestMemCommon
):
85 def test_read_ctypes(self
):
86 m
= MemMMap(row_bytes
=8, initial_mem
=(0x58, [
87 0x5DE6DA2A1137745E, 0x6054D17B4C773D2D,
88 0x5B66920D9540B825, 0x7753D053D9854A8F,
89 0x9F2A58E2B5B79829, 0x974AC142D081CE83,
90 0xAA963F95FC566F57, 0xE63A95A3F654A57E,
91 0x103709510CBE0EEF, 0xF6A18DEDFE1B69A5,
92 0x5053575776376ACD, 0xCFDFF67B7C5096C2,
93 0x9F8FC1B06E7868A0, 0x6E7B1D27CCBAF8E7,
94 0xEB91B92FAF546BA1, 0x21FB683F34641876,
97 bytes_
= m
.get_ctypes(0x58, 128, False)
99 self
.assertSequenceEqual(bytes_
, [
100 0x5E, 0x74, 0x37, 0x11, 0x2A, 0xDA, 0xE6, 0x5D,
101 0x2D, 0x3D, 0x77, 0x4C, 0x7B, 0xD1, 0x54, 0x60,
102 0x25, 0xB8, 0x40, 0x95, 0x0D, 0x92, 0x66, 0x5B,
103 0x8F, 0x4A, 0x85, 0xD9, 0x53, 0xD0, 0x53, 0x77,
104 0x29, 0x98, 0xB7, 0xB5, 0xE2, 0x58, 0x2A, 0x9F,
105 0x83, 0xCE, 0x81, 0xD0, 0x42, 0xC1, 0x4A, 0x97,
106 0x57, 0x6F, 0x56, 0xFC, 0x95, 0x3F, 0x96, 0xAA,
107 0x7E, 0xA5, 0x54, 0xF6, 0xA3, 0x95, 0x3A, 0xE6,
108 0xEF, 0x0E, 0xBE, 0x0C, 0x51, 0x09, 0x37, 0x10,
109 0xA5, 0x69, 0x1B, 0xFE, 0xED, 0x8D, 0xA1, 0xF6,
110 0xCD, 0x6A, 0x37, 0x76, 0x57, 0x57, 0x53, 0x50,
111 0xC2, 0x96, 0x50, 0x7C, 0x7B, 0xF6, 0xDF, 0xCF,
112 0xA0, 0x68, 0x78, 0x6E, 0xB0, 0xC1, 0x8F, 0x9F,
113 0xE7, 0xF8, 0xBA, 0xCC, 0x27, 0x1D, 0x7B, 0x6E,
114 0xA1, 0x6B, 0x54, 0xAF, 0x2F, 0xB9, 0x91, 0xEB,
115 0x76, 0x18, 0x64, 0x34, 0x3F, 0x68, 0xFB, 0x21,
118 def test_write_ctypes(self
):
119 m
= MemMMap(row_bytes
=8, initial_mem
=(0x58, [
120 0x5DE6DA2A1137745E, 0x6054D17B4C773D2D,
123 bytes_
= m
.get_ctypes(0x160, 16, True)
125 self
.assertIsInstance(bytes_
, ctypes
.c_ubyte
* 16)
130 text
= self
.log_fancy_to_string(m
)
131 self
.assertEqual(text
, """
133 0x00000050: 00 00 00 00 00 00 00 00 5E 74 37 11 2A DA E6 5D |........^t7.*..]|
134 0x00000060: 2D 3D 77 4C 7B D1 54 60 00 00 00 00 00 00 00 00 |-=wL{.T`........|
136 0x00000160: 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF |.."3DUfw........|
140 if __name__
== '__main__':