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