Commit 861efb8a authored by Christophe Leroy's avatar Christophe Leroy Committed by Madhavan Srinivasan
Browse files

powerpc/kexec: fix physical address calculation in clear_utlb_entry()



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 c974809a ("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: 68343020 ("powerpc/47x: Kernel support for KEXEC")
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/dc4f9616fba9c05c5dbf9b4b5480eb1c362adc17.1741256651.git.christophe.leroy@csgroup.eu
parent 1e4d73d0
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -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 */