Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9d4996d authored by Paul Mackerras's avatar Paul Mackerras Committed by Michael Ellerman
Browse files

powerpc/mm/book3s-64: Move HPTE-related bits in PTE to upper end



This moves the _PAGE_HASHPTE, _PAGE_F_GIX and _PAGE_F_SECOND fields in
the Linux PTE on 64-bit Book 3S systems to the most significant byte.
Of the 5 bits, one is a software-use bit and the other four are
reserved bit positions in the PowerISA v3.0 radix PTE format.
Using these bits is OK because these bits are all to do with tracking
the HPTE(s) associated with the Linux PTE, and therefore won't be
needed in radix mode.  This frees up bit positions in the lower two
bytes.

Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 84c95756
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -24,11 +24,7 @@
#define _PAGE_DIRTY		0x00080 /* C: page changed */
#define _PAGE_ACCESSED		0x00100 /* R: page referenced */
#define _PAGE_RW		0x00200 /* software: user write access allowed */
#define _PAGE_HASHPTE		0x00400 /* software: pte has an associated HPTE */
#define _PAGE_BUSY		0x00800 /* software: PTE & hash are busy */
#define _PAGE_F_GIX		0x07000 /* full page: hidx bits */
#define _PAGE_F_GIX_SHIFT	12
#define _PAGE_F_SECOND		0x08000 /* Whether to use secondary hash or not */
#define _PAGE_SPECIAL		0x10000 /* software: special page */

#ifdef CONFIG_MEM_SOFT_DIRTY
@@ -37,6 +33,10 @@
#define _PAGE_SOFT_DIRTY	0x00000
#endif

#define _PAGE_F_GIX_SHIFT	57
#define _PAGE_F_GIX		(7ul << 57)	/* HPTE index within HPTEG */
#define _PAGE_F_SECOND		(1ul << 60)	/* HPTE is in 2ndary HPTEG */
#define _PAGE_HASHPTE		(1ul << 61)	/* PTE has associated HPTE */
#define _PAGE_PTE		(1ul << 62)	/* distinguishes PTEs from pointers */
#define _PAGE_PRESENT		(1ul << 63)	/* pte contains a translation */

+3 −2
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
		if (old_pte & _PAGE_F_SECOND)
			hash = ~hash;
		slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
		slot += (old_pte & _PAGE_F_GIX) >> 12;
		slot += (old_pte & _PAGE_F_GIX) >> _PAGE_F_GIX_SHIFT;

		if (ppc_md.hpte_updatepp(slot, rflags, vpn, mmu_psize,
					 mmu_psize, ssize, flags) == -1)
@@ -105,7 +105,8 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
			return -1;
		}

		new_pte |= (slot << 12) & (_PAGE_F_SECOND | _PAGE_F_GIX);
		new_pte |= (slot << _PAGE_F_GIX_SHIFT) &
			(_PAGE_F_SECOND | _PAGE_F_GIX);
	}

	/*