xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/HypervisorLevel.scala (revision 01cdded87283f55be427ca849d18baa3e9459c2d)
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 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  }))
74    .setAddr(0x609)
75
76  val henvcfg = Module(new CSRModule("Henvcfg", new CSRBundle {
77    val FIOM  = RW(0)     // Fence of I/O implies Memory
78    val CBIE  = RW(5, 4)  // Zicbom Enable
79    val CBCFE = RW(6)     // Zicbom Enable
80    val CBZE  = RW(7)     // Zicboz Enable
81    val PBMTE = RW(62)    // Svpbmt Enable
82    val STCE  = RW(63)    // Sstc Enable
83  }))
84    .setAddr(0x60A)
85
86  val htval = Module(new CSRModule("Htval", new CSRBundle {
87    val ALL = RW(63, 0)
88  }) with TrapEntryHSEventSinkBundle)
89    .setAddr(0x643)
90
91  val hip = Module(new CSRModule("Hip", new HipBundle) with HypervisorBundle with HasExternalInterruptBundle {
92    val fromVSip = IO(Flipped(new VSipToHip))
93    val toHvip = IO(new HipToHvip)
94
95    rdata.VSSIP := hvip.VSSIP
96    rdata.VSTIP := hvip.VSTIP.asUInt.asBool | platformIRP.VSTIP
97    rdata.VSEIP := hvip.VSEIP.asUInt.asBool | platformIRP.VSEIP | hgeip.ip.asUInt(hstatus.VGEIN.asUInt)
98    rdata.SGEIP := (hgeip.ip.asUInt | hgeie.ie.asUInt).orR
99
100    // hip.VSEIP is read only
101    // hip.VSTIP is read only
102    // hip.VSSIP is alias of hvip.VSSIP
103    // vsip.SSIP is alias of hip.VSSIP
104    toHvip.VSSIP.valid := fromVSip.SSIP.valid || wen
105    toHvip.VSSIP.bits := Mux1H(Seq(
106      fromVSip.SSIP.valid -> fromVSip.SSIP.bits,
107      wen                 -> wdata.VSSIP
108    ))
109  })
110    .setAddr(0x644)
111
112  val hvip = Module(new CSRModule("Hvip", new CSRBundle {
113    val VSSIP = RW( 2)
114    val VSTIP = RW( 6)
115    val VSEIP = RW(10)
116  }) {
117    val fromHip = IO(Flipped(new HipToHvip))
118    when (fromHip.VSSIP.valid) { reg.VSSIP := fromHip.VSSIP.bits }
119  })
120    .setAddr(0x645)
121
122  hvip.fromHip := hip.toHvip
123
124  val hviprio1 = Module(new CSRModule("Hviprio1", new CSRBundle {
125    val PrioSSI = RW(15,  8)
126    val PrioSTI = RW(31, 24)
127    val PrioCOI = RW(47, 40)
128    val Prio14  = RW(55, 48)
129    val Prio15  = RW(63, 56)
130  }))
131    .setAddr(0x646)
132
133  val hviprio2 = Module(new CSRModule("Hviprio2", new CSRBundle {
134    val Prio16  = RW( 7,  0)
135    val Prio17  = RW(15,  8)
136    val Prio18  = RW(23, 16)
137    val Prio19  = RW(31, 24)
138    val Prio20  = RW(39, 32)
139    val Prio21  = RW(47, 40)
140    val Prio22  = RW(55, 48)
141    val Prio23  = RW(63, 56)
142  }))
143    .setAddr(0x647)
144
145  val htinst = Module(new CSRModule("Htinst", new CSRBundle {
146    val ALL = RO(63, 0)
147  }) with TrapEntryHSEventSinkBundle)
148    .setAddr(0x64A)
149
150  val hgatp = Module(new CSRModule("Hgatp", new CSRBundle {
151    val MODE = HgatpMode(63, 60, wNoFilter)
152    // WARL in privileged spec.
153    // RW, since we support max width of VMID
154    val VMID = RW(44 - 1 + VMIDLEN, 44)
155    val PPN = RW(43, 0)
156  }) {
157    // Ref: 13.2.10. Hypervisor Guest Address Translation and Protection Register (hgatp)
158    // A write to hgatp with an unsupported MODE value is not ignored as it is for satp. Instead, the fields of
159    // hgatp are WARL in the normal way, when so indicated.
160  })
161    .setAddr(0x680)
162
163  val hgeip = Module(new CSRModule("Hgeip", new HgeipBundle))
164    .setAddr(0xE12)
165
166  val hypervisorCSRMods: Seq[CSRModule[_]] = Seq(
167    hstatus,
168    hedeleg,
169    hideleg,
170    hie,
171    htimedelta,
172    hcounteren,
173    hgeie,
174    hvien,
175    hvictl,
176    henvcfg,
177    htval,
178    hip,
179    hvip,
180    hviprio1,
181    hviprio2,
182    htinst,
183    hgatp,
184    hgeip,
185  )
186
187  val hypervisorCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], Data)] = SeqMap.from(
188    hypervisorCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata.asInstanceOf[CSRBundle].asUInt))).iterator
189  )
190
191  val hypervisorCSROutMap: SeqMap[Int, UInt] = SeqMap.from(
192    hypervisorCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator
193  )
194}
195
196class HstatusBundle extends CSRBundle {
197
198  val VSBE  = RO(5).withReset(0.U)
199  val GVA   = RW(6)
200  val SPV   = VirtMode(7)
201  val SPVP  = RW(8)
202  val HU    = RW(9)
203  val VGEIN = HstatusVgeinField(17, 12, wNoFilter, rNoFilter)
204  val VTVM  = RW(20)
205  val VTM   = RW(21)
206  val VTSR  = RW(22)
207  val VSXL  = XLENField(33, 32).withReset(XLENField.XLEN64)
208
209}
210
211object HstatusVgeinField extends CSREnum with WLRLApply {
212  override def isLegal(enum: CSREnumType): Bool = enum.asUInt <= GEILEN.U
213}
214
215class HstatusModule(implicit p: Parameters) extends CSRModule("Hstatus", new HstatusBundle)
216  with SretEventSinkBundle
217  with TrapEntryHSEventSinkBundle
218
219class HvipBundle extends CSRBundle {
220  val VSSIP = RW(2)
221  val VSTIP = RW(6)
222  val VSEIP = RW(10)
223}
224
225class HieBundle extends CSRBundle {
226  val VSSIE = RW( 2)
227  val VSTIE = RW( 6)
228  val VSEIE = RW(10)
229  val SGEIE = RW(12)
230}
231
232class HipBundle extends CSRBundle {
233  val VSSIP = RW( 2) // alias of hvip.VSSIP
234  val VSTIP = RO( 6) // hvip.VSTIP | PLIC.VSTIP
235  val VSEIP = RO(10) // hvip.VSEIP | hgeip(hstatus.VGEIN) | PLIC.VSEIP
236  val SGEIP = RO(12) // |(hgeip & hegie)
237}
238
239class HgeieBundle extends CSRBundle {
240  val ie = RW(GEILEN, 1)
241  // bit 0 is read only 0
242}
243
244class HgeipBundle extends CSRBundle {
245  val ip = RW(GEILEN, 1)
246  // bit 0 is read only 0
247}
248
249class HedelegBundle extends ExceptionBundle {
250  // default RW
251  this.EX_HSCALL.setRO()
252  this.EX_VSCALL.setRO()
253  this.EX_MCALL .setRO()
254  this.EX_IGPF  .setRO()
255  this.EX_LGPF  .setRO()
256  this.EX_VI    .setRO()
257  this.EX_SGPF  .setRO()
258}
259
260class HidelegBundle extends InterruptBundle {
261  // default RW
262  this.SSI .setRO()
263  this.MSI .setRO()
264  this.STI .setRO()
265  this.MTI .setRO()
266  this.SEI .setRO()
267  this.MEI .setRO()
268  this.SGEI.setRO()
269}
270
271class HipToHvip extends Bundle {
272  val VSSIP = ValidIO(RW(0))
273}
274
275trait HypervisorBundle { self: CSRModule[_] =>
276  val hstatus = IO(Input(new HstatusBundle))
277  val hvip    = IO(Input(new HvipBundle))
278  val hideleg = IO(Input(new HidelegBundle))
279  val hedeleg = IO(Input(new HedelegBundle))
280  val hgeip   = IO(Input(new HgeipBundle))
281  val hgeie   = IO(Input(new HgeieBundle))
282  val hip     = IO(Input(new HipBundle))
283  val hie     = IO(Input(new HieBundle))
284}
285