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

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
...@@ -260,7 +260,7 @@ GLUE(.,name): ...@@ -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;
......
...@@ -1127,7 +1127,7 @@ found_iprot: ...@@ -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 */ ...@@ -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 */ ...@@ -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)
......
/* 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 */ ...@@ -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 */ ...@@ -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: ...@@ -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)
......
...@@ -70,7 +70,7 @@ _ENTRY(_start); ...@@ -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) ...@@ -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: ...@@ -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
......
...@@ -79,7 +79,7 @@ _ENTRY(_start); ...@@ -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) ...@@ -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) ...@@ -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
......
...@@ -199,7 +199,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_476_DD2) ...@@ -199,7 +199,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_476_DD2)
* Touch enough instruction cache lines to ensure cache hits * Touch enough instruction cache lines to ensure cache hits
*/ */
1: mflr r9 1: mflr r9
bl 2f bcl 20,31,$+4
2: mflr r6 2: mflr r6
li r7,32 li r7,32
PPC_ICBT(0,R6,R7) /* touch next cache line */ PPC_ICBT(0,R6,R7) /* touch next cache line */
...@@ -414,7 +414,7 @@ _GLOBAL(loadcam_multi) ...@@ -414,7 +414,7 @@ _GLOBAL(loadcam_multi)
* Set up temporary TLB entry that is the same as what we're * Set up temporary TLB entry that is the same as what we're
* running from, but in AS=1. * running from, but in AS=1.
*/ */
bl 1f bcl 20,31,$+4
1: mflr r6 1: mflr r6
tlbsx 0,r8 tlbsx 0,r8
mfspr r6,SPRN_MAS1 mfspr r6,SPRN_MAS1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment