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