1 //
2 // Copyright (c) 2010-2022 Antmicro
3 //
4 //  This file is licensed under the MIT License.
5 //  Full license text is available in 'licenses/MIT.txt'.
6 //
7 using Antmicro.Renode.Logging;
8 using Antmicro.Renode.Utilities;
9 using System.Collections.Generic;
10 
11 namespace Antmicro.Renode.Peripherals.Miscellaneous.Crypto
12 {
13     public class InternalMemoryAccessor
14     {
InternalMemoryAccessor(uint size, string name, Endianness endianness)15         public InternalMemoryAccessor(uint size, string name, Endianness endianness)
16         {
17             this.endianness = endianness;
18             internalMemory = new byte[size];
19             Name = name;
20         }
21 
ReadDoubleWord(long offset)22         public uint ReadDoubleWord(long offset)
23         {
24             if(offset < 0 || (offset + 4) >= internalMemory.Length)
25             {
26                 Logger.Log(LogLevel.Error, "Trying to read outside of {0} internal memory, at offset 0x{1:X}", Name, offset);
27                 return 0;
28             }
29             var result = BitHelper.ToUInt32(internalMemory, (int)offset, 4, endianness == Endianness.LittleEndian);
30             Logger.Log(LogLevel.Debug, "Read value 0x{0:X} from memory {1} at offset 0x{2:X}", result, Name, offset);
31             return result;
32         }
33 
ReadBytes(long offset, int count)34         public IEnumerable<byte> ReadBytes(long offset, int count)
35         {
36             if(offset < 0 || (offset + count) >= internalMemory.Length)
37             {
38                 Logger.Log(LogLevel.Error, "Trying to read {0} bytes outside of {1} internal memory, at offset 0x{2:X}", count, Name, offset);
39                 yield return 0;
40             }
41             for(var i = 0; i < count; ++i)
42             {
43                 yield return internalMemory[offset + i];
44             }
45         }
46 
WriteDoubleWord(long offset, uint value)47         public void WriteDoubleWord(long offset, uint value)
48         {
49             if(offset < 0 || (offset + 4) >= internalMemory.Length)
50             {
51                 Logger.Log(LogLevel.Error, "Trying to write value 0x{0:X} outside of {1} internal memory, at offset 0x{2:X}", value, Name, offset);
52                 return;
53             }
54             Logger.Log(LogLevel.Debug, "Writing value 0x{0:X} to memory {1} at offset 0x{2:X}", value, Name, offset);
55             foreach(var b in BitHelper.GetBytesFromValue(value, sizeof(uint), endianness == Endianness.LittleEndian))
56             {
57                 internalMemory[offset] = b;
58                 ++offset;
59             }
60         }
61 
WriteBytes(long offset, byte[] bytes)62         public void WriteBytes(long offset, byte[] bytes)
63         {
64             if(offset < 0 || (offset + bytes.Length) >= internalMemory.Length)
65             {
66                 Logger.Log(LogLevel.Error, "Trying to write {0] bytes outside of {1} internal memory, at offset 0x{2:X}", bytes.Length, Name, offset);
67                 return;
68             }
69             foreach(var b in bytes)
70             {
71                 internalMemory[offset] = b;
72                 ++offset;
73             }
74         }
75 
Reset()76         public void Reset()
77         {
78             for(var i = 0; i < internalMemory.Length; ++i)
79             {
80                 internalMemory[i] = 0;
81             }
82         }
83 
84         public string Name { get; }
85 
86         private readonly Endianness endianness;
87         private readonly byte[] internalMemory;
88     }
89 }
90