2 * Copyright (c) 2011,2017-2019 ARM Limited
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.
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.
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.
44 #include "arch/arm/tracers/tarmac_parser.hh"
46 #include "arch/arm/tlb.hh"
47 #include "arch/arm/insts/static_inst.hh"
48 #include "config/the_isa.hh"
49 #include "cpu/static_inst.hh"
50 #include "cpu/thread_context.hh"
51 #include "mem/packet.hh"
52 #include "mem/port_proxy.hh"
53 #include "sim/core.hh"
54 #include "sim/faults.hh"
55 #include "sim/sim_exit.hh"
58 using namespace ArmISA
;
62 // TARMAC Parser static variables
63 const int TarmacParserRecord::MaxLineLength
;
64 int8_t TarmacParserRecord::maxVectorLength
= 0;
66 TarmacParserRecord::ParserInstEntry
TarmacParserRecord::instRecord
;
67 TarmacParserRecord::ParserRegEntry
TarmacParserRecord::regRecord
;
68 TarmacParserRecord::ParserMemEntry
TarmacParserRecord::memRecord
;
69 TarmacBaseRecord::TarmacRecordType
TarmacParserRecord::currRecordType
;
71 list
<TarmacParserRecord::ParserRegEntry
> TarmacParserRecord::destRegRecords
;
72 char TarmacParserRecord::buf
[TarmacParserRecord::MaxLineLength
];
73 TarmacParserRecord::MiscRegMap
TarmacParserRecord::miscRegMap
= {
75 { "cpsr", MISCREG_CPSR
},
76 { "nzcv", MISCREG_NZCV
},
78 // AArch32 CP14 registers
79 { "dbgdidr", MISCREG_DBGDIDR
},
80 { "dbgdscrint", MISCREG_DBGDSCRint
},
81 { "dbgdccint", MISCREG_DBGDCCINT
},
82 { "dbgdtrtxint", MISCREG_DBGDTRTXint
},
83 { "dbgdtrrxint", MISCREG_DBGDTRRXint
},
84 { "dbgwfar", MISCREG_DBGWFAR
},
85 { "dbgvcr", MISCREG_DBGVCR
},
86 { "dbgdtrrxext", MISCREG_DBGDTRRXext
},
87 { "dbgdscrext", MISCREG_DBGDSCRext
},
88 { "dbgdtrtxext", MISCREG_DBGDTRTXext
},
89 { "dbgoseccr", MISCREG_DBGOSECCR
},
90 { "dbgbvr0", MISCREG_DBGBVR0
},
91 { "dbgbvr1", MISCREG_DBGBVR1
},
92 { "dbgbvr2", MISCREG_DBGBVR2
},
93 { "dbgbvr3", MISCREG_DBGBVR3
},
94 { "dbgbvr4", MISCREG_DBGBVR4
},
95 { "dbgbvr5", MISCREG_DBGBVR5
},
96 { "dbgbvr6", MISCREG_DBGBVR6
},
97 { "dbgbvr7", MISCREG_DBGBVR7
},
98 { "dbgbvr8", MISCREG_DBGBVR8
},
99 { "dbgbvr9", MISCREG_DBGBVR9
},
100 { "dbgbvr10", MISCREG_DBGBVR10
},
101 { "dbgbvr11", MISCREG_DBGBVR11
},
102 { "dbgbvr12", MISCREG_DBGBVR12
},
103 { "dbgbvr13", MISCREG_DBGBVR13
},
104 { "dbgbvr14", MISCREG_DBGBVR14
},
105 { "dbgbvr15", MISCREG_DBGBVR15
},
106 { "dbgbcr0", MISCREG_DBGBCR0
},
107 { "dbgbcr1", MISCREG_DBGBCR1
},
108 { "dbgbcr2", MISCREG_DBGBCR2
},
109 { "dbgbcr3", MISCREG_DBGBCR3
},
110 { "dbgbcr4", MISCREG_DBGBCR4
},
111 { "dbgbcr5", MISCREG_DBGBCR5
},
112 { "dbgbcr6", MISCREG_DBGBCR6
},
113 { "dbgbcr7", MISCREG_DBGBCR7
},
114 { "dbgbcr8", MISCREG_DBGBCR8
},
115 { "dbgbcr9", MISCREG_DBGBCR9
},
116 { "dbgbcr10", MISCREG_DBGBCR10
},
117 { "dbgbcr11", MISCREG_DBGBCR11
},
118 { "dbgbcr12", MISCREG_DBGBCR12
},
119 { "dbgbcr13", MISCREG_DBGBCR13
},
120 { "dbgbcr14", MISCREG_DBGBCR14
},
121 { "dbgbcr15", MISCREG_DBGBCR15
},
122 { "dbgwvr0", MISCREG_DBGWVR0
},
123 { "dbgwvr1", MISCREG_DBGWVR1
},
124 { "dbgwvr2", MISCREG_DBGWVR2
},
125 { "dbgwvr3", MISCREG_DBGWVR3
},
126 { "dbgwvr4", MISCREG_DBGWVR4
},
127 { "dbgwvr5", MISCREG_DBGWVR5
},
128 { "dbgwvr6", MISCREG_DBGWVR6
},
129 { "dbgwvr7", MISCREG_DBGWVR7
},
130 { "dbgwvr8", MISCREG_DBGWVR8
},
131 { "dbgwvr9", MISCREG_DBGWVR9
},
132 { "dbgwvr10", MISCREG_DBGWVR10
},
133 { "dbgwvr11", MISCREG_DBGWVR11
},
134 { "dbgwvr12", MISCREG_DBGWVR12
},
135 { "dbgwvr13", MISCREG_DBGWVR13
},
136 { "dbgwvr14", MISCREG_DBGWVR14
},
137 { "dbgwvr15", MISCREG_DBGWVR15
},
138 { "dbgwcr0", MISCREG_DBGWCR0
},
139 { "dbgwcr1", MISCREG_DBGWCR1
},
140 { "dbgwcr2", MISCREG_DBGWCR2
},
141 { "dbgwcr3", MISCREG_DBGWCR3
},
142 { "dbgwcr4", MISCREG_DBGWCR4
},
143 { "dbgwcr5", MISCREG_DBGWCR5
},
144 { "dbgwcr6", MISCREG_DBGWCR6
},
145 { "dbgwcr7", MISCREG_DBGWCR7
},
146 { "dbgwcr8", MISCREG_DBGWCR8
},
147 { "dbgwcr9", MISCREG_DBGWCR9
},
148 { "dbgwcr10", MISCREG_DBGWCR10
},
149 { "dbgwcr11", MISCREG_DBGWCR11
},
150 { "dbgwcr12", MISCREG_DBGWCR12
},
151 { "dbgwcr13", MISCREG_DBGWCR13
},
152 { "dbgwcr14", MISCREG_DBGWCR14
},
153 { "dbgwcr15", MISCREG_DBGWCR15
},
154 { "dbgdrar", MISCREG_DBGDRAR
},
155 { "dbgbxvr0", MISCREG_DBGBXVR0
},
156 { "dbgbxvr1", MISCREG_DBGBXVR1
},
157 { "dbgbxvr2", MISCREG_DBGBXVR2
},
158 { "dbgbxvr3", MISCREG_DBGBXVR3
},
159 { "dbgbxvr4", MISCREG_DBGBXVR4
},
160 { "dbgbxvr5", MISCREG_DBGBXVR5
},
161 { "dbgbxvr6", MISCREG_DBGBXVR6
},
162 { "dbgbxvr7", MISCREG_DBGBXVR7
},
163 { "dbgbxvr8", MISCREG_DBGBXVR8
},
164 { "dbgbxvr9", MISCREG_DBGBXVR9
},
165 { "dbgbxvr10", MISCREG_DBGBXVR10
},
166 { "dbgbxvr11", MISCREG_DBGBXVR11
},
167 { "dbgbxvr12", MISCREG_DBGBXVR12
},
168 { "dbgbxvr13", MISCREG_DBGBXVR13
},
169 { "dbgbxvr14", MISCREG_DBGBXVR14
},
170 { "dbgbxvr15", MISCREG_DBGBXVR15
},
171 { "dbgoslar", MISCREG_DBGOSLAR
},
172 { "dbgoslsr", MISCREG_DBGOSLSR
},
173 { "dbgosdlr", MISCREG_DBGOSDLR
},
174 { "dbgprcr", MISCREG_DBGPRCR
},
175 { "dbgdsar", MISCREG_DBGDSAR
},
176 { "dbgclaimset", MISCREG_DBGCLAIMSET
},
177 { "dbgclaimclr", MISCREG_DBGCLAIMCLR
},
178 { "dbgauthstatus", MISCREG_DBGAUTHSTATUS
},
179 { "dbgdevid2", MISCREG_DBGDEVID2
},
180 { "dbgdevid1", MISCREG_DBGDEVID1
},
181 { "dbgdevid0", MISCREG_DBGDEVID0
},
182 { "teecr", MISCREG_TEECR
},
183 { "jidr", MISCREG_JIDR
},
184 { "teehbr", MISCREG_TEEHBR
},
185 { "joscr", MISCREG_JOSCR
},
186 { "jmcr", MISCREG_JMCR
},
188 // AArch32 CP15 registers
189 { "midr", MISCREG_MIDR
},
190 { "ctr", MISCREG_CTR
},
191 { "tcmtr", MISCREG_TCMTR
},
192 { "tlbtr", MISCREG_TLBTR
},
193 { "mpidr", MISCREG_MPIDR
},
194 { "revidr", MISCREG_REVIDR
},
195 { "id_pfr0", MISCREG_ID_PFR0
},
196 { "id_pfr1", MISCREG_ID_PFR1
},
197 { "id_dfr0", MISCREG_ID_DFR0
},
198 { "id_afr0", MISCREG_ID_AFR0
},
199 { "id_mmfr0", MISCREG_ID_MMFR0
},
200 { "id_mmfr1", MISCREG_ID_MMFR1
},
201 { "id_mmfr2", MISCREG_ID_MMFR2
},
202 { "id_mmfr3", MISCREG_ID_MMFR3
},
203 { "id_isar0", MISCREG_ID_ISAR0
},
204 { "id_isar1", MISCREG_ID_ISAR1
},
205 { "id_isar2", MISCREG_ID_ISAR2
},
206 { "id_isar3", MISCREG_ID_ISAR3
},
207 { "id_isar4", MISCREG_ID_ISAR4
},
208 { "id_isar5", MISCREG_ID_ISAR5
},
209 { "ccsidr", MISCREG_CCSIDR
},
210 { "clidr", MISCREG_CLIDR
},
211 { "aidr", MISCREG_AIDR
},
212 { "csselr_ns", MISCREG_CSSELR_NS
},
213 { "csselr_s", MISCREG_CSSELR_S
},
214 { "vpidr", MISCREG_VPIDR
},
215 { "vmpidr", MISCREG_VMPIDR
},
216 { "sctlr_ns", MISCREG_SCTLR_NS
},
217 { "sctlr_s", MISCREG_SCTLR_S
},
218 { "actlr_ns", MISCREG_ACTLR_NS
},
219 { "actlr_s", MISCREG_ACTLR_S
},
220 { "cpacr", MISCREG_CPACR
},
221 { "scr", MISCREG_SCR
},
222 { "sder", MISCREG_SDER
},
223 { "nsacr", MISCREG_NSACR
},
224 { "hsctlr", MISCREG_HSCTLR
},
225 { "hactlr", MISCREG_HACTLR
},
226 { "hcr", MISCREG_HCR
},
227 { "hcr2", MISCREG_HCR2
},
228 { "hdcr", MISCREG_HDCR
},
229 { "hcptr", MISCREG_HCPTR
},
230 { "hstr", MISCREG_HSTR
},
231 { "hacr", MISCREG_HACR
},
232 { "ttbr0_ns", MISCREG_TTBR0_NS
},
233 { "ttbr0_s", MISCREG_TTBR0_S
},
234 { "ttbr1_ns", MISCREG_TTBR1_NS
},
235 { "ttbr1_s", MISCREG_TTBR1_S
},
236 { "ttbcr_ns", MISCREG_TTBCR_NS
},
237 { "ttbcr_s", MISCREG_TTBCR_S
},
238 { "htcr", MISCREG_HTCR
},
239 { "vtcr", MISCREG_VTCR
},
240 { "dacr_ns", MISCREG_DACR_NS
},
241 { "dacr_s", MISCREG_DACR_S
},
242 { "dfsr_ns", MISCREG_DFSR_NS
},
243 { "dfsr_s", MISCREG_DFSR_S
},
244 { "ifsr_ns", MISCREG_IFSR_NS
},
245 { "ifsr_s", MISCREG_IFSR_S
},
246 { "adfsr_ns", MISCREG_ADFSR_NS
},
247 { "adfsr_s", MISCREG_ADFSR_S
},
248 { "aifsr_ns", MISCREG_AIFSR_NS
},
249 { "aifsr_s", MISCREG_AIFSR_S
},
250 { "hadfsr", MISCREG_HADFSR
},
251 { "haifsr", MISCREG_HAIFSR
},
252 { "hsr", MISCREG_HSR
},
253 { "dfar_ns", MISCREG_DFAR_NS
},
254 { "dfar_s", MISCREG_DFAR_S
},
255 { "ifar_ns", MISCREG_IFAR_NS
},
256 { "ifar_s", MISCREG_IFAR_S
},
257 { "hdfar", MISCREG_HDFAR
},
258 { "hifar", MISCREG_HIFAR
},
259 { "hpfar", MISCREG_HPFAR
},
260 { "icialluis", MISCREG_ICIALLUIS
},
261 { "bpiallis", MISCREG_BPIALLIS
},
262 { "par_ns", MISCREG_PAR_NS
},
263 { "par_s", MISCREG_PAR_S
},
264 { "iciallu", MISCREG_ICIALLU
},
265 { "icimvau", MISCREG_ICIMVAU
},
266 { "cp15isb", MISCREG_CP15ISB
},
267 { "bpiall", MISCREG_BPIALL
},
268 { "bpimva", MISCREG_BPIMVA
},
269 { "dcimvac", MISCREG_DCIMVAC
},
270 { "dcisw", MISCREG_DCISW
},
271 { "ats1cpr", MISCREG_ATS1CPR
},
272 { "ats1cpw", MISCREG_ATS1CPW
},
273 { "ats1cur", MISCREG_ATS1CUR
},
274 { "ats1cuw", MISCREG_ATS1CUW
},
275 { "ats12nsopr", MISCREG_ATS12NSOPR
},
276 { "ats12nsopw", MISCREG_ATS12NSOPW
},
277 { "ats12nsour", MISCREG_ATS12NSOUR
},
278 { "ats12nsouw", MISCREG_ATS12NSOUW
},
279 { "dccmvac", MISCREG_DCCMVAC
},
280 { "dccsw", MISCREG_DCCSW
},
281 { "cp15dsb", MISCREG_CP15DSB
},
282 { "cp15dmb", MISCREG_CP15DMB
},
283 { "dccmvau", MISCREG_DCCMVAU
},
284 { "dccimvac", MISCREG_DCCIMVAC
},
285 { "dccisw", MISCREG_DCCISW
},
286 { "ats1hr", MISCREG_ATS1HR
},
287 { "ats1hw", MISCREG_ATS1HW
},
288 { "tlbiallis", MISCREG_TLBIALLIS
},
289 { "tlbimvais", MISCREG_TLBIMVAIS
},
290 { "tlbiasidis", MISCREG_TLBIASIDIS
},
291 { "tlbimvaais", MISCREG_TLBIMVAAIS
},
292 { "tlbimvalis", MISCREG_TLBIMVALIS
},
293 { "tlbimvaalis", MISCREG_TLBIMVAALIS
},
294 { "itlbiall", MISCREG_ITLBIALL
},
295 { "itlbimva", MISCREG_ITLBIMVA
},
296 { "itlbiasid", MISCREG_ITLBIASID
},
297 { "dtlbiall", MISCREG_DTLBIALL
},
298 { "dtlbimva", MISCREG_DTLBIMVA
},
299 { "dtlbiasid", MISCREG_DTLBIASID
},
300 { "tlbiall", MISCREG_TLBIALL
},
301 { "tlbimva", MISCREG_TLBIMVA
},
302 { "tlbiasid", MISCREG_TLBIASID
},
303 { "tlbimvaa", MISCREG_TLBIMVAA
},
304 { "tlbimval", MISCREG_TLBIMVAL
},
305 { "tlbimvaal", MISCREG_TLBIMVAAL
},
306 { "tlbiipas2is", MISCREG_TLBIIPAS2IS
},
307 { "tlbiipas2lis", MISCREG_TLBIIPAS2LIS
},
308 { "tlbiallhis", MISCREG_TLBIALLHIS
},
309 { "tlbimvahis", MISCREG_TLBIMVAHIS
},
310 { "tlbiallnsnhis", MISCREG_TLBIALLNSNHIS
},
311 { "tlbimvalhis", MISCREG_TLBIMVALHIS
},
312 { "tlbiipas2", MISCREG_TLBIIPAS2
},
313 { "tlbiipas2l", MISCREG_TLBIIPAS2L
},
314 { "tlbiallh", MISCREG_TLBIALLH
},
315 { "tlbimvah", MISCREG_TLBIMVAH
},
316 { "tlbiallnsnh", MISCREG_TLBIALLNSNH
},
317 { "tlbimvalh", MISCREG_TLBIMVALH
},
318 { "pmcr", MISCREG_PMCR
},
319 { "pmcntenset", MISCREG_PMCNTENSET
},
320 { "pmcntenclr", MISCREG_PMCNTENCLR
},
321 { "pmovsr", MISCREG_PMOVSR
},
322 { "pmswinc", MISCREG_PMSWINC
},
323 { "pmselr", MISCREG_PMSELR
},
324 { "pmceid0", MISCREG_PMCEID0
},
325 { "pmceid1", MISCREG_PMCEID1
},
326 { "pmccntr", MISCREG_PMCCNTR
},
327 { "pmxevtyper", MISCREG_PMXEVTYPER
},
328 { "pmccfiltr", MISCREG_PMCCFILTR
},
329 { "pmxevcntr", MISCREG_PMXEVCNTR
},
330 { "pmuserenr", MISCREG_PMUSERENR
},
331 { "pmintenset", MISCREG_PMINTENSET
},
332 { "pmintenclr", MISCREG_PMINTENCLR
},
333 { "pmovsset", MISCREG_PMOVSSET
},
334 { "l2ctlr", MISCREG_L2CTLR
},
335 { "l2ectlr", MISCREG_L2ECTLR
},
336 { "prrr_ns", MISCREG_PRRR_NS
},
337 { "prrr_s", MISCREG_PRRR_S
},
338 { "mair0_ns", MISCREG_MAIR0_NS
},
339 { "mair0_s", MISCREG_MAIR0_S
},
340 { "nmrr_ns", MISCREG_NMRR_NS
},
341 { "nmrr_s", MISCREG_NMRR_S
},
342 { "mair1_ns", MISCREG_MAIR1_NS
},
343 { "mair1_s", MISCREG_MAIR1_S
},
344 { "amair0_ns", MISCREG_AMAIR0_NS
},
345 { "amair0_s", MISCREG_AMAIR0_S
},
346 { "amair1_ns", MISCREG_AMAIR1_NS
},
347 { "amair1_s", MISCREG_AMAIR1_S
},
348 { "hmair0", MISCREG_HMAIR0
},
349 { "hmair1", MISCREG_HMAIR1
},
350 { "hamair0", MISCREG_HAMAIR0
},
351 { "hamair1", MISCREG_HAMAIR1
},
352 { "vbar_ns", MISCREG_VBAR_NS
},
353 { "vbar_s", MISCREG_VBAR_S
},
354 { "mvbar", MISCREG_MVBAR
},
355 { "rmr", MISCREG_RMR
},
356 { "isr", MISCREG_ISR
},
357 { "hvbar", MISCREG_HVBAR
},
358 { "fcseidr", MISCREG_FCSEIDR
},
359 { "contextidr_ns", MISCREG_CONTEXTIDR_NS
},
360 { "contextidr_s", MISCREG_CONTEXTIDR_S
},
361 { "tpidrurw_ns", MISCREG_TPIDRURW_NS
},
362 { "tpidrurw_s", MISCREG_TPIDRURW_S
},
363 { "tpidruro_ns", MISCREG_TPIDRURO_NS
},
364 { "tpidruro_s", MISCREG_TPIDRURO_S
},
365 { "tpidrprw_ns", MISCREG_TPIDRPRW_NS
},
366 { "tpidrprw_s", MISCREG_TPIDRPRW_S
},
367 { "htpidr", MISCREG_HTPIDR
},
368 { "cntfrq", MISCREG_CNTFRQ
},
369 { "cntkctl", MISCREG_CNTKCTL
},
370 { "cntp_tval_ns", MISCREG_CNTP_TVAL_NS
},
371 { "cntp_tval_s", MISCREG_CNTP_TVAL_S
},
372 { "cntp_ctl_ns", MISCREG_CNTP_CTL_NS
},
373 { "cntp_ctl_s", MISCREG_CNTP_CTL_S
},
374 { "cntv_tval", MISCREG_CNTV_TVAL
},
375 { "cntv_ctl", MISCREG_CNTV_CTL
},
376 { "cnthctl", MISCREG_CNTHCTL
},
377 { "cnthp_tval", MISCREG_CNTHP_TVAL
},
378 { "cnthp_ctl", MISCREG_CNTHP_CTL
},
379 { "il1data0", MISCREG_IL1DATA0
},
380 { "il1data1", MISCREG_IL1DATA1
},
381 { "il1data2", MISCREG_IL1DATA2
},
382 { "il1data3", MISCREG_IL1DATA3
},
383 { "dl1data0", MISCREG_DL1DATA0
},
384 { "dl1data1", MISCREG_DL1DATA1
},
385 { "dl1data2", MISCREG_DL1DATA2
},
386 { "dl1data3", MISCREG_DL1DATA3
},
387 { "dl1data4", MISCREG_DL1DATA4
},
388 { "ramindex", MISCREG_RAMINDEX
},
389 { "l2actlr", MISCREG_L2ACTLR
},
390 { "cbar", MISCREG_CBAR
},
391 { "httbr", MISCREG_HTTBR
},
392 { "vttbr", MISCREG_VTTBR
},
393 { "cntpct", MISCREG_CNTPCT
},
394 { "cntvct", MISCREG_CNTVCT
},
395 { "cntp_cval_ns", MISCREG_CNTP_CVAL_NS
},
396 { "cntp_cval_s", MISCREG_CNTP_CVAL_S
},
397 { "cntv_cval", MISCREG_CNTV_CVAL
},
398 { "cntvoff", MISCREG_CNTVOFF
},
399 { "cnthp_cval", MISCREG_CNTHP_CVAL
},
400 { "cpumerrsr", MISCREG_CPUMERRSR
},
401 { "l2merrsr", MISCREG_L2MERRSR
},
403 // AArch64 registers (Op0=2)
404 { "mdccint_el1", MISCREG_MDCCINT_EL1
},
405 { "osdtrrx_el1", MISCREG_OSDTRRX_EL1
},
406 { "mdscr_el1", MISCREG_MDSCR_EL1
},
407 { "osdtrtx_el1", MISCREG_OSDTRTX_EL1
},
408 { "oseccr_el1", MISCREG_OSECCR_EL1
},
409 { "dbgbvr0_el1", MISCREG_DBGBVR0_EL1
},
410 { "dbgbvr1_el1", MISCREG_DBGBVR1_EL1
},
411 { "dbgbvr2_el1", MISCREG_DBGBVR2_EL1
},
412 { "dbgbvr3_el1", MISCREG_DBGBVR3_EL1
},
413 { "dbgbvr4_el1", MISCREG_DBGBVR4_EL1
},
414 { "dbgbvr5_el1", MISCREG_DBGBVR5_EL1
},
415 { "dbgbvr6_el1", MISCREG_DBGBVR6_EL1
},
416 { "dbgbvr7_el1", MISCREG_DBGBVR7_EL1
},
417 { "dbgbvr8_el1", MISCREG_DBGBVR8_EL1
},
418 { "dbgbvr9_el1", MISCREG_DBGBVR9_EL1
},
419 { "dbgbvr10_el1", MISCREG_DBGBVR10_EL1
},
420 { "dbgbvr11_el1", MISCREG_DBGBVR11_EL1
},
421 { "dbgbvr12_el1", MISCREG_DBGBVR12_EL1
},
422 { "dbgbvr13_el1", MISCREG_DBGBVR13_EL1
},
423 { "dbgbvr14_el1", MISCREG_DBGBVR14_EL1
},
424 { "dbgbvr15_el1", MISCREG_DBGBVR15_EL1
},
425 { "dbgbcr0_el1", MISCREG_DBGBCR0_EL1
},
426 { "dbgbcr1_el1", MISCREG_DBGBCR1_EL1
},
427 { "dbgbcr2_el1", MISCREG_DBGBCR2_EL1
},
428 { "dbgbcr3_el1", MISCREG_DBGBCR3_EL1
},
429 { "dbgbcr4_el1", MISCREG_DBGBCR4_EL1
},
430 { "dbgbcr5_el1", MISCREG_DBGBCR5_EL1
},
431 { "dbgbcr6_el1", MISCREG_DBGBCR6_EL1
},
432 { "dbgbcr7_el1", MISCREG_DBGBCR7_EL1
},
433 { "dbgbcr8_el1", MISCREG_DBGBCR8_EL1
},
434 { "dbgbcr9_el1", MISCREG_DBGBCR9_EL1
},
435 { "dbgbcr10_el1", MISCREG_DBGBCR10_EL1
},
436 { "dbgbcr11_el1", MISCREG_DBGBCR11_EL1
},
437 { "dbgbcr12_el1", MISCREG_DBGBCR12_EL1
},
438 { "dbgbcr13_el1", MISCREG_DBGBCR13_EL1
},
439 { "dbgbcr14_el1", MISCREG_DBGBCR14_EL1
},
440 { "dbgbcr15_el1", MISCREG_DBGBCR15_EL1
},
441 { "dbgwvr0_el1", MISCREG_DBGWVR0_EL1
},
442 { "dbgwvr1_el1", MISCREG_DBGWVR1_EL1
},
443 { "dbgwvr2_el1", MISCREG_DBGWVR2_EL1
},
444 { "dbgwvr3_el1", MISCREG_DBGWVR3_EL1
},
445 { "dbgwvr4_el1", MISCREG_DBGWVR4_EL1
},
446 { "dbgwvr5_el1", MISCREG_DBGWVR5_EL1
},
447 { "dbgwvr6_el1", MISCREG_DBGWVR6_EL1
},
448 { "dbgwvr7_el1", MISCREG_DBGWVR7_EL1
},
449 { "dbgwvr8_el1", MISCREG_DBGWVR8_EL1
},
450 { "dbgwvr9_el1", MISCREG_DBGWVR9_EL1
},
451 { "dbgwvr10_el1", MISCREG_DBGWVR10_EL1
},
452 { "dbgwvr11_el1", MISCREG_DBGWVR11_EL1
},
453 { "dbgwvr12_el1", MISCREG_DBGWVR12_EL1
},
454 { "dbgwvr13_el1", MISCREG_DBGWVR13_EL1
},
455 { "dbgwvr14_el1", MISCREG_DBGWVR14_EL1
},
456 { "dbgwvr15_el1", MISCREG_DBGWVR15_EL1
},
457 { "dbgwcr0_el1", MISCREG_DBGWCR0_EL1
},
458 { "dbgwcr1_el1", MISCREG_DBGWCR1_EL1
},
459 { "dbgwcr2_el1", MISCREG_DBGWCR2_EL1
},
460 { "dbgwcr3_el1", MISCREG_DBGWCR3_EL1
},
461 { "dbgwcr4_el1", MISCREG_DBGWCR4_EL1
},
462 { "dbgwcr5_el1", MISCREG_DBGWCR5_EL1
},
463 { "dbgwcr6_el1", MISCREG_DBGWCR6_EL1
},
464 { "dbgwcr7_el1", MISCREG_DBGWCR7_EL1
},
465 { "dbgwcr8_el1", MISCREG_DBGWCR8_EL1
},
466 { "dbgwcr9_el1", MISCREG_DBGWCR9_EL1
},
467 { "dbgwcr10_el1", MISCREG_DBGWCR10_EL1
},
468 { "dbgwcr11_el1", MISCREG_DBGWCR11_EL1
},
469 { "dbgwcr12_el1", MISCREG_DBGWCR12_EL1
},
470 { "dbgwcr13_el1", MISCREG_DBGWCR13_EL1
},
471 { "dbgwcr14_el1", MISCREG_DBGWCR14_EL1
},
472 { "dbgwcr15_el1", MISCREG_DBGWCR15_EL1
},
473 { "mdccsr_el0", MISCREG_MDCCSR_EL0
},
474 { "mddtr_el0", MISCREG_MDDTR_EL0
},
475 { "mddtrtx_el0", MISCREG_MDDTRTX_EL0
},
476 { "mddtrrx_el0", MISCREG_MDDTRRX_EL0
},
477 { "dbgvcr32_el2", MISCREG_DBGVCR32_EL2
},
478 { "mdrar_el1", MISCREG_MDRAR_EL1
},
479 { "oslar_el1", MISCREG_OSLAR_EL1
},
480 { "oslsr_el1", MISCREG_OSLSR_EL1
},
481 { "osdlr_el1", MISCREG_OSDLR_EL1
},
482 { "dbgprcr_el1", MISCREG_DBGPRCR_EL1
},
483 { "dbgclaimset_el1", MISCREG_DBGCLAIMSET_EL1
},
484 { "dbgclaimclr_el1", MISCREG_DBGCLAIMCLR_EL1
},
485 { "dbgauthstatus_el1", MISCREG_DBGAUTHSTATUS_EL1
},
486 { "teecr32_el1", MISCREG_TEECR32_EL1
},
487 { "teehbr32_el1", MISCREG_TEEHBR32_EL1
},
489 // AArch64 registers (Op0=1,3)
490 { "midr_el1", MISCREG_MIDR_EL1
},
491 { "mpidr_el1", MISCREG_MPIDR_EL1
},
492 { "revidr_el1", MISCREG_REVIDR_EL1
},
493 { "id_pfr0_el1", MISCREG_ID_PFR0_EL1
},
494 { "id_pfr1_el1", MISCREG_ID_PFR1_EL1
},
495 { "id_dfr0_el1", MISCREG_ID_DFR0_EL1
},
496 { "id_afr0_el1", MISCREG_ID_AFR0_EL1
},
497 { "id_mmfr0_el1", MISCREG_ID_MMFR0_EL1
},
498 { "id_mmfr1_el1", MISCREG_ID_MMFR1_EL1
},
499 { "id_mmfr2_el1", MISCREG_ID_MMFR2_EL1
},
500 { "id_mmfr3_el1", MISCREG_ID_MMFR3_EL1
},
501 { "id_isar0_el1", MISCREG_ID_ISAR0_EL1
},
502 { "id_isar1_el1", MISCREG_ID_ISAR1_EL1
},
503 { "id_isar2_el1", MISCREG_ID_ISAR2_EL1
},
504 { "id_isar3_el1", MISCREG_ID_ISAR3_EL1
},
505 { "id_isar4_el1", MISCREG_ID_ISAR4_EL1
},
506 { "id_isar5_el1", MISCREG_ID_ISAR5_EL1
},
507 { "mvfr0_el1", MISCREG_MVFR0_EL1
},
508 { "mvfr1_el1", MISCREG_MVFR1_EL1
},
509 { "mvfr2_el1", MISCREG_MVFR2_EL1
},
510 { "id_aa64pfr0_el1", MISCREG_ID_AA64PFR0_EL1
},
511 { "id_aa64pfr1_el1", MISCREG_ID_AA64PFR1_EL1
},
512 { "id_aa64dfr0_el1", MISCREG_ID_AA64DFR0_EL1
},
513 { "id_aa64dfr1_el1", MISCREG_ID_AA64DFR1_EL1
},
514 { "id_aa64afr0_el1", MISCREG_ID_AA64AFR0_EL1
},
515 { "id_aa64afr1_el1", MISCREG_ID_AA64AFR1_EL1
},
516 { "id_aa64isar0_el1", MISCREG_ID_AA64ISAR0_EL1
},
517 { "id_aa64isar1_el1", MISCREG_ID_AA64ISAR1_EL1
},
518 { "id_aa64mmfr0_el1", MISCREG_ID_AA64MMFR0_EL1
},
519 { "id_aa64mmfr1_el1", MISCREG_ID_AA64MMFR1_EL1
},
520 { "id_aa64mmfr2_el1", MISCREG_ID_AA64MMFR2_EL1
},
521 { "ccsidr_el1", MISCREG_CCSIDR_EL1
},
522 { "clidr_el1", MISCREG_CLIDR_EL1
},
523 { "aidr_el1", MISCREG_AIDR_EL1
},
524 { "csselr_el1", MISCREG_CSSELR_EL1
},
525 { "ctr_el0", MISCREG_CTR_EL0
},
526 { "dczid_el0", MISCREG_DCZID_EL0
},
527 { "vpidr_el2", MISCREG_VPIDR_EL2
},
528 { "vmpidr_el2", MISCREG_VMPIDR_EL2
},
529 { "sctlr_el1", MISCREG_SCTLR_EL1
},
530 { "actlr_el1", MISCREG_ACTLR_EL1
},
531 { "cpacr_el1", MISCREG_CPACR_EL1
},
532 { "sctlr_el2", MISCREG_SCTLR_EL2
},
533 { "actlr_el2", MISCREG_ACTLR_EL2
},
534 { "hcr_el2", MISCREG_HCR_EL2
},
535 { "mdcr_el2", MISCREG_MDCR_EL2
},
536 { "cptr_el2", MISCREG_CPTR_EL2
},
537 { "hstr_el2", MISCREG_HSTR_EL2
},
538 { "hacr_el2", MISCREG_HACR_EL2
},
539 { "sctlr_el3", MISCREG_SCTLR_EL3
},
540 { "actlr_el3", MISCREG_ACTLR_EL3
},
541 { "scr_el3", MISCREG_SCR_EL3
},
542 { "sder32_el3", MISCREG_SDER32_EL3
},
543 { "cptr_el3", MISCREG_CPTR_EL3
},
544 { "mdcr_el3", MISCREG_MDCR_EL3
},
545 { "ttbr0_el1", MISCREG_TTBR0_EL1
},
546 { "ttbr1_el1", MISCREG_TTBR1_EL1
},
547 { "tcr_el1", MISCREG_TCR_EL1
},
548 { "ttbr0_el2", MISCREG_TTBR0_EL2
},
549 { "tcr_el2", MISCREG_TCR_EL2
},
550 { "vttbr_el2", MISCREG_VTTBR_EL2
},
551 { "vtcr_el2", MISCREG_VTCR_EL2
},
552 { "ttbr0_el3", MISCREG_TTBR0_EL3
},
553 { "tcr_el3", MISCREG_TCR_EL3
},
554 { "dacr32_el2", MISCREG_DACR32_EL2
},
555 { "spsr_el1", MISCREG_SPSR_EL1
},
556 { "elr_el1", MISCREG_ELR_EL1
},
557 { "sp_el0", MISCREG_SP_EL0
},
558 { "spsel", MISCREG_SPSEL
},
559 { "currentel", MISCREG_CURRENTEL
},
560 { "nzcv", MISCREG_NZCV
},
561 { "daif", MISCREG_DAIF
},
562 { "fpcr", MISCREG_FPCR
},
563 { "fpsr", MISCREG_FPSR
},
564 { "dspsr_el0", MISCREG_DSPSR_EL0
},
565 { "dlr_el0", MISCREG_DLR_EL0
},
566 { "spsr_el2", MISCREG_SPSR_EL2
},
567 { "elr_el2", MISCREG_ELR_EL2
},
568 { "sp_el1", MISCREG_SP_EL1
},
569 { "spsr_irq", MISCREG_SPSR_IRQ_AA64
},
570 { "spsr_abt", MISCREG_SPSR_ABT_AA64
},
571 { "spsr_und", MISCREG_SPSR_UND_AA64
},
572 { "spsr_fiq", MISCREG_SPSR_FIQ_AA64
},
573 { "spsr_el3", MISCREG_SPSR_EL3
},
574 { "elr_el3", MISCREG_ELR_EL3
},
575 { "sp_el2", MISCREG_SP_EL2
},
576 { "afsr0_el1", MISCREG_AFSR0_EL1
},
577 { "afsr1_el1", MISCREG_AFSR1_EL1
},
578 { "esr_el1", MISCREG_ESR_EL1
},
579 { "ifsr32_el2", MISCREG_IFSR32_EL2
},
580 { "afsr0_el2", MISCREG_AFSR0_EL2
},
581 { "afsr1_el2", MISCREG_AFSR1_EL2
},
582 { "esr_el2", MISCREG_ESR_EL2
},
583 { "fpexc32_el2", MISCREG_FPEXC32_EL2
},
584 { "afsr0_el3", MISCREG_AFSR0_EL3
},
585 { "afsr1_el3", MISCREG_AFSR1_EL3
},
586 { "esr_el3", MISCREG_ESR_EL3
},
587 { "far_el1", MISCREG_FAR_EL1
},
588 { "far_el2", MISCREG_FAR_EL2
},
589 { "hpfar_el2", MISCREG_HPFAR_EL2
},
590 { "far_el3", MISCREG_FAR_EL3
},
591 { "ic_ialluis", MISCREG_IC_IALLUIS
},
592 { "par_el1", MISCREG_PAR_EL1
},
593 { "ic_iallu", MISCREG_IC_IALLU
},
594 { "dc_ivac_xt", MISCREG_DC_IVAC_Xt
},
595 { "dc_isw_xt", MISCREG_DC_ISW_Xt
},
596 { "at_s1e1r_xt", MISCREG_AT_S1E1R_Xt
},
597 { "at_s1e1w_xt", MISCREG_AT_S1E1W_Xt
},
598 { "at_s1e0r_xt", MISCREG_AT_S1E0R_Xt
},
599 { "at_s1e0w_xt", MISCREG_AT_S1E0W_Xt
},
600 { "dc_csw_xt", MISCREG_DC_CSW_Xt
},
601 { "dc_cisw_xt", MISCREG_DC_CISW_Xt
},
602 { "dc_zva_xt", MISCREG_DC_ZVA_Xt
},
603 { "ic_ivau_xt", MISCREG_IC_IVAU_Xt
},
604 { "dc_cvac_xt", MISCREG_DC_CVAC_Xt
},
605 { "dc_cvau_xt", MISCREG_DC_CVAU_Xt
},
606 { "dc_civac_xt", MISCREG_DC_CIVAC_Xt
},
607 { "at_s1e2r_xt", MISCREG_AT_S1E2R_Xt
},
608 { "at_s1e2w_xt", MISCREG_AT_S1E2W_Xt
},
609 { "at_s12e1r_xt", MISCREG_AT_S12E1R_Xt
},
610 { "at_s12e1w_xt", MISCREG_AT_S12E1W_Xt
},
611 { "at_s12e0r_xt", MISCREG_AT_S12E0R_Xt
},
612 { "at_s12e0w_xt", MISCREG_AT_S12E0W_Xt
},
613 { "at_s1e3r_xt", MISCREG_AT_S1E3R_Xt
},
614 { "at_s1e3w_xt", MISCREG_AT_S1E3W_Xt
},
615 { "tlbi_vmalle1is", MISCREG_TLBI_VMALLE1IS
},
616 { "tlbi_vae1is_xt", MISCREG_TLBI_VAE1IS_Xt
},
617 { "tlbi_aside1is_xt", MISCREG_TLBI_ASIDE1IS_Xt
},
618 { "tlbi_vaae1is_xt", MISCREG_TLBI_VAAE1IS_Xt
},
619 { "tlbi_vale1is_xt", MISCREG_TLBI_VALE1IS_Xt
},
620 { "tlbi_vaale1is_xt", MISCREG_TLBI_VAALE1IS_Xt
},
621 { "tlbi_vmalle1", MISCREG_TLBI_VMALLE1
},
622 { "tlbi_vae1_xt", MISCREG_TLBI_VAE1_Xt
},
623 { "tlbi_aside1_xt", MISCREG_TLBI_ASIDE1_Xt
},
624 { "tlbi_vaae1_xt", MISCREG_TLBI_VAAE1_Xt
},
625 { "tlbi_vale1_xt", MISCREG_TLBI_VALE1_Xt
},
626 { "tlbi_vaale1_xt", MISCREG_TLBI_VAALE1_Xt
},
627 { "tlbi_ipas2e1is_xt", MISCREG_TLBI_IPAS2E1IS_Xt
},
628 { "tlbi_ipas2le1is_xt", MISCREG_TLBI_IPAS2LE1IS_Xt
},
629 { "tlbi_alle2is", MISCREG_TLBI_ALLE2IS
},
630 { "tlbi_vae2is_xt", MISCREG_TLBI_VAE2IS_Xt
},
631 { "tlbi_alle1is", MISCREG_TLBI_ALLE1IS
},
632 { "tlbi_vale2is_xt", MISCREG_TLBI_VALE2IS_Xt
},
633 { "tlbi_vmalls12e1is", MISCREG_TLBI_VMALLS12E1IS
},
634 { "tlbi_ipas2e1_xt", MISCREG_TLBI_IPAS2E1_Xt
},
635 { "tlbi_ipas2le1_xt", MISCREG_TLBI_IPAS2LE1_Xt
},
636 { "tlbi_alle2", MISCREG_TLBI_ALLE2
},
637 { "tlbi_vae2_xt", MISCREG_TLBI_VAE2_Xt
},
638 { "tlbi_alle1", MISCREG_TLBI_ALLE1
},
639 { "tlbi_vale2_xt", MISCREG_TLBI_VALE2_Xt
},
640 { "tlbi_vmalls12e1", MISCREG_TLBI_VMALLS12E1
},
641 { "tlbi_alle3is", MISCREG_TLBI_ALLE3IS
},
642 { "tlbi_vae3is_xt", MISCREG_TLBI_VAE3IS_Xt
},
643 { "tlbi_vale3is_xt", MISCREG_TLBI_VALE3IS_Xt
},
644 { "tlbi_alle3", MISCREG_TLBI_ALLE3
},
645 { "tlbi_vae3_xt", MISCREG_TLBI_VAE3_Xt
},
646 { "tlbi_vale3_xt", MISCREG_TLBI_VALE3_Xt
},
647 { "pmintenset_el1", MISCREG_PMINTENSET_EL1
},
648 { "pmintenclr_el1", MISCREG_PMINTENCLR_EL1
},
649 { "pmcr_el0", MISCREG_PMCR_EL0
},
650 { "pmcntenset_el0", MISCREG_PMCNTENSET_EL0
},
651 { "pmcntenclr_el0", MISCREG_PMCNTENCLR_EL0
},
652 { "pmovsclr_el0", MISCREG_PMOVSCLR_EL0
},
653 { "pmswinc_el0", MISCREG_PMSWINC_EL0
},
654 { "pmselr_el0", MISCREG_PMSELR_EL0
},
655 { "pmceid0_el0", MISCREG_PMCEID0_EL0
},
656 { "pmceid1_el0", MISCREG_PMCEID1_EL0
},
657 { "pmccntr_el0", MISCREG_PMCCNTR_EL0
},
658 { "pmxevtyper_el0", MISCREG_PMXEVTYPER_EL0
},
659 { "pmccfiltr_el0", MISCREG_PMCCFILTR_EL0
},
660 { "pmxevcntr_el0", MISCREG_PMXEVCNTR_EL0
},
661 { "pmuserenr_el0", MISCREG_PMUSERENR_EL0
},
662 { "pmovsset_el0", MISCREG_PMOVSSET_EL0
},
663 { "mair_el1", MISCREG_MAIR_EL1
},
664 { "amair_el1", MISCREG_AMAIR_EL1
},
665 { "mair_el2", MISCREG_MAIR_EL2
},
666 { "amair_el2", MISCREG_AMAIR_EL2
},
667 { "mair_el3", MISCREG_MAIR_EL3
},
668 { "amair_el3", MISCREG_AMAIR_EL3
},
669 { "l2ctlr_el1", MISCREG_L2CTLR_EL1
},
670 { "l2ectlr_el1", MISCREG_L2ECTLR_EL1
},
671 { "vbar_el1", MISCREG_VBAR_EL1
},
672 { "rvbar_el1", MISCREG_RVBAR_EL1
},
673 { "isr_el1", MISCREG_ISR_EL1
},
674 { "vbar_el2", MISCREG_VBAR_EL2
},
675 { "rvbar_el2", MISCREG_RVBAR_EL2
},
676 { "vbar_el3", MISCREG_VBAR_EL3
},
677 { "rvbar_el3", MISCREG_RVBAR_EL3
},
678 { "rmr_el3", MISCREG_RMR_EL3
},
679 { "contextidr_el1", MISCREG_CONTEXTIDR_EL1
},
680 { "contextidr_el2", MISCREG_CONTEXTIDR_EL2
},
681 { "tpidr_el1", MISCREG_TPIDR_EL1
},
682 { "tpidr_el0", MISCREG_TPIDR_EL0
},
683 { "tpidrro_el0", MISCREG_TPIDRRO_EL0
},
684 { "tpidr_el2", MISCREG_TPIDR_EL2
},
685 { "tpidr_el3", MISCREG_TPIDR_EL3
},
686 { "cntkctl_el1", MISCREG_CNTKCTL_EL1
},
687 { "cntfrq_el0", MISCREG_CNTFRQ_EL0
},
688 { "cntpct_el0", MISCREG_CNTPCT_EL0
},
689 { "cntvct_el0", MISCREG_CNTVCT_EL0
},
690 { "cntp_tval_el0", MISCREG_CNTP_TVAL_EL0
},
691 { "cntp_ctl_el0", MISCREG_CNTP_CTL_EL0
},
692 { "cntp_cval_el0", MISCREG_CNTP_CVAL_EL0
},
693 { "cntv_tval_el0", MISCREG_CNTV_TVAL_EL0
},
694 { "cntv_ctl_el0", MISCREG_CNTV_CTL_EL0
},
695 { "cntv_cval_el0", MISCREG_CNTV_CVAL_EL0
},
696 { "pmevcntr0_el0", MISCREG_PMEVCNTR0_EL0
},
697 { "pmevcntr1_el0", MISCREG_PMEVCNTR1_EL0
},
698 { "pmevcntr2_el0", MISCREG_PMEVCNTR2_EL0
},
699 { "pmevcntr3_el0", MISCREG_PMEVCNTR3_EL0
},
700 { "pmevcntr4_el0", MISCREG_PMEVCNTR4_EL0
},
701 { "pmevcntr5_el0", MISCREG_PMEVCNTR5_EL0
},
702 { "pmevtyper0_el0", MISCREG_PMEVTYPER0_EL0
},
703 { "pmevtyper1_el0", MISCREG_PMEVTYPER1_EL0
},
704 { "pmevtyper2_el0", MISCREG_PMEVTYPER2_EL0
},
705 { "pmevtyper3_el0", MISCREG_PMEVTYPER3_EL0
},
706 { "pmevtyper4_el0", MISCREG_PMEVTYPER4_EL0
},
707 { "pmevtyper5_el0", MISCREG_PMEVTYPER5_EL0
},
708 { "cntvoff_el2", MISCREG_CNTVOFF_EL2
},
709 { "cnthctl_el2", MISCREG_CNTHCTL_EL2
},
710 { "cnthp_tval_el2", MISCREG_CNTHP_TVAL_EL2
},
711 { "cnthp_ctl_el2", MISCREG_CNTHP_CTL_EL2
},
712 { "cnthp_cval_el2", MISCREG_CNTHP_CVAL_EL2
},
713 { "cntps_tval_el1", MISCREG_CNTPS_TVAL_EL1
},
714 { "cntps_ctl_el1", MISCREG_CNTPS_CTL_EL1
},
715 { "cntps_cval_el1", MISCREG_CNTPS_CVAL_EL1
},
716 { "il1data0_el1", MISCREG_IL1DATA0_EL1
},
717 { "il1data1_el1", MISCREG_IL1DATA1_EL1
},
718 { "il1data2_el1", MISCREG_IL1DATA2_EL1
},
719 { "il1data3_el1", MISCREG_IL1DATA3_EL1
},
720 { "dl1data0_el1", MISCREG_DL1DATA0_EL1
},
721 { "dl1data1_el1", MISCREG_DL1DATA1_EL1
},
722 { "dl1data2_el1", MISCREG_DL1DATA2_EL1
},
723 { "dl1data3_el1", MISCREG_DL1DATA3_EL1
},
724 { "dl1data4_el1", MISCREG_DL1DATA4_EL1
},
725 { "l2actlr_el1", MISCREG_L2ACTLR_EL1
},
726 { "cpuactlr_el1", MISCREG_CPUACTLR_EL1
},
727 { "cpuectlr_el1", MISCREG_CPUECTLR_EL1
},
728 { "cpumerrsr_el1", MISCREG_CPUMERRSR_EL1
},
729 { "l2merrsr_el1", MISCREG_L2MERRSR_EL1
},
730 { "cbar_el1", MISCREG_CBAR_EL1
},
734 TarmacParserRecord::TarmacParserRecordEvent::process()
736 ostream
&outs
= Trace::output();
738 list
<ParserRegEntry
>::iterator it
= destRegRecords
.begin(),
739 end
= destRegRecords
.end();
741 std::vector
<uint64_t> values
;
743 for (; it
!= end
; ++it
) {
748 values
.push_back(thread
->readIntReg(it
->index
));
751 if (instRecord
.isetstate
== ISET_A64
) {
752 const ArmISA::VecRegContainer
& vc
= thread
->readVecReg(
753 RegId(VecRegClass
, it
->index
));
754 auto vv
= vc
.as
<uint32_t>();
755 values
.push_back(vv
[0]);
757 const VecElem elem
= thread
->readVecElem(
759 it
->index
/ NumVecElemPerNeonVecReg
,
760 it
->index
% NumVecElemPerNeonVecReg
));
761 values
.push_back(elem
);
765 if (instRecord
.isetstate
== ISET_A64
) {
766 const ArmISA::VecRegContainer
& vc
= thread
->readVecReg(
767 RegId(VecRegClass
, it
->index
));
768 auto vv
= vc
.as
<uint64_t>();
769 values
.push_back(vv
[0]);
771 const VecElem w0
= thread
->readVecElem(
773 it
->index
/ NumVecElemPerNeonVecReg
,
774 it
->index
% NumVecElemPerNeonVecReg
));
775 const VecElem w1
= thread
->readVecElem(
777 (it
->index
+ 1) / NumVecElemPerNeonVecReg
,
778 (it
->index
+ 1) % NumVecElemPerNeonVecReg
));
780 values
.push_back((uint64_t)(w1
) << 32 | w0
);
785 const ArmISA::VecPredRegContainer
& pc
=
786 thread
->readVecPredReg(RegId(VecPredRegClass
, it
->index
));
787 auto pv
= pc
.as
<uint8_t>();
789 for (int i
= maxVectorLength
* 8; i
> 0; ) {
790 p
= (p
<< 1) | pv
[--i
];
796 if (instRecord
.isetstate
== ISET_A64
) {
797 const ArmISA::VecRegContainer
& vc
= thread
->readVecReg(
798 RegId(VecRegClass
, it
->index
));
799 auto vv
= vc
.as
<uint64_t>();
800 values
.push_back(vv
[0]);
801 values
.push_back(vv
[1]);
803 const VecElem w0
= thread
->readVecElem(
805 it
->index
/ NumVecElemPerNeonVecReg
,
806 it
->index
% NumVecElemPerNeonVecReg
));
807 const VecElem w1
= thread
->readVecElem(
809 (it
->index
+ 1) / NumVecElemPerNeonVecReg
,
810 (it
->index
+ 1) % NumVecElemPerNeonVecReg
));
811 const VecElem w2
= thread
->readVecElem(
813 (it
->index
+ 2) / NumVecElemPerNeonVecReg
,
814 (it
->index
+ 2) % NumVecElemPerNeonVecReg
));
815 const VecElem w3
= thread
->readVecElem(
817 (it
->index
+ 3) / NumVecElemPerNeonVecReg
,
818 (it
->index
+ 3) % NumVecElemPerNeonVecReg
));
820 values
.push_back((uint64_t)(w1
) << 32 | w0
);
821 values
.push_back((uint64_t)(w3
) << 32 | w2
);
826 int8_t i
= maxVectorLength
;
827 const TheISA::VecRegContainer
& vc
= thread
->readVecReg(
828 RegId(VecRegClass
, it
->index
));
829 auto vv
= vc
.as
<uint64_t>();
831 values
.push_back(vv
[--i
]);
836 if (it
->index
== MISCREG_CPSR
) {
837 // Read condition codes from aliased integer regs
838 CPSR cpsr
= thread
->readMiscRegNoEffect(it
->index
);
839 cpsr
.nz
= thread
->readCCReg(CCREG_NZ
);
840 cpsr
.c
= thread
->readCCReg(CCREG_C
);
841 cpsr
.v
= thread
->readCCReg(CCREG_V
);
842 cpsr
.ge
= thread
->readCCReg(CCREG_GE
);
843 values
.push_back(cpsr
);
844 } else if (it
->index
== MISCREG_NZCV
) {
846 cpsr
.nz
= thread
->readCCReg(CCREG_NZ
);
847 cpsr
.c
= thread
->readCCReg(CCREG_C
);
848 cpsr
.v
= thread
->readCCReg(CCREG_V
);
849 values
.push_back(cpsr
);
850 } else if (it
->index
== MISCREG_FPCR
) {
851 // Read FPSCR and extract FPCR value
852 FPSCR fpscr
= thread
->readMiscRegNoEffect(MISCREG_FPSCR
);
853 const uint32_t ones
= (uint32_t)(-1);
862 fpcrMask
.stride
= ones
;
863 fpcrMask
.rMode
= ones
;
867 values
.push_back(fpscr
& fpcrMask
);
868 } else if (it
->index
== MISCREG_FPSR
) {
869 // Read FPSCR and extract FPSR value
870 FPSCR fpscr
= thread
->readMiscRegNoEffect(MISCREG_FPSCR
);
871 const uint32_t ones
= (uint32_t)(-1);
884 values
.push_back(fpscr
& fpsrMask
);
886 values
.push_back(thread
->readMiscRegNoEffect(it
->index
));
890 panic("Unknown TARMAC trace record type!");
894 if (values
.size() != it
->values
.size()) same
= false;
896 uint32_t size
= values
.size();
897 if (size
> it
->values
.size())
898 size
= it
->values
.size();
901 for (int i
= 0; i
< size
; ++i
) {
902 if (values
[i
] != it
->values
[i
]) {
911 TarmacParserRecord::printMismatchHeader(inst
, pc
);
914 outs
<< "diff> [" << it
->repr
<< "] gem5: 0x" << hex
;
915 for (auto v
: values
)
916 outs
<< setw(16) << setfill('0') << v
;
918 outs
<< ", TARMAC: 0x" << hex
;
919 for (auto v
: it
->values
)
920 outs
<< setw(16) << setfill('0') << v
;
924 destRegRecords
.clear();
926 if (mismatchOnPcOrOpcode
&& (parent
.exitOnDiff
||
927 parent
.exitOnInsnDiff
))
928 exitSimLoop("a mismatch with the TARMAC trace has been detected "
929 "on PC or opcode", 1);
930 if (mismatch
&& parent
.exitOnDiff
)
931 exitSimLoop("a mismatch with the TARMAC trace has been detected "
936 TarmacParserRecord::TarmacParserRecordEvent::description() const
938 return "TARMAC parser record event";
943 TarmacParserRecord::printMismatchHeader(const StaticInstPtr staticInst
,
946 ostream
&outs
= Trace::output();
947 outs
<< "\nMismatch between gem5 and TARMAC trace @ " << dec
<< curTick()
949 << "[seq_num: " << dec
<< instRecord
.seq_num
950 << ", opcode: 0x" << hex
<< (staticInst
->machInst
& 0xffffffff)
951 << ", PC: 0x" << pc
.pc()
952 << ", disasm: " << staticInst
->disassemble(pc
.pc()) << "]"
956 TarmacParserRecord::TarmacParserRecord(Tick _when
, ThreadContext
*_thread
,
957 const StaticInstPtr _staticInst
,
959 TarmacParser
& _parent
,
960 const StaticInstPtr _macroStaticInst
)
961 : TarmacBaseRecord(_when
, _thread
, _staticInst
,
962 _pc
, _macroStaticInst
),
963 parsingStarted(false), mismatch(false),
964 mismatchOnPcOrOpcode(false), parent(_parent
)
966 memReq
= std::make_shared
<Request
>();
967 if (maxVectorLength
== 0) {
968 maxVectorLength
= ArmStaticInst::getCurSveVecLen
<uint64_t>(_thread
);
973 TarmacParserRecord::dump()
975 ostream
&outs
= Trace::output();
977 uint64_t written_data
= 0;
978 unsigned mem_flags
= 3 | ArmISA::TLB::AllowUnaligned
;
982 if (!staticInst
->isMicroop() || staticInst
->isLastMicroop()) {
984 if (parent
.macroopInProgress
&& !staticInst
->isLastMicroop()) {
985 // A microop faulted and it was not the last microop -> advance
986 // TARMAC trace to next instruction
990 parent
.macroopInProgress
= false;
992 auto arm_inst
= static_cast<const ArmStaticInst
*>(
996 while (advanceTrace()) {
997 switch (currRecordType
) {
1000 parsingStarted
= true;
1001 if (pc
.instAddr() != instRecord
.addr
) {
1003 printMismatchHeader(staticInst
, pc
);
1004 outs
<< "diff> [PC] gem5: 0x" << hex
<< pc
.instAddr()
1005 << ", TARMAC: 0x" << instRecord
.addr
<< endl
;
1007 mismatchOnPcOrOpcode
= true;
1010 if (arm_inst
->encoding() != instRecord
.opcode
) {
1012 printMismatchHeader(staticInst
, pc
);
1013 outs
<< "diff> [opcode] gem5: 0x" << hex
1014 << arm_inst
->encoding()
1015 << ", TARMAC: 0x" << instRecord
.opcode
<< endl
;
1017 mismatchOnPcOrOpcode
= true;
1020 // Set the Instruction set state.
1021 isetstate
= pcToISetState(pc
);
1023 if (instRecord
.isetstate
!= isetstate
&&
1024 isetstate
!= ISET_UNSUPPORTED
) {
1026 printMismatchHeader(staticInst
, pc
);
1027 outs
<< "diff> [iset_state] gem5: "
1028 << iSetStateToStr(isetstate
)
1030 << iSetStateToStr(instRecord
.isetstate
);
1034 // TODO(Giacomo): add support for predicate and mode checking
1038 destRegRecords
.push_back(regRecord
);
1042 if (!readMemNoEffect(memRecord
.addr
, (uint8_t*) &written_data
,
1043 memRecord
.size
, mem_flags
))
1045 if (written_data
!= memRecord
.data
) {
1047 printMismatchHeader(staticInst
, pc
);
1048 outs
<< "diff> [mem(0x" << hex
<< memRecord
.addr
1049 << ")] gem5: 0x" << written_data
1050 << ", TARMAC: 0x" << memRecord
.data
1055 case TARMAC_UNSUPPORTED
:
1059 panic("Unknown TARMAC trace record type!");
1062 // We are done with the current instruction, i.e. all the corresponding
1063 // entries in the TARMAC trace have been parsed
1064 if (destRegRecords
.size()) {
1065 TarmacParserRecordEvent
*event
= new TarmacParserRecordEvent(
1066 parent
, thread
, staticInst
, pc
, mismatch
,
1067 mismatchOnPcOrOpcode
);
1068 mainEventQueue
[0]->schedule(event
, curTick());
1069 } else if (mismatchOnPcOrOpcode
&& (parent
.exitOnDiff
||
1070 parent
.exitOnInsnDiff
)) {
1071 exitSimLoop("a mismatch with the TARMAC trace has been detected "
1072 "on PC or opcode", 1);
1075 parent
.macroopInProgress
= true;
1080 TarmacParserRecord::advanceTrace()
1082 ifstream
& trace
= parent
.trace
;
1083 trace
>> hex
; // All integer values are in hex base
1085 if (buf
[0] != 'I') {
1089 trace
>> buf
>> buf
;
1091 assert((buf
[0] == 'c') && (buf
[1] == 'p') && (buf
[2] == 'u'));
1099 if (buf
[0] == 'I') {
1100 // Instruction trace record
1103 currRecordType
= TARMAC_INST
;
1104 instRecord
.taken
= (buf
[1] == 'T');
1106 instRecord
.seq_num
= atoi(&buf
[1]);
1107 trace
>> instRecord
.addr
;
1108 char c
= trace
.peek();
1110 // Skip phys. address and _S/_NS suffix
1113 trace
>> instRecord
.opcode
;
1117 instRecord
.isetstate
= ISET_ARM
;
1120 instRecord
.isetstate
= ISET_THUMB
;
1123 instRecord
.isetstate
= ISET_A64
;
1126 warn("Invalid TARMAC trace record (seq_num: %lld)",
1127 instRecord
.seq_num
);
1128 instRecord
.isetstate
= ISET_UNSUPPORTED
;
1129 currRecordType
= TARMAC_UNSUPPORTED
;
1132 trace
.ignore(MaxLineLength
, '\n');
1134 } else if (buf
[0] == 'R') {
1135 // Register trace record
1136 currRecordType
= TARMAC_REG
;
1137 regRecord
.values
.clear();
1139 strcpy(regRecord
.repr
, buf
);
1140 if (std::tolower(buf
[0]) == 'r' && isdigit(buf
[1])) {
1142 regRecord
.type
= REG_R
;
1143 int base_index
= atoi(&buf
[1]);
1144 char* pch
= strchr(buf
, '_');
1146 regRecord
.index
= INTREG_USR(base_index
);
1149 if (strncmp(pch
, "usr", 3) == 0)
1150 regRecord
.index
= INTREG_USR(base_index
);
1151 else if (strncmp(pch
, "fiq", 3) == 0)
1152 regRecord
.index
= INTREG_FIQ(base_index
);
1153 else if (strncmp(pch
, "irq", 3) == 0)
1154 regRecord
.index
= INTREG_IRQ(base_index
);
1155 else if (strncmp(pch
, "svc", 3) == 0)
1156 regRecord
.index
= INTREG_SVC(base_index
);
1157 else if (strncmp(pch
, "mon", 3) == 0)
1158 regRecord
.index
= INTREG_MON(base_index
);
1159 else if (strncmp(pch
, "abt", 3) == 0)
1160 regRecord
.index
= INTREG_ABT(base_index
);
1161 else if (strncmp(pch
, "und", 3) == 0)
1162 regRecord
.index
= INTREG_UND(base_index
);
1163 else if (strncmp(pch
, "hyp", 3) == 0)
1164 regRecord
.index
= INTREG_HYP(base_index
);
1166 } else if (std::tolower(buf
[0]) == 'x' && isdigit(buf
[1])) {
1168 regRecord
.type
= REG_X
;
1169 regRecord
.index
= atoi(&buf
[1]);
1170 } else if (std::tolower(buf
[0]) == 's' && isdigit(buf
[1])) {
1172 regRecord
.type
= REG_S
;
1173 regRecord
.index
= atoi(&buf
[1]);
1174 } else if (std::tolower(buf
[0]) == 'd' && isdigit(buf
[1])) {
1176 regRecord
.type
= REG_D
;
1177 regRecord
.index
= atoi(&buf
[1]);
1178 } else if (std::tolower(buf
[0]) == 'q' && isdigit(buf
[1])) {
1180 regRecord
.type
= REG_Q
;
1181 regRecord
.index
= atoi(&buf
[1]);
1182 } else if (std::tolower(buf
[0]) == 'z' && isdigit(buf
[1])) {
1183 // Z (SVE vector) register
1184 regRecord
.type
= REG_Z
;
1185 regRecord
.index
= atoi(&buf
[1]);
1186 } else if (std::tolower(buf
[0]) == 'p' && isdigit(buf
[1])) {
1187 // P (SVE predicate) register
1188 regRecord
.type
= REG_P
;
1189 regRecord
.index
= atoi(&buf
[1]);
1190 } else if (strncmp(buf
, "SP_EL", 5) == 0) {
1191 // A64 stack pointer
1192 regRecord
.type
= REG_X
;
1193 regRecord
.index
= INTREG_SP0
+ atoi(&buf
[5]);
1194 } else if (miscRegMap
.count(buf
)) {
1196 regRecord
.type
= REG_MISC
;
1197 regRecord
.index
= miscRegMap
[buf
];
1199 // Try match with upper case name (misc. register)
1200 string reg_name
= buf
;
1201 transform(reg_name
.begin(), reg_name
.end(), reg_name
.begin(),
1203 if (miscRegMap
.count(reg_name
.c_str())) {
1204 regRecord
.type
= REG_MISC
;
1205 regRecord
.index
= miscRegMap
[reg_name
.c_str()];
1207 warn("Unknown register in TARMAC trace (%s).\n", buf
);
1208 currRecordType
= TARMAC_UNSUPPORTED
;
1209 trace
.ignore(MaxLineLength
, '\n');
1214 if (regRecord
.type
== REG_Q
) {
1217 uint64_t hi
= strtoull(buf
, NULL
, 16);
1219 uint64_t lo
= strtoull(buf
, NULL
, 16);
1220 regRecord
.values
.push_back(lo
);
1221 regRecord
.values
.push_back(hi
);
1222 } else if (regRecord
.type
== REG_Z
) {
1223 regRecord
.values
.resize(maxVectorLength
);
1224 for (uint8_t i
= 0; i
< maxVectorLength
; ++i
) {
1233 v
= (v
<< 32) | lsw
;
1234 if (i
< maxVectorLength
- 1) trace
>> c
;
1235 regRecord
.values
[i
] = v
;
1238 // REG_P values are also parsed here
1241 char c
= trace
.peek();
1242 if ((c
== ':') || (c
== '_')) {
1243 // 64-bit value with : or _ in the middle
1246 v
= (v
<< 32) | lsw
;
1248 regRecord
.values
.push_back(v
);
1250 trace
.ignore(MaxLineLength
, '\n');
1252 } else if (buf
[0] == 'M' && (parent
.memWrCheck
&& buf
[1] == 'W')) {
1253 currRecordType
= TARMAC_MEM
;
1254 memRecord
.size
= atoi(&buf
[2]);
1255 trace
>> memRecord
.addr
;
1256 char c
= trace
.peek();
1258 // Skip phys. address and _S/_NS suffix
1265 // 64-bit value with _ in the middle
1268 data
= (data
<< 32) | lsw
;
1270 memRecord
.data
= data
;
1271 trace
.ignore(MaxLineLength
, '\n');
1274 currRecordType
= TARMAC_UNSUPPORTED
;
1275 trace
.ignore(MaxLineLength
, '\n');
1283 TarmacParserRecord::readMemNoEffect(Addr addr
, uint8_t *data
, unsigned size
,
1286 const RequestPtr
&req
= memReq
;
1287 ArmISA::TLB
* dtb
= static_cast<TLB
*>(thread
->getDTBPtr());
1289 req
->setVirt(addr
, size
, flags
, thread
->pcState().instAddr(),
1290 Request::funcRequestorId
);
1292 // Translate to physical address
1293 Fault fault
= dtb
->translateAtomic(req
, thread
, BaseTLB::Read
);
1295 // Ignore read if the address falls into the ignored range
1296 if (parent
.ignoredAddrRange
.contains(addr
))
1299 // Now do the access
1300 if (fault
== NoFault
&&
1301 !req
->getFlags().isSet(Request::NO_ACCESS
)) {
1302 if (req
->isLLSC() || req
->isLocalAccess())
1303 // LLSCs and local accesses are ignored
1305 // the translating proxy will perform the virtual to physical
1306 // translation again
1307 thread
->getVirtProxy().readBlob(addr
, data
, size
);
1312 if (fault
!= NoFault
) {
1320 TarmacParser::advanceTraceToStartPc()
1322 char buf
[TarmacParserRecord::MaxLineLength
];
1326 trace
>> hex
; // All integer values are in hex base
1329 saved_offset
= trace
.tellg();
1330 trace
>> buf
>> buf
>> buf
;
1333 if (buf
[0] == 'I') {
1335 if (pc
== startPc
) {
1336 // Set file pointer to the beginning of this line
1337 trace
.seekg(saved_offset
, ios::beg
);
1340 trace
.ignore(TarmacParserRecord::MaxLineLength
, '\n');
1343 trace
.ignore(TarmacParserRecord::MaxLineLength
, '\n');
1346 panic("End of TARMAC trace reached before start PC\n");
1351 TarmacParserRecord::iSetStateToStr(ISetState isetstate
) const
1353 switch (isetstate
) {
1357 return "Thumb (A32)";
1361 return "UNSUPPORTED";
1365 } // namespace Trace
1367 Trace::TarmacParser
*
1368 TarmacParserParams::create()
1370 return new Trace::TarmacParser(this);