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