This diff should be correct. My old diff removed the "idx ^=" assignment, my new diff moves it down. --gkoehler
Index: arch/powerpc64/powerpc64/pmap.c =================================================================== RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/pmap.c,v diff -u -p -r1.62 pmap.c --- arch/powerpc64/powerpc64/pmap.c 4 Jun 2024 17:31:59 -0000 1.62 +++ arch/powerpc64/powerpc64/pmap.c 26 Nov 2024 04:54:47 -0000 @@ -816,8 +816,8 @@ pte_insert(struct pte_desc *pted) pted->pted_va &= ~(PTED_VA_HID_M|PTED_VA_PTEGIDX_M); pted->pted_va |= off & (PTED_VA_PTEGIDX_M|PTED_VA_HID_M); - idx ^= (PTED_HID(pted) ? pmap_ptab_mask : 0); - pte = pmap_ptable + (idx * 8); + pte = pmap_ptable; + pte += (idx ^ (PTED_HID(pted) ? pmap_ptab_mask : 0)) * 8; pte += PTED_PTEGIDX(pted); /* increment by index into pteg */ if ((pte->pte_hi & PTE_WIRED) == 0) @@ -825,6 +825,7 @@ pte_insert(struct pte_desc *pted) off++; } + idx ^= (PTED_HID(pted) ? pmap_ptab_mask : 0); /* * Since we only wire unmanaged kernel mappings, we should * always find a slot that we can replace.