[PATCH] powerpc/32: Avoid link stack corruption in a few places

From: Christophe Leroy
Date: Mon Aug 23 2021 - 03:53:42 EST


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

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

Signed-off-by: Christophe Leroy <christophe.leroy@xxxxxxxxxx>
---
arch/powerpc/kernel/misc_32.S | 2 +-
arch/powerpc/kernel/reloc_32.S | 2 +-
arch/powerpc/kexec/relocate_32.S | 12 ++++++------
3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
index d8645efff902..d81e15a88a34 100644
--- a/arch/powerpc/kernel/misc_32.S
+++ b/arch/powerpc/kernel/misc_32.S
@@ -67,7 +67,7 @@ _GLOBAL(reloc_got2)
srwi. r8,r8,2
beqlr
mtctr r8
- bl 1f
+ bcl 20,31,1f
1: mflr r0
lis r4,1b@ha
addi r4,r4,1b@l
diff --git a/arch/powerpc/kernel/reloc_32.S b/arch/powerpc/kernel/reloc_32.S
index 10e96f3e22fe..5e9b58ae319e 100644
--- a/arch/powerpc/kernel/reloc_32.S
+++ b/arch/powerpc/kernel/reloc_32.S
@@ -30,7 +30,7 @@ R_PPC_RELATIVE = 22
_GLOBAL(relocate)

mflr r0 /* Save our LR */
- bl 0f /* Find our current runtime address */
+ bcl 20,31,0f /* Find our current runtime address */
0: mflr r12 /* Make it accessible */
mtlr r0

diff --git a/arch/powerpc/kexec/relocate_32.S b/arch/powerpc/kexec/relocate_32.S
index 61946c19e07c..e25a5a9861ea 100644
--- a/arch/powerpc/kexec/relocate_32.S
+++ b/arch/powerpc/kexec/relocate_32.S
@@ -93,7 +93,7 @@ wmmucr:
* Invalidate all the TLB entries except the current entry
* where we are running from
*/
- bl 0f /* Find our address */
+ bcl 20,31,0f /* Find our address */
0: mflr r5 /* Make it accessible */
tlbsx r23,0,r5 /* Find entry we are in */
li r4,0 /* Start at TLB entry 0 */
@@ -158,7 +158,7 @@ write_out:
/* Switch to other address space in MSR */
insrwi r9, r7, 1, 26 /* Set MSR[IS] = r7 */

- bl 1f
+ bcl 20,31,1f
1: mflr r8
addi r8, r8, (2f-1b) /* Find the target offset */

@@ -202,7 +202,7 @@ next_tlb:
li r9,0
insrwi r9, r7, 1, 26 /* Set MSR[IS] = r7 */

- bl 1f
+ bcl 20,31,1f
1: mflr r8
and r8, r8, r11 /* Get our offset within page */
addi r8, r8, (2f-1b)
@@ -240,7 +240,7 @@ setup_map_47x:
sync

/* Find the entry we are running from */
- bl 2f
+ bcl 20,31,2f
2: mflr r23
tlbsx r23, 0, r23
tlbre r24, r23, 0 /* TLB Word 0 */
@@ -296,7 +296,7 @@ clear_utlb_entry:
/* Update the msr to the new TS */
insrwi r5, r7, 1, 26

- bl 1f
+ bcl 20,31,1f
1: mflr r6
addi r6, r6, (2f-1b)

@@ -355,7 +355,7 @@ write_utlb:
/* Defaults to 256M */
lis r10, 0x1000

- bl 1f
+ bcl 20,31,1f
1: mflr r4
addi r4, r4, (2f-1b) /* virtual address of 2f */

--
2.25.0