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

powerpc/booke: Avoid link stack corruption in several places



Use bcl 20,31,+4 instead of bl in order to preserve link stack.

See commit c974809a ("powerpc/vdso: Avoid link stack corruption
in __get_datapage()") for details.

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/e9fbc285eceb720e6c0e032ef47fe8b05f669b48.1629791751.git.christophe.leroy@csgroup.eu
parent 113ec9cc
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -260,7 +260,7 @@ GLUE(.,name):


/* Be careful, this will clobber the lr register. */
/* Be careful, this will clobber the lr register. */
#define LOAD_REG_ADDR_PIC(reg, name)		\
#define LOAD_REG_ADDR_PIC(reg, name)		\
	bl	0f;				\
	bcl	20,31,$+4;			\
0:	mflr	reg;				\
0:	mflr	reg;				\
	addis	reg,reg,(name - 0b)@ha;		\
	addis	reg,reg,(name - 0b)@ha;		\
	addi	reg,reg,(name - 0b)@l;
	addi	reg,reg,(name - 0b)@l;
+3 −3
Original line number Original line Diff line number Diff line
@@ -1127,7 +1127,7 @@ found_iprot:
 * r3 = MAS0_TLBSEL (for the iprot array)
 * r3 = MAS0_TLBSEL (for the iprot array)
 * r4 = SPRN_TLBnCFG
 * r4 = SPRN_TLBnCFG
 */
 */
	bl	invstr				/* Find our address */
	bcl	20,31,$+4			/* Find our address */
invstr:	mflr	r6				/* Make it accessible */
invstr:	mflr	r6				/* Make it accessible */
	mfmsr	r7
	mfmsr	r7
	rlwinm	r5,r7,27,31,31			/* extract MSR[IS] */
	rlwinm	r5,r7,27,31,31			/* extract MSR[IS] */
@@ -1196,7 +1196,7 @@ skpinv: addi r6,r6,1 /* Increment */
	mfmsr	r6
	mfmsr	r6
	xori	r6,r6,MSR_IS
	xori	r6,r6,MSR_IS
	mtspr	SPRN_SRR1,r6
	mtspr	SPRN_SRR1,r6
	bl	1f		/* Find our address */
	bcl	20,31,$+4	/* Find our address */
1:	mflr	r6
1:	mflr	r6
	addi	r6,r6,(2f - 1b)
	addi	r6,r6,(2f - 1b)
	mtspr	SPRN_SRR0,r6
	mtspr	SPRN_SRR0,r6
@@ -1256,7 +1256,7 @@ skpinv: addi r6,r6,1 /* Increment */
 * r4 = MAS0 w/TLBSEL & ESEL for the temp mapping
 * r4 = MAS0 w/TLBSEL & ESEL for the temp mapping
 */
 */
	/* Now we branch the new virtual address mapped by this entry */
	/* Now we branch the new virtual address mapped by this entry */
	bl	1f		/* Find our address */
	bcl	20,31,$+4	/* Find our address */
1:	mflr	r6
1:	mflr	r6
	addi	r6,r6,(2f - 1b)
	addi	r6,r6,(2f - 1b)
	tovirt(r6,r6)
	tovirt(r6,r6)
+4 −4
Original line number Original line Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
/* SPDX-License-Identifier: GPL-2.0 */


/* 1. Find the index of the entry we're executing in */
/* 1. Find the index of the entry we're executing in */
	bl	invstr				/* Find our address */
	bcl	20,31,$+4				/* Find our address */
invstr:	mflr	r6				/* Make it accessible */
invstr:	mflr	r6				/* Make it accessible */
	mfmsr	r7
	mfmsr	r7
	rlwinm	r4,r7,27,31,31			/* extract MSR[IS] */
	rlwinm	r4,r7,27,31,31			/* extract MSR[IS] */
@@ -85,7 +85,7 @@ skpinv: addi r6,r6,1 /* Increment */
	addi	r6,r6,10
	addi	r6,r6,10
	slw	r6,r8,r6	/* convert to mask */
	slw	r6,r8,r6	/* convert to mask */


	bl	1f		/* Find our address */
	bcl	20,31,$+4	/* Find our address */
1:	mflr	r7
1:	mflr	r7


	mfspr	r8,SPRN_MAS3
	mfspr	r8,SPRN_MAS3
@@ -117,7 +117,7 @@ skpinv: addi r6,r6,1 /* Increment */


	xori	r6,r4,1
	xori	r6,r4,1
	slwi	r6,r6,5		/* setup new context with other address space */
	slwi	r6,r6,5		/* setup new context with other address space */
	bl	1f		/* Find our address */
	bcl	20,31,$+4	/* Find our address */
1:	mflr	r9
1:	mflr	r9
	rlwimi	r7,r9,0,20,31
	rlwimi	r7,r9,0,20,31
	addi	r7,r7,(2f - 1b)
	addi	r7,r7,(2f - 1b)
@@ -207,7 +207,7 @@ next_tlb_setup:


	lis	r7,MSR_KERNEL@h
	lis	r7,MSR_KERNEL@h
	ori	r7,r7,MSR_KERNEL@l
	ori	r7,r7,MSR_KERNEL@l
	bl	1f			/* Find our address */
	bcl	20,31,$+4		/* Find our address */
1:	mflr	r9
1:	mflr	r9
	rlwimi	r6,r9,0,20,31
	rlwimi	r6,r9,0,20,31
	addi	r6,r6,(2f - 1b)
	addi	r6,r6,(2f - 1b)
+3 −3
Original line number Original line Diff line number Diff line
@@ -70,7 +70,7 @@ _ENTRY(_start);
 * address.
 * address.
 * r21 will be loaded with the physical runtime address of _stext
 * r21 will be loaded with the physical runtime address of _stext
 */
 */
	bl	0f				/* Get our runtime address */
	bcl	20,31,$+4			/* Get our runtime address */
0:	mflr	r21				/* Make it accessible */
0:	mflr	r21				/* Make it accessible */
	addis	r21,r21,(_stext - 0b)@ha
	addis	r21,r21,(_stext - 0b)@ha
	addi	r21,r21,(_stext - 0b)@l 	/* Get our current runtime base */
	addi	r21,r21,(_stext - 0b)@l 	/* Get our current runtime base */
@@ -853,7 +853,7 @@ _GLOBAL(init_cpu_state)
wmmucr:	mtspr	SPRN_MMUCR,r3			/* Put MMUCR */
wmmucr:	mtspr	SPRN_MMUCR,r3			/* Put MMUCR */
	sync
	sync


	bl	invstr				/* Find our address */
	bcl	20,31,$+4			/* Find our address */
invstr:	mflr	r5				/* Make it accessible */
invstr:	mflr	r5				/* Make it accessible */
	tlbsx	r23,0,r5			/* Find entry we are in */
	tlbsx	r23,0,r5			/* Find entry we are in */
	li	r4,0				/* Start at TLB entry 0 */
	li	r4,0				/* Start at TLB entry 0 */
@@ -1045,7 +1045,7 @@ head_start_47x:
	sync
	sync


	/* Find the entry we are running from */
	/* Find the entry we are running from */
	bl	1f
	bcl	20,31,$+4
1:	mflr	r23
1:	mflr	r23
	tlbsx	r23,0,r23
	tlbsx	r23,0,r23
	tlbre	r24,r23,0
	tlbre	r24,r23,0
+3 −3
Original line number Original line Diff line number Diff line
@@ -79,7 +79,7 @@ _ENTRY(_start);
	mr	r23,r3
	mr	r23,r3
	mr	r25,r4
	mr	r25,r4


	bl	0f
	bcl	20,31,$+4
0:	mflr	r8
0:	mflr	r8
	addis	r3,r8,(is_second_reloc - 0b)@ha
	addis	r3,r8,(is_second_reloc - 0b)@ha
	lwz	r19,(is_second_reloc - 0b)@l(r3)
	lwz	r19,(is_second_reloc - 0b)@l(r3)
@@ -1132,7 +1132,7 @@ _GLOBAL(switch_to_as1)
	bne	1b
	bne	1b


	/* Get the tlb entry used by the current running code */
	/* Get the tlb entry used by the current running code */
	bl	0f
	bcl	20,31,$+4
0:	mflr	r4
0:	mflr	r4
	tlbsx	0,r4
	tlbsx	0,r4


@@ -1166,7 +1166,7 @@ _GLOBAL(switch_to_as1)
_GLOBAL(restore_to_as0)
_GLOBAL(restore_to_as0)
	mflr	r0
	mflr	r0


	bl	0f
	bcl	20,31,$+4
0:	mflr	r9
0:	mflr	r9
	addi	r9,r9,1f - 0b
	addi	r9,r9,1f - 0b


Loading