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