Deleted Added
sdiff udiff text old ( 7351:d90afcb8724e ) new ( 7404:bfc74724914e )
full compact
1/*
2 * Copyright (c) 2010 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: Gabe Black
38 */
39
40#include "arch/arm/miscregs.hh"
41
42namespace ArmISA
43{
44
45MiscRegIndex
46decodeCP15Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
47{
48 switch (crn) {
49 case 0:
50 switch (opc1) {
51 case 0:
52 switch (crm) {
53 case 0:
54 switch (opc2) {
55 case 1:
56 return MISCREG_CTR;
57 case 2:
58 return MISCREG_TCMTR;
59 case 3:
60 return MISCREG_TLBTR;
61 case 5:
62 return MISCREG_MPIDR;
63 default:
64 return MISCREG_MIDR;
65 }
66 break;
67 case 1:
68 switch (opc2) {
69 case 0:
70 return MISCREG_ID_PFR0;
71 case 1:
72 return MISCREG_ID_PFR1;
73 case 2:
74 return MISCREG_ID_DFR0;
75 case 3:
76 return MISCREG_ID_AFR0;
77 case 4:
78 return MISCREG_ID_MMFR0;
79 case 5:
80 return MISCREG_ID_MMFR1;
81 case 6:
82 return MISCREG_ID_MMFR2;
83 case 7:
84 return MISCREG_ID_MMFR3;
85 }
86 break;
87 case 2:
88 switch (opc2) {
89 case 0:
90 return MISCREG_ID_ISAR0;
91 case 1:
92 return MISCREG_ID_ISAR1;
93 case 2:
94 return MISCREG_ID_ISAR2;
95 case 3:
96 return MISCREG_ID_ISAR3;
97 case 4:
98 return MISCREG_ID_ISAR4;
99 case 5:
100 return MISCREG_ID_ISAR5;
101 case 6:
102 case 7:
103 return MISCREG_RAZ; // read as zero
104 }
105 break;
106 default:
107 return MISCREG_RAZ; // read as zero
108 }
109 break;
110 case 1:
111 if (crm == 0) {
112 switch (opc2) {
113 case 0:
114 return MISCREG_CCSIDR;
115 case 1:
116 return MISCREG_CLIDR;
117 case 7:
118 return MISCREG_AIDR;
119 }
120 }
121 break;
122 case 2:
123 if (crm == 0 && opc2 == 0) {
124 return MISCREG_CSSELR;
125 }
126 break;
127 }
128 break;
129 case 1:
130 if (opc1 == 0) {
131 if (crm == 0) {
132 switch (opc2) {
133 case 0:
134 return MISCREG_SCTLR;
135 case 1:
136 return MISCREG_ACTLR;
137 case 0x2:
138 return MISCREG_CPACR;
139 }
140 } else if (crm == 1) {
141 switch (opc2) {
142 case 0:
143 return MISCREG_SCR;
144 case 1:
145 return MISCREG_SDER;
146 case 2:
147 return MISCREG_NSACR;
148 }
149 }
150 }
151 break;
152 case 2:
153 if (opc2 == 0 && crm == 0) {
154 switch (opc2) {
155 case 0:
156 return MISCREG_TTBR0;
157 case 1:
158 return MISCREG_TTBR1;
159 case 2:
160 return MISCREG_TTBCR;
161 }
162 }
163 break;
164 case 3:
165 if (opc1 == 0 && crm == 0 && opc2 == 0) {
166 return MISCREG_DACR;
167 }
168 break;
169 case 5:
170 if (opc1 == 0) {
171 if (crm == 0) {
172 if (opc2 == 0) {
173 return MISCREG_DFSR;
174 } else if (opc2 == 1) {
175 return MISCREG_IFSR;
176 }
177 } else if (crm == 1) {
178 if (opc2 == 0) {
179 return MISCREG_ADFSR;
180 } else if (opc2 == 1) {
181 return MISCREG_AIFSR;
182 }
183 }
184 }
185 break;
186 case 6:
187 if (opc1 == 0 && crm == 0) {
188 switch (opc2) {
189 case 0:
190 return MISCREG_DFAR;
191 case 2:
192 return MISCREG_IFAR;
193 }
194 }
195 break;
196 case 7:
197 if (opc1 == 0) {
198 switch (crm) {
199 case 0:
200 if (opc2 == 4) {
201 return MISCREG_NOP;
202 }
203 break;
204 case 1:
205 switch (opc2) {
206 case 0:
207 return MISCREG_ICIALLUIS;
208 case 6:
209 return MISCREG_BPIALLIS;
210 }
211 break;
212 case 4:
213 if (opc2 == 0) {
214 return MISCREG_PAR;
215 }
216 break;
217 case 5:
218 switch (opc2) {
219 case 0:
220 return MISCREG_ICIALLU;
221 case 1:
222 return MISCREG_ICIMVAU;
223 case 4:
224 return MISCREG_CP15ISB;
225 case 6:
226 return MISCREG_BPIALL;
227 case 7:
228 return MISCREG_BPIMVA;
229 }
230 break;
231 case 6:
232 if (opc2 == 1) {
233 return MISCREG_DCIMVAC;
234 } else if (opc2 == 2) {
235 return MISCREG_DCISW;
236 }
237 break;
238 case 8:
239 switch (opc2) {
240 case 0:
241 return MISCREG_V2PCWPR;
242 case 1:
243 return MISCREG_V2PCWPW;
244 case 2:
245 return MISCREG_V2PCWUR;
246 case 3:
247 return MISCREG_V2PCWUW;
248 case 4:
249 return MISCREG_V2POWPR;
250 case 5:
251 return MISCREG_V2POWPW;
252 case 6:
253 return MISCREG_V2POWUR;
254 case 7:
255 return MISCREG_V2POWUW;
256 }
257 break;
258 case 10:
259 switch (opc2) {
260 case 1:
261 return MISCREG_DCCMVAC;
262 case 2:
263 return MISCREG_MCCSW;
264 case 4:
265 return MISCREG_CP15DSB;
266 case 5:
267 return MISCREG_CP15DMB;
268 }
269 break;
270 case 11:
271 if (opc2 == 1) {
272 return MISCREG_DCCMVAU;
273 }
274 break;
275 case 13:
276 if (opc2 == 1) {
277 return MISCREG_NOP;
278 }
279 break;
280 case 14:
281 if (opc2 == 1) {
282 return MISCREG_DCCIMVAC;
283 } else if (opc2 == 2) {
284 return MISCREG_DCCISW;
285 }
286 break;
287 }
288 }
289 break;
290 case 8:
291 if (opc1 == 0) {
292 switch (crm) {
293 case 3:
294 switch (opc2) {
295 case 0:
296 return MISCREG_TLBIALLIS;
297 case 1:
298 return MISCREG_TLBIMVAIS;
299 case 2:
300 return MISCREG_TLBIASIDIS;
301 case 3:
302 return MISCREG_TLBIMVAAIS;
303 }
304 break;
305 case 5:
306 switch (opc2) {
307 case 0:
308 return MISCREG_ITLBIALL;
309 case 1:
310 return MISCREG_ITLBIMVA;
311 case 2:
312 return MISCREG_ITLBIASID;
313 }
314 break;
315 case 6:
316 switch (opc2) {
317 case 0:
318 return MISCREG_DTLBIALL;
319 case 1:
320 return MISCREG_DTLBIMVA;
321 case 2:
322 return MISCREG_DTLBIASID;
323 }
324 break;
325 case 7:
326 switch (opc2) {
327 case 0:
328 return MISCREG_TLBIALL;
329 case 1:
330 return MISCREG_TLBIMVA;
331 case 2:
332 return MISCREG_TLBIASID;
333 case 3:
334 return MISCREG_TLBIMVAA;
335 }
336 break;
337 }
338 }
339 break;
340 case 9:
341 if (opc1 >= 0 && opc1 <= 7) {
342 switch (crm) {
343 case 0:
344 case 1:
345 case 2:
346 case 5:
347 case 6:
348 case 7:
349 case 8:
350 //Reserved for Branch Predictor, Cache and TCM operations
351 case 12:
352 case 13:
353 case 14:
354 case 15:
355 // Reserved for Performance monitors
356 break;
357 }
358 }
359 break;
360 case 10:
361 if (opc1 == 0) {
362 // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown
363 if (crm == 2) { // TEX Remap Registers
364 if (opc2 == 0) {
365 return MISCREG_PRRR;
366 } else if (opc2 == 1) {
367 return MISCREG_NMRR;
368 }
369 }
370 }
371 break;
372 case 11:
373 if (opc1 >= 0 && opc1 <=7) {
374 switch (crm) {
375 case 0:
376 case 1:
377 case 2:
378 case 3:
379 case 4:
380 case 5:
381 case 6:
382 case 7:
383 case 8:
384 case 15:
385 // Reserved for DMA operations for TCM access
386 break;
387 }
388 }
389 break;
390 case 12:
391 if (opc1 == 0) {
392 if (crm == 0) {
393 if (opc2 == 0) {
394 return MISCREG_VBAR;
395 } else if (opc2 == 1) {
396 return MISCREG_MVBAR;
397 }
398 } else if (crm == 1) {
399 if (opc2 == 0) {
400 return MISCREG_ISR;
401 }
402 }
403 }
404 break;
405 case 13:
406 if (opc1 == 0) {
407 if (crm == 0) {
408 switch (crm) {
409 case 0:
410 return MISCREG_FCEIDR;
411 case 1:
412 return MISCREG_CONTEXTIDR;
413 case 2:
414 return MISCREG_TPIDRURW;
415 case 3:
416 return MISCREG_TPIDRURO;
417 case 4:
418 return MISCREG_TPIDRPRW;
419 }
420 }
421 }
422 break;
423 case 15:
424 // Implementation defined
425 break;
426 }
427 // Unrecognized register
428 return NUM_MISCREGS;
429}
430
431};