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