1 // 2 // Copyright (c) 2010-2024 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.Peripherals.Bus; 9 using Antmicro.Renode.Peripherals.CPU; 10 using System; 11 using System.Collections.Generic; 12 using System.Linq; 13 14 namespace Antmicro.Renode.Utilities 15 { 16 public interface ICanLoadFiles 17 { 18 // Handle data from FileChunk collection - specific for each peripheral LoadFileChunks(string path, IEnumerable<FileChunk> chunks, ICPU cpu)19 void LoadFileChunks(string path, IEnumerable<FileChunk> chunks, ICPU cpu); 20 } 21 22 public static class LoadFileChunksExtensions 23 { 24 // Returns the lowest touched address LoadFileChunks(this IMultibyteWritePeripheral peripheral, IEnumerable<FileChunk> chunks, ICPU cpu = null)25 public static ulong LoadFileChunks(this IMultibyteWritePeripheral peripheral, IEnumerable<FileChunk> chunks, ICPU cpu = null) 26 { 27 ulong minAddr = ulong.MaxValue; 28 29 foreach(FileChunk chunk in chunks) 30 { 31 Logger.LogAs( 32 peripheral, 33 LogLevel.Info, 34 "Loading block of {0} bytes length at 0x{1:X}.", 35 chunk.Data.Count(), 36 chunk.OffsetToLoad 37 ); 38 var chunkData = chunk.Data.ToArray(); 39 peripheral.WriteBytes((long)chunk.OffsetToLoad, chunkData, 0, chunkData.Length, context: cpu); 40 minAddr = Math.Min(minAddr, chunk.OffsetToLoad); 41 } 42 43 return minAddr; 44 } 45 } 46 47 public struct FileChunk 48 { 49 public IEnumerable<byte> Data; 50 public ulong OffsetToLoad; 51 } 52 } 53