From 58635ecfb783e146540a3611998158fa04087edf Mon Sep 17 00:00:00 2001 From: John Ingalls Date: Wed, 19 Jan 2022 12:56:11 -0800 Subject: [PATCH] PTWResp gpa_is_pte, now that resp_gf can be set by stage-2 page-fault --- src/main/scala/rocket/PTW.scala | 2 ++ src/main/scala/rocket/TLB.scala | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/scala/rocket/PTW.scala b/src/main/scala/rocket/PTW.scala index 8bc8a08d401..3d53edfb2dd 100644 --- a/src/main/scala/rocket/PTW.scala +++ b/src/main/scala/rocket/PTW.scala @@ -37,6 +37,7 @@ class PTWResp(implicit p: Parameters) extends CoreBundle()(p) { val fragmented_superpage = Bool() val homogeneous = Bool() val gpa = Valid(UInt(vaddrBits.W)) + val gpa_is_pte = Bool() } class TLBPTWIO(implicit p: Parameters) extends CoreBundle()(p) @@ -399,6 +400,7 @@ class PTW(n: Int)(implicit edge: TLEdgeOut, p: Parameters) extends CoreModule()( io.requestor(i).resp.bits.gpa.valid := r_req.need_gpa io.requestor(i).resp.bits.gpa.bits := Cat(Mux(!stage2_final || !r_req.vstage1 || aux_count === (pgLevels - 1), aux_pte.ppn, makeFragmentedSuperpagePPN(aux_pte.ppn)(aux_count)), gpa_pgoff) + io.requestor(i).resp.bits.gpa_is_pte := !stage2_final io.requestor(i).ptbr := io.dpath.ptbr io.requestor(i).hgatp := io.dpath.hgatp io.requestor(i).vsatp := io.dpath.vsatp diff --git a/src/main/scala/rocket/TLB.scala b/src/main/scala/rocket/TLB.scala index 5ee26052ea7..f7b9da0325b 100644 --- a/src/main/scala/rocket/TLB.scala +++ b/src/main/scala/rocket/TLB.scala @@ -207,7 +207,7 @@ class TLB(instruction: Boolean, lgMaxSize: Int, cfg: TLBConfig)(implicit edge: T val r_gpa_valid = Reg(Bool()) val r_gpa = Reg(UInt(vaddrBits.W)) val r_gpa_vpn = Reg(UInt(vpnBits.W)) - val r_gpa_gf = Reg(Bool()) + val r_gpa_is_pte = Reg(Bool()) val priv = io.req.bits.prv val priv_v = usingHypervisor && io.req.bits.v @@ -304,7 +304,7 @@ class TLB(instruction: Boolean, lgMaxSize: Int, cfg: TLBConfig)(implicit edge: T r_gpa_valid := io.ptw.resp.bits.gpa.valid r_gpa := io.ptw.resp.bits.gpa.bits - r_gpa_gf := io.ptw.resp.bits.gf + r_gpa_is_pte := io.ptw.resp.bits.gpa_is_pte } val entries = all_entries.map(_.getData(vpn)) @@ -436,7 +436,7 @@ class TLB(instruction: Boolean, lgMaxSize: Int, cfg: TLBConfig)(implicit edge: T io.resp.prefetchable := (prefetchable_array & hits).orR && edge.manager.managers.forall(m => !m.supportsAcquireB || m.supportsHint) io.resp.miss := do_refill || vsatp_mode_mismatch || tlb_miss || multipleHits io.resp.paddr := Cat(ppn, io.req.bits.vaddr(pgIdxBits-1, 0)) - io.resp.gpa_is_pte := vstage1_en && r_gpa_gf + io.resp.gpa_is_pte := vstage1_en && r_gpa_is_pte io.resp.gpa := { val page = Mux(!vstage1_en, Cat(bad_va, vpn), r_gpa >> pgIdxBits) val offset = Mux(io.resp.gpa_is_pte, r_gpa(pgIdxBits-1, 0), io.req.bits.vaddr(pgIdxBits-1, 0))