Skip to content

Commit 40bb0e9

Browse files
chleroympe
authored andcommitted
Revert "powerpc/32s: reorder Linux PTE bits to better match Hash PTE bits."
This reverts commit 697ece7. The implementation of SWAP on powerpc requires page protection bits to not be one of the least significant PTE bits. Until the SWAP implementation is changed and this requirement voids, we have to keep at least _PAGE_RW outside of the 3 last bits. For now, revert to previous PTE bits order. A further rework may come later. Fixes: 697ece7 ("powerpc/32s: reorder Linux PTE bits to better match Hash PTE bits.") Reported-by: Rui Salvaterra <[email protected]> Signed-off-by: Christophe Leroy <[email protected]> Signed-off-by: Michael Ellerman <[email protected]> Link: https://lore.kernel.org/r/b34706f8de87f84d135abb5f3ede6b6f16fb1f41.1589969799.git.christophe.leroy@csgroup.eu
1 parent 249c9b0 commit 40bb0e9

File tree

3 files changed

+18
-13
lines changed

3 files changed

+18
-13
lines changed

arch/powerpc/include/asm/book3s/32/hash.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@
1717
* updating the accessed and modified bits in the page table tree.
1818
*/
1919

20-
#define _PAGE_USER 0x001 /* usermode access allowed */
21-
#define _PAGE_RW 0x002 /* software: user write access allowed */
22-
#define _PAGE_PRESENT 0x004 /* software: pte contains a translation */
20+
#define _PAGE_PRESENT 0x001 /* software: pte contains a translation */
21+
#define _PAGE_HASHPTE 0x002 /* hash_page has made an HPTE for this pte */
22+
#define _PAGE_USER 0x004 /* usermode access allowed */
2323
#define _PAGE_GUARDED 0x008 /* G: prohibit speculative access */
2424
#define _PAGE_COHERENT 0x010 /* M: enforce memory coherence (SMP systems) */
2525
#define _PAGE_NO_CACHE 0x020 /* I: cache inhibit */
2626
#define _PAGE_WRITETHRU 0x040 /* W: cache write-through */
2727
#define _PAGE_DIRTY 0x080 /* C: page changed */
2828
#define _PAGE_ACCESSED 0x100 /* R: page referenced */
2929
#define _PAGE_EXEC 0x200 /* software: exec allowed */
30-
#define _PAGE_HASHPTE 0x400 /* hash_page has made an HPTE for this pte */
30+
#define _PAGE_RW 0x400 /* software: user write access allowed */
3131
#define _PAGE_SPECIAL 0x800 /* software: Special page */
3232

3333
#ifdef CONFIG_PTE_64BIT

arch/powerpc/kernel/head_32.S

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ BEGIN_MMU_FTR_SECTION
348348
andis. r0, r5, (DSISR_BAD_FAULT_32S | DSISR_DABRMATCH)@h
349349
#endif
350350
bne handle_page_fault_tramp_2 /* if not, try to put a PTE */
351-
rlwinm r3, r5, 32 - 24, 30, 30 /* DSISR_STORE -> _PAGE_RW */
351+
rlwinm r3, r5, 32 - 15, 21, 21 /* DSISR_STORE -> _PAGE_RW */
352352
bl hash_page
353353
b handle_page_fault_tramp_1
354354
FTR_SECTION_ELSE
@@ -497,6 +497,7 @@ InstructionTLBMiss:
497497
andc. r1,r1,r0 /* check access & ~permission */
498498
bne- InstructionAddressInvalid /* return if access not permitted */
499499
/* Convert linux-style PTE to low word of PPC-style PTE */
500+
rlwimi r0,r0,32-2,31,31 /* _PAGE_USER -> PP lsb */
500501
ori r1, r1, 0xe06 /* clear out reserved bits */
501502
andc r1, r0, r1 /* PP = user? 1 : 0 */
502503
BEGIN_FTR_SECTION
@@ -564,8 +565,9 @@ DataLoadTLBMiss:
564565
* we would need to update the pte atomically with lwarx/stwcx.
565566
*/
566567
/* Convert linux-style PTE to low word of PPC-style PTE */
567-
rlwinm r1,r0,0,30,30 /* _PAGE_RW -> PP msb */
568-
rlwimi r0,r0,1,30,30 /* _PAGE_USER -> PP msb */
568+
rlwinm r1,r0,32-9,30,30 /* _PAGE_RW -> PP msb */
569+
rlwimi r0,r0,32-1,30,30 /* _PAGE_USER -> PP msb */
570+
rlwimi r0,r0,32-1,31,31 /* _PAGE_USER -> PP lsb */
569571
ori r1,r1,0xe04 /* clear out reserved bits */
570572
andc r1,r0,r1 /* PP = user? rw? 1: 3: 0 */
571573
BEGIN_FTR_SECTION
@@ -643,6 +645,7 @@ DataStoreTLBMiss:
643645
* we would need to update the pte atomically with lwarx/stwcx.
644646
*/
645647
/* Convert linux-style PTE to low word of PPC-style PTE */
648+
rlwimi r0,r0,32-2,31,31 /* _PAGE_USER -> PP lsb */
646649
li r1,0xe06 /* clear out reserved bits & PP msb */
647650
andc r1,r0,r1 /* PP = user? 1: 0 */
648651
BEGIN_FTR_SECTION

arch/powerpc/mm/book3s32/hash_low.S

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ mmu_hash_lock:
3535
/*
3636
* Load a PTE into the hash table, if possible.
3737
* The address is in r4, and r3 contains an access flag:
38-
* _PAGE_RW (0x002) if a write.
38+
* _PAGE_RW (0x400) if a write.
3939
* r9 contains the SRR1 value, from which we use the MSR_PR bit.
4040
* SPRG_THREAD contains the physical address of the current task's thread.
4141
*
@@ -69,7 +69,7 @@ _GLOBAL(hash_page)
6969
blt+ 112f /* assume user more likely */
7070
lis r5, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */
7171
addi r5 ,r5 ,(swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */
72-
rlwimi r3,r9,32-14,31,31 /* MSR_PR -> _PAGE_USER */
72+
rlwimi r3,r9,32-12,29,29 /* MSR_PR -> _PAGE_USER */
7373
112:
7474
#ifndef CONFIG_PTE_64BIT
7575
rlwimi r5,r4,12,20,29 /* insert top 10 bits of address */
@@ -94,7 +94,7 @@ _GLOBAL(hash_page)
9494
#else
9595
rlwimi r8,r4,23,20,28 /* compute pte address */
9696
#endif
97-
rlwinm r0,r3,6,24,24 /* _PAGE_RW access -> _PAGE_DIRTY */
97+
rlwinm r0,r3,32-3,24,24 /* _PAGE_RW access -> _PAGE_DIRTY */
9898
ori r0,r0,_PAGE_ACCESSED|_PAGE_HASHPTE
9999

100100
/*
@@ -310,9 +310,11 @@ Hash_msk = (((1 << Hash_bits) - 1) * 64)
310310

311311
_GLOBAL(create_hpte)
312312
/* Convert linux-style PTE (r5) to low word of PPC-style PTE (r8) */
313+
rlwinm r8,r5,32-9,30,30 /* _PAGE_RW -> PP msb */
313314
rlwinm r0,r5,32-6,30,30 /* _PAGE_DIRTY -> PP msb */
314-
and r8,r5,r0 /* writable if _RW & _DIRTY */
315-
rlwimi r5,r5,1,30,30 /* _PAGE_USER -> PP msb */
315+
and r8,r8,r0 /* writable if _RW & _DIRTY */
316+
rlwimi r5,r5,32-1,30,30 /* _PAGE_USER -> PP msb */
317+
rlwimi r5,r5,32-2,31,31 /* _PAGE_USER -> PP lsb */
316318
ori r8,r8,0xe04 /* clear out reserved bits */
317319
andc r8,r5,r8 /* PP = user? (rw&dirty? 1: 3): 0 */
318320
BEGIN_FTR_SECTION
@@ -564,7 +566,7 @@ _GLOBAL(flush_hash_pages)
564566
33: lwarx r8,0,r5 /* fetch the pte flags word */
565567
andi. r0,r8,_PAGE_HASHPTE
566568
beq 8f /* done if HASHPTE is already clear */
567-
rlwinm r8,r8,0,~_PAGE_HASHPTE /* clear HASHPTE bit */
569+
rlwinm r8,r8,0,31,29 /* clear HASHPTE bit */
568570
stwcx. r8,0,r5 /* update the pte */
569571
bne- 33b
570572

0 commit comments

Comments
 (0)