Commit 8e93fb33 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

powerpc/64: provide a helper macro to load r2 with the kernel TOC



A later change stops the kernel using r2 and loads it with a poison
value.  Provide a PACATOC loading abstraction which can hide this
detail.

Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220926034057.2360083-5-npiggin@gmail.com
parent 754f6117
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -327,6 +327,12 @@ GLUE(.,name):

#ifdef __powerpc64__

#define __LOAD_PACA_TOC(reg)			\
	ld	reg,PACATOC(r13)

#define LOAD_PACA_TOC()				\
	__LOAD_PACA_TOC(r2)

#define LOAD_REG_IMMEDIATE(reg, expr) __LOAD_REG_IMMEDIATE reg, expr

#define LOAD_REG_IMMEDIATE_SYM(reg, tmp, expr)	\
+6 −6
Original line number Diff line number Diff line
@@ -371,7 +371,7 @@ exc_##n##_common: \
	ld	r4,excf+EX_R11(r13);	/* get back r11 */		    \
	mfspr	r5,scratch;		/* get back r13 */		    \
	SAVE_GPR(12, r1);		/* save r12 in stackframe */	    \
	ld	r2,PACATOC(r13);	/* get kernel TOC into r2 */	    \
	LOAD_PACA_TOC();		/* get kernel TOC into r2 */	    \
	mflr	r6;			/* save LR in stackframe */	    \
	mfctr	r7;			/* save CTR in stackframe */	    \
	mfspr	r8,SPRN_XER;		/* save XER in stackframe */	    \
@@ -687,7 +687,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
	beq+	1f

#ifdef CONFIG_RELOCATABLE
	ld	r15,PACATOC(r13)
	__LOAD_PACA_TOC(r15)
	ld	r14,interrupt_base_book3e@got(r15)
	ld	r15,__end_interrupts@got(r15)
	cmpld	cr0,r10,r14
@@ -758,7 +758,7 @@ kernel_dbg_exc:
	beq+	1f

#ifdef CONFIG_RELOCATABLE
	ld	r15,PACATOC(r13)
	__LOAD_PACA_TOC(r15)
	ld	r14,interrupt_base_book3e@got(r15)
	ld	r15,__end_interrupts@got(r15)
	cmpld	cr0,r10,r14
@@ -883,7 +883,7 @@ kernel_dbg_exc:

.macro SEARCH_RESTART_TABLE
#ifdef CONFIG_RELOCATABLE
	ld	r11,PACATOC(r13)
	__LOAD_PACA_TOC(r11)
	ld	r14,__start___restart_table@got(r11)
	ld	r15,__stop___restart_table@got(r11)
#else
@@ -1061,7 +1061,7 @@ bad_stack_book3e:
	std	r11,0(r1)
	ZEROIZE_GPR(12)
	std	r12,0(r11)
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
1:	addi	r3,r1,STACK_FRAME_OVERHEAD
	bl	kernel_bad_stack
	b	1b
@@ -1302,7 +1302,7 @@ a2_tlbinit_after_linear_map:

	/* Now we branch the new virtual address mapped by this entry */
#ifdef CONFIG_RELOCATABLE
	ld	r5,PACATOC(r13)
	__LOAD_PACA_TOC(r5)
	ld	r3,1f@got(r5)
#else
	LOAD_REG_IMMEDIATE_SYM(r3, r5, 1f)
+3 −3
Original line number Diff line number Diff line
@@ -580,7 +580,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
	std	r2,GPR2(r1)		/* save r2 in stackframe	*/
	SAVE_GPRS(3, 8, r1)		/* save r3 - r8 in stackframe   */
	mflr	r9			/* Get LR, later save to stack	*/
	ld	r2,PACATOC(r13)		/* get kernel TOC into r2	*/
	LOAD_PACA_TOC()			/* get kernel TOC into r2	*/
	std	r9,_LINK(r1)
	lbz	r10,PACAIRQSOFTMASK(r13)
	mfspr	r11,SPRN_XER		/* save XER in stackframe	*/
@@ -610,7 +610,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
.macro SEARCH_RESTART_TABLE
#ifdef CONFIG_RELOCATABLE
	mr	r12,r2
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
	LOAD_REG_ADDR(r9, __start___restart_table)
	LOAD_REG_ADDR(r10, __stop___restart_table)
	mr	r2,r12
@@ -640,7 +640,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
.macro SEARCH_SOFT_MASK_TABLE
#ifdef CONFIG_RELOCATABLE
	mr	r12,r2
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
	LOAD_REG_ADDR(r9, __start___soft_mask_table)
	LOAD_REG_ADDR(r10, __stop___soft_mask_table)
	mr	r2,r12
+2 −2
Original line number Diff line number Diff line
@@ -841,7 +841,7 @@ __secondary_start:
 * before going into C code.
 */
start_secondary_prolog:
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
	li	r3,0
	std	r3,0(r1)		/* Zero the stack frame pointer	*/
	bl	start_secondary
@@ -981,7 +981,7 @@ start_here_common:
	std	r1,PACAKSAVE(r13)

	/* Load the TOC (virtual address) */
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()

	/* Mark interrupts soft and hard disabled (they might be enabled
	 * in the PACA when doing hotplug)
+6 −6
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name)
	std	r0,GPR0(r1)
	std	r10,GPR1(r1)
	std	r2,GPR2(r1)
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
	mfcr	r12
	li	r11,0
	/* Save syscall parameters in r3-r8 */
@@ -174,7 +174,7 @@ syscall_vectored_\name\()_restart:
_ASM_NOKPROBE_SYMBOL(syscall_vectored_\name\()_restart)
	GET_PACA(r13)
	ld	r1,PACA_EXIT_SAVE_R1(r13)
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
	ld	r3,RESULT(r1)
	addi	r4,r1,STACK_FRAME_OVERHEAD
	li	r11,IRQS_ALL_DISABLED
@@ -224,7 +224,7 @@ START_BTB_FLUSH_SECTION
	BTB_FLUSH(r10)
END_BTB_FLUSH_SECTION
#endif
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
	mfcr	r12
	li	r11,0
	/* Save syscall parameters in r3-r8 */
@@ -355,7 +355,7 @@ syscall_restart:
_ASM_NOKPROBE_SYMBOL(syscall_restart)
	GET_PACA(r13)
	ld	r1,PACA_EXIT_SAVE_R1(r13)
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
	ld	r3,RESULT(r1)
	addi	r4,r1,STACK_FRAME_OVERHEAD
	li	r11,IRQS_ALL_DISABLED
@@ -502,7 +502,7 @@ interrupt_return_\srr\()_user_restart:
_ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_user_restart)
	GET_PACA(r13)
	ld	r1,PACA_EXIT_SAVE_R1(r13)
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
	addi	r3,r1,STACK_FRAME_OVERHEAD
	li	r11,IRQS_ALL_DISABLED
	stb	r11,PACAIRQSOFTMASK(r13)
@@ -663,7 +663,7 @@ interrupt_return_\srr\()_kernel_restart:
_ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_kernel_restart)
	GET_PACA(r13)
	ld	r1,PACA_EXIT_SAVE_R1(r13)
	ld	r2,PACATOC(r13)
	LOAD_PACA_TOC()
	addi	r3,r1,STACK_FRAME_OVERHEAD
	li	r11,IRQS_ALL_DISABLED
	stb	r11,PACAIRQSOFTMASK(r13)
Loading