104eeddc0SDimitry Andric//===- RISCVSystemOperands.td ------------------------------*- tablegen -*-===// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// This file defines the symbolic operands permitted for various kinds of 100b57cec5SDimitry Andric// RISC-V system instruction. 110b57cec5SDimitry Andric// 120b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andricinclude "llvm/TableGen/SearchableTable.td" 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 170b57cec5SDimitry Andric// CSR (control and status register read/write) instruction options. 180b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 190b57cec5SDimitry Andric 200b57cec5SDimitry Andricclass SysReg<string name, bits<12> op> { 210b57cec5SDimitry Andric string Name = name; 22647cbc5dSDimitry Andric // A maximum of one alias is supported right now. 23647cbc5dSDimitry Andric string AltName = name; 24647cbc5dSDimitry Andric // A maximum of one deprecated name is supported right now. Unlike the 25647cbc5dSDimitry Andric // `AltName` alias, a `DeprecatedName` generates a diagnostic when the name is 26647cbc5dSDimitry Andric // used to encourage software to migrate away from the name. 27fe6060f1SDimitry Andric string DeprecatedName = ""; 28fe6060f1SDimitry Andric bits<12> Encoding = op; 290b57cec5SDimitry Andric // FIXME: add these additional fields when needed. 300b57cec5SDimitry Andric // Privilege Access: Read and Write = 0, 1, 2; Read-Only = 3. 310b57cec5SDimitry Andric // Privilege Mode: User = 0, System = 1 or Machine = 3. 320b57cec5SDimitry Andric // bits<2> ReadWrite = op{11 - 10}; 330b57cec5SDimitry Andric // bits<2> XMode = op{9 - 8}; 340b57cec5SDimitry Andric // Check Extra field name and what bits 7-6 correspond to. 350b57cec5SDimitry Andric // bits<2> Extra = op{7 - 6}; 360b57cec5SDimitry Andric // Register number without the privilege bits. 370b57cec5SDimitry Andric // bits<6> Number = op{5 - 0}; 380b57cec5SDimitry Andric code FeaturesRequired = [{ {} }]; 390b57cec5SDimitry Andric bit isRV32Only = 0; 400b57cec5SDimitry Andric} 410b57cec5SDimitry Andric 420b57cec5SDimitry Andricdef SysRegsList : GenericTable { 430b57cec5SDimitry Andric let FilterClass = "SysReg"; 440b57cec5SDimitry Andric // FIXME: add "ReadWrite", "Mode", "Extra", "Number" fields when needed. 45fe6060f1SDimitry Andric let Fields = [ 46647cbc5dSDimitry Andric "Name", "AltName", "DeprecatedName", "Encoding", "FeaturesRequired", 47fe6060f1SDimitry Andric "isRV32Only", 48fe6060f1SDimitry Andric ]; 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric let PrimaryKey = [ "Encoding" ]; 510b57cec5SDimitry Andric let PrimaryKeyName = "lookupSysRegByEncoding"; 52*0fca6ea1SDimitry Andric let PrimaryKeyReturnRange = true; 530b57cec5SDimitry Andric} 540b57cec5SDimitry Andric 550b57cec5SDimitry Andricdef lookupSysRegByName : SearchIndex { 560b57cec5SDimitry Andric let Table = SysRegsList; 570b57cec5SDimitry Andric let Key = [ "Name" ]; 580b57cec5SDimitry Andric} 590b57cec5SDimitry Andric 60647cbc5dSDimitry Andricdef lookupSysRegByAltName : SearchIndex { 61647cbc5dSDimitry Andric let Table = SysRegsList; 62647cbc5dSDimitry Andric let Key = [ "AltName" ]; 63647cbc5dSDimitry Andric} 64647cbc5dSDimitry Andric 65fe6060f1SDimitry Andricdef lookupSysRegByDeprecatedName : SearchIndex { 66fe6060f1SDimitry Andric let Table = SysRegsList; 67fe6060f1SDimitry Andric let Key = [ "DeprecatedName" ]; 68fe6060f1SDimitry Andric} 69fe6060f1SDimitry Andric 700b57cec5SDimitry Andric// The following CSR encodings match those given in Tables 2.2, 7106c3fb27SDimitry Andric// 2.3, 2.4, 2.5 and 2.6 in the RISC-V Instruction Set Manual 720b57cec5SDimitry Andric// Volume II: Privileged Architecture. 730b57cec5SDimitry Andric 7404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 750b57cec5SDimitry Andric// User Floating-Point CSRs 7604eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 770b57cec5SDimitry Andric 78fe6060f1SDimitry Andricdef SysRegFFLAGS : SysReg<"fflags", 0x001>; 79fe6060f1SDimitry Andricdef SysRegFRM : SysReg<"frm", 0x002>; 80fe6060f1SDimitry Andricdef SysRegFCSR : SysReg<"fcsr", 0x003>; 810b57cec5SDimitry Andric 8204eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 830b57cec5SDimitry Andric// User Counter/Timers 8404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 850b57cec5SDimitry Andricdef CYCLE : SysReg<"cycle", 0xC00>; 860b57cec5SDimitry Andricdef TIME : SysReg<"time", 0xC01>; 870b57cec5SDimitry Andricdef INSTRET : SysReg<"instret", 0xC02>; 880b57cec5SDimitry Andric 8904eeddc0SDimitry Andric// hpmcounter3-hpmcounter31 at 0xC03-0xC1F. 9004eeddc0SDimitry Andricforeach i = 3...31 in 9104eeddc0SDimitry Andric def : SysReg<"hpmcounter"#i, !add(0xC03, !sub(i, 3))>; 920b57cec5SDimitry Andric 930b57cec5SDimitry Andriclet isRV32Only = 1 in { 940b57cec5SDimitry Andricdef CYCLEH : SysReg<"cycleh", 0xC80>; 950b57cec5SDimitry Andricdef TIMEH : SysReg<"timeh", 0xC81>; 960b57cec5SDimitry Andricdef INSTRETH : SysReg<"instreth", 0xC82>; 970b57cec5SDimitry Andric 9804eeddc0SDimitry Andric// hpmcounter3h-hpmcounter31h at 0xC83-0xC9F. 9904eeddc0SDimitry Andricforeach i = 3...31 in 10004eeddc0SDimitry Andric def : SysReg<"hpmcounter"#i#"h", !add(0xC83, !sub(i, 3))>; 1010b57cec5SDimitry Andric} 1020b57cec5SDimitry Andric 10304eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 1040b57cec5SDimitry Andric// Supervisor Trap Setup 10504eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 1060b57cec5SDimitry Andricdef : SysReg<"sstatus", 0x100>; 1070b57cec5SDimitry Andricdef : SysReg<"sie", 0x104>; 1080b57cec5SDimitry Andricdef : SysReg<"stvec", 0x105>; 1090b57cec5SDimitry Andricdef : SysReg<"scounteren", 0x106>; 11004eeddc0SDimitry Andricdef : SysReg<"stimecmp", 0x14D>; 11104eeddc0SDimitry Andriclet isRV32Only = 1 in 11204eeddc0SDimitry Andricdef : SysReg<"stimecmph", 0x15D>; 1130b57cec5SDimitry Andric 11404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 11504eeddc0SDimitry Andric// Supervisor Configuration 11604eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 11704eeddc0SDimitry Andric 11804eeddc0SDimitry Andricdef : SysReg<"senvcfg", 0x10A>; 11904eeddc0SDimitry Andric 12004eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 1210b57cec5SDimitry Andric// Supervisor Trap Handling 12204eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 1230b57cec5SDimitry Andricdef : SysReg<"sscratch", 0x140>; 1240b57cec5SDimitry Andricdef : SysReg<"sepc", 0x141>; 1250b57cec5SDimitry Andricdef : SysReg<"scause", 0x142>; 126fe6060f1SDimitry Andriclet DeprecatedName = "sbadaddr" in 1270b57cec5SDimitry Andricdef : SysReg<"stval", 0x143>; 1280b57cec5SDimitry Andricdef : SysReg<"sip", 0x144>; 1290b57cec5SDimitry Andric 13004eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 1310b57cec5SDimitry Andric// Supervisor Protection and Translation 13204eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 133fe6060f1SDimitry Andriclet DeprecatedName = "sptbr" in 1340b57cec5SDimitry Andricdef : SysReg<"satp", 0x180>; 1350b57cec5SDimitry Andric 13604eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 137*0fca6ea1SDimitry Andric// Quality-of-Service(QoS) Identifiers (Ssqosid) 138*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 139*0fca6ea1SDimitry Andricdef : SysReg<"srmcfg", 0x181>; 140*0fca6ea1SDimitry Andric 141*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 14204eeddc0SDimitry Andric// Debug/Trace Registers 14304eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 14404eeddc0SDimitry Andric 14504eeddc0SDimitry Andricdef : SysReg<"scontext", 0x5A8>; 14604eeddc0SDimitry Andric 14704eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 14804eeddc0SDimitry Andric// Supervisor Count Overflow (defined in Sscofpmf) 14904eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 15004eeddc0SDimitry Andric 15104eeddc0SDimitry Andricdef : SysReg<"scountovf", 0xDA0>; 15204eeddc0SDimitry Andric 15304eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 15404eeddc0SDimitry Andric// Hypervisor Trap Setup 15504eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 15604eeddc0SDimitry Andric 15704eeddc0SDimitry Andricdef : SysReg<"hstatus", 0x600>; 15804eeddc0SDimitry Andricdef : SysReg<"hedeleg", 0x602>; 15904eeddc0SDimitry Andricdef : SysReg<"hideleg", 0x603>; 16004eeddc0SDimitry Andricdef : SysReg<"hie", 0x604>; 16104eeddc0SDimitry Andricdef : SysReg<"hcounteren", 0x606>; 16204eeddc0SDimitry Andricdef : SysReg<"hgeie", 0x607>; 16304eeddc0SDimitry Andric 16404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 16504eeddc0SDimitry Andric// Hypervisor Trap Handling 16604eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 16704eeddc0SDimitry Andric 16804eeddc0SDimitry Andricdef : SysReg<"htval", 0x643>; 16904eeddc0SDimitry Andricdef : SysReg<"hip", 0x644>; 17004eeddc0SDimitry Andricdef : SysReg<"hvip", 0x645>; 17104eeddc0SDimitry Andricdef : SysReg<"htinst", 0x64A>; 17204eeddc0SDimitry Andricdef : SysReg<"hgeip", 0xE12>; 17304eeddc0SDimitry Andric 17404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 17504eeddc0SDimitry Andric// Hypervisor Configuration 17604eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 17704eeddc0SDimitry Andric 17804eeddc0SDimitry Andricdef : SysReg<"henvcfg", 0x60A>; 17904eeddc0SDimitry Andriclet isRV32Only = 1 in 18004eeddc0SDimitry Andricdef : SysReg<"henvcfgh", 0x61A>; 18104eeddc0SDimitry Andric 18204eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 18304eeddc0SDimitry Andric// Hypervisor Protection and Translation 18404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 18504eeddc0SDimitry Andric 18604eeddc0SDimitry Andricdef : SysReg<"hgatp", 0x680>; 18704eeddc0SDimitry Andric 18804eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 18904eeddc0SDimitry Andric// Debug/Trace Registers 19004eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 19104eeddc0SDimitry Andric 19204eeddc0SDimitry Andricdef : SysReg<"hcontext", 0x6A8>; 19304eeddc0SDimitry Andric 19404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 19504eeddc0SDimitry Andric// Hypervisor Counter/Timer Virtualization Registers 19604eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 19704eeddc0SDimitry Andric 19804eeddc0SDimitry Andricdef : SysReg<"htimedelta", 0x605>; 19904eeddc0SDimitry Andriclet isRV32Only = 1 in 20004eeddc0SDimitry Andricdef : SysReg<"htimedeltah", 0x615>; 20104eeddc0SDimitry Andric 20204eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 20304eeddc0SDimitry Andric// Virtual Supervisor Registers 20404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 20504eeddc0SDimitry Andric 20604eeddc0SDimitry Andricdef : SysReg<"vsstatus", 0x200>; 20704eeddc0SDimitry Andricdef : SysReg<"vsie", 0x204>; 20804eeddc0SDimitry Andricdef : SysReg<"vstvec", 0x205>; 20904eeddc0SDimitry Andricdef : SysReg<"vsscratch", 0x240>; 21004eeddc0SDimitry Andricdef : SysReg<"vsepc", 0x241>; 21104eeddc0SDimitry Andricdef : SysReg<"vscause", 0x242>; 21204eeddc0SDimitry Andricdef : SysReg<"vstval", 0x243>; 21304eeddc0SDimitry Andricdef : SysReg<"vsip", 0x244>; 21404eeddc0SDimitry Andricdef : SysReg<"vstimecmp", 0x24D>; 21504eeddc0SDimitry Andriclet isRV32Only = 1 in 21604eeddc0SDimitry Andricdef : SysReg<"vstimecmph", 0x25D>; 21704eeddc0SDimitry Andricdef : SysReg<"vsatp", 0x280>; 21804eeddc0SDimitry Andric 21904eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2200b57cec5SDimitry Andric// Machine Information Registers 22104eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andricdef : SysReg<"mvendorid", 0xF11>; 2240b57cec5SDimitry Andricdef : SysReg<"marchid", 0xF12>; 2250b57cec5SDimitry Andricdef : SysReg<"mimpid", 0xF13>; 2260b57cec5SDimitry Andricdef : SysReg<"mhartid", 0xF14>; 22704eeddc0SDimitry Andricdef : SysReg<"mconfigptr", 0xF15>; 2280b57cec5SDimitry Andric 22904eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2300b57cec5SDimitry Andric// Machine Trap Setup 23104eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2320b57cec5SDimitry Andricdef : SysReg<"mstatus", 0x300>; 2330b57cec5SDimitry Andricdef : SysReg<"misa", 0x301>; 2340b57cec5SDimitry Andricdef : SysReg<"medeleg", 0x302>; 2350b57cec5SDimitry Andricdef : SysReg<"mideleg", 0x303>; 2360b57cec5SDimitry Andricdef : SysReg<"mie", 0x304>; 2370b57cec5SDimitry Andricdef : SysReg<"mtvec", 0x305>; 2380b57cec5SDimitry Andricdef : SysReg<"mcounteren", 0x306>; 23904eeddc0SDimitry Andriclet isRV32Only = 1 in 24004eeddc0SDimitry Andricdef : SysReg<"mstatush", 0x310>; 2410b57cec5SDimitry Andric 24204eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2430b57cec5SDimitry Andric// Machine Trap Handling 24404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2450b57cec5SDimitry Andricdef : SysReg<"mscratch", 0x340>; 2460b57cec5SDimitry Andricdef : SysReg<"mepc", 0x341>; 2470b57cec5SDimitry Andricdef : SysReg<"mcause", 0x342>; 248fe6060f1SDimitry Andriclet DeprecatedName = "mbadaddr" in 2490b57cec5SDimitry Andricdef : SysReg<"mtval", 0x343>; 2500b57cec5SDimitry Andricdef : SysReg<"mip", 0x344>; 25104eeddc0SDimitry Andricdef : SysReg<"mtinst", 0x34A>; 25204eeddc0SDimitry Andricdef : SysReg<"mtval2", 0x34B>; 2530b57cec5SDimitry Andric 25404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 25504eeddc0SDimitry Andric// Machine Configuration 25604eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 25704eeddc0SDimitry Andric 25804eeddc0SDimitry Andricdef : SysReg<"menvcfg", 0x30A>; 25904eeddc0SDimitry Andriclet isRV32Only = 1 in 26004eeddc0SDimitry Andricdef : SysReg<"menvcfgh", 0x31A>; 26104eeddc0SDimitry Andricdef : SysReg<"mseccfg", 0x747>; 26204eeddc0SDimitry Andriclet isRV32Only = 1 in 26304eeddc0SDimitry Andricdef : SysReg<"mseccfgh", 0x757>; 26404eeddc0SDimitry Andric 26504eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2660b57cec5SDimitry Andric// Machine Protection and Translation 26704eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 26804eeddc0SDimitry Andric 26904eeddc0SDimitry Andric// pmpcfg0-pmpcfg15 at 0x3A0-0x3AF. Odd-numbered registers are RV32-only. 27004eeddc0SDimitry Andricforeach i = 0...15 in { 27104eeddc0SDimitry Andric let isRV32Only = !and(i, 1) in 27204eeddc0SDimitry Andric def : SysReg<"pmpcfg"#i, !add(0x3A0, i)>; 2730b57cec5SDimitry Andric} 2740b57cec5SDimitry Andric 27504eeddc0SDimitry Andric// pmpaddr0-pmpaddr63 at 0x3B0-0x3EF. 27604eeddc0SDimitry Andricforeach i = 0...63 in 27704eeddc0SDimitry Andric def : SysReg<"pmpaddr"#i, !add(0x3B0, i)>; 2780b57cec5SDimitry Andric 27904eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2800b57cec5SDimitry Andric// Machine Counter and Timers 28104eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2820b57cec5SDimitry Andricdef : SysReg<"mcycle", 0xB00>; 2830b57cec5SDimitry Andricdef : SysReg<"minstret", 0xB02>; 2840b57cec5SDimitry Andric 28504eeddc0SDimitry Andric// mhpmcounter3-mhpmcounter31 at 0xB03-0xB1F. 28604eeddc0SDimitry Andricforeach i = 3...31 in 28704eeddc0SDimitry Andric def : SysReg<"mhpmcounter"#i, !add(0xB03, !sub(i, 3))>; 2880b57cec5SDimitry Andric 2890b57cec5SDimitry Andriclet isRV32Only = 1 in { 2900b57cec5SDimitry Andricdef: SysReg<"mcycleh", 0xB80>; 2910b57cec5SDimitry Andricdef: SysReg<"minstreth", 0xB82>; 2920b57cec5SDimitry Andric 29304eeddc0SDimitry Andric// mhpmcounter3h-mhpmcounter31h at 0xB83-0xB9F. 29404eeddc0SDimitry Andricforeach i = 3...31 in 29504eeddc0SDimitry Andric def : SysReg<"mhpmcounter"#i#"h", !add(0xB83, !sub(i, 3))>; 2960b57cec5SDimitry Andric} 2970b57cec5SDimitry Andric 29804eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 2990b57cec5SDimitry Andric// Machine Counter Setup 30004eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 301647cbc5dSDimitry Andriclet AltName = "mucounteren" in // Privileged spec v1.9.1 Name 3025ffd83dbSDimitry Andricdef : SysReg<"mcountinhibit", 0x320>; 303e8d8bef9SDimitry Andric 30404eeddc0SDimitry Andric// mhpmevent3-mhpmevent31 at 0x323-0x33F. 30504eeddc0SDimitry Andricforeach i = 3...31 in 30604eeddc0SDimitry Andric def : SysReg<"mhpmevent"#i, !add(0x323, !sub(i, 3))>; 3070b57cec5SDimitry Andric 30804eeddc0SDimitry Andric// mhpmevent3h-mhpmevent31h at 0x723-0x73F 30904eeddc0SDimitry Andricforeach i = 3...31 in { 31004eeddc0SDimitry Andric let isRV32Only = 1 in 31104eeddc0SDimitry Andric def : SysReg<"mhpmevent"#i#"h", !add(0x723, !sub(i, 3))>; 31204eeddc0SDimitry Andric} 31304eeddc0SDimitry Andric 31404eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 315*0fca6ea1SDimitry Andric// Supervisor Counter Setup 316*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 317*0fca6ea1SDimitry Andricdef : SysReg<"scountinhibit", 0x120>; 318*0fca6ea1SDimitry Andric 319*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 3200b57cec5SDimitry Andric// Debug/ Trace Registers (shared with Debug Mode) 32104eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 3220b57cec5SDimitry Andricdef : SysReg<"tselect", 0x7A0>; 3230b57cec5SDimitry Andricdef : SysReg<"tdata1", 0x7A1>; 3240b57cec5SDimitry Andricdef : SysReg<"tdata2", 0x7A2>; 3250b57cec5SDimitry Andricdef : SysReg<"tdata3", 0x7A3>; 32604eeddc0SDimitry Andricdef : SysReg<"mcontext", 0x7A8>; 3270b57cec5SDimitry Andric 32804eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 3290b57cec5SDimitry Andric// Debug Mode Registers 33004eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 3310b57cec5SDimitry Andricdef : SysReg<"dcsr", 0x7B0>; 3320b57cec5SDimitry Andricdef : SysReg<"dpc", 0x7B1>; 3335ffd83dbSDimitry Andric 3345ffd83dbSDimitry Andric// "dscratch" is an alternative name for "dscratch0" which appeared in earlier 3355ffd83dbSDimitry Andric// drafts of the RISC-V debug spec 336647cbc5dSDimitry Andriclet AltName = "dscratch" in 3375ffd83dbSDimitry Andricdef : SysReg<"dscratch0", 0x7B2>; 3385ffd83dbSDimitry Andricdef : SysReg<"dscratch1", 0x7B3>; 3395ffd83dbSDimitry Andric 34004eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 3415ffd83dbSDimitry Andric// User Vector CSRs 34204eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 3435ffd83dbSDimitry Andricdef : SysReg<"vstart", 0x008>; 3445ffd83dbSDimitry Andricdef : SysReg<"vxsat", 0x009>; 34506c3fb27SDimitry Andricdef SysRegVXRM : SysReg<"vxrm", 0x00A>; 346349cc55cSDimitry Andricdef : SysReg<"vcsr", 0x00F>; 34706c3fb27SDimitry Andricdef SysRegVL : SysReg<"vl", 0xC20>; 3485ffd83dbSDimitry Andricdef : SysReg<"vtype", 0xC21>; 3494824e7fdSDimitry Andricdef SysRegVLENB: SysReg<"vlenb", 0xC22>; 35004eeddc0SDimitry Andric 35104eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 352*0fca6ea1SDimitry Andric// Shadow Stack CSR 353*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 354*0fca6ea1SDimitry Andricdef : SysReg<"ssp", 0x011>; 355*0fca6ea1SDimitry Andric 356*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 35704eeddc0SDimitry Andric// State Enable Extension (Smstateen) 35804eeddc0SDimitry Andric//===----------------------------------------------------------------------===// 35904eeddc0SDimitry Andric 36004eeddc0SDimitry Andric// sstateen0-sstateen3 at 0x10C-0x10F, mstateen0-mstateen3 at 0x30C-0x30F, 36104eeddc0SDimitry Andric// mstateen0h-mstateen3h at 0x31C-0x31F, hstateen0-hstateen3 at 0x60C-0x60F, 36204eeddc0SDimitry Andric// and hstateen0h-hstateen3h at 0x61C-0x61F. 36304eeddc0SDimitry Andricforeach i = 0...3 in { 36404eeddc0SDimitry Andric def : SysReg<"sstateen"#i, !add(0x10C, i)>; 36504eeddc0SDimitry Andric def : SysReg<"mstateen"#i, !add(0x30C, i)>; 36604eeddc0SDimitry Andric let isRV32Only = 1 in 36704eeddc0SDimitry Andric def : SysReg<"mstateen"#i#"h", !add(0x31C, i)>; 36804eeddc0SDimitry Andric def : SysReg<"hstateen"#i, !add(0x60C, i)>; 36904eeddc0SDimitry Andric let isRV32Only = 1 in 37004eeddc0SDimitry Andric def : SysReg<"hstateen"#i#"h", !add(0x61C, i)>; 37104eeddc0SDimitry Andric} 37204eeddc0SDimitry Andric 37304eeddc0SDimitry Andric//===----------------------------------------------- 37404eeddc0SDimitry Andric// Entropy Source CSR 37504eeddc0SDimitry Andric//===----------------------------------------------- 37604eeddc0SDimitry Andric 37704eeddc0SDimitry Andricdef SEED : SysReg<"seed", 0x015>; 37806c3fb27SDimitry Andric 37906c3fb27SDimitry Andric//===----------------------------------------------- 38006c3fb27SDimitry Andric// Advanced Interrupt Architecture 38106c3fb27SDimitry Andric//===----------------------------------------------- 38206c3fb27SDimitry Andric 38306c3fb27SDimitry Andric// Machine-level CSRs 38406c3fb27SDimitry Andricdef : SysReg<"miselect", 0x350>; 38506c3fb27SDimitry Andricdef : SysReg<"mireg", 0x351>; 386*0fca6ea1SDimitry Andricforeach i = 2...3 in { 387*0fca6ea1SDimitry Andric def : SysReg<"mireg"#i, !add(0x350, i)>; 388*0fca6ea1SDimitry Andric} 389*0fca6ea1SDimitry Andricforeach i = 4...6 in { 390*0fca6ea1SDimitry Andric def : SysReg<"mireg"#i, !add(0x351, i)>; 391*0fca6ea1SDimitry Andric} 39206c3fb27SDimitry Andricdef : SysReg<"mtopei", 0x35C>; 39306c3fb27SDimitry Andricdef : SysReg<"mtopi", 0xFB0>; 39406c3fb27SDimitry Andricdef : SysReg<"mvien", 0x308>; 39506c3fb27SDimitry Andricdef : SysReg<"mvip", 0x309>; 39606c3fb27SDimitry Andriclet isRV32Only = 1 in { 39706c3fb27SDimitry Andricdef : SysReg<"midelegh", 0x313>; 39806c3fb27SDimitry Andricdef : SysReg<"mieh", 0x314>; 39906c3fb27SDimitry Andricdef : SysReg<"mvienh", 0x318>; 40006c3fb27SDimitry Andricdef : SysReg<"mviph", 0x319>; 40106c3fb27SDimitry Andricdef : SysReg<"miph", 0x354>; 40206c3fb27SDimitry Andric} // isRV32Only 40306c3fb27SDimitry Andric 40406c3fb27SDimitry Andric// Supervisor-level CSRs 40506c3fb27SDimitry Andricdef : SysReg<"siselect", 0x150>; 40606c3fb27SDimitry Andricdef : SysReg<"sireg", 0x151>; 407*0fca6ea1SDimitry Andricforeach i = 2...3 in { 408*0fca6ea1SDimitry Andric def : SysReg<"sireg"#i, !add(0x150, i)>; 409*0fca6ea1SDimitry Andric} 410*0fca6ea1SDimitry Andricforeach i = 4...6 in { 411*0fca6ea1SDimitry Andric def : SysReg<"sireg"#i, !add(0x151, i)>; 412*0fca6ea1SDimitry Andric} 41306c3fb27SDimitry Andricdef : SysReg<"stopei", 0x15C>; 41406c3fb27SDimitry Andricdef : SysReg<"stopi", 0xDB0>; 41506c3fb27SDimitry Andriclet isRV32Only = 1 in { 41606c3fb27SDimitry Andricdef : SysReg<"sieh", 0x114>; 41706c3fb27SDimitry Andricdef : SysReg<"siph", 0x154>; 41806c3fb27SDimitry Andric} // isRV32Only 41906c3fb27SDimitry Andric 42006c3fb27SDimitry Andric// Hypervisor and VS CSRs 42106c3fb27SDimitry Andricdef : SysReg<"hvien", 0x608>; 42206c3fb27SDimitry Andricdef : SysReg<"hvictl", 0x609>; 42306c3fb27SDimitry Andricdef : SysReg<"hviprio1", 0x646>; 42406c3fb27SDimitry Andricdef : SysReg<"hviprio2", 0x647>; 42506c3fb27SDimitry Andricdef : SysReg<"vsiselect", 0x250>; 42606c3fb27SDimitry Andricdef : SysReg<"vsireg", 0x251>; 427*0fca6ea1SDimitry Andricforeach i = 2...3 in { 428*0fca6ea1SDimitry Andric def : SysReg<"vsireg"#i, !add(0x250, i)>; 429*0fca6ea1SDimitry Andric} 430*0fca6ea1SDimitry Andricforeach i = 4...6 in { 431*0fca6ea1SDimitry Andric def : SysReg<"vsireg"#i, !add(0x251, i)>; 432*0fca6ea1SDimitry Andric} 43306c3fb27SDimitry Andricdef : SysReg<"vstopei", 0x25C>; 43406c3fb27SDimitry Andricdef : SysReg<"vstopi", 0xEB0>; 43506c3fb27SDimitry Andriclet isRV32Only = 1 in { 43606c3fb27SDimitry Andricdef : SysReg<"hidelegh", 0x613>; 43706c3fb27SDimitry Andricdef : SysReg<"hvienh", 0x618>; 43806c3fb27SDimitry Andricdef : SysReg<"hviph", 0x655>; 43906c3fb27SDimitry Andricdef : SysReg<"hviprio1h", 0x656>; 44006c3fb27SDimitry Andricdef : SysReg<"hviprio2h", 0x657>; 44106c3fb27SDimitry Andricdef : SysReg<"vsieh", 0x214>; 44206c3fb27SDimitry Andricdef : SysReg<"vsiph", 0x254>; 44306c3fb27SDimitry Andric} // isRV32Only 44406c3fb27SDimitry Andric 445*0fca6ea1SDimitry Andric//===----------------------------------------------- 44606c3fb27SDimitry Andric// Jump Vector Table CSR 44706c3fb27SDimitry Andric//===----------------------------------------------- 44806c3fb27SDimitry Andric 44906c3fb27SDimitry Andricdef : SysReg<"jvt", 0x017>; 450*0fca6ea1SDimitry Andric 451*0fca6ea1SDimitry Andric//===----------------------------------------------- 452*0fca6ea1SDimitry Andric// Resumable Non-Maskable Interrupts(Smrnmi) CSRs 453*0fca6ea1SDimitry Andric//===----------------------------------------------- 454*0fca6ea1SDimitry Andricdef : SysReg<"mnscratch", 0x740>; 455*0fca6ea1SDimitry Andricdef : SysReg<"mnepc", 0x741>; 456*0fca6ea1SDimitry Andricdef : SysReg<"mncause", 0x742>; 457*0fca6ea1SDimitry Andricdef : SysReg<"mnstatus", 0x744>; 458