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