On Wed, 13 May 2026 at 12:45, Ilias Apalodimas
<[email protected]> wrote:
>
> On Tue, 12 May 2026 at 14:13, Casey Connolly <[email protected]>
> wrote:
> >
> > When a region is explicitly unmapped (like with
> > mmu_change_region_attr(.... PTE_TYPE_FAULT)) the address translation
> > still remains but won't be used since the region is marked invalid.
> > Print these regions when we dump the pagetable to help with debugging.
> >
> > Signed-off-by: Casey Connolly <[email protected]>
> > ---
>
> Reviewed-by: Ilias Apalodimas <[email protected]>
Looking at it again, this prints 'Ukn' instead of 'Fault'
Cheers
/Ilias
>
> > arch/arm/cpu/armv8/cache_v8.c | 8 ++++++--
> > 1 file changed, 6 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/arm/cpu/armv8/cache_v8.c b/arch/arm/cpu/armv8/cache_v8.c
> > index 368c622cd18e..36d337378fcd 100644
> > --- a/arch/arm/cpu/armv8/cache_v8.c
> > +++ b/arch/arm/cpu/armv8/cache_v8.c
> > @@ -533,9 +533,9 @@ static void __pagetable_walk(u64 addr, u64 tcr, int
> > level, pte_walker_cb_t cb, v
> >
> > if (exit)
> > return;
> >
> > - if (pte_type(&pte) == PTE_TYPE_FAULT)
> > + if (!pte)
> > continue;
> >
> > attrs = pte & ALL_ATTRS;
> > /* If we're currently inside a block or set of pages */
> > @@ -572,9 +572,9 @@ static void __pagetable_walk(u64 addr, u64 tcr, int
> > level, pte_walker_cb_t cb, v
> >
> > /* Go down a level */
> > __pagetable_walk(_addr, tcr, level + 1, cb, priv);
> > state[level] = WALKER_STATE_START;
> > - } else if (pte_type(&pte) == PTE_TYPE_BLOCK ||
> > pte_type(&pte) == PTE_TYPE_PAGE) {
> > + } else {
> > /* We foud a block or page, start walking */
> > entry_start = pte;
> > state[level] = WALKER_STATE_REGION;
> > }
> > @@ -707,8 +707,12 @@ static bool pagetable_print_entry(u64 start_attrs, u64
> > end, int va_bits, int lev
> > {
> > u64 _addr = start_attrs & GENMASK_ULL(va_bits, PAGE_SHIFT);
> > int indent = va_bits < 39 ? level - 1 : level;
> >
> > + /* Ignore empty blocks */
> > + if (!start_attrs)
> > + return false;
> > +
> > printf("%*s", indent * 2, "");
> > if (PTE_IS_TABLE(start_attrs, level))
> > printf("[%#016llx]%19s", _addr, "");
> > else
> >
> > --
> > 2.53.0
> >