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 System;
8 using Antmicro.Renode.Core;
9 using Antmicro.Renode.Exceptions;
10 using Antmicro.Renode.Peripherals.IRQControllers;
11 using Antmicro.Renode.Peripherals.Miscellaneous;
12 using Endianess = ELFSharp.ELF.Endianess;
13 
14 namespace Antmicro.Renode.Peripherals.CPU
15 {
16     public class ARMv7R : Arm, IARMSingleSecurityStateCPU
17     {
ARMv7R(IMachine machine, string cpuType, uint cpuId = 0, ARM_GenericInterruptController genericInterruptController = null, Endianess endianness = Endianess.LittleEndian, uint? numberOfMPURegions = null, ArmSignalsUnit signalsUnit = null)18         public ARMv7R(IMachine machine, string cpuType, uint cpuId = 0, ARM_GenericInterruptController genericInterruptController = null, Endianess endianness = Endianess.LittleEndian,
19                       uint? numberOfMPURegions = null, ArmSignalsUnit signalsUnit = null)
20             : base(cpuType, machine, cpuId, endianness, numberOfMPURegions, signalsUnit)
21         {
22             Affinity = new Affinity(cpuId);
23             try
24             {
25                 genericInterruptController?.AttachCPU(this);
26             }
27             catch(Exception e)
28             {
29                 throw new ConstructionException($"Failed to attach CPU to Generic Interrupt Controller: {e.Message}", e);
30             }
31         }
32 
33         public override MemorySystemArchitectureType MemorySystemArchitecture => MemorySystemArchitectureType.Physical_PMSA;
34 
35         // Currently unsupported
36         public bool FIQMaskOverride => false;
37         public bool IRQMaskOverride => false;
38 
39         public Affinity Affinity { get; }
40         public SecurityState SecurityState => SecurityState.Secure;
41         public ExceptionLevel ExceptionLevel => ExceptionLevel.EL1_SystemMode;
42         public uint AuxiliaryControlRegister { get; set; }
43 
Write32CP15Inner(Coprocessor32BitMoveInstruction instruction, uint value)44         protected override void Write32CP15Inner(Coprocessor32BitMoveInstruction instruction, uint value)
45         {
46             if(instruction == AuxiliaryControlRegisterInstruction)
47             {
48                 AuxiliaryControlRegister = value;
49                 return;
50             }
51             base.Write32CP15Inner(instruction, value);
52         }
53 
Read32CP15Inner(Coprocessor32BitMoveInstruction instruction)54         protected override uint Read32CP15Inner(Coprocessor32BitMoveInstruction instruction)
55         {
56             if(instruction == AuxiliaryControlRegisterInstruction)
57             {
58                 return AuxiliaryControlRegister;
59             }
60             return base.Read32CP15Inner(instruction);
61         }
62 
63         private readonly Coprocessor32BitMoveInstruction AuxiliaryControlRegisterInstruction = new Coprocessor32BitMoveInstruction(0, 1, 0, 1); // ACTLR
64     }
65 }
66