xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/HypervisorLevel.scala (revision 039cdc35f5f3b68b6295ec5ace90f22a77322e02)
1package xiangshan.backend.fu.NewCSR
2
3import chisel3._
4import chisel3.util._
5import xiangshan.backend.fu.NewCSR.CSRDefines.{
6  CSRRWField => RW,
7  CSRROField => RO,
8  CSRWLRLField => WLRL,
9  CSRWARLField => WARL,
10  _
11}
12import xiangshan.backend.fu.NewCSR.CSRFunc._
13import xiangshan.backend.fu.NewCSR.CSRConfig._
14import xiangshan.backend.fu.NewCSR.CSRBundles._
15
16import scala.collection.immutable.SeqMap
17import xiangshan.backend.fu.NewCSR.CSREnumTypeImplicitCast._
18
19trait HypervisorLevel { self: NewCSR =>
20
21  val hstatus = Module(new HstatusModule)
22    .setAddr(0x600)
23
24  val hedeleg = Module(new CSRModule("Hedeleg", new HedelegBundle))
25    .setAddr(0x602)
26
27  val hideleg = Module(new CSRModule("Hideleg", new HidelegBundle))
28    .setAddr(0x603)
29
30  val hie = Module(new CSRModule("Hie", new HieBundle) with HypervisorBundle {
31    val fromVSie = IO(Flipped(new VSieToHie))
32    val fromMie = IO(Flipped(new MieToHie))
33
34    when (fromVSie.SSIE.valid) { reg.VSSIE := fromVSie.SSIE.bits }
35    when (fromVSie.STIE.valid) { reg.VSTIE := fromVSie.STIE.bits }
36    when (fromVSie.SEIE.valid) { reg.VSEIE := fromVSie.SEIE.bits }
37    when (fromMie.VSSIE.valid) { reg.VSSIE := fromMie.VSSIE.bits }
38    when (fromMie.VSTIE.valid) { reg.VSTIE := fromMie.VSTIE.bits }
39    when (fromMie.VSEIE.valid) { reg.VSEIE := fromMie.VSEIE.bits }
40    when (fromMie.SGEIE.valid) { reg.SGEIE := fromMie.SGEIE.bits }
41  }).setAddr(0x604)
42
43  hie.fromMie := mie.toHie
44
45  val htimedelta = Module(new CSRModule("Htimedelta", new CSRBundle {
46    val VALUE = RW(63, 0)
47  })).setAddr(0x605)
48
49  val hcounteren = Module(new CSRModule("Hcounteren", new Counteren)).setAddr(0x606)
50
51  val hgeie = Module(new CSRModule("Hgeie", new HgeieBundle))
52    .setAddr(0x607)
53
54  val hvien = Module(new CSRModule("Hvien", new CSRBundle {
55    val ien = RW(63, 13)
56    // bits 12:0 read only 0
57  })).setAddr(0x608)
58
59  val hvictl = Module(new CSRModule("Hvictl", new CSRBundle {
60    // Virtual Trap Interrupt control
61    val VTI    = RW  (30)
62    // WARL in AIA spec.
63    // RW, since we support max width of IID
64    val IID    = RW  (15 + HIIDWidth, 16)
65    // determines the interrupt’s presumed default priority order relative to a (virtual) supervisor external interrupt (SEI), major identity 9
66    // 0 = interrupt has higher default priority than an SEI
67    // 1 = interrupt has lower default priority than an SEI
68    // When hvictl.IID = 9, DPR is ignored.
69    // Todo: sort the interrupt specified by hvictl with DPR
70    val DPR    = RW  (9)
71    val IPRIOM = RW  (8)
72    val IPRIO  = RW  ( 7,  0)
73  })).setAddr(0x609)
74
75  val henvcfg = Module(new CSRModule("Henvcfg", new CSRBundle {
76    val FIOM  = RW(0)     // Fence of I/O implies Memory
77    val CBIE  = RW(5, 4)  // Zicbom Enable
78    val CBCFE = RW(6)     // Zicbom Enable
79    val CBZE  = RW(7)     // Zicboz Enable
80    val PBMTE = RW(62)    // Svpbmt Enable
81    val STCE  = RW(63)    // Sstc Enable
82  })).setAddr(0x60A)
83
84  val htval = Module(new CSRModule("Htval", new CSRBundle {
85    val ALL = RW(63, 0)
86  })).setAddr(0x643)
87
88  val hip = Module(new CSRModule("Hip", new HipBundle) with HypervisorBundle with HasExternalInterruptBundle {
89    val fromVSip = IO(Flipped(new VSipToHip))
90    val toHvip = IO(new HipToHvip)
91
92    rdata.VSSIP := hvip.VSSIP
93    rdata.VSTIP := hvip.VSTIP.asUInt.asBool | platformIRP.VSTIP
94    rdata.VSEIP := hvip.VSEIP.asUInt.asBool | platformIRP.VSEIP | hgeip.ip.asUInt(hstatus.VGEIN.asUInt)
95    rdata.SGEIP := (hgeip.ip.asUInt | hgeie.ie.asUInt).orR
96
97    // hip.VSEIP is read only
98    // hip.VSTIP is read only
99    // hip.VSSIP is alias of hvip.VSSIP
100    // vsip.SSIP is alias of hip.VSSIP
101    toHvip.VSSIP.valid := fromVSip.SSIP.valid || wen
102    toHvip.VSSIP.bits := Mux1H(Seq(
103      fromVSip.SSIP.valid -> fromVSip.SSIP.bits,
104      wen                 -> wdata.VSSIP
105    ))
106  }).setAddr(0x644)
107
108  val hvip = Module(new CSRModule("Hvip", new CSRBundle {
109    val VSSIP = RW( 2)
110    val VSTIP = RW( 6)
111    val VSEIP = RW(10)
112  }) {
113    val fromHip = IO(Flipped(new HipToHvip))
114    when (fromHip.VSSIP.valid) { reg.VSSIP := fromHip.VSSIP.bits }
115  }).setAddr(0x645)
116
117  hvip.fromHip := hip.toHvip
118
119  val hviprio1 = Module(new CSRModule("Hviprio1", new CSRBundle {
120    val PrioSSI = RW(15,  8)
121    val PrioSTI = RW(31, 24)
122    val PrioCOI = RW(47, 40)
123    val Prio14  = RW(55, 48)
124    val Prio15  = RW(63, 56)
125  })).setAddr(0x646)
126
127  val hviprio2 = Module(new CSRModule("Hviprio2", new CSRBundle {
128    val Prio16  = RW( 7,  0)
129    val Prio17  = RW(15,  8)
130    val Prio18  = RW(23, 16)
131    val Prio19  = RW(31, 24)
132    val Prio20  = RW(39, 32)
133    val Prio21  = RW(47, 40)
134    val Prio22  = RW(55, 48)
135    val Prio23  = RW(63, 56)
136  })).setAddr(0x647)
137
138  val htinst = Module(new CSRModule("Htinst", new CSRBundle {
139    val ALL = RO(63, 0)
140  })).setAddr(0x64A)
141
142  val hgatp = Module(new CSRModule("Hgatp", new CSRBundle {
143    val MODE = HgatpMode(63, 60, wNoFilter)
144    // WARL in privileged spec.
145    // RW, since we support max width of VMID
146    val VMID = RW(44 - 1 + VMIDLEN, 44)
147    val PPN = RW(43, 0)
148  }) {
149    // Ref: 13.2.10. Hypervisor Guest Address Translation and Protection Register (hgatp)
150    // A write to hgatp with an unsupported MODE value is not ignored as it is for satp. Instead, the fields of
151    // hgatp are WARL in the normal way, when so indicated.
152  }).setAddr(0x680)
153
154  val hgeip = Module(new CSRModule("Hgeip", new HgeipBundle)).setAddr(0xE12)
155
156  val hypervisorCSRMods: Seq[CSRModule[_]] = Seq(
157    hstatus,
158    hedeleg,
159    hideleg,
160    hie,
161    htimedelta,
162    hcounteren,
163    hgeie,
164    hvien,
165    hvictl,
166    henvcfg,
167    htval,
168    hip,
169    hvip,
170    hviprio1,
171    hviprio2,
172    htinst,
173    hgatp,
174    hgeip,
175  )
176
177  val hypervisorCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], Data)] = SeqMap.from(
178    hypervisorCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata.asInstanceOf[CSRBundle].asUInt))).iterator
179  )
180}
181
182class HstatusBundle extends CSRBundle {
183
184  val VSBE  = RO(5).withReset(0.U)
185  val GVA   = RW(6)
186  val SPV   = RW(7)
187  val SPVP  = RW(8)
188  val HU    = RW(9)
189  val VGEIN = HstatusVgeinField(17, 12, wNoFilter, rNoFilter)
190  val VTVM  = RW(20)
191  val VTM   = RW(21)
192  val VTSR  = RW(22)
193  val VSXL  = XLENField(33, 32).withReset(XLENField.XLEN64)
194
195}
196
197object HstatusVgeinField extends CSREnum with CSRWLRLApply {
198  override def isLegal(enum: CSREnumType): Bool = enum.asUInt <= GEILEN.U
199}
200
201class HstatusModule extends CSRModule("Hstatus", new HstatusBundle)
202
203class HvipBundle extends CSRBundle {
204  val VSSIP = RW(2)
205  val VSTIP = RW(6)
206  val VSEIP = RW(10)
207}
208
209class HieBundle extends CSRBundle {
210  val VSSIE = RW( 2)
211  val VSTIE = RW( 6)
212  val VSEIE = RW(10)
213  val SGEIE = RW(12)
214}
215
216class HipBundle extends CSRBundle {
217  val VSSIP = RW( 2) // alias of hvip.VSSIP
218  val VSTIP = RO( 6) // hvip.VSTIP | PLIC.VSTIP
219  val VSEIP = RO(10) // hvip.VSEIP | hgeip(hstatus.VGEIN) | PLIC.VSEIP
220  val SGEIP = RO(12) // |(hgeip & hegie)
221}
222
223class HgeieBundle extends CSRBundle {
224  val ie = RW(GEILEN, 1)
225  // bit 0 is read only 0
226}
227
228class HgeipBundle extends CSRBundle {
229  val ip = RW(GEILEN, 1)
230  // bit 0 is read only 0
231}
232
233class HedelegBundle extends ExceptionBundle {
234  // default RW
235  this.EX_HSCALL.setRO()
236  this.EX_VSCALL.setRO()
237  this.EX_MCALL .setRO()
238  this.EX_IGPF  .setRO()
239  this.EX_LGPF  .setRO()
240  this.EX_VI    .setRO()
241  this.EX_SGPF  .setRO()
242}
243
244class HidelegBundle extends InterruptBundle {
245  // default RW
246  this.SSI .setRO()
247  this.MSI .setRO()
248  this.STI .setRO()
249  this.MTI .setRO()
250  this.SEI .setRO()
251  this.MEI .setRO()
252  this.SGEI.setRO()
253}
254
255class HipToHvip extends Bundle {
256  val VSSIP = ValidIO(RW(0))
257}
258
259trait HypervisorBundle { self: CSRModule[_] =>
260  val hstatus = IO(Input(new HstatusBundle))
261  val hvip    = IO(Input(new HvipBundle))
262  val hideleg = IO(Input(new HidelegBundle))
263  val hedeleg = IO(Input(new HedelegBundle))
264  val hgeip   = IO(Input(new HgeipBundle))
265  val hgeie   = IO(Input(new HgeieBundle))
266  val hip     = IO(Input(new HipBundle))
267  val hie     = IO(Input(new HieBundle))
268}
269