miscregs.cc revision 7405
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 *          Ali Saidi
39 */
40
41#include "arch/arm/isa.hh"
42#include "arch/arm/miscregs.hh"
43#include "base/misc.hh"
44
45namespace ArmISA
46{
47
48MiscRegIndex
49decodeCP15Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
50{
51    switch (crn) {
52      case 0:
53        switch (opc1) {
54          case 0:
55            switch (crm) {
56              case 0:
57                switch (opc2) {
58                  case 1:
59                    return MISCREG_CTR;
60                  case 2:
61                    return MISCREG_TCMTR;
62                  case 3:
63                    return MISCREG_TLBTR;
64                  case 5:
65                    return MISCREG_MPIDR;
66                  default:
67                    return MISCREG_MIDR;
68                }
69                break;
70              case 1:
71                switch (opc2) {
72                  case 0:
73                    return MISCREG_ID_PFR0;
74                  case 1:
75                    return MISCREG_ID_PFR1;
76                  case 2:
77                    return MISCREG_ID_DFR0;
78                  case 3:
79                    return MISCREG_ID_AFR0;
80                  case 4:
81                    return MISCREG_ID_MMFR0;
82                  case 5:
83                    return MISCREG_ID_MMFR1;
84                  case 6:
85                    return MISCREG_ID_MMFR2;
86                  case 7:
87                    return MISCREG_ID_MMFR3;
88                }
89                break;
90              case 2:
91                switch (opc2) {
92                  case 0:
93                    return MISCREG_ID_ISAR0;
94                  case 1:
95                    return MISCREG_ID_ISAR1;
96                  case 2:
97                    return MISCREG_ID_ISAR2;
98                  case 3:
99                    return MISCREG_ID_ISAR3;
100                  case 4:
101                    return MISCREG_ID_ISAR4;
102                  case 5:
103                    return MISCREG_ID_ISAR5;
104                  case 6:
105                  case 7:
106                    return MISCREG_RAZ; // read as zero
107                }
108                break;
109              default:
110                return MISCREG_RAZ; // read as zero
111            }
112            break;
113          case 1:
114            if (crm == 0) {
115                switch (opc2) {
116                  case 0:
117                    return MISCREG_CCSIDR;
118                  case 1:
119                    return MISCREG_CLIDR;
120                  case 7:
121                    return MISCREG_AIDR;
122                }
123            }
124            break;
125          case 2:
126            if (crm == 0 && opc2 == 0) {
127                return MISCREG_CSSELR;
128            }
129            break;
130        }
131        break;
132      case 1:
133        if (opc1 == 0) {
134            if (crm == 0) {
135                switch (opc2) {
136                  case 0:
137                    return MISCREG_SCTLR;
138                  case 1:
139                    return MISCREG_ACTLR;
140                  case 0x2:
141                    return MISCREG_CPACR;
142                }
143            } else if (crm == 1) {
144                switch (opc2) {
145                  case 0:
146                    return MISCREG_SCR;
147                  case 1:
148                    return MISCREG_SDER;
149                  case 2:
150                    return MISCREG_NSACR;
151                }
152            }
153        }
154        break;
155      case 2:
156        if (opc2 == 0 && crm == 0) {
157            switch (opc2) {
158              case 0:
159                return MISCREG_TTBR0;
160              case 1:
161                return MISCREG_TTBR1;
162              case 2:
163                return MISCREG_TTBCR;
164            }
165        }
166        break;
167      case 3:
168        if (opc1 == 0 && crm == 0 && opc2 == 0) {
169            return MISCREG_DACR;
170        }
171        break;
172      case 5:
173        if (opc1 == 0) {
174            if (crm == 0) {
175                if (opc2 == 0) {
176                    return MISCREG_DFSR;
177                } else if (opc2 == 1) {
178                    return MISCREG_IFSR;
179                }
180            } else if (crm == 1) {
181                if (opc2 == 0) {
182                    return MISCREG_ADFSR;
183                } else if (opc2 == 1) {
184                    return MISCREG_AIFSR;
185                }
186            }
187        }
188        break;
189      case 6:
190        if (opc1 == 0 && crm == 0) {
191            switch (opc2) {
192              case 0:
193                return MISCREG_DFAR;
194              case 2:
195                return MISCREG_IFAR;
196            }
197        }
198        break;
199      case 7:
200        if (opc1 == 0) {
201            switch (crm) {
202              case 0:
203                if (opc2 == 4) {
204                    return MISCREG_NOP;
205                }
206                break;
207              case 1:
208                switch (opc2) {
209                  case 0:
210                    return MISCREG_ICIALLUIS;
211                  case 6:
212                    return MISCREG_BPIALLIS;
213                }
214                break;
215              case 4:
216                if (opc2 == 0) {
217                    return MISCREG_PAR;
218                }
219                break;
220              case 5:
221                switch (opc2) {
222                  case 0:
223                    return MISCREG_ICIALLU;
224                  case 1:
225                    return MISCREG_ICIMVAU;
226                  case 4:
227                    return MISCREG_CP15ISB;
228                  case 6:
229                    return MISCREG_BPIALL;
230                  case 7:
231                    return MISCREG_BPIMVA;
232                }
233                break;
234              case 6:
235                if (opc2 == 1) {
236                    return MISCREG_DCIMVAC;
237                } else if (opc2 == 2) {
238                    return MISCREG_DCISW;
239                }
240                break;
241              case 8:
242                switch (opc2) {
243                  case 0:
244                    return MISCREG_V2PCWPR;
245                  case 1:
246                    return MISCREG_V2PCWPW;
247                  case 2:
248                    return MISCREG_V2PCWUR;
249                  case 3:
250                    return MISCREG_V2PCWUW;
251                  case 4:
252                    return MISCREG_V2POWPR;
253                  case 5:
254                    return MISCREG_V2POWPW;
255                  case 6:
256                    return MISCREG_V2POWUR;
257                  case 7:
258                    return MISCREG_V2POWUW;
259                }
260                break;
261              case 10:
262                switch (opc2) {
263                  case 1:
264                    return MISCREG_DCCMVAC;
265                  case 2:
266                    return MISCREG_MCCSW;
267                  case 4:
268                    return MISCREG_CP15DSB;
269                  case 5:
270                    return MISCREG_CP15DMB;
271                }
272                break;
273              case 11:
274                if (opc2 == 1) {
275                    return MISCREG_DCCMVAU;
276                }
277                break;
278              case 13:
279                if (opc2 == 1) {
280                    return MISCREG_NOP;
281                }
282                break;
283              case 14:
284                if (opc2 == 1) {
285                    return MISCREG_DCCIMVAC;
286                } else if (opc2 == 2) {
287                    return MISCREG_DCCISW;
288                }
289                break;
290            }
291        }
292        break;
293      case 8:
294        if (opc1 == 0) {
295            switch (crm) {
296              case 3:
297                switch (opc2) {
298                  case 0:
299                    return MISCREG_TLBIALLIS;
300                  case 1:
301                    return MISCREG_TLBIMVAIS;
302                  case 2:
303                    return MISCREG_TLBIASIDIS;
304                  case 3:
305                    return MISCREG_TLBIMVAAIS;
306                }
307                break;
308              case 5:
309                switch (opc2) {
310                  case 0:
311                    return MISCREG_ITLBIALL;
312                  case 1:
313                    return MISCREG_ITLBIMVA;
314                  case 2:
315                    return MISCREG_ITLBIASID;
316                }
317                break;
318              case 6:
319                switch (opc2) {
320                  case 0:
321                    return MISCREG_DTLBIALL;
322                  case 1:
323                    return MISCREG_DTLBIMVA;
324                  case 2:
325                    return MISCREG_DTLBIASID;
326                }
327                break;
328              case 7:
329                switch (opc2) {
330                  case 0:
331                    return MISCREG_TLBIALL;
332                  case 1:
333                    return MISCREG_TLBIMVA;
334                  case 2:
335                    return MISCREG_TLBIASID;
336                  case 3:
337                    return MISCREG_TLBIMVAA;
338                }
339                break;
340            }
341        }
342        break;
343      case 9:
344        if (opc1 >= 0 && opc1 <= 7) {
345            switch (crm) {
346              case 0:
347              case 1:
348              case 2:
349              case 5:
350              case 6:
351              case 7:
352              case 8:
353                //Reserved for Branch Predictor, Cache and TCM operations
354              case 12:
355              case 13:
356              case 14:
357              case 15:
358                // Reserved for Performance monitors
359                break;
360            }
361        }
362        break;
363      case 10:
364        if (opc1 == 0) {
365            // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown
366            if (crm == 2) { // TEX Remap Registers
367                if (opc2 == 0) {
368                    return MISCREG_PRRR;
369                } else if (opc2 == 1) {
370                    return MISCREG_NMRR;
371                }
372            }
373        }
374        break;
375      case 11:
376        if (opc1 >= 0 && opc1 <=7) {
377            switch (crm) {
378              case 0:
379              case 1:
380              case 2:
381              case 3:
382              case 4:
383              case 5:
384              case 6:
385              case 7:
386              case 8:
387              case 15:
388                // Reserved for DMA operations for TCM access
389                break;
390            }
391        }
392        break;
393      case 12:
394        if (opc1 == 0) {
395            if (crm == 0) {
396                if (opc2 == 0) {
397                    return MISCREG_VBAR;
398                } else if (opc2 == 1) {
399                    return MISCREG_MVBAR;
400                }
401            } else if (crm == 1) {
402                if (opc2 == 0) {
403                    return MISCREG_ISR;
404                }
405            }
406        }
407        break;
408      case 13:
409        if (opc1 == 0) {
410            if (crm == 0) {
411                switch (crm) {
412                  case 0:
413                    return MISCREG_FCEIDR;
414                  case 1:
415                    return MISCREG_CONTEXTIDR;
416                  case 2:
417                    return MISCREG_TPIDRURW;
418                  case 3:
419                    return MISCREG_TPIDRURO;
420                  case 4:
421                    return MISCREG_TPIDRPRW;
422                }
423            }
424        }
425        break;
426      case 15:
427        // Implementation defined
428        break;
429    }
430    warn("Unknown miscreg: CRn: %d Opc1: %d CRm: %d opc2: %d\n",
431            crn, opc1, crm, opc2);
432    // Unrecognized register
433    return NUM_MISCREGS;
434}
435
436};
437