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.