xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSREvents/MretEvent.scala (revision 6808b8030a5ec6cf43824f1d575b050426f1c427)
1237d4cfdSXuan Hupackage xiangshan.backend.fu.NewCSR.CSREvents
2237d4cfdSXuan Hu
3237d4cfdSXuan Huimport chisel3._
4237d4cfdSXuan Huimport chisel3.util._
5c1b28b66STang Haojinimport org.chipsalliance.cde.config.Parameters
6237d4cfdSXuan Huimport utility.{SignExt, ZeroExt}
7237d4cfdSXuan Huimport xiangshan.ExceptionNO
8237d4cfdSXuan Huimport xiangshan.ExceptionNO._
9237d4cfdSXuan Huimport xiangshan.backend.fu.NewCSR.CSRBundles.{CauseBundle, OneFieldBundle, PrivState}
10237d4cfdSXuan Huimport xiangshan.backend.fu.NewCSR.CSRConfig.{VaddrMaxWidth, XLEN}
11c1b28b66STang Haojinimport xiangshan.backend.fu.NewCSR.CSRDefines.{HgatpMode, PrivMode, SatpMode, VirtMode}
12237d4cfdSXuan Huimport xiangshan.backend.fu.NewCSR._
13c1b28b66STang Haojinimport xiangshan.AddrTransType
14237d4cfdSXuan Hu
15237d4cfdSXuan Hu
16237d4cfdSXuan Huclass MretEventOutput extends Bundle with EventUpdatePrivStateOutput with EventOutputBase {
17*6808b803SZehao Liu  val mstatus  = ValidIO((new MstatusBundle).addInEvent(_.MPP, _.MPV, _.MIE, _.MPIE, _.MPRV, _.MDT, _.SDT))
18*6808b803SZehao Liu  val vsstatus = ValidIO((new SstatusBundle).addInEvent(_.SDT))
19c1b28b66STang Haojin  val targetPc = ValidIO(new TargetPCBundle)
20237d4cfdSXuan Hu}
21237d4cfdSXuan Hu
22237d4cfdSXuan Huclass MretEventInput extends Bundle {
23237d4cfdSXuan Hu  val mstatus  = Input(new MstatusBundle)
24*6808b803SZehao Liu  val vsstatus = Input(new SstatusBundle)
25237d4cfdSXuan Hu  val mepc     = Input(new Epc())
26c1b28b66STang Haojin  val satp     = Input(new SatpBundle)
27c1b28b66STang Haojin  val vsatp    = Input(new SatpBundle)
28c1b28b66STang Haojin  val hgatp    = Input(new HgatpBundle)
29237d4cfdSXuan Hu}
30237d4cfdSXuan Hu
31c1b28b66STang Haojinclass MretEventModule(implicit p: Parameters) extends Module with CSREventBase {
32237d4cfdSXuan Hu  val in = IO(new MretEventInput)
33237d4cfdSXuan Hu  val out = IO(new MretEventOutput)
34237d4cfdSXuan Hu
35c1b28b66STang Haojin  private val satp = in.satp
36c1b28b66STang Haojin  private val vsatp = in.vsatp
37c1b28b66STang Haojin  private val hgatp = in.hgatp
38c1b28b66STang Haojin  private val nextPrivState = out.privState.bits
39c1b28b66STang Haojin
40c1b28b66STang Haojin  private val instrAddrTransType = AddrTransType(
41c1b28b66STang Haojin    bare = nextPrivState.isModeM ||
42c1b28b66STang Haojin           (!nextPrivState.isVirtual && satp.MODE === SatpMode.Bare) ||
43c1b28b66STang Haojin           (nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Bare),
44c1b28b66STang Haojin    sv39 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv39 ||
45c1b28b66STang Haojin           nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv39,
46c1b28b66STang Haojin    sv48 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv48 ||
47c1b28b66STang Haojin           nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv48,
48c1b28b66STang Haojin    sv39x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv39x4,
49c1b28b66STang Haojin    sv48x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv48x4
50c1b28b66STang Haojin  )
51*6808b803SZehao Liu  val outPrivState   = Wire(new PrivState)
52*6808b803SZehao Liu  outPrivState.PRVM := in.mstatus.MPP
53*6808b803SZehao Liu  outPrivState.V    := Mux(in.mstatus.MPP === PrivMode.M, VirtMode.Off.asUInt, in.mstatus.MPV.asUInt)
54*6808b803SZehao Liu
55*6808b803SZehao Liu  val mretToM  = outPrivState.isModeM
56*6808b803SZehao Liu  val mretToS  = outPrivState.isModeHS
57*6808b803SZehao Liu  val mretToVu = outPrivState.isModeVU
58c1b28b66STang Haojin
59237d4cfdSXuan Hu  out := DontCare
60237d4cfdSXuan Hu
61237d4cfdSXuan Hu  out.privState.valid := valid
62237d4cfdSXuan Hu  out.mstatus  .valid := valid
63237d4cfdSXuan Hu  out.targetPc .valid := valid
64237d4cfdSXuan Hu
65*6808b803SZehao Liu  out.privState.bits          := outPrivState
66237d4cfdSXuan Hu  out.mstatus.bits.MPP        := PrivMode.U
67c2a2229dSlewislzh  out.mstatus.bits.MPV        := VirtMode.Off.asUInt
68237d4cfdSXuan Hu  out.mstatus.bits.MIE        := in.mstatus.MPIE
69237d4cfdSXuan Hu  out.mstatus.bits.MPIE       := 1.U
70237d4cfdSXuan Hu  out.mstatus.bits.MPRV       := Mux(in.mstatus.MPP =/= PrivMode.M, 0.U, in.mstatus.MPRV.asUInt)
71*6808b803SZehao Liu  // clear MDT when return mret always execute in M mode
72*6808b803SZehao Liu  out.mstatus.bits.MDT    := 0.U
73*6808b803SZehao Liu  // clear sstatus.SDT when return mode below M and HS
74*6808b803SZehao Liu  out.mstatus.bits.SDT    := Mux(mretToM || mretToS, in.mstatus.SDT.asBool, 0.U)
75*6808b803SZehao Liu  // clear vsstatus.SDT when return to VU
76*6808b803SZehao Liu  out.vsstatus.bits.SDT   := Mux(mretToVu, 0.U, in.vsstatus.SDT.asBool)
77*6808b803SZehao Liu
78c1b28b66STang Haojin  out.targetPc.bits.pc        := in.mepc.asUInt
79c1b28b66STang Haojin  out.targetPc.bits.raiseIPF  := instrAddrTransType.checkPageFault(in.mepc.asUInt)
80c1b28b66STang Haojin  out.targetPc.bits.raiseIAF  := instrAddrTransType.checkAccessFault(in.mepc.asUInt)
81c1b28b66STang Haojin  out.targetPc.bits.raiseIGPF := instrAddrTransType.checkGuestPageFault(in.mepc.asUInt)
82237d4cfdSXuan Hu}
83237d4cfdSXuan Hu
84cb36ac0fSXuan Hutrait MretEventSinkBundle extends EventSinkBundle { self: CSRModule[_ <: CSRBundle] =>
85237d4cfdSXuan Hu  val retFromM = IO(Flipped(new MretEventOutput))
86237d4cfdSXuan Hu
87cb36ac0fSXuan Hu  addUpdateBundleInCSREnumType(retFromM.getBundleByName(self.modName.toLowerCase()))
88237d4cfdSXuan Hu
89cb36ac0fSXuan Hu  reconnectReg()
90237d4cfdSXuan Hu}
91