Commit 47169fba authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

powerpc/64s/exception: Move EXCEPTION_COMMON additions into callers



More cases of code insertion via macros that does not add a great
deal. All the additions have to be specified in the macro arguments,
so they can just as well go after the macro.

No generated code change.

Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent c06075f3
Loading
Loading
Loading
Loading
+13 −29
Original line number Diff line number Diff line
@@ -640,21 +640,6 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
	EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, bitmask ;	\
	EXCEPTION_PROLOG_2_VIRT label, EXC_HV

/*
 * Our exception common code can be passed various "additions"
 * to specify the behaviour of interrupts, whether to kick the
 * runlatch, etc...
 */

/*
 * This addition reconciles our actual IRQ state with the various software
 * flags that track it. This may call C code.
 */
#define ADD_RECONCILE	RECONCILE_IRQ_STATE(r10,r11)

#define ADD_NVGPRS				\
	bl	save_nvgprs

#define RUNLATCH_ON				\
BEGIN_FTR_SECTION				\
	ld	r3, PACA_THREAD_INFO(r13);	\
@@ -663,25 +648,22 @@ BEGIN_FTR_SECTION \
	beql	ppc64_runlatch_on_trampoline;	\
END_FTR_SECTION_IFSET(CPU_FTR_CTRL)

#define EXCEPTION_COMMON(area, trap, label, additions)		\
#define EXCEPTION_COMMON(area, trap)				\
	EXCEPTION_PROLOG_COMMON(trap, area);			\
	/* Volatile regs are potentially clobbered here */	\
	additions

/*
 * Exception where stack is already set in r1, r1 is saved in r10, and it
 * continues rather than returns.
 * Exception where stack is already set in r1, r1 is saved in r10
 */
#define EXCEPTION_COMMON_NORET_STACK(area, trap, label, additions) \
#define EXCEPTION_COMMON_STACK(area, trap)			\
	EXCEPTION_PROLOG_COMMON_1();				\
	kuap_save_amr_and_lock r9, r10, cr1;			\
	EXCEPTION_PROLOG_COMMON_2(area);			\
	EXCEPTION_PROLOG_COMMON_3(trap);			\
	/* Volatile regs are potentially clobbered here */	\
	additions
	EXCEPTION_PROLOG_COMMON_3(trap)

#define STD_EXCEPTION_COMMON(trap, label, hdlr)			\
	EXCEPTION_COMMON(PACA_EXGEN, trap, label, ADD_NVGPRS;ADD_RECONCILE); \
#define STD_EXCEPTION_COMMON(trap, hdlr)			\
	EXCEPTION_COMMON(PACA_EXGEN, trap);			\
	bl	save_nvgprs;					\
	RECONCILE_IRQ_STATE(r10, r11);				\
	addi	r3,r1,STACK_FRAME_OVERHEAD;			\
	bl	hdlr;						\
	b	ret_from_except
@@ -691,9 +673,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
 * in the idle task and therefore need the special idle handling
 * (finish nap and runlatch)
 */
#define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr)		\
	EXCEPTION_COMMON(PACA_EXGEN, trap, label,		\
		FINISH_NAP;ADD_RECONCILE;RUNLATCH_ON);		\
#define STD_EXCEPTION_COMMON_ASYNC(trap, hdlr)			\
	EXCEPTION_COMMON(PACA_EXGEN, trap);			\
	FINISH_NAP;						\
	RECONCILE_IRQ_STATE(r10, r11);				\
	RUNLATCH_ON;						\
	addi	r3,r1,STACK_FRAME_OVERHEAD;			\
	bl	hdlr;						\
	b	ret_from_except_lite
+2 −2
Original line number Diff line number Diff line
@@ -403,11 +403,11 @@ name:

#define EXC_COMMON(name, realvec, hdlr)					\
	EXC_COMMON_BEGIN(name);						\
	STD_EXCEPTION_COMMON(realvec, name, hdlr)
	STD_EXCEPTION_COMMON(realvec, hdlr)

#define EXC_COMMON_ASYNC(name, realvec, hdlr)				\
	EXC_COMMON_BEGIN(name);						\
	STD_EXCEPTION_COMMON_ASYNC(realvec, name, hdlr)
	STD_EXCEPTION_COMMON_ASYNC(realvec, hdlr)

#endif /* __ASSEMBLY__ */

+24 −21
Original line number Diff line number Diff line
@@ -164,21 +164,6 @@ EXC_COMMON_BEGIN(system_reset_idle_common)
	b	idle_return_gpr_loss
#endif

/*
 * Set IRQS_ALL_DISABLED unconditionally so arch_irqs_disabled does
 * the right thing. We do not want to reconcile because that goes
 * through irq tracing which we don't want in NMI.
 *
 * Save PACAIRQHAPPENED because some code will do a hard disable
 * (e.g., xmon). So we want to restore this back to where it was
 * when we return. DAR is unused in the stack, so save it there.
 */
#define ADD_RECONCILE_NMI						\
	li	r10,IRQS_ALL_DISABLED;					\
	stb	r10,PACAIRQSOFTMASK(r13);				\
	lbz	r10,PACAIRQHAPPENED(r13);				\
	std	r10,_DAR(r1)

EXC_COMMON_BEGIN(system_reset_common)
	/*
	 * Increment paca->in_nmi then enable MSR_RI. SLB or MCE will be able
@@ -195,8 +180,22 @@ EXC_COMMON_BEGIN(system_reset_common)
	mr	r10,r1
	ld	r1,PACA_NMI_EMERG_SP(r13)
	subi	r1,r1,INT_FRAME_SIZE
	EXCEPTION_COMMON_NORET_STACK(PACA_EXNMI, 0x100, system_reset,
					ADD_NVGPRS;ADD_RECONCILE_NMI)
	EXCEPTION_COMMON_STACK(PACA_EXNMI, 0x100)
	bl	save_nvgprs
	/*
	 * Set IRQS_ALL_DISABLED unconditionally so arch_irqs_disabled does
	 * the right thing. We do not want to reconcile because that goes
	 * through irq tracing which we don't want in NMI.
	 *
	 * Save PACAIRQHAPPENED because some code will do a hard disable
	 * (e.g., xmon). So we want to restore this back to where it was
	 * when we return. DAR is unused in the stack, so save it there.
	 */
	li	r10,IRQS_ALL_DISABLED
	stb	r10,PACAIRQSOFTMASK(r13)
	lbz	r10,PACAIRQHAPPENED(r13)
	std	r10,_DAR(r1)

	addi	r3,r1,STACK_FRAME_OVERHEAD
	bl	system_reset_exception

@@ -1172,8 +1171,11 @@ hmi_exception_after_realmode:
	b	tramp_real_hmi_exception

EXC_COMMON_BEGIN(hmi_exception_common)
EXCEPTION_COMMON(PACA_EXGEN, 0xe60, hmi_exception_common,
			FINISH_NAP;ADD_NVGPRS;ADD_RECONCILE;RUNLATCH_ON)
	EXCEPTION_COMMON(PACA_EXGEN, 0xe60)
	FINISH_NAP
	bl	save_nvgprs
	RECONCILE_IRQ_STATE(r10, r11)
	RUNLATCH_ON
	addi	r3,r1,STACK_FRAME_OVERHEAD
	bl	handle_hmi_exception
	b	ret_from_except
@@ -1471,8 +1473,9 @@ EXC_COMMON_BEGIN(soft_nmi_common)
	mr	r10,r1
	ld	r1,PACAEMERGSP(r13)
	subi	r1,r1,INT_FRAME_SIZE
	EXCEPTION_COMMON_NORET_STACK(PACA_EXGEN, 0x900, system_reset,
					ADD_NVGPRS;ADD_RECONCILE)
	EXCEPTION_COMMON_STACK(PACA_EXGEN, 0x900)
	bl	save_nvgprs
	RECONCILE_IRQ_STATE(r10, r11)
	addi	r3,r1,STACK_FRAME_OVERHEAD
	bl	soft_nmi_interrupt
	b	ret_from_except