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