Skip to content

Commit c8347bb

Browse files
committed
Merge tag 'powerpc-5.7-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc fixes from Michael Ellerman: - a revert of a recent change to the PTE bits for 32-bit BookS, which broke swap. - a "fix" to disable STRICT_KERNEL_RWX for 64-bit in Kconfig, as it's causing crashes for some people. Thanks to Christophe Leroy and Rui Salvaterra. * tag 'powerpc-5.7-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/64s: Disable STRICT_KERNEL_RWX Revert "powerpc/32s: reorder Linux PTE bits to better match Hash PTE bits."
2 parents 051143e + 8659a0e commit c8347bb

File tree

4 files changed

+19
-14
lines changed

4 files changed

+19
-14
lines changed

arch/powerpc/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ config PPC
130130
select ARCH_HAS_PTE_SPECIAL
131131
select ARCH_HAS_MEMBARRIER_CALLBACKS
132132
select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE && PPC_BOOK3S_64
133-
select ARCH_HAS_STRICT_KERNEL_RWX if ((PPC_BOOK3S_64 || PPC32) && !HIBERNATION)
133+
select ARCH_HAS_STRICT_KERNEL_RWX if (PPC32 && !HIBERNATION)
134134
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
135135
select ARCH_HAS_UACCESS_FLUSHCACHE
136136
select ARCH_HAS_UACCESS_MCSAFE if PPC64

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)