fix(L2TLB): fix check condition for Napot pages (#4900)
The Napot extension requires that the lower 4 bits of the page table's PPN satisfy 4'b1000. However, `pte_in.getPPN()` contains the original PPN value, while ptw_resp.ppn has already been truncated once. So we should use `pte_in.getPPN()` here to check Napot pages.
This commit is contained in:
parent
ab9c3e84d9
commit
2a4e953c6a
|
@ -699,7 +699,7 @@ class L2TLBImp(outer: L2TLB)(implicit p: Parameters) extends PtwModule(outer) wi
|
||||||
ptw_resp.ppn_low := pte_in.getPPN()(sectortlbwidth - 1, 0)
|
ptw_resp.ppn_low := pte_in.getPPN()(sectortlbwidth - 1, 0)
|
||||||
ptw_resp.level.map(_ := 0.U)
|
ptw_resp.level.map(_ := 0.U)
|
||||||
ptw_resp.pbmt := pte_in.pbmt
|
ptw_resp.pbmt := pte_in.pbmt
|
||||||
ptw_resp.n.map(_ := pte_in.n === true.B && ptw_resp.ppn(3, 0) === 8.U)
|
ptw_resp.n.map(_ := pte_in.n === true.B && pte_in.getPPN()(3, 0) === 8.U)
|
||||||
ptw_resp.perm.map(_ := pte_in.getPerm())
|
ptw_resp.perm.map(_ := pte_in.getPerm())
|
||||||
ptw_resp.tag := vpn(vpnLen - 1, sectortlbwidth)
|
ptw_resp.tag := vpn(vpnLen - 1, sectortlbwidth)
|
||||||
// LLPTW will not handle onlyS2 situations
|
// LLPTW will not handle onlyS2 situations
|
||||||
|
|
|
@ -1246,7 +1246,7 @@ class PtwMergeResp(implicit p: Parameters) extends PtwBundle {
|
||||||
val ptw_resp = Wire(new PtwMergeEntry(tagLen = sectorvpnLen, hasPerm = true, hasLevel = true, hasNapot = true))
|
val ptw_resp = Wire(new PtwMergeEntry(tagLen = sectorvpnLen, hasPerm = true, hasLevel = true, hasNapot = true))
|
||||||
ptw_resp.ppn := resp_pte.getPPN()(ptePPNLen - 1, sectortlbwidth)
|
ptw_resp.ppn := resp_pte.getPPN()(ptePPNLen - 1, sectortlbwidth)
|
||||||
ptw_resp.ppn_low := resp_pte.getPPN()(sectortlbwidth - 1, 0)
|
ptw_resp.ppn_low := resp_pte.getPPN()(sectortlbwidth - 1, 0)
|
||||||
ptw_resp.n.map(_ := resp_pte.n === true.B && ptw_resp.ppn(3, 0) === 8.U && level === 0.U)
|
ptw_resp.n.map(_ := resp_pte.n === true.B && resp_pte.getPPN()(3, 0) === 8.U && level === 0.U)
|
||||||
ptw_resp.pbmt := resp_pte.pbmt
|
ptw_resp.pbmt := resp_pte.pbmt
|
||||||
ptw_resp.level.map(_ := level)
|
ptw_resp.level.map(_ := level)
|
||||||
ptw_resp.perm.map(_ := resp_pte.getPerm())
|
ptw_resp.perm.map(_ := resp_pte.getPerm())
|
||||||
|
|
Loading…
Reference in New Issue