This patch enables CONFIG_VMAP_STACK. For that, a few changes are done in head_8xx.S.
Signed-off-by: Christophe Leroy <christophe.le...@c-s.fr> --- arch/powerpc/Kconfig | 1 + arch/powerpc/kernel/head_8xx.S | 47 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 6137f5e3bb2d..ddbec19c3c22 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -178,6 +178,7 @@ config PPC select HAVE_ARCH_NVRAM_OPS select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_TRACEHOOK + select HAVE_ARCH_VMAP_STACK if PPC_8xx select HAVE_C_RECORDMCOUNT select HAVE_CBPF_JIT if !PPC64 select HAVE_STACKPROTECTOR if PPC64 && $(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=r13) diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 2fa02ae7a88c..dfd68b72688e 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S @@ -127,8 +127,12 @@ instruction_counter: . = 0x200 MachineCheck: EXCEPTION_PROLOG +#ifdef CONFIG_VMAP_STACK + lwz r4, _DAR(r11) +#else mfspr r4,SPRN_DAR stw r4,_DAR(r11) +#endif li r5,RPN_PATTERN mtspr SPRN_DAR,r5 /* Tag DAR, to be used in DTLB Error */ mfspr r5,SPRN_DSISR @@ -143,8 +147,12 @@ MachineCheck: . = 0x600 Alignment: EXCEPTION_PROLOG +#ifdef CONFIG_VMAP_STACK + lwz r4, _DAR(r11) +#else mfspr r4,SPRN_DAR stw r4,_DAR(r11) +#endif li r5,RPN_PATTERN mtspr SPRN_DAR,r5 /* Tag DAR, to be used in DTLB Error */ mfspr r5,SPRN_DSISR @@ -467,17 +475,28 @@ DataTLBError: cmpwi cr0, r11, RPN_PATTERN beq- FixupDAR /* must be a buggy dcbX, icbi insn. */ DARFixed:/* Return from dcbx instruction bug workaround */ +#ifdef CONFIG_VMAP_STACK + li r11, RPN_PATTERN + mtspr SPRN_DAR, r11 /* Tag DAR, to be used in DTLB Error */ + mfspr r11, SPRN_SRR1 +#endif EXCEPTION_PROLOG_1 EXCEPTION_PROLOG_2 mfspr r5,SPRN_DSISR stw r5,_DSISR(r11) +#ifdef CONFIG_VMAP_STACK + lwz r4, _DAR(r11) +#else mfspr r4,SPRN_DAR +#endif andis. r10,r5,DSISR_NOHPTE@h beq+ .Ldtlbie tlbie r4 .Ldtlbie: +#ifndef CONFIG_VMAP_STACK li r10,RPN_PATTERN mtspr SPRN_DAR,r10 /* Tag DAR, to be used in DTLB Error */ +#endif /* 0x300 is DataAccess exception, needed by bad_page_fault() */ EXC_XFER_LITE(0x300, handle_page_fault) @@ -498,6 +517,9 @@ DARFixed:/* Return from dcbx instruction bug workaround */ * using them. */ do_databreakpoint: +#ifdef CONFIG_VMAP_STACK + mfspr r11, SPRN_SRR1 +#endif EXCEPTION_PROLOG_1 EXCEPTION_PROLOG_2 addi r3,r1,STACK_FRAME_OVERHEAD @@ -508,8 +530,21 @@ do_databreakpoint: . = 0x1c00 DataBreakpoint: - EXCEPTION_PROLOG_0 + mtspr SPRN_SPRG_SCRATCH0, r10 + mtspr SPRN_SPRG_SCRATCH1, r11 +#ifdef CONFIG_VMAP_STACK + mfspr r10, SPRN_SPRG_THREAD + mfspr r11, SPRN_DAR + stw r11, DAR(r10) + mfspr r11, SPRN_SRR1 + stw r11, SRR1(r10) +#endif mfspr r11, SPRN_SRR0 +#ifdef CONFIG_VMAP_STACK + stw r11, SRR0(r10) +#endif + mfcr r10 + cmplwi cr0, r11, (.Ldtlbie - PAGE_OFFSET)@l cmplwi cr7, r11, (.Litlbie - PAGE_OFFSET)@l cror 4*cr0+eq, 4*cr0+eq, 4*cr7+eq @@ -625,7 +660,12 @@ modified_instr: .space 4 /* this is where the add instr. is stored */ bne+ 143f subf r10,r0,r10 /* r10=r10-r0, only if reg RA is r0 */ +#ifdef CONFIG_VMAP_STACK +143: mfspr r11, SPRN_SPRG_THREAD + stw r10, DAR(r11) +#else 143: mtdar r10 /* store faulting EA in DAR */ +#endif mfspr r10,SPRN_M_TW b DARFixed /* Go back to normal TLB handling */ #else @@ -679,7 +719,12 @@ modified_instr: 152: mfdar r11 mtctr r11 /* restore ctr reg from DAR */ +#ifdef CONFIG_VMAP_STACK + mfspr r11, SPRN_SPRG_THREAD + stw r10, DAR(r11) +#else mtdar r10 /* save fault EA to DAR */ +#endif mfspr r10,SPRN_M_TW b DARFixed /* Go back to normal TLB handling */ -- 2.13.3