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 System;
8 using System.Collections.Generic;
9 using System.Linq;
10 using System.Text;
11 using Antmicro.Renode.Core;
12 using Antmicro.Renode.Peripherals.Bus;
13 using Antmicro.Renode.Peripherals.CPU;
14 
15 namespace Antmicro.Renode.Logging.Profiling
16 {
17     public class ProfilerHeader
18     {
ProfilerHeader()19         public ProfilerHeader()
20         {
21             buffer = new List<byte>();
22         }
23 
RegisterPeripherals(IMachine machine)24         public void RegisterPeripherals(IMachine machine)
25         {
26             var peripherals = machine.GetRegisteredPeripherals();
27             var cpus = peripherals.Where(x => x.Peripheral is ICPU).ToList();
28 
29             buffer.AddRange(BitConverter.GetBytes(cpus.Count));
30 
31             foreach(var cpu in cpus)
32             {
33                 buffer.AddRange(BitConverter.GetBytes(machine.SystemBus.GetCPUSlot(cpu.Peripheral as ICPU)));
34                 buffer.AddRange(BitConverter.GetBytes(cpu.Name.Length));
35                 buffer.AddRange(Encoding.ASCII.GetBytes(cpu.Name));
36             }
37 
38             var busPeripherals = peripherals.Where(x => x.RegistrationPoint is BusRangeRegistration && x.Name != null);
39             buffer.AddRange(BitConverter.GetBytes(busPeripherals.Count()));
40             foreach(var peripheral in busPeripherals)
41             {
42                 var name = peripheral.Name;
43                 if(peripheral.RegistrationPoint is BusMultiRegistration bmr)
44                 {
45                     name = $"{bmr.ConnectionRegionName}@{name}";
46                 }
47                 buffer.AddRange(BitConverter.GetBytes(name.Length));
48                 buffer.AddRange(Encoding.ASCII.GetBytes(name));
49                 var registrationPoint = peripheral.RegistrationPoint as BusRangeRegistration;
50                 buffer.AddRange(BitConverter.GetBytes(registrationPoint.Range.StartAddress));
51                 buffer.AddRange(BitConverter.GetBytes(registrationPoint.Range.EndAddress));
52             }
53         }
54 
55         public byte[] Bytes => buffer.ToArray();
56 
57         private readonly List<byte> buffer;
58     }
59 }
60