Skip to content

Commit 1e35eba

Browse files
chleroympe
authored andcommitted
powerpc/8xx: Fix pinned TLBs with CONFIG_STRICT_KERNEL_RWX
As spotted and explained in commit c12ab8d ("powerpc/8xx: Fix Oops with STRICT_KERNEL_RWX without DEBUG_RODATA_TEST"), the selection of STRICT_KERNEL_RWX without selecting DEBUG_RODATA_TEST has spotted the lack of the DIRTY bit in the pinned kernel data TLBs. This problem should have been detected a lot earlier if things had been working as expected. But due to an incredible level of chance or mishap, this went undetected because of a set of bugs: In fact the DTLBs were not pinned, because instead of setting the reserve bit in MD_CTR, it was set in MI_CTR that is the register for ITLBs. But then, another huge bug was there: the physical address was reset to 0 at the boundary between RO and RW areas, leading to the same physical space being mapped at both 0xc0000000 and 0xc8000000. This had by miracle no consequence until now because the entry was not really pinned so it was overwritten soon enough to go undetected. Of course, now that we really pin the DTLBs, it must be fixed as well. Fixes: f76c8f6 ("powerpc/8xx: Add function to set pinned TLBs") Cc: stable@vger.kernel.org # v5.8+ Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Depends-on: c12ab8d ("powerpc/8xx: Fix Oops with STRICT_KERNEL_RWX without DEBUG_RODATA_TEST") Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/a21e9a057fe2d247a535aff0d157a54eefee017a.1636963688.git.christophe.leroy@csgroup.eu
1 parent 5499802 commit 1e35eba

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

arch/powerpc/kernel/head_8xx.S

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,7 @@ _GLOBAL(mmu_pin_tlb)
733733
#ifdef CONFIG_PIN_TLB_DATA
734734
LOAD_REG_IMMEDIATE(r6, PAGE_OFFSET)
735735
LOAD_REG_IMMEDIATE(r7, MI_SVALID | MI_PS8MEG | _PMD_ACCESSED)
736+
li r8, 0
736737
#ifdef CONFIG_PIN_TLB_IMMR
737738
li r0, 3
738739
#else
@@ -741,26 +742,26 @@ _GLOBAL(mmu_pin_tlb)
741742
mtctr r0
742743
cmpwi r4, 0
743744
beq 4f
744-
LOAD_REG_IMMEDIATE(r8, 0xf0 | _PAGE_RO | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT)
745745
LOAD_REG_ADDR(r9, _sinittext)
746746

747747
2: ori r0, r6, MD_EVALID
748+
ori r12, r8, 0xf0 | _PAGE_RO | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT
748749
mtspr SPRN_MD_CTR, r5
749750
mtspr SPRN_MD_EPN, r0
750751
mtspr SPRN_MD_TWC, r7
751-
mtspr SPRN_MD_RPN, r8
752+
mtspr SPRN_MD_RPN, r12
752753
addi r5, r5, 0x100
753754
addis r6, r6, SZ_8M@h
754755
addis r8, r8, SZ_8M@h
755756
cmplw r6, r9
756757
bdnzt lt, 2b
757-
758-
4: LOAD_REG_IMMEDIATE(r8, 0xf0 | _PAGE_DIRTY | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT)
758+
4:
759759
2: ori r0, r6, MD_EVALID
760+
ori r12, r8, 0xf0 | _PAGE_DIRTY | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT
760761
mtspr SPRN_MD_CTR, r5
761762
mtspr SPRN_MD_EPN, r0
762763
mtspr SPRN_MD_TWC, r7
763-
mtspr SPRN_MD_RPN, r8
764+
mtspr SPRN_MD_RPN, r12
764765
addi r5, r5, 0x100
765766
addis r6, r6, SZ_8M@h
766767
addis r8, r8, SZ_8M@h
@@ -781,7 +782,7 @@ _GLOBAL(mmu_pin_tlb)
781782
#endif
782783
#if defined(CONFIG_PIN_TLB_IMMR) || defined(CONFIG_PIN_TLB_DATA)
783784
lis r0, (MD_RSV4I | MD_TWAM)@h
784-
mtspr SPRN_MI_CTR, r0
785+
mtspr SPRN_MD_CTR, r0
785786
#endif
786787
mtspr SPRN_SRR1, r10
787788
mtspr SPRN_SRR0, r11

0 commit comments

Comments
 (0)