]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
powerpc/kexec: fix physical address calculation in clear_utlb_entry()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Thu, 6 Mar 2025 10:24:28 +0000 (11:24 +0100)
committerMadhavan Srinivasan <maddy@linux.ibm.com>
Mon, 10 Mar 2025 04:40:55 +0000 (10:10 +0530)
In relocate_32.S, function clear_utlb_entry() goes into real mode. To
do so, it has to calculate the physical address based on the virtual
address. To get the virtual address it uses 'bl' which is problematic
(see commit c974809a26a1 ("powerpc/vdso: Avoid link stack corruption
in __get_datapage()")). In addition, the calculation is done on a
wrong address because 'bl' loads LR with the address of the following
instruction, not the address of the target. So when the target is not
the instruction following the 'bl' instruction, it may lead to
unexpected behaviour.

Fix it by re-writing the code so that is goes via another path which
is based 'bcl 20,31,.+4' which is the right instruction to use for that.

Fixes: 683430200315 ("powerpc/47x: Kernel support for KEXEC")
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/dc4f9616fba9c05c5dbf9b4b5480eb1c362adc17.1741256651.git.christophe.leroy@csgroup.eu
arch/powerpc/kexec/relocate_32.S

index 104c9911f40611960b8d6b077553920f4cfb9d66..dd86e338307d3f95cfcba22cc34267c8b3e64338 100644 (file)
@@ -348,16 +348,13 @@ write_utlb:
        rlwinm  r10, r24, 0, 22, 27
 
        cmpwi   r10, PPC47x_TLB0_4K
-       bne     0f
        li      r10, 0x1000                     /* r10 = 4k */
-       ANNOTATE_INTRA_FUNCTION_CALL
-       bl      1f
+       beq     0f
 
-0:
        /* Defaults to 256M */
        lis     r10, 0x1000
 
-       bcl     20,31,$+4
+0:     bcl     20,31,$+4
 1:     mflr    r4
        addi    r4, r4, (2f-1b)                 /* virtual address  of 2f */