Commit cd08f109 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman
Browse files

powerpc/32s: Enable CONFIG_VMAP_STACK



A few changes to retrieve DAR and DSISR from struct regs
instead of retrieving them directly, as they may have
changed due to a TLB miss.

Also modifies hash_page() and friends to work with virtual
data addresses instead of physical ones. Same on load_up_fpu()
and load_up_altivec().

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
[mpe: Fix tovirt_vmstack call in head_32.S to fix CHRP build]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/2e2509a242fd5f3e23df4a06530c18060c4d321e.1576916812.git.christophe.leroy@c-s.fr
parent 94dd54c5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1339,7 +1339,7 @@ _GLOBAL(enter_rtas)
	lis	r6,1f@ha	/* physical return address for rtas */
	addi	r6,r6,1f@l
	tophys(r6,r6)
	tophys(r7,r1)
	tophys_novmstack r7, r1
	lwz	r8,RTASENTRY(r4)
	lwz	r4,RTASBASE(r4)
	mfmsr	r9
+3 −0
Original line number Diff line number Diff line
@@ -94,6 +94,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
	/* enable use of FP after return */
#ifdef CONFIG_PPC32
	mfspr	r5,SPRN_SPRG_THREAD	/* current task's THREAD (phys) */
#ifdef CONFIG_VMAP_STACK
	tovirt(r5, r5)
#endif
	lwz	r4,THREAD_FPEXC_MODE(r5)
	ori	r9,r9,MSR_FP		/* enable FP for current */
	or	r9,r9,r4
+13 −3
Original line number Diff line number Diff line
@@ -272,14 +272,21 @@ __secondary_hold_acknowledge:
 */
	. = 0x200
	DO_KVM  0x200
MachineCheck:
	EXCEPTION_PROLOG_0
#ifdef CONFIG_VMAP_STACK
	li	r11, MSR_KERNEL & ~(MSR_IR | MSR_RI) /* can take DTLB miss */
	mtmsr	r11
	isync
#endif
#ifdef CONFIG_PPC_CHRP
	mfspr	r11, SPRN_SPRG_THREAD
	tovirt_vmstack r11, r11
	lwz	r11, RTAS_SP(r11)
	cmpwi	cr1, r11, 0
	bne	cr1, 7f
#endif /* CONFIG_PPC_CHRP */
	EXCEPTION_PROLOG_1
	EXCEPTION_PROLOG_1 for_rtas=1
7:	EXCEPTION_PROLOG_2
	addi	r3,r1,STACK_FRAME_OVERHEAD
#ifdef CONFIG_PPC_CHRP
@@ -294,7 +301,7 @@ __secondary_hold_acknowledge:
	. = 0x300
	DO_KVM  0x300
DataAccess:
	EXCEPTION_PROLOG
	EXCEPTION_PROLOG handle_dar_dsisr=1
	get_and_save_dar_dsisr_on_stack	r4, r5, r11
BEGIN_MMU_FTR_SECTION
#ifdef CONFIG_PPC_KUAP
@@ -334,7 +341,7 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
	. = 0x600
	DO_KVM  0x600
Alignment:
	EXCEPTION_PROLOG
	EXCEPTION_PROLOG handle_dar_dsisr=1
	save_dar_dsisr_on_stack r4, r5, r11
	addi	r3,r1,STACK_FRAME_OVERHEAD
	EXC_XFER_STD(0x600, alignment_exception)
@@ -645,6 +652,9 @@ handle_page_fault_tramp_1:
handle_page_fault_tramp_2:
	EXC_XFER_LITE(0x300, handle_page_fault)

stack_overflow:
	vmap_stack_overflow_exception

AltiVecUnavailable:
	EXCEPTION_PROLOG
#ifdef CONFIG_ALTIVEC
+3 −1
Original line number Diff line number Diff line
@@ -38,11 +38,13 @@
	andi.	r11, r11, MSR_PR
.endm

.macro EXCEPTION_PROLOG_1
.macro EXCEPTION_PROLOG_1 for_rtas=0
#ifdef CONFIG_VMAP_STACK
	.ifeq	\for_rtas
	li	r11, MSR_KERNEL & ~(MSR_IR | MSR_RI) /* can take DTLB miss */
	mtmsr	r11
	isync
	.endif
	subi	r11, r1, INT_FRAME_SIZE		/* use r1 if kernel */
#else
	tophys(r11,r1)			/* use tophys(r1) if kernel */
+3 −0
Original line number Diff line number Diff line
@@ -67,6 +67,9 @@ _GLOBAL(load_up_altivec)
#ifdef CONFIG_PPC32
	mfspr	r5,SPRN_SPRG_THREAD		/* current task's THREAD (phys) */
	oris	r9,r9,MSR_VEC@h
#ifdef CONFIG_VMAP_STACK
	tovirt(r5, r5)
#endif
#else
	ld	r4,PACACURRENT(r13)
	addi	r5,r4,THREAD		/* Get THREAD */
Loading