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