On 4/27/20 4:03 AM, Peter Maydell wrote: > On Wed, 22 Apr 2020 at 05:33, Richard Henderson > <richard.hender...@linaro.org> wrote: >> >> With sve_cont_ldst_pages, the differences between first-fault and no-fault >> are minimal, so unify the routines. With cpu_probe_watchpoint, we are able >> to make progress through pages with TLB_WATCHPOINT set when the watchpoint >> does not actually fire. >> >> Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > > >> /* >> - * Perform one normal read, which will fault or not. >> - * But it is likely to bring the page into the tlb. >> + * From this point on, all memory operations are MemSingleNF. >> + * >> + * Per the MemSingleNF pseudocode, a no-fault load from Device memory >> + * must not actually hit the bus -- it returns (UNKNOWN, FAULT) instead. >> + * If you map non-RAM with Normal memory attributes and do a NF >> + * load then it should access the bus -- but doing so is illegal. >> + * >> + * While we do not have access to the memory attributes from the PTE >> + * to tell Device memory from Normal memory, we can validly assume that >> + * non-RAM has been mapped as Device memory. Thus we indicate fault >> + * on all MMIO. > > I still don't understand why this is right. All non-RAM is MMIO > but not all MMIO is non-RAM; so you might have something that's > MMIO (at least for the moment) and has been mapped Normal. That > shouldn't fault.
Everything that must go through the slow path has TLB_MMIO set. What you're thinking of, romd, has TLB_MMIO set on the write comparator but not the read comparator. Have another browse through tlb_set_page_with_attrs, lines 859-893, and the uses of is_romd. r~