xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSREvents/MNretEvent.scala (revision 26d03c882b233b6264a2eded969562fac9650e4a)
1c2a2229dSlewislzhpackage xiangshan.backend.fu.NewCSR.CSREvents
2c2a2229dSlewislzh
3c2a2229dSlewislzhimport chisel3._
4c2a2229dSlewislzhimport chisel3.util._
5c1b28b66STang Haojinimport org.chipsalliance.cde.config.Parameters
6c2a2229dSlewislzhimport utility.{SignExt, ZeroExt}
7c2a2229dSlewislzhimport xiangshan.ExceptionNO
8c2a2229dSlewislzhimport xiangshan.ExceptionNO._
9c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR.CSRBundles.{CauseBundle, OneFieldBundle, PrivState}
10c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR.CSRConfig.{VaddrMaxWidth, XLEN}
11c1b28b66STang Haojinimport xiangshan.backend.fu.NewCSR.CSRDefines.{HgatpMode, PrivMode, SatpMode, VirtMode}
12c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR._
13c1b28b66STang Haojinimport xiangshan.AddrTransType
14c2a2229dSlewislzh
15c2a2229dSlewislzh
16c2a2229dSlewislzhclass MNretEventOutput extends Bundle with EventUpdatePrivStateOutput with EventOutputBase {
17c2a2229dSlewislzh  val mnstatus  = ValidIO((new MnstatusBundle).addInEvent(_.MNPP, _.MNPV, _.NMIE))
186808b803SZehao Liu  val mstatus   = ValidIO((new MstatusBundle).addInEvent(_.MPRV, _.MDT, _.SDT))
196808b803SZehao Liu  val vsstatus  = ValidIO((new SstatusBundle).addInEvent(_.SDT))
20c1b28b66STang Haojin  val targetPc  = ValidIO(new TargetPCBundle)
21c2a2229dSlewislzh}
22c2a2229dSlewislzh
23c2a2229dSlewislzhclass MNretEventInput extends Bundle {
24c2a2229dSlewislzh  val mnstatus = Input(new MnstatusBundle)
25c2a2229dSlewislzh  val mstatus  = Input(new MstatusBundle)
26c2a2229dSlewislzh  val mnepc    = Input(new Epc())
27c1b28b66STang Haojin  val satp     = Input(new SatpBundle)
28c1b28b66STang Haojin  val vsatp    = Input(new SatpBundle)
29c1b28b66STang Haojin  val hgatp    = Input(new HgatpBundle)
306808b803SZehao Liu  val vsstatus = Input(new SstatusBundle)
31c2a2229dSlewislzh}
32c2a2229dSlewislzh
33c1b28b66STang Haojinclass MNretEventModule(implicit p: Parameters) extends Module with CSREventBase {
34c2a2229dSlewislzh  val in = IO(new MNretEventInput)
35c2a2229dSlewislzh  val out = IO(new MNretEventOutput)
36c2a2229dSlewislzh
37c1b28b66STang Haojin  private val satp = in.satp
38c1b28b66STang Haojin  private val vsatp = in.vsatp
39c1b28b66STang Haojin  private val hgatp = in.hgatp
40c1b28b66STang Haojin  private val nextPrivState = out.privState.bits
41c1b28b66STang Haojin
42c1b28b66STang Haojin  private val instrAddrTransType = AddrTransType(
43c1b28b66STang Haojin    bare = nextPrivState.isModeM ||
44c1b28b66STang Haojin           (!nextPrivState.isVirtual && satp.MODE === SatpMode.Bare) ||
45c1b28b66STang Haojin           (nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Bare),
46c1b28b66STang Haojin    sv39 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv39 ||
47c1b28b66STang Haojin           nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv39,
48c1b28b66STang Haojin    sv48 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv48 ||
49c1b28b66STang Haojin           nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv48,
50c1b28b66STang Haojin    sv39x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv39x4,
51c1b28b66STang Haojin    sv48x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv48x4
52c1b28b66STang Haojin  )
53c1b28b66STang Haojin
546808b803SZehao Liu  val outPrivState   = Wire(new PrivState)
556808b803SZehao Liu  outPrivState.PRVM := in.mnstatus.MNPP
566808b803SZehao Liu  outPrivState.V    := Mux(in.mnstatus.MNPP === PrivMode.M, VirtMode.Off.asUInt, in.mnstatus.MNPV.asUInt)
576808b803SZehao Liu
586808b803SZehao Liu  val mnretToM  = outPrivState.isModeM
596808b803SZehao Liu  val mnretToS  = outPrivState.isModeHS
606808b803SZehao Liu  val mnretToVU = outPrivState.isModeVU
616808b803SZehao Liu
62c2a2229dSlewislzh  out := DontCare
63c2a2229dSlewislzh
64c2a2229dSlewislzh  out.privState.valid := valid
65c2a2229dSlewislzh  out.mnstatus .valid := valid
66*26d03c88SZehao Liu  out.mstatus  .valid := valid
67*26d03c88SZehao Liu  out.vsstatus .valid := valid
68c2a2229dSlewislzh  out.targetPc .valid := valid
69c2a2229dSlewislzh
706808b803SZehao Liu  out.privState.bits          := outPrivState
71c2a2229dSlewislzh  out.mnstatus.bits.MNPP      := PrivMode.U
72c2a2229dSlewislzh  out.mnstatus.bits.MNPV      := VirtMode.Off.asUInt
73c2a2229dSlewislzh  out.mnstatus.bits.NMIE      := 1.U
74c2a2229dSlewislzh  out.mstatus.bits.MPRV       := Mux(in.mnstatus.MNPP =/= PrivMode.M, 0.U, in.mstatus.MPRV.asUInt)
756808b803SZehao Liu  // clear MDT when mnret to below M
766808b803SZehao Liu  out.mstatus.bits.MDT        := Mux(mnretToM, in.mstatus.MDT.asBool, 0.U)
776808b803SZehao Liu  out.mstatus.bits.SDT        := Mux(mnretToM || mnretToS, in.mstatus.SDT.asBool, 0.U)
786808b803SZehao Liu  out.vsstatus.bits.SDT       := Mux(mnretToVU, 0.U, in.vsstatus.SDT.asBool)
79c1b28b66STang Haojin  out.targetPc.bits.pc        := in.mnepc.asUInt
80c1b28b66STang Haojin  out.targetPc.bits.raiseIPF  := instrAddrTransType.checkPageFault(in.mnepc.asUInt)
81c1b28b66STang Haojin  out.targetPc.bits.raiseIAF  := instrAddrTransType.checkAccessFault(in.mnepc.asUInt)
82c1b28b66STang Haojin  out.targetPc.bits.raiseIGPF := instrAddrTransType.checkGuestPageFault(in.mnepc.asUInt)
83c2a2229dSlewislzh}
84c2a2229dSlewislzh
85cb36ac0fSXuan Hutrait MNretEventSinkBundle extends EventSinkBundle { self: CSRModule[_ <: CSRBundle] =>
86c2a2229dSlewislzh  val retFromMN = IO(Flipped(new MNretEventOutput))
87c2a2229dSlewislzh
88cb36ac0fSXuan Hu  addUpdateBundleInCSREnumType(retFromMN.getBundleByName(self.modName.toLowerCase()))
89c2a2229dSlewislzh
90cb36ac0fSXuan Hu  reconnectReg()
91c2a2229dSlewislzh}