]> git.baikalelectronics.ru Git - kernel.git/commitdiff
powerpc: Avoid link stack corruption in misc asm functions
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Tue, 24 Aug 2021 07:56:35 +0000 (07:56 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 25 Aug 2021 03:35:47 +0000 (13:35 +1000)
bl;mflr is used at several places to get code position.

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

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

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/c6eabb4fb6c156f75d56dcbcc6f243e5ac0fba42.1629791763.git.christophe.leroy@csgroup.eu
arch/powerpc/kernel/misc.S
arch/powerpc/kernel/misc_32.S
arch/powerpc/kernel/misc_64.S
arch/powerpc/kernel/reloc_32.S
arch/powerpc/kexec/relocate_32.S

index 5be96feccb5522ee05ae3010d091c51779695170..fb7de3543c037325bb9e57990d0836560a6f698d 100644 (file)
@@ -29,7 +29,7 @@ _GLOBAL(reloc_offset)
        li      r3, 0
 _GLOBAL(add_reloc_offset)
        mflr    r0
-       bl      1f
+       bcl     20,31,$+4
 1:     mflr    r5
        PPC_LL  r4,(2f-1b)(r5)
        subf    r5,r4,r5
index d8645efff902400966257c5a00d3c512f9517019..e5127b19fec29c56f94cca89757db567dc490ef5 100644 (file)
@@ -67,7 +67,7 @@ _GLOBAL(reloc_got2)
        srwi.   r8,r8,2
        beqlr
        mtctr   r8
-       bl      1f
+       bcl     20,31,$+4
 1:     mflr    r0
        lis     r4,1b@ha
        addi    r4,r4,1b@l
index 4b761a18a74d183adfefc59a5b0367d9dc548686..d38a019b38e108f8e0380aca515969f58bc3a6ef 100644 (file)
@@ -255,7 +255,7 @@ _GLOBAL(scom970_write)
  * Physical (hardware) cpu id should be in r3.
  */
 _GLOBAL(kexec_wait)
-       bl      1f
+       bcl     20,31,$+4
 1:     mflr    r5
        addi    r5,r5,kexec_flag-1b
 
index 10e96f3e22fe3f4092e0a82c7f47f5bbba31bc58..0508c14b4c28124a7541ed4c7baf351e059a7011 100644 (file)
@@ -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,$+4       /* Find our current runtime address */
 0:     mflr    r12             /* Make it accessible */
        mtlr    r0
 
index 61946c19e07ca8b5902d9ae7ad9e1bf68fe0800f..cf6e52bdf8d8331565cdf82e8483ef750ae3fb0a 100644 (file)
@@ -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,$+4                       /* 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,$+4
 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,$+4
 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,$+4
 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,$+4
 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,$+4
 1:     mflr    r4
        addi    r4, r4, (2f-1b)                 /* virtual address  of 2f */