1 /******************************************************** 2 * 3 * Warning! 4 * This file was generated automatically. 5 * Please do not edit. Changes should be made in the 6 * appropriate *.tt file. 7 * 8 */ 9 using System; 10 using System.Linq; 11 using System.Collections.Generic; 12 using Antmicro.Renode.Peripherals.CPU.Registers; 13 using Antmicro.Renode.Utilities.Binding; 14 using Antmicro.Renode.Exceptions; 15 16 namespace Antmicro.Renode.Peripherals.CPU 17 { 18 public partial class ARMv8A 19 { SetRegister(int register, RegisterValue value)20 public override void SetRegister(int register, RegisterValue value) 21 { 22 if(!mapping.TryGetValue((ARMv8ARegisters)register, out var r)) 23 { 24 if(TrySetNonMappedRegister(register, value)) 25 { 26 return; 27 } 28 throw new RecoverableException($"Wrong register index: {register}"); 29 } 30 31 switch(r.Width) 32 { 33 case 32: 34 SetRegisterValue32(r.Index, checked((uint)value)); 35 break; 36 case 64: 37 SetRegisterValue64(r.Index, checked((ulong)value)); 38 break; 39 default: 40 throw new ArgumentException($"Unsupported register width: {r.Width}"); 41 } 42 } 43 GetRegister(int register)44 public override RegisterValue GetRegister(int register) 45 { 46 if(!mapping.TryGetValue((ARMv8ARegisters)register, out var r)) 47 { 48 if(TryGetNonMappedRegister(register, out var value)) 49 { 50 return value; 51 } 52 throw new RecoverableException($"Wrong register index: {register}"); 53 } 54 switch(r.Width) 55 { 56 case 32: 57 return GetRegisterValue32(r.Index); 58 case 64: 59 return GetRegisterValue64(r.Index); 60 default: 61 throw new ArgumentException($"Unsupported register width: {r.Width}"); 62 } 63 } 64 GetRegisters()65 public override IEnumerable<CPURegister> GetRegisters() 66 { 67 return mapping.Values.Concat(GetNonMappedRegisters()).OrderBy(x => x.Index); 68 } 69 70 [Register] 71 public RegisterValue SP 72 { 73 get 74 { 75 return GetRegisterValue64((int)ARMv8ARegisters.SP); 76 } 77 set 78 { 79 SetRegisterValue64((int)ARMv8ARegisters.SP, value); 80 } 81 } 82 [Register] 83 public override RegisterValue PC 84 { 85 get 86 { 87 return GetRegisterValue64((int)ARMv8ARegisters.PC); 88 } 89 set 90 { 91 SetRegisterValue64((int)ARMv8ARegisters.PC, value); 92 } 93 } 94 [Register] 95 public RegisterValue PSTATE 96 { 97 get 98 { 99 return GetRegisterValue32((int)ARMv8ARegisters.PSTATE); 100 } 101 set 102 { 103 SetRegisterValue32((int)ARMv8ARegisters.PSTATE, value); 104 } 105 } 106 [Register] 107 public RegisterValue FPSR 108 { 109 get 110 { 111 return GetRegisterValue32((int)ARMv8ARegisters.FPSR); 112 } 113 set 114 { 115 SetRegisterValue32((int)ARMv8ARegisters.FPSR, value); 116 } 117 } 118 [Register] 119 public RegisterValue FPCR 120 { 121 get 122 { 123 return GetRegisterValue32((int)ARMv8ARegisters.FPCR); 124 } 125 set 126 { 127 SetRegisterValue32((int)ARMv8ARegisters.FPCR, value); 128 } 129 } 130 [Register] 131 public RegisterValue CPSR 132 { 133 get 134 { 135 return GetRegisterValue32((int)ARMv8ARegisters.CPSR); 136 } 137 set 138 { 139 SetRegisterValue32((int)ARMv8ARegisters.CPSR, value); 140 } 141 } 142 public RegistersGroup X { get; private set; } 143 public RegistersGroup R { get; private set; } 144 InitializeRegisters()145 protected override void InitializeRegisters() 146 { 147 var indexValueMapX = new Dictionary<int, ARMv8ARegisters> 148 { 149 { 0, ARMv8ARegisters.X0 }, 150 { 1, ARMv8ARegisters.X1 }, 151 { 2, ARMv8ARegisters.X2 }, 152 { 3, ARMv8ARegisters.X3 }, 153 { 4, ARMv8ARegisters.X4 }, 154 { 5, ARMv8ARegisters.X5 }, 155 { 6, ARMv8ARegisters.X6 }, 156 { 7, ARMv8ARegisters.X7 }, 157 { 8, ARMv8ARegisters.X8 }, 158 { 9, ARMv8ARegisters.X9 }, 159 { 10, ARMv8ARegisters.X10 }, 160 { 11, ARMv8ARegisters.X11 }, 161 { 12, ARMv8ARegisters.X12 }, 162 { 13, ARMv8ARegisters.X13 }, 163 { 14, ARMv8ARegisters.X14 }, 164 { 15, ARMv8ARegisters.X15 }, 165 { 16, ARMv8ARegisters.X16 }, 166 { 17, ARMv8ARegisters.X17 }, 167 { 18, ARMv8ARegisters.X18 }, 168 { 19, ARMv8ARegisters.X19 }, 169 { 20, ARMv8ARegisters.X20 }, 170 { 21, ARMv8ARegisters.X21 }, 171 { 22, ARMv8ARegisters.X22 }, 172 { 23, ARMv8ARegisters.X23 }, 173 { 24, ARMv8ARegisters.X24 }, 174 { 25, ARMv8ARegisters.X25 }, 175 { 26, ARMv8ARegisters.X26 }, 176 { 27, ARMv8ARegisters.X27 }, 177 { 28, ARMv8ARegisters.X28 }, 178 { 29, ARMv8ARegisters.X29 }, 179 { 30, ARMv8ARegisters.X30 }, 180 }; 181 X = new RegistersGroup( 182 indexValueMapX.Keys, 183 i => GetRegister((int)indexValueMapX[i]), 184 (i, v) => SetRegister((int)indexValueMapX[i], v)); 185 186 var indexValueMapR = new Dictionary<int, ARMv8ARegisters> 187 { 188 { 0, ARMv8ARegisters.R0 }, 189 { 1, ARMv8ARegisters.R1 }, 190 { 2, ARMv8ARegisters.R2 }, 191 { 3, ARMv8ARegisters.R3 }, 192 { 4, ARMv8ARegisters.R4 }, 193 { 5, ARMv8ARegisters.R5 }, 194 { 6, ARMv8ARegisters.R6 }, 195 { 7, ARMv8ARegisters.R7 }, 196 { 8, ARMv8ARegisters.R8 }, 197 { 9, ARMv8ARegisters.R9 }, 198 { 10, ARMv8ARegisters.R10 }, 199 { 11, ARMv8ARegisters.R11 }, 200 { 12, ARMv8ARegisters.R12 }, 201 { 13, ARMv8ARegisters.R13 }, 202 { 14, ARMv8ARegisters.R14 }, 203 { 15, ARMv8ARegisters.R15 }, 204 }; 205 R = new RegistersGroup( 206 indexValueMapR.Keys, 207 i => GetRegister((int)indexValueMapR[i]), 208 (i, v) => SetRegister((int)indexValueMapR[i], v)); 209 210 } 211 212 // 649: Field '...' is never assigned to, and will always have its default value null 213 #pragma warning disable 649 214 215 [Import(Name = "tlib_set_register_value_64")] 216 protected Action<int, ulong> SetRegisterValue64; 217 [Import(Name = "tlib_get_register_value_64")] 218 protected Func<int, ulong> GetRegisterValue64; 219 220 #pragma warning restore 649 221 222 // 649: Field '...' is never assigned to, and will always have its default value null 223 #pragma warning disable 649 224 225 [Import(Name = "tlib_set_register_value_32")] 226 protected Action<int, uint> SetRegisterValue32; 227 [Import(Name = "tlib_get_register_value_32")] 228 protected Func<int, uint> GetRegisterValue32; 229 230 #pragma warning restore 649 231 232 private static readonly Dictionary<ARMv8ARegisters, CPURegister> mapping = new Dictionary<ARMv8ARegisters, CPURegister> 233 { 234 { ARMv8ARegisters.X0, new CPURegister(0, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X0" }) }, 235 { ARMv8ARegisters.X1, new CPURegister(1, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X1" }) }, 236 { ARMv8ARegisters.X2, new CPURegister(2, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X2" }) }, 237 { ARMv8ARegisters.X3, new CPURegister(3, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X3" }) }, 238 { ARMv8ARegisters.X4, new CPURegister(4, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X4" }) }, 239 { ARMv8ARegisters.X5, new CPURegister(5, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X5" }) }, 240 { ARMv8ARegisters.X6, new CPURegister(6, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X6" }) }, 241 { ARMv8ARegisters.X7, new CPURegister(7, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X7" }) }, 242 { ARMv8ARegisters.X8, new CPURegister(8, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X8" }) }, 243 { ARMv8ARegisters.X9, new CPURegister(9, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X9" }) }, 244 { ARMv8ARegisters.X10, new CPURegister(10, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X10" }) }, 245 { ARMv8ARegisters.X11, new CPURegister(11, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X11" }) }, 246 { ARMv8ARegisters.X12, new CPURegister(12, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X12" }) }, 247 { ARMv8ARegisters.X13, new CPURegister(13, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X13" }) }, 248 { ARMv8ARegisters.X14, new CPURegister(14, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X14" }) }, 249 { ARMv8ARegisters.X15, new CPURegister(15, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X15" }) }, 250 { ARMv8ARegisters.X16, new CPURegister(16, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X16" }) }, 251 { ARMv8ARegisters.X17, new CPURegister(17, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X17" }) }, 252 { ARMv8ARegisters.X18, new CPURegister(18, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X18" }) }, 253 { ARMv8ARegisters.X19, new CPURegister(19, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X19" }) }, 254 { ARMv8ARegisters.X20, new CPURegister(20, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X20" }) }, 255 { ARMv8ARegisters.X21, new CPURegister(21, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X21" }) }, 256 { ARMv8ARegisters.X22, new CPURegister(22, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X22" }) }, 257 { ARMv8ARegisters.X23, new CPURegister(23, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X23" }) }, 258 { ARMv8ARegisters.X24, new CPURegister(24, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X24" }) }, 259 { ARMv8ARegisters.X25, new CPURegister(25, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X25" }) }, 260 { ARMv8ARegisters.X26, new CPURegister(26, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X26" }) }, 261 { ARMv8ARegisters.X27, new CPURegister(27, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X27" }) }, 262 { ARMv8ARegisters.X28, new CPURegister(28, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X28" }) }, 263 { ARMv8ARegisters.X29, new CPURegister(29, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X29" }) }, 264 { ARMv8ARegisters.X30, new CPURegister(30, 64, isGeneral: true, isReadonly: false, aliases: new [] { "X30" }) }, 265 { ARMv8ARegisters.SP, new CPURegister(31, 64, isGeneral: true, isReadonly: false, aliases: new [] { "SP" }) }, 266 { ARMv8ARegisters.PC, new CPURegister(32, 64, isGeneral: true, isReadonly: false, aliases: new [] { "PC" }) }, 267 { ARMv8ARegisters.PSTATE, new CPURegister(33, 32, isGeneral: true, isReadonly: false, aliases: new [] { "PSTATE" }) }, 268 { ARMv8ARegisters.FPSR, new CPURegister(66, 32, isGeneral: false, isReadonly: false, aliases: new [] { "FPSR" }) }, 269 { ARMv8ARegisters.FPCR, new CPURegister(67, 32, isGeneral: false, isReadonly: false, aliases: new [] { "FPCR" }) }, 270 { ARMv8ARegisters.R0, new CPURegister(100, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R0" }) }, 271 { ARMv8ARegisters.R1, new CPURegister(101, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R1" }) }, 272 { ARMv8ARegisters.R2, new CPURegister(102, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R2" }) }, 273 { ARMv8ARegisters.R3, new CPURegister(103, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R3" }) }, 274 { ARMv8ARegisters.R4, new CPURegister(104, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R4" }) }, 275 { ARMv8ARegisters.R5, new CPURegister(105, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R5" }) }, 276 { ARMv8ARegisters.R6, new CPURegister(106, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R6" }) }, 277 { ARMv8ARegisters.R7, new CPURegister(107, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R7" }) }, 278 { ARMv8ARegisters.R8, new CPURegister(108, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R8" }) }, 279 { ARMv8ARegisters.R9, new CPURegister(109, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R9" }) }, 280 { ARMv8ARegisters.R10, new CPURegister(110, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R10" }) }, 281 { ARMv8ARegisters.R11, new CPURegister(111, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R11" }) }, 282 { ARMv8ARegisters.R12, new CPURegister(112, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R12" }) }, 283 { ARMv8ARegisters.R13, new CPURegister(113, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R13" }) }, 284 { ARMv8ARegisters.R14, new CPURegister(114, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R14" }) }, 285 { ARMv8ARegisters.R15, new CPURegister(115, 32, isGeneral: false, isReadonly: false, aliases: new [] { "R15" }) }, 286 { ARMv8ARegisters.CPSR, new CPURegister(125, 32, isGeneral: false, isReadonly: false, aliases: new [] { "CPSR" }) }, 287 }; 288 } 289 290 public enum ARMv8ARegisters 291 { 292 SP = 31, 293 PC = 32, 294 PSTATE = 33, 295 FPSR = 66, 296 FPCR = 67, 297 CPSR = 125, 298 X0 = 0, 299 X1 = 1, 300 X2 = 2, 301 X3 = 3, 302 X4 = 4, 303 X5 = 5, 304 X6 = 6, 305 X7 = 7, 306 X8 = 8, 307 X9 = 9, 308 X10 = 10, 309 X11 = 11, 310 X12 = 12, 311 X13 = 13, 312 X14 = 14, 313 X15 = 15, 314 X16 = 16, 315 X17 = 17, 316 X18 = 18, 317 X19 = 19, 318 X20 = 20, 319 X21 = 21, 320 X22 = 22, 321 X23 = 23, 322 X24 = 24, 323 X25 = 25, 324 X26 = 26, 325 X27 = 27, 326 X28 = 28, 327 X29 = 29, 328 X30 = 30, 329 R0 = 100, 330 R1 = 101, 331 R2 = 102, 332 R3 = 103, 333 R4 = 104, 334 R5 = 105, 335 R6 = 106, 336 R7 = 107, 337 R8 = 108, 338 R9 = 109, 339 R10 = 110, 340 R11 = 111, 341 R12 = 112, 342 R13 = 113, 343 R14 = 114, 344 R15 = 115, 345 } 346 } 347