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:
Haoyuan Feng 2025-07-24 14:33:47 +08:00 committed by GitHub
parent ab9c3e84d9
commit 2a4e953c6a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 2 additions and 2 deletions

View File

@ -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.level.map(_ := 0.U)
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.tag := vpn(vpnLen - 1, sectortlbwidth)
// LLPTW will not handle onlyS2 situations

View File

@ -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))
ptw_resp.ppn := resp_pte.getPPN()(ptePPNLen - 1, sectortlbwidth)
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.level.map(_ := level)
ptw_resp.perm.map(_ := resp_pte.getPerm())