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