registers.hh revision 13592:b8972ccebd63
1/*
2 * Copyright (c) 2013 ARM Limited
3 * Copyright (c) 2014-2015 Sven Karlsson
4 * All rights reserved
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating
9 * to a hardware implementation of the functionality of the software
10 * licensed hereunder.  You may use the software subject to the license
11 * terms below provided that you ensure that this notice is replicated
12 * unmodified and in its entirety in all distributions of the software,
13 * modified or unmodified, in source code or in binary form.
14 *
15 * Copyright (c) 2016 RISC-V Foundation
16 * Copyright (c) 2016 The University of Virginia
17 * All rights reserved.
18 *
19 * Redistribution and use in source and binary forms, with or without
20 * modification, are permitted provided that the following conditions are
21 * met: redistributions of source code must retain the above copyright
22 * notice, this list of conditions and the following disclaimer;
23 * redistributions in binary form must reproduce the above copyright
24 * notice, this list of conditions and the following disclaimer in the
25 * documentation and/or other materials provided with the distribution;
26 * neither the name of the copyright holders nor the names of its
27 * contributors may be used to endorse or promote products derived from
28 * this software without specific prior written permission.
29 *
30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
33 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
34 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
36 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
38 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
40 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 *
42 * Authors: Andreas Hansson
43 *          Sven Karlsson
44 *          Alec Roelke
45 */
46
47#ifndef __ARCH_RISCV_REGISTERS_HH__
48#define __ARCH_RISCV_REGISTERS_HH__
49
50#include <map>
51#include <string>
52#include <vector>
53
54#include "arch/generic/types.hh"
55#include "arch/generic/vec_reg.hh"
56#include "arch/isa_traits.hh"
57#include "arch/riscv/generated/max_inst_regs.hh"
58#include "base/types.hh"
59
60namespace RiscvISA {
61
62using RiscvISAInst::MaxInstSrcRegs;
63using RiscvISAInst::MaxInstDestRegs;
64const int MaxMiscDestRegs = 1;
65
66typedef RegVal IntReg;
67typedef RegVal FloatRegBits;
68typedef uint8_t CCReg; // Not applicable to Riscv
69typedef RegVal MiscReg;
70
71// dummy typedefs since we don't have vector regs
72const unsigned NumVecElemPerVecReg = 2;
73using VecElem = uint32_t;
74using VecReg = ::VecRegT<VecElem, NumVecElemPerVecReg, false>;
75using ConstVecReg = ::VecRegT<VecElem, NumVecElemPerVecReg, true>;
76using VecRegContainer = VecReg::Container;
77
78const int NumIntArchRegs = 32;
79const int NumMicroIntRegs = 1;
80const int NumIntRegs = NumIntArchRegs + NumMicroIntRegs;
81const int NumFloatRegs = 32;
82// This has to be one to prevent warnings that are treated as errors
83const unsigned NumVecRegs = 1;
84const int NumCCRegs = 0;
85
86// Semantically meaningful register indices
87const int ZeroReg = 0;
88const int ReturnAddrReg = 1;
89const int StackPointerReg = 2;
90const int GlobalPointerReg = 3;
91const int ThreadPointerReg = 4;
92const int FramePointerReg = 8;
93const int ReturnValueReg = 10;
94const std::vector<int> ReturnValueRegs = {10, 11};
95const std::vector<int> ArgumentRegs = {10, 11, 12, 13, 14, 15, 16, 17};
96const int AMOTempReg = 32;
97
98const int SyscallPseudoReturnReg = 10;
99const std::vector<int> SyscallArgumentRegs = {10, 11, 12, 13, 14, 15, 16};
100const int SyscallNumReg = 17;
101
102const std::vector<std::string> IntRegNames = {
103    "zero", "ra", "sp", "gp",
104    "tp", "t0", "t1", "t2",
105    "s0", "s1", "a0", "a1",
106    "a2", "a3", "a4", "a5",
107    "a6", "a7", "s2", "s3",
108    "s4", "s5", "s6", "s7",
109    "s8", "s9", "s10", "s11",
110    "t3", "t4", "t5", "t6"
111};
112const std::vector<std::string> FloatRegNames = {
113    "ft0", "ft1", "ft2", "ft3",
114    "ft4", "ft5", "ft6", "ft7",
115    "fs0", "fs1", "fa0", "fa1",
116    "fa2", "fa3", "fa4", "fa5",
117    "fa6", "fa7", "fs2", "fs3",
118    "fs4", "fs5", "fs6", "fs7",
119    "fs8", "fs9", "fs10", "fs11",
120    "ft8", "ft9", "ft10", "ft11"
121};
122
123enum MiscRegIndex {
124    MISCREG_PRV = 0,
125    MISCREG_ISA,
126    MISCREG_VENDORID,
127    MISCREG_ARCHID,
128    MISCREG_IMPID,
129    MISCREG_HARTID,
130    MISCREG_STATUS,
131    MISCREG_IP,
132    MISCREG_IE,
133    MISCREG_CYCLE,
134    MISCREG_TIME,
135    MISCREG_INSTRET,
136    MISCREG_HPMCOUNTER03,
137    MISCREG_HPMCOUNTER04,
138    MISCREG_HPMCOUNTER05,
139    MISCREG_HPMCOUNTER06,
140    MISCREG_HPMCOUNTER07,
141    MISCREG_HPMCOUNTER08,
142    MISCREG_HPMCOUNTER09,
143    MISCREG_HPMCOUNTER10,
144    MISCREG_HPMCOUNTER11,
145    MISCREG_HPMCOUNTER12,
146    MISCREG_HPMCOUNTER13,
147    MISCREG_HPMCOUNTER14,
148    MISCREG_HPMCOUNTER15,
149    MISCREG_HPMCOUNTER16,
150    MISCREG_HPMCOUNTER17,
151    MISCREG_HPMCOUNTER18,
152    MISCREG_HPMCOUNTER19,
153    MISCREG_HPMCOUNTER20,
154    MISCREG_HPMCOUNTER21,
155    MISCREG_HPMCOUNTER22,
156    MISCREG_HPMCOUNTER23,
157    MISCREG_HPMCOUNTER24,
158    MISCREG_HPMCOUNTER25,
159    MISCREG_HPMCOUNTER26,
160    MISCREG_HPMCOUNTER27,
161    MISCREG_HPMCOUNTER28,
162    MISCREG_HPMCOUNTER29,
163    MISCREG_HPMCOUNTER30,
164    MISCREG_HPMCOUNTER31,
165    MISCREG_HPMEVENT03,
166    MISCREG_HPMEVENT04,
167    MISCREG_HPMEVENT05,
168    MISCREG_HPMEVENT06,
169    MISCREG_HPMEVENT07,
170    MISCREG_HPMEVENT08,
171    MISCREG_HPMEVENT09,
172    MISCREG_HPMEVENT10,
173    MISCREG_HPMEVENT11,
174    MISCREG_HPMEVENT12,
175    MISCREG_HPMEVENT13,
176    MISCREG_HPMEVENT14,
177    MISCREG_HPMEVENT15,
178    MISCREG_HPMEVENT16,
179    MISCREG_HPMEVENT17,
180    MISCREG_HPMEVENT18,
181    MISCREG_HPMEVENT19,
182    MISCREG_HPMEVENT20,
183    MISCREG_HPMEVENT21,
184    MISCREG_HPMEVENT22,
185    MISCREG_HPMEVENT23,
186    MISCREG_HPMEVENT24,
187    MISCREG_HPMEVENT25,
188    MISCREG_HPMEVENT26,
189    MISCREG_HPMEVENT27,
190    MISCREG_HPMEVENT28,
191    MISCREG_HPMEVENT29,
192    MISCREG_HPMEVENT30,
193    MISCREG_HPMEVENT31,
194    MISCREG_TSELECT,
195    MISCREG_TDATA1,
196    MISCREG_TDATA2,
197    MISCREG_TDATA3,
198    MISCREG_DCSR,
199    MISCREG_DPC,
200    MISCREG_DSCRATCH,
201
202    MISCREG_MEDELEG,
203    MISCREG_MIDELEG,
204    MISCREG_MTVEC,
205    MISCREG_MCOUNTEREN,
206    MISCREG_MSCRATCH,
207    MISCREG_MEPC,
208    MISCREG_MCAUSE,
209    MISCREG_MTVAL,
210    MISCREG_PMPCFG0,
211    // pmpcfg1 rv32 only
212    MISCREG_PMPCFG2,
213    // pmpcfg3 rv32 only
214    MISCREG_PMPADDR00,
215    MISCREG_PMPADDR01,
216    MISCREG_PMPADDR02,
217    MISCREG_PMPADDR03,
218    MISCREG_PMPADDR04,
219    MISCREG_PMPADDR05,
220    MISCREG_PMPADDR06,
221    MISCREG_PMPADDR07,
222    MISCREG_PMPADDR08,
223    MISCREG_PMPADDR09,
224    MISCREG_PMPADDR10,
225    MISCREG_PMPADDR11,
226    MISCREG_PMPADDR12,
227    MISCREG_PMPADDR13,
228    MISCREG_PMPADDR14,
229    MISCREG_PMPADDR15,
230
231    MISCREG_SEDELEG,
232    MISCREG_SIDELEG,
233    MISCREG_STVEC,
234    MISCREG_SCOUNTEREN,
235    MISCREG_SSCRATCH,
236    MISCREG_SEPC,
237    MISCREG_SCAUSE,
238    MISCREG_STVAL,
239    MISCREG_SATP,
240
241    MISCREG_UTVEC,
242    MISCREG_USCRATCH,
243    MISCREG_UEPC,
244    MISCREG_UCAUSE,
245    MISCREG_UTVAL,
246    MISCREG_FFLAGS,
247    MISCREG_FRM,
248
249    NUM_MISCREGS
250};
251const int NumMiscRegs = NUM_MISCREGS;
252
253enum CSRIndex {
254    CSR_USTATUS = 0x000,
255    CSR_UIE = 0x004,
256    CSR_UTVEC = 0x005,
257    CSR_USCRATCH = 0x040,
258    CSR_UEPC = 0x041,
259    CSR_UCAUSE = 0x042,
260    CSR_UTVAL = 0x043,
261    CSR_UIP = 0x044,
262    CSR_FFLAGS = 0x001,
263    CSR_FRM = 0x002,
264    CSR_FCSR = 0x003,
265    CSR_CYCLE = 0xC00,
266    CSR_TIME = 0xC01,
267    CSR_INSTRET = 0xC02,
268    CSR_HPMCOUNTER03 = 0xC03,
269    CSR_HPMCOUNTER04 = 0xC04,
270    CSR_HPMCOUNTER05 = 0xC05,
271    CSR_HPMCOUNTER06 = 0xC06,
272    CSR_HPMCOUNTER07 = 0xC07,
273    CSR_HPMCOUNTER08 = 0xC08,
274    CSR_HPMCOUNTER09 = 0xC09,
275    CSR_HPMCOUNTER10 = 0xC0A,
276    CSR_HPMCOUNTER11 = 0xC0B,
277    CSR_HPMCOUNTER12 = 0xC0C,
278    CSR_HPMCOUNTER13 = 0xC0D,
279    CSR_HPMCOUNTER14 = 0xC0E,
280    CSR_HPMCOUNTER15 = 0xC0F,
281    CSR_HPMCOUNTER16 = 0xC10,
282    CSR_HPMCOUNTER17 = 0xC11,
283    CSR_HPMCOUNTER18 = 0xC12,
284    CSR_HPMCOUNTER19 = 0xC13,
285    CSR_HPMCOUNTER20 = 0xC14,
286    CSR_HPMCOUNTER21 = 0xC15,
287    CSR_HPMCOUNTER22 = 0xC16,
288    CSR_HPMCOUNTER23 = 0xC17,
289    CSR_HPMCOUNTER24 = 0xC18,
290    CSR_HPMCOUNTER25 = 0xC19,
291    CSR_HPMCOUNTER26 = 0xC1A,
292    CSR_HPMCOUNTER27 = 0xC1B,
293    CSR_HPMCOUNTER28 = 0xC1C,
294    CSR_HPMCOUNTER29 = 0xC1D,
295    CSR_HPMCOUNTER30 = 0xC1E,
296    CSR_HPMCOUNTER31 = 0xC1F,
297    // HPMCOUNTERH rv32 only
298
299    CSR_SSTATUS = 0x100,
300    CSR_SEDELEG = 0x102,
301    CSR_SIDELEG = 0x103,
302    CSR_SIE = 0x104,
303    CSR_STVEC = 0x105,
304    CSR_SSCRATCH = 0x140,
305    CSR_SEPC = 0x141,
306    CSR_SCAUSE = 0x142,
307    CSR_STVAL = 0x143,
308    CSR_SIP = 0x144,
309    CSR_SATP = 0x180,
310
311    CSR_MVENDORID = 0xF11,
312    CSR_MARCHID = 0xF12,
313    CSR_MIMPID = 0xF13,
314    CSR_MHARTID = 0xF14,
315    CSR_MSTATUS = 0x300,
316    CSR_MISA = 0x301,
317    CSR_MEDELEG = 0x302,
318    CSR_MIDELEG = 0x303,
319    CSR_MIE = 0x304,
320    CSR_MTVEC = 0x305,
321    CSR_MSCRATCH = 0x340,
322    CSR_MEPC = 0x341,
323    CSR_MCAUSE = 0x342,
324    CSR_MTVAL = 0x343,
325    CSR_MIP = 0x344,
326    CSR_PMPCFG0 = 0x3A0,
327    // pmpcfg1 rv32 only
328    CSR_PMPCFG2 = 0x3A2,
329    // pmpcfg3 rv32 only
330    CSR_PMPADDR00 = 0x3B0,
331    CSR_PMPADDR01 = 0x3B1,
332    CSR_PMPADDR02 = 0x3B2,
333    CSR_PMPADDR03 = 0x3B3,
334    CSR_PMPADDR04 = 0x3B4,
335    CSR_PMPADDR05 = 0x3B5,
336    CSR_PMPADDR06 = 0x3B6,
337    CSR_PMPADDR07 = 0x3B7,
338    CSR_PMPADDR08 = 0x3B8,
339    CSR_PMPADDR09 = 0x3B9,
340    CSR_PMPADDR10 = 0x3BA,
341    CSR_PMPADDR11 = 0x3BB,
342    CSR_PMPADDR12 = 0x3BC,
343    CSR_PMPADDR13 = 0x3BD,
344    CSR_PMPADDR14 = 0x3BE,
345    CSR_PMPADDR15 = 0x3BF,
346    CSR_MCYCLE = 0xB00,
347    CSR_MINSTRET = 0xB02,
348    CSR_MHPMCOUNTER03 = 0xC03,
349    CSR_MHPMCOUNTER04 = 0xC04,
350    CSR_MHPMCOUNTER05 = 0xC05,
351    CSR_MHPMCOUNTER06 = 0xC06,
352    CSR_MHPMCOUNTER07 = 0xC07,
353    CSR_MHPMCOUNTER08 = 0xC08,
354    CSR_MHPMCOUNTER09 = 0xC09,
355    CSR_MHPMCOUNTER10 = 0xC0A,
356    CSR_MHPMCOUNTER11 = 0xC0B,
357    CSR_MHPMCOUNTER12 = 0xC0C,
358    CSR_MHPMCOUNTER13 = 0xC0D,
359    CSR_MHPMCOUNTER14 = 0xC0E,
360    CSR_MHPMCOUNTER15 = 0xC0F,
361    CSR_MHPMCOUNTER16 = 0xC10,
362    CSR_MHPMCOUNTER17 = 0xC11,
363    CSR_MHPMCOUNTER18 = 0xC12,
364    CSR_MHPMCOUNTER19 = 0xC13,
365    CSR_MHPMCOUNTER20 = 0xC14,
366    CSR_MHPMCOUNTER21 = 0xC15,
367    CSR_MHPMCOUNTER22 = 0xC16,
368    CSR_MHPMCOUNTER23 = 0xC17,
369    CSR_MHPMCOUNTER24 = 0xC18,
370    CSR_MHPMCOUNTER25 = 0xC19,
371    CSR_MHPMCOUNTER26 = 0xC1A,
372    CSR_MHPMCOUNTER27 = 0xC1B,
373    CSR_MHPMCOUNTER28 = 0xC1C,
374    CSR_MHPMCOUNTER29 = 0xC1D,
375    CSR_MHPMCOUNTER30 = 0xC1E,
376    CSR_MHPMCOUNTER31 = 0xC1F,
377    // MHPMCOUNTERH rv32 only
378    CSR_MHPMEVENT03 = 0x323,
379    CSR_MHPMEVENT04 = 0x324,
380    CSR_MHPMEVENT05 = 0x325,
381    CSR_MHPMEVENT06 = 0x326,
382    CSR_MHPMEVENT07 = 0x327,
383    CSR_MHPMEVENT08 = 0x328,
384    CSR_MHPMEVENT09 = 0x329,
385    CSR_MHPMEVENT10 = 0x32A,
386    CSR_MHPMEVENT11 = 0x32B,
387    CSR_MHPMEVENT12 = 0x32C,
388    CSR_MHPMEVENT13 = 0x32D,
389    CSR_MHPMEVENT14 = 0x32E,
390    CSR_MHPMEVENT15 = 0x32F,
391    CSR_MHPMEVENT16 = 0x330,
392    CSR_MHPMEVENT17 = 0x331,
393    CSR_MHPMEVENT18 = 0x332,
394    CSR_MHPMEVENT19 = 0x333,
395    CSR_MHPMEVENT20 = 0x334,
396    CSR_MHPMEVENT21 = 0x335,
397    CSR_MHPMEVENT22 = 0x336,
398    CSR_MHPMEVENT23 = 0x337,
399    CSR_MHPMEVENT24 = 0x338,
400    CSR_MHPMEVENT25 = 0x339,
401    CSR_MHPMEVENT26 = 0x33A,
402    CSR_MHPMEVENT27 = 0x33B,
403    CSR_MHPMEVENT28 = 0x33C,
404    CSR_MHPMEVENT29 = 0x33D,
405    CSR_MHPMEVENT30 = 0x33E,
406    CSR_MHPMEVENT31 = 0x33F,
407
408    CSR_TSELECT = 0x7A0,
409    CSR_TDATA1 = 0x7A1,
410    CSR_TDATA2 = 0x7A2,
411    CSR_TDATA3 = 0x7A3,
412    CSR_DCSR = 0x7B0,
413    CSR_DPC = 0x7B1,
414    CSR_DSCRATCH = 0x7B2
415};
416
417struct CSRMetadata
418{
419    const std::string name;
420    const int physIndex;
421};
422
423const std::map<int, CSRMetadata> CSRData = {
424    {CSR_USTATUS, {"ustatus", MISCREG_STATUS}},
425    {CSR_UIE, {"uie", MISCREG_IE}},
426    {CSR_UTVEC, {"utvec", MISCREG_UTVEC}},
427    {CSR_USCRATCH, {"uscratch", MISCREG_USCRATCH}},
428    {CSR_UEPC, {"uepc", MISCREG_UEPC}},
429    {CSR_UCAUSE, {"ucause", MISCREG_UCAUSE}},
430    {CSR_UTVAL, {"utval", MISCREG_UTVAL}},
431    {CSR_UIP, {"uip", MISCREG_IP}},
432    {CSR_FFLAGS, {"fflags", MISCREG_FFLAGS}},
433    {CSR_FRM, {"frm", MISCREG_FRM}},
434    {CSR_FCSR, {"fcsr", MISCREG_FFLAGS}}, // Actually FRM << 5 | FFLAGS
435    {CSR_CYCLE, {"cycle", MISCREG_CYCLE}},
436    {CSR_TIME, {"time", MISCREG_TIME}},
437    {CSR_INSTRET, {"instret", MISCREG_INSTRET}},
438    {CSR_HPMCOUNTER03, {"hpmcounter03", MISCREG_HPMCOUNTER03}},
439    {CSR_HPMCOUNTER04, {"hpmcounter04", MISCREG_HPMCOUNTER04}},
440    {CSR_HPMCOUNTER05, {"hpmcounter05", MISCREG_HPMCOUNTER05}},
441    {CSR_HPMCOUNTER06, {"hpmcounter06", MISCREG_HPMCOUNTER06}},
442    {CSR_HPMCOUNTER07, {"hpmcounter07", MISCREG_HPMCOUNTER07}},
443    {CSR_HPMCOUNTER08, {"hpmcounter08", MISCREG_HPMCOUNTER08}},
444    {CSR_HPMCOUNTER09, {"hpmcounter09", MISCREG_HPMCOUNTER09}},
445    {CSR_HPMCOUNTER10, {"hpmcounter10", MISCREG_HPMCOUNTER10}},
446    {CSR_HPMCOUNTER11, {"hpmcounter11", MISCREG_HPMCOUNTER11}},
447    {CSR_HPMCOUNTER12, {"hpmcounter12", MISCREG_HPMCOUNTER12}},
448    {CSR_HPMCOUNTER13, {"hpmcounter13", MISCREG_HPMCOUNTER13}},
449    {CSR_HPMCOUNTER14, {"hpmcounter14", MISCREG_HPMCOUNTER14}},
450    {CSR_HPMCOUNTER15, {"hpmcounter15", MISCREG_HPMCOUNTER15}},
451    {CSR_HPMCOUNTER16, {"hpmcounter16", MISCREG_HPMCOUNTER16}},
452    {CSR_HPMCOUNTER17, {"hpmcounter17", MISCREG_HPMCOUNTER17}},
453    {CSR_HPMCOUNTER18, {"hpmcounter18", MISCREG_HPMCOUNTER18}},
454    {CSR_HPMCOUNTER19, {"hpmcounter19", MISCREG_HPMCOUNTER19}},
455    {CSR_HPMCOUNTER20, {"hpmcounter20", MISCREG_HPMCOUNTER20}},
456    {CSR_HPMCOUNTER21, {"hpmcounter21", MISCREG_HPMCOUNTER21}},
457    {CSR_HPMCOUNTER22, {"hpmcounter22", MISCREG_HPMCOUNTER22}},
458    {CSR_HPMCOUNTER23, {"hpmcounter23", MISCREG_HPMCOUNTER23}},
459    {CSR_HPMCOUNTER24, {"hpmcounter24", MISCREG_HPMCOUNTER24}},
460    {CSR_HPMCOUNTER25, {"hpmcounter25", MISCREG_HPMCOUNTER25}},
461    {CSR_HPMCOUNTER26, {"hpmcounter26", MISCREG_HPMCOUNTER26}},
462    {CSR_HPMCOUNTER27, {"hpmcounter27", MISCREG_HPMCOUNTER27}},
463    {CSR_HPMCOUNTER28, {"hpmcounter28", MISCREG_HPMCOUNTER28}},
464    {CSR_HPMCOUNTER29, {"hpmcounter29", MISCREG_HPMCOUNTER29}},
465    {CSR_HPMCOUNTER30, {"hpmcounter30", MISCREG_HPMCOUNTER30}},
466    {CSR_HPMCOUNTER31, {"hpmcounter31", MISCREG_HPMCOUNTER31}},
467
468    {CSR_SSTATUS, {"sstatus", MISCREG_STATUS}},
469    {CSR_SEDELEG, {"sedeleg", MISCREG_SEDELEG}},
470    {CSR_SIDELEG, {"sideleg", MISCREG_SIDELEG}},
471    {CSR_SIE, {"sie", MISCREG_IE}},
472    {CSR_STVEC, {"stvec", MISCREG_STVEC}},
473    {CSR_SSCRATCH, {"sscratch", MISCREG_SSCRATCH}},
474    {CSR_SEPC, {"sepc", MISCREG_SEPC}},
475    {CSR_SCAUSE, {"scause", MISCREG_SCAUSE}},
476    {CSR_STVAL, {"stval", MISCREG_STVAL}},
477    {CSR_SIP, {"sip", MISCREG_IP}},
478    {CSR_SATP, {"satp", MISCREG_SATP}},
479
480    {CSR_MVENDORID, {"mvendorid", MISCREG_VENDORID}},
481    {CSR_MARCHID, {"marchid", MISCREG_ARCHID}},
482    {CSR_MIMPID, {"mimpid", MISCREG_IMPID}},
483    {CSR_MHARTID, {"mhartid", MISCREG_HARTID}},
484    {CSR_MSTATUS, {"mstatus", MISCREG_STATUS}},
485    {CSR_MISA, {"misa", MISCREG_ISA}},
486    {CSR_MEDELEG, {"medeleg", MISCREG_MEDELEG}},
487    {CSR_MIDELEG, {"mideleg", MISCREG_MIDELEG}},
488    {CSR_MIE, {"mie", MISCREG_IE}},
489    {CSR_MTVEC, {"mtvec", MISCREG_MTVEC}},
490    {CSR_MSCRATCH, {"mscratch", MISCREG_MSCRATCH}},
491    {CSR_MEPC, {"mepc", MISCREG_MEPC}},
492    {CSR_MCAUSE, {"mcause", MISCREG_MCAUSE}},
493    {CSR_MTVAL, {"mtval", MISCREG_MTVAL}},
494    {CSR_MIP, {"mip", MISCREG_IP}},
495    {CSR_PMPCFG0, {"pmpcfg0", MISCREG_PMPCFG0}},
496    // pmpcfg1 rv32 only
497    {CSR_PMPCFG2, {"pmpcfg2", MISCREG_PMPCFG2}},
498    // pmpcfg3 rv32 only
499    {CSR_PMPADDR00, {"pmpaddr0", MISCREG_PMPADDR00}},
500    {CSR_PMPADDR01, {"pmpaddr1", MISCREG_PMPADDR01}},
501    {CSR_PMPADDR02, {"pmpaddr2", MISCREG_PMPADDR02}},
502    {CSR_PMPADDR03, {"pmpaddr3", MISCREG_PMPADDR03}},
503    {CSR_PMPADDR04, {"pmpaddr4", MISCREG_PMPADDR04}},
504    {CSR_PMPADDR05, {"pmpaddr5", MISCREG_PMPADDR05}},
505    {CSR_PMPADDR06, {"pmpaddr6", MISCREG_PMPADDR06}},
506    {CSR_PMPADDR07, {"pmpaddr7", MISCREG_PMPADDR07}},
507    {CSR_PMPADDR08, {"pmpaddr8", MISCREG_PMPADDR08}},
508    {CSR_PMPADDR09, {"pmpaddr9", MISCREG_PMPADDR09}},
509    {CSR_PMPADDR10, {"pmpaddr10", MISCREG_PMPADDR10}},
510    {CSR_PMPADDR11, {"pmpaddr11", MISCREG_PMPADDR11}},
511    {CSR_PMPADDR12, {"pmpaddr12", MISCREG_PMPADDR12}},
512    {CSR_PMPADDR13, {"pmpaddr13", MISCREG_PMPADDR13}},
513    {CSR_PMPADDR14, {"pmpaddr14", MISCREG_PMPADDR14}},
514    {CSR_PMPADDR15, {"pmpaddr15", MISCREG_PMPADDR15}},
515    {CSR_MCYCLE, {"mcycle", MISCREG_CYCLE}},
516    {CSR_MINSTRET, {"minstret", MISCREG_INSTRET}},
517    {CSR_MHPMCOUNTER03, {"mhpmcounter03", MISCREG_HPMCOUNTER03}},
518    {CSR_MHPMCOUNTER04, {"mhpmcounter04", MISCREG_HPMCOUNTER04}},
519    {CSR_MHPMCOUNTER05, {"mhpmcounter05", MISCREG_HPMCOUNTER05}},
520    {CSR_MHPMCOUNTER06, {"mhpmcounter06", MISCREG_HPMCOUNTER06}},
521    {CSR_MHPMCOUNTER07, {"mhpmcounter07", MISCREG_HPMCOUNTER07}},
522    {CSR_MHPMCOUNTER08, {"mhpmcounter08", MISCREG_HPMCOUNTER08}},
523    {CSR_MHPMCOUNTER09, {"mhpmcounter09", MISCREG_HPMCOUNTER09}},
524    {CSR_MHPMCOUNTER10, {"mhpmcounter10", MISCREG_HPMCOUNTER10}},
525    {CSR_MHPMCOUNTER11, {"mhpmcounter11", MISCREG_HPMCOUNTER11}},
526    {CSR_MHPMCOUNTER12, {"mhpmcounter12", MISCREG_HPMCOUNTER12}},
527    {CSR_MHPMCOUNTER13, {"mhpmcounter13", MISCREG_HPMCOUNTER13}},
528    {CSR_MHPMCOUNTER14, {"mhpmcounter14", MISCREG_HPMCOUNTER14}},
529    {CSR_MHPMCOUNTER15, {"mhpmcounter15", MISCREG_HPMCOUNTER15}},
530    {CSR_MHPMCOUNTER16, {"mhpmcounter16", MISCREG_HPMCOUNTER16}},
531    {CSR_MHPMCOUNTER17, {"mhpmcounter17", MISCREG_HPMCOUNTER17}},
532    {CSR_MHPMCOUNTER18, {"mhpmcounter18", MISCREG_HPMCOUNTER18}},
533    {CSR_MHPMCOUNTER19, {"mhpmcounter19", MISCREG_HPMCOUNTER19}},
534    {CSR_MHPMCOUNTER20, {"mhpmcounter20", MISCREG_HPMCOUNTER20}},
535    {CSR_MHPMCOUNTER21, {"mhpmcounter21", MISCREG_HPMCOUNTER21}},
536    {CSR_MHPMCOUNTER22, {"mhpmcounter22", MISCREG_HPMCOUNTER22}},
537    {CSR_MHPMCOUNTER23, {"mhpmcounter23", MISCREG_HPMCOUNTER23}},
538    {CSR_MHPMCOUNTER24, {"mhpmcounter24", MISCREG_HPMCOUNTER24}},
539    {CSR_MHPMCOUNTER25, {"mhpmcounter25", MISCREG_HPMCOUNTER25}},
540    {CSR_MHPMCOUNTER26, {"mhpmcounter26", MISCREG_HPMCOUNTER26}},
541    {CSR_MHPMCOUNTER27, {"mhpmcounter27", MISCREG_HPMCOUNTER27}},
542    {CSR_MHPMCOUNTER28, {"mhpmcounter28", MISCREG_HPMCOUNTER28}},
543    {CSR_MHPMCOUNTER29, {"mhpmcounter29", MISCREG_HPMCOUNTER29}},
544    {CSR_MHPMCOUNTER30, {"mhpmcounter30", MISCREG_HPMCOUNTER30}},
545    {CSR_MHPMCOUNTER31, {"mhpmcounter31", MISCREG_HPMCOUNTER31}},
546    {CSR_MHPMEVENT03, {"mhpmevent03", MISCREG_HPMEVENT03}},
547    {CSR_MHPMEVENT04, {"mhpmevent04", MISCREG_HPMEVENT04}},
548    {CSR_MHPMEVENT05, {"mhpmevent05", MISCREG_HPMEVENT05}},
549    {CSR_MHPMEVENT06, {"mhpmevent06", MISCREG_HPMEVENT06}},
550    {CSR_MHPMEVENT07, {"mhpmevent07", MISCREG_HPMEVENT07}},
551    {CSR_MHPMEVENT08, {"mhpmevent08", MISCREG_HPMEVENT08}},
552    {CSR_MHPMEVENT09, {"mhpmevent09", MISCREG_HPMEVENT09}},
553    {CSR_MHPMEVENT10, {"mhpmevent10", MISCREG_HPMEVENT10}},
554    {CSR_MHPMEVENT11, {"mhpmevent11", MISCREG_HPMEVENT11}},
555    {CSR_MHPMEVENT12, {"mhpmevent12", MISCREG_HPMEVENT12}},
556    {CSR_MHPMEVENT13, {"mhpmevent13", MISCREG_HPMEVENT13}},
557    {CSR_MHPMEVENT14, {"mhpmevent14", MISCREG_HPMEVENT14}},
558    {CSR_MHPMEVENT15, {"mhpmevent15", MISCREG_HPMEVENT15}},
559    {CSR_MHPMEVENT16, {"mhpmevent16", MISCREG_HPMEVENT16}},
560    {CSR_MHPMEVENT17, {"mhpmevent17", MISCREG_HPMEVENT17}},
561    {CSR_MHPMEVENT18, {"mhpmevent18", MISCREG_HPMEVENT18}},
562    {CSR_MHPMEVENT19, {"mhpmevent19", MISCREG_HPMEVENT19}},
563    {CSR_MHPMEVENT20, {"mhpmevent20", MISCREG_HPMEVENT20}},
564    {CSR_MHPMEVENT21, {"mhpmevent21", MISCREG_HPMEVENT21}},
565    {CSR_MHPMEVENT22, {"mhpmevent22", MISCREG_HPMEVENT22}},
566    {CSR_MHPMEVENT23, {"mhpmevent23", MISCREG_HPMEVENT23}},
567    {CSR_MHPMEVENT24, {"mhpmevent24", MISCREG_HPMEVENT24}},
568    {CSR_MHPMEVENT25, {"mhpmevent25", MISCREG_HPMEVENT25}},
569    {CSR_MHPMEVENT26, {"mhpmevent26", MISCREG_HPMEVENT26}},
570    {CSR_MHPMEVENT27, {"mhpmevent27", MISCREG_HPMEVENT27}},
571    {CSR_MHPMEVENT28, {"mhpmevent28", MISCREG_HPMEVENT28}},
572    {CSR_MHPMEVENT29, {"mhpmevent29", MISCREG_HPMEVENT29}},
573    {CSR_MHPMEVENT30, {"mhpmevent30", MISCREG_HPMEVENT30}},
574    {CSR_MHPMEVENT31, {"mhpmevent31", MISCREG_HPMEVENT31}},
575
576    {CSR_TSELECT, {"tselect", MISCREG_TSELECT}},
577    {CSR_TDATA1, {"tdata1", MISCREG_TDATA1}},
578    {CSR_TDATA2, {"tdata2", MISCREG_TDATA2}},
579    {CSR_TDATA3, {"tdata3", MISCREG_TDATA3}},
580    {CSR_DCSR, {"dcsr", MISCREG_DCSR}},
581    {CSR_DPC, {"dpc", MISCREG_DPC}},
582    {CSR_DSCRATCH, {"dscratch", MISCREG_DSCRATCH}}
583};
584
585/**
586 * These fields are specified in the RISC-V Instruction Set Manual, Volume II,
587 * v1.10, accessible at www.riscv.org. in Figure 3.7. The main register that
588 * uses these fields is the MSTATUS register, which is shadowed by two others
589 * accessible at lower privilege levels (SSTATUS and USTATUS) that can't see
590 * the fields for higher privileges.
591 */
592BitUnion64(STATUS)
593    Bitfield<63> sd;
594    Bitfield<35, 34> sxl;
595    Bitfield<33, 32> uxl;
596    Bitfield<22> tsr;
597    Bitfield<21> tw;
598    Bitfield<20> tvm;
599    Bitfield<19> mxr;
600    Bitfield<18> sum;
601    Bitfield<17> mprv;
602    Bitfield<16, 15> xs;
603    Bitfield<14, 13> fs;
604    Bitfield<12, 11> mpp;
605    Bitfield<8> spp;
606    Bitfield<7> mpie;
607    Bitfield<5> spie;
608    Bitfield<4> upie;
609    Bitfield<3> mie;
610    Bitfield<1> sie;
611    Bitfield<0> uie;
612EndBitUnion(STATUS)
613
614/**
615 * These fields are specified in the RISC-V Instruction Set Manual, Volume II,
616 * v1.10 in Figures 3.11 and 3.12, accessible at www.riscv.org. Both the MIP
617 * and MIE registers have the same fields, so accesses to either should use
618 * this bit union.
619 */
620BitUnion64(INTERRUPT)
621    Bitfield<11> mei;
622    Bitfield<9> sei;
623    Bitfield<8> uei;
624    Bitfield<7> mti;
625    Bitfield<5> sti;
626    Bitfield<4> uti;
627    Bitfield<3> msi;
628    Bitfield<1> ssi;
629    Bitfield<0> usi;
630EndBitUnion(INTERRUPT)
631
632const off_t MXL_OFFSET = (sizeof(MiscReg) * 8 - 2);
633const off_t SXL_OFFSET = 34;
634const off_t UXL_OFFSET = 32;
635const off_t FS_OFFSET = 13;
636const off_t FRM_OFFSET = 5;
637
638const MiscReg ISA_MXL_MASK = 3ULL << MXL_OFFSET;
639const MiscReg ISA_EXT_MASK = mask(26);
640const MiscReg MISA_MASK = ISA_MXL_MASK | ISA_EXT_MASK;
641
642const MiscReg STATUS_SD_MASK = 1ULL << ((sizeof(MiscReg) * 8) - 1);
643const MiscReg STATUS_SXL_MASK = 3ULL << SXL_OFFSET;
644const MiscReg STATUS_UXL_MASK = 3ULL << UXL_OFFSET;
645const MiscReg STATUS_TSR_MASK = 1ULL << 22;
646const MiscReg STATUS_TW_MASK = 1ULL << 21;
647const MiscReg STATUS_TVM_MASK = 1ULL << 20;
648const MiscReg STATUS_MXR_MASK = 1ULL << 19;
649const MiscReg STATUS_SUM_MASK = 1ULL << 18;
650const MiscReg STATUS_MPRV_MASK = 1ULL << 17;
651const MiscReg STATUS_XS_MASK = 3ULL << 15;
652const MiscReg STATUS_FS_MASK = 3ULL << FS_OFFSET;
653const MiscReg STATUS_MPP_MASK = 3ULL << 11;
654const MiscReg STATUS_SPP_MASK = 1ULL << 8;
655const MiscReg STATUS_MPIE_MASK = 1ULL << 7;
656const MiscReg STATUS_SPIE_MASK = 1ULL << 5;
657const MiscReg STATUS_UPIE_MASK = 1ULL << 4;
658const MiscReg STATUS_MIE_MASK = 1ULL << 3;
659const MiscReg STATUS_SIE_MASK = 1ULL << 1;
660const MiscReg STATUS_UIE_MASK = 1ULL << 0;
661const MiscReg MSTATUS_MASK = STATUS_SD_MASK | STATUS_SXL_MASK |
662                             STATUS_UXL_MASK | STATUS_TSR_MASK |
663                             STATUS_TW_MASK | STATUS_TVM_MASK |
664                             STATUS_MXR_MASK | STATUS_SUM_MASK |
665                             STATUS_MPRV_MASK | STATUS_XS_MASK |
666                             STATUS_FS_MASK | STATUS_MPP_MASK |
667                             STATUS_SPP_MASK | STATUS_MPIE_MASK |
668                             STATUS_SPIE_MASK | STATUS_UPIE_MASK |
669                             STATUS_MIE_MASK | STATUS_SIE_MASK |
670                             STATUS_UIE_MASK;
671const MiscReg SSTATUS_MASK = STATUS_SD_MASK | STATUS_UXL_MASK |
672                             STATUS_MXR_MASK | STATUS_SUM_MASK |
673                             STATUS_XS_MASK | STATUS_FS_MASK |
674                             STATUS_SPP_MASK | STATUS_SPIE_MASK |
675                             STATUS_UPIE_MASK | STATUS_SIE_MASK |
676                             STATUS_UIE_MASK;
677const MiscReg USTATUS_MASK = STATUS_SD_MASK | STATUS_MXR_MASK |
678                             STATUS_SUM_MASK | STATUS_XS_MASK |
679                             STATUS_FS_MASK | STATUS_UPIE_MASK |
680                             STATUS_UIE_MASK;
681
682const MiscReg MEI_MASK = 1ULL << 11;
683const MiscReg SEI_MASK = 1ULL << 9;
684const MiscReg UEI_MASK = 1ULL << 8;
685const MiscReg MTI_MASK = 1ULL << 7;
686const MiscReg STI_MASK = 1ULL << 5;
687const MiscReg UTI_MASK = 1ULL << 4;
688const MiscReg MSI_MASK = 1ULL << 3;
689const MiscReg SSI_MASK = 1ULL << 1;
690const MiscReg USI_MASK = 1ULL << 0;
691const MiscReg MI_MASK = MEI_MASK | SEI_MASK | UEI_MASK |
692                        MTI_MASK | STI_MASK | UTI_MASK |
693                        MSI_MASK | SSI_MASK | USI_MASK;
694const MiscReg SI_MASK = SEI_MASK | UEI_MASK |
695                        STI_MASK | UTI_MASK |
696                        SSI_MASK | USI_MASK;
697const MiscReg UI_MASK = UEI_MASK | UTI_MASK | USI_MASK;
698const MiscReg FFLAGS_MASK = (1 << FRM_OFFSET) - 1;
699const MiscReg FRM_MASK = 0x7;
700
701const std::map<int, MiscReg> CSRMasks = {
702    {CSR_USTATUS, USTATUS_MASK},
703    {CSR_UIE, UI_MASK},
704    {CSR_UIP, UI_MASK},
705    {CSR_FFLAGS, FFLAGS_MASK},
706    {CSR_FRM, FRM_MASK},
707    {CSR_FCSR, FFLAGS_MASK | (FRM_MASK << FRM_OFFSET)},
708    {CSR_SSTATUS, SSTATUS_MASK},
709    {CSR_SIE, SI_MASK},
710    {CSR_SIP, SI_MASK},
711    {CSR_MSTATUS, MSTATUS_MASK},
712    {CSR_MISA, MISA_MASK},
713    {CSR_MIE, MI_MASK},
714    {CSR_MIP, MI_MASK}
715};
716
717}
718
719#endif // __ARCH_RISCV_REGISTERS_HH__
720