Re: sys/powerpc64: encode PTCR PATS correctly
Kirill A. Korinsky <[email protected]> Mon, 13 Jul 2026 15:11:33 +0200
| Newsgroups | gmane.os.openbsd.tech |
|---|---|
| Message-ID | <[email protected]> |
On Mon, 13 Jul 2026 14:28:53 +0200, Mark Kettenis <[email protected]> wrote: > > > Date: Mon, 13 Jul 2026 13:46:49 +0200 > > From: Kirill A. Korinsky <[email protected]> > > > > On Wed, 08 Jul 2026 00:35:32 +0200, > > Kirill A. Korinsky <[email protected]> wrote: > > > > > > Mark, George, > > > > > > Shivang Upadhyay in qemu-devel > > > https://marc.info/?l=qemu-devel&m=178332702820587&w=2 pointed that we may > > > have a typo kind of bug in powerpc64's pmap. > > > > > > The PTCR PATS field stores log2(partition table size) - 12. Since > > > PATMEMSZ is a power of two, ffs(PATMEMSZ) is log2(PATMEMSZ) + 1; the > > > old expression wrote 5 for the 64 KiB table, describing 128 KiB to > > > Book3S v3 hardware. > > > > > > Use fls(PATMEMSZ) - 1 - 12 to express the intended log2 calculation > > > and encode the 64 KiB partition table as PATS == 4. > > > > > > Ok? > > > > > > > Ping? > > I'd still like to see this tested on real hardware. Seems George is > alive, so hopefully he'll get around to doing this soonish. > > One minor nit about the proposed diff... > > > Index: sys/arch/powerpc64/powerpc64/pmap.c > > =================================================================== > > RCS file: /home/cvs/src/sys/arch/powerpc64/powerpc64/pmap.c,v > > diff -u -p -r1.66 pmap.c > > --- sys/arch/powerpc64/powerpc64/pmap.c 21 Aug 2025 00:10:21 -0000 1.66 > > +++ sys/arch/powerpc64/powerpc64/pmap.c 7 Jul 2026 20:20:55 -0000 > > @@ -124,7 +124,7 @@ uint64_t pmap_ptab_mask; > > struct pate *pmap_pat; > > > > #define PATMEMSZ (64 * 1024) > > -#define PATSIZE (ffs(PATMEMSZ) - 12) > > +#define PATSIZE (fls(PATMEMSZ) - 1 - 12) > > I think I'd prefer to keep using ffs(). As long as the size is a > power of two there should be no issue. But if it isn't, ffs() would > pass a smaller size to the hardware instead of a larger size, which > seems safer. I also would use an extra set of parentheses to express > that the "- 1" is part of the log2 calculation. So... > > #define PATSIZE ((ffs(PATMEMSZ) - 1) - 12) > > Make sense, here an updated trivial diff which I do have locally now: Index: sys/arch/powerpc64/powerpc64/pmap.c =================================================================== RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/pmap.c,v diff -u -p -r1.66 pmap.c --- sys/arch/powerpc64/powerpc64/pmap.c 21 Aug 2025 00:10:21 -0000 1.66 +++ sys/arch/powerpc64/powerpc64/pmap.c 13 Jul 2026 13:10:39 -0000 @@ -124,7 +124,7 @@ uint64_t pmap_ptab_mask; struct pate *pmap_pat; #define PATMEMSZ (64 * 1024) -#define PATSIZE (ffs(PATMEMSZ) - 12) +#define PATSIZE (ffs(PATMEMSZ) - 1 - 12) struct pte_desc { /* Linked list of phys -> virt entries */ -- wbr, Kirill