mirror of
https://github.com/chipsalliance/rocket-chip.git
synced 2026-05-29 00:30:12 +08:00
PTW: access vs guest page fault exception prioritization for Stage-1 PTEs with unsupported GPA sizes (#3789)
This commit is contained in:
@@ -310,7 +310,7 @@ class PTW(n: Int)(implicit edge: TLEdgeOut, p: Parameters) extends CoreModule()(
|
||||
when (count <= i.U && tmp.ppn((pgLevels-1-i)*pgLevelBits-1, (pgLevels-2-i)*pgLevelBits) =/= 0.U) { res.v := false.B }
|
||||
}
|
||||
(res,
|
||||
Mux(do_both_stages && !stage2, (tmp.ppn >> vpnBits) =/= 0.U, (tmp.ppn >> ppnBits) =/= 0.U),
|
||||
!(do_both_stages && !stage2) && ((tmp.ppn >> ppnBits) =/= 0.U),
|
||||
do_both_stages && !stage2 && checkInvalidHypervisorGPA(r_hgatp, tmp.ppn))
|
||||
}
|
||||
// find non-leaf PTE, need traverse
|
||||
@@ -742,8 +742,8 @@ class PTW(n: Int)(implicit edge: TLEdgeOut, p: Parameters) extends CoreModule()(
|
||||
resp_valid(r_req_dest) := true.B
|
||||
}
|
||||
|
||||
resp_ae_ptw := ae && count < (pgLevels-1).U && pte.table()
|
||||
resp_ae_final := ae && pte.leaf()
|
||||
resp_ae_ptw := ae && ((count < (pgLevels-1).U && pte.table()) || (do_both_stages && !stage2_final))
|
||||
resp_ae_final := ae && pte.leaf() && !(do_both_stages && !stage2_final)
|
||||
resp_pf := pf && !stage2
|
||||
resp_gf := gf || (pf && stage2)
|
||||
resp_hr := !stage2 || (!pf && !gf && pte.ur())
|
||||
|
||||
@@ -597,9 +597,9 @@ class TLB(instruction: Boolean, lgMaxSize: Int, cfg: TLBConfig)(implicit edge: T
|
||||
val pf_ld_array = Mux(cmd_read, ((~Mux(cmd_readx, x_array, r_array) & ~ptw_ae_array) | ptw_pf_array) & ~ptw_gf_array, 0.U)
|
||||
val pf_st_array = Mux(cmd_write_perms, ((~w_array & ~ptw_ae_array) | ptw_pf_array) & ~ptw_gf_array, 0.U)
|
||||
val pf_inst_array = ((~x_array & ~ptw_ae_array) | ptw_pf_array) & ~ptw_gf_array
|
||||
val gf_ld_array = Mux(priv_v && cmd_read, (~Mux(cmd_readx, hx_array, hr_array) | ptw_gf_array) & ~ptw_ae_array, 0.U)
|
||||
val gf_st_array = Mux(priv_v && cmd_write_perms, (~hw_array | ptw_gf_array) & ~ptw_ae_array, 0.U)
|
||||
val gf_inst_array = Mux(priv_v, (~hx_array | ptw_gf_array) & ~ptw_ae_array, 0.U)
|
||||
val gf_ld_array = Mux(priv_v && cmd_read, (~Mux(cmd_readx, hx_array, hr_array) & ~ptw_ae_array) | ptw_gf_array, 0.U)
|
||||
val gf_st_array = Mux(priv_v && cmd_write_perms, (~hw_array & ~ptw_ae_array) | ptw_gf_array, 0.U)
|
||||
val gf_inst_array = Mux(priv_v, (~hx_array & ~ptw_ae_array) | ptw_gf_array, 0.U)
|
||||
|
||||
val gpa_hits = {
|
||||
val need_gpa_mask = if (instruction) gf_inst_array else gf_ld_array | gf_st_array
|
||||
|
||||
Reference in New Issue
Block a user