xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/HypervisorLevel.scala (revision c2650312b580f636dcbe07b8ba84fa3d8b9d3e3d)
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
191class HstatusBundle extends CSRBundle {
192
193  val VSBE  = RO(5).withReset(0.U)
194  val GVA   = RW(6)
195  val SPV   = VirtMode(7)
196  val SPVP  = RW(8)
197  val HU    = RW(9)
198  val VGEIN = HstatusVgeinField(17, 12, wNoFilter, rNoFilter)
199  val VTVM  = RW(20)
200  val VTM   = RW(21)
201  val VTSR  = RW(22)
202  val VSXL  = XLENField(33, 32).withReset(XLENField.XLEN64)
203
204}
205
206object HstatusVgeinField extends CSREnum with CSRWLRLApply {
207  override def isLegal(enum: CSREnumType): Bool = enum.asUInt <= GEILEN.U
208}
209
210class HstatusModule extends CSRModule("Hstatus", new HstatusBundle)
211  with SretEventSinkBundle
212  with TrapEntryHSEventSinkBundle
213
214class HvipBundle extends CSRBundle {
215  val VSSIP = RW(2)
216  val VSTIP = RW(6)
217  val VSEIP = RW(10)
218}
219
220class HieBundle extends CSRBundle {
221  val VSSIE = RW( 2)
222  val VSTIE = RW( 6)
223  val VSEIE = RW(10)
224  val SGEIE = RW(12)
225}
226
227class HipBundle extends CSRBundle {
228  val VSSIP = RW( 2) // alias of hvip.VSSIP
229  val VSTIP = RO( 6) // hvip.VSTIP | PLIC.VSTIP
230  val VSEIP = RO(10) // hvip.VSEIP | hgeip(hstatus.VGEIN) | PLIC.VSEIP
231  val SGEIP = RO(12) // |(hgeip & hegie)
232}
233
234class HgeieBundle extends CSRBundle {
235  val ie = RW(GEILEN, 1)
236  // bit 0 is read only 0
237}
238
239class HgeipBundle extends CSRBundle {
240  val ip = RW(GEILEN, 1)
241  // bit 0 is read only 0
242}
243
244class HedelegBundle extends ExceptionBundle {
245  // default RW
246  this.EX_HSCALL.setRO()
247  this.EX_VSCALL.setRO()
248  this.EX_MCALL .setRO()
249  this.EX_IGPF  .setRO()
250  this.EX_LGPF  .setRO()
251  this.EX_VI    .setRO()
252  this.EX_SGPF  .setRO()
253}
254
255class HidelegBundle extends InterruptBundle {
256  // default RW
257  this.SSI .setRO()
258  this.MSI .setRO()
259  this.STI .setRO()
260  this.MTI .setRO()
261  this.SEI .setRO()
262  this.MEI .setRO()
263  this.SGEI.setRO()
264}
265
266class HipToHvip extends Bundle {
267  val VSSIP = ValidIO(RW(0))
268}
269
270trait HypervisorBundle { self: CSRModule[_] =>
271  val hstatus = IO(Input(new HstatusBundle))
272  val hvip    = IO(Input(new HvipBundle))
273  val hideleg = IO(Input(new HidelegBundle))
274  val hedeleg = IO(Input(new HedelegBundle))
275  val hgeip   = IO(Input(new HgeipBundle))
276  val hgeie   = IO(Input(new HgeieBundle))
277  val hip     = IO(Input(new HipBundle))
278  val hie     = IO(Input(new HieBundle))
279}
280