Commit 8f844c06 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman
Browse files

powerpc/32: Provide a name to exception prolog continuation in virtual mode



Now that the prolog continuation is separated in .text, give it a name
and mark it _ASM_NOKPROBE_SYMBOL.

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/d96374218815a6627e1e922ab2aba994050fb87a.1615552867.git.christophe.leroy@csgroup.eu
parent dc13b889
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -10,10 +10,10 @@
 * We assume sprg3 has the physical address of the current
 * task's thread_struct.
 */
.macro EXCEPTION_PROLOG handle_dar_dsisr=0
.macro EXCEPTION_PROLOG		name handle_dar_dsisr=0
	EXCEPTION_PROLOG_0	handle_dar_dsisr=\handle_dar_dsisr
	EXCEPTION_PROLOG_1
	EXCEPTION_PROLOG_2	handle_dar_dsisr=\handle_dar_dsisr
	EXCEPTION_PROLOG_2	\name handle_dar_dsisr=\handle_dar_dsisr
.endm

.macro EXCEPTION_PROLOG_0 handle_dar_dsisr=0
@@ -56,7 +56,7 @@
#endif
.endm

.macro EXCEPTION_PROLOG_2 handle_dar_dsisr=0
.macro EXCEPTION_PROLOG_2 name handle_dar_dsisr=0
#ifdef CONFIG_PPC_8xx
	.if	\handle_dar_dsisr
	li	r11, RPN_PATTERN
@@ -72,6 +72,7 @@
	rfi

	.text
\name\()_virt:
1:
	stw	r11,GPR1(r1)
	stw	r11,0(r1)
@@ -109,6 +110,7 @@
	stw	r10,8(r11)
	SAVE_4GPRS(3, r11)
	SAVE_2GPRS(7, r11)
_ASM_NOKPROBE_SYMBOL(\name\()_virt)
.endm

.macro SYSCALL_ENTRY trapno
@@ -180,7 +182,7 @@

#define EXCEPTION(n, label, hdlr, xfer)		\
	START_EXCEPTION(n, label)		\
	EXCEPTION_PROLOG;			\
	EXCEPTION_PROLOG label;			\
	addi	r3,r1,STACK_FRAME_OVERHEAD;	\
	xfer(n, hdlr)

@@ -212,7 +214,7 @@
#endif
	lwz	r1, emergency_ctx@l(r1)
	addi	r1, r1, THREAD_SIZE - INT_FRAME_SIZE
	EXCEPTION_PROLOG_2
	EXCEPTION_PROLOG_2 vmap_stack_overflow
	SAVE_NVGPRS(r11)
	addi	r3, r1, STACK_FRAME_OVERHEAD
	EXC_XFER_STD(0, stack_overflow_exception)
+12 −10
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ _ENTRY(crit_esr)
 * Instead we use a couple of words of memory at low physical addresses.
 * This is OK since we don't support SMP on these processors.
 */
.macro CRITICAL_EXCEPTION_PROLOG
.macro CRITICAL_EXCEPTION_PROLOG name
	stw	r10,crit_r10@l(0)	/* save two registers to work with */
	stw	r11,crit_r11@l(0)
	mfspr	r10,SPRN_SRR0
@@ -135,6 +135,7 @@ _ENTRY(crit_esr)

	.text
1:
\name\()_virt:
	lwz	r11,crit_r1@l(0)
	stw	r11,GPR1(r1)
	stw	r11,0(r1)
@@ -162,6 +163,7 @@ _ENTRY(crit_esr)
	stw	r10, 8(r11)
	SAVE_4GPRS(3, r11)
	SAVE_2GPRS(7, r11)
_ASM_NOKPROBE_SYMBOL(\name\()_virt)
.endm

	/*
@@ -182,7 +184,7 @@ _ENTRY(crit_esr)
 */
#define CRITICAL_EXCEPTION(n, label, hdlr)			\
	START_EXCEPTION(n, label);				\
	CRITICAL_EXCEPTION_PROLOG;				\
	CRITICAL_EXCEPTION_PROLOG label;				\
	addi	r3,r1,STACK_FRAME_OVERHEAD;			\
	EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
			  crit_transfer_to_handler, ret_from_crit_exc)
@@ -205,7 +207,7 @@ _ENTRY(crit_esr)
 * if they can't resolve the lightweight TLB fault.
 */
	START_EXCEPTION(0x0300,	DataStorage)
	EXCEPTION_PROLOG handle_dar_dsisr=1
	EXCEPTION_PROLOG DataStorage handle_dar_dsisr=1
	EXC_XFER_LITE(0x300, handle_page_fault)

/*
@@ -213,7 +215,7 @@ _ENTRY(crit_esr)
 * This is caused by a fetch from non-execute or guarded pages.
 */
	START_EXCEPTION(0x0400, InstructionAccess)
	EXCEPTION_PROLOG
	EXCEPTION_PROLOG InstructionAccess
	li	r5,0
	stw	r5, _ESR(r11)		/* Zero ESR */
	stw	r12, _DEAR(r11)		/* SRR0 as DEAR */
@@ -224,13 +226,13 @@ _ENTRY(crit_esr)

/* 0x0600 - Alignment Exception */
	START_EXCEPTION(0x0600, Alignment)
	EXCEPTION_PROLOG handle_dar_dsisr=1
	EXCEPTION_PROLOG Alignment handle_dar_dsisr=1
	addi	r3,r1,STACK_FRAME_OVERHEAD
	EXC_XFER_STD(0x600, alignment_exception)

/* 0x0700 - Program Exception */
	START_EXCEPTION(0x0700, ProgramCheck)
	EXCEPTION_PROLOG handle_dar_dsisr=1
	EXCEPTION_PROLOG ProgramCheck handle_dar_dsisr=1
	addi	r3,r1,STACK_FRAME_OVERHEAD
	EXC_XFER_STD(0x700, program_check_exception)

@@ -450,7 +452,7 @@ _ENTRY(crit_esr)
 */
	/* 0x2000 - Debug Exception */
	START_EXCEPTION(0x2000, DebugTrap)
	CRITICAL_EXCEPTION_PROLOG
	CRITICAL_EXCEPTION_PROLOG DebugTrap

	/*
	 * If this is a single step or branch-taken exception in an
@@ -500,7 +502,7 @@ _ENTRY(crit_esr)
	/* Programmable Interval Timer (PIT) Exception. (from 0x1000) */
	__HEAD
Decrementer:
	EXCEPTION_PROLOG
	EXCEPTION_PROLOG Decrementer
	lis	r0,TSR_PIS@h
	mtspr	SPRN_TSR,r0		/* Clear the PIT exception */
	addi	r3,r1,STACK_FRAME_OVERHEAD
@@ -509,14 +511,14 @@ Decrementer:
	/* Fixed Interval Timer (FIT) Exception. (from 0x1010) */
	__HEAD
FITException:
	EXCEPTION_PROLOG
	EXCEPTION_PROLOG FITException
	addi	r3,r1,STACK_FRAME_OVERHEAD;
	EXC_XFER_STD(0x1010, unknown_exception)

	/* Watchdog Timer (WDT) Exception. (from 0x1020) */
	__HEAD
WDTException:
	CRITICAL_EXCEPTION_PROLOG;
	CRITICAL_EXCEPTION_PROLOG WDTException
	addi	r3,r1,STACK_FRAME_OVERHEAD;
	EXC_XFER_TEMPLATE(WatchdogException, 0x1020+2,
	                  (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)),
+5 −5
Original line number Diff line number Diff line
@@ -122,7 +122,7 @@ instruction_counter:

/* Machine check */
	START_EXCEPTION(0x200, MachineCheck)
	EXCEPTION_PROLOG handle_dar_dsisr=1
	EXCEPTION_PROLOG MachineCheck handle_dar_dsisr=1
	addi r3,r1,STACK_FRAME_OVERHEAD
	EXC_XFER_STD(0x200, machine_check_exception)

@@ -131,7 +131,7 @@ instruction_counter:

/* Alignment exception */
	START_EXCEPTION(0x600, Alignment)
	EXCEPTION_PROLOG handle_dar_dsisr=1
	EXCEPTION_PROLOG Alignment handle_dar_dsisr=1
	addi	r3,r1,STACK_FRAME_OVERHEAD
	EXC_XFER_STD(0x600, alignment_exception)

@@ -294,7 +294,7 @@ instruction_counter:
 * addresses.  There is nothing to do but handle a big time error fault.
 */
	START_EXCEPTION(0x1300, InstructionTLBError)
	EXCEPTION_PROLOG
	EXCEPTION_PROLOG InstructionTLBError
	andis.	r5,r9,DSISR_SRR1_MATCH_32S@h /* Filter relevant SRR1 bits */
	andis.	r10,r9,SRR1_ISI_NOPT@h
	beq+	.Litlbie
@@ -316,7 +316,7 @@ instruction_counter:
	beq-	cr1, FixupDAR	/* must be a buggy dcbX, icbi insn. */
DARFixed:/* Return from dcbx instruction bug workaround */
	EXCEPTION_PROLOG_1
	EXCEPTION_PROLOG_2 handle_dar_dsisr=1
	EXCEPTION_PROLOG_2 DataTLBError handle_dar_dsisr=1
	lwz	r4, _DAR(r11)
	lwz	r5, _DSISR(r11)
	andis.	r10,r5,DSISR_NOHPTE@h
@@ -347,7 +347,7 @@ DARFixed:/* Return from dcbx instruction bug workaround */
	rfi

1:	EXCEPTION_PROLOG_1
	EXCEPTION_PROLOG_2 handle_dar_dsisr=1
	EXCEPTION_PROLOG_2 DataBreakpoint handle_dar_dsisr=1
	addi	r3,r1,STACK_FRAME_OVERHEAD
	mfspr	r4,SPRN_BAR
	stw	r4,_DAR(r11)
+7 −7
Original line number Diff line number Diff line
@@ -266,7 +266,7 @@ __secondary_hold_acknowledge:
	mfspr	r1, SPRN_SPRG_SCRATCH2
#endif /* CONFIG_PPC_CHRP */
	EXCEPTION_PROLOG_1
7:	EXCEPTION_PROLOG_2
7:	EXCEPTION_PROLOG_2 MachineCheck
	addi	r3,r1,STACK_FRAME_OVERHEAD
#ifdef CONFIG_PPC_CHRP
	beq	cr1, 1f
@@ -296,7 +296,7 @@ ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_HPTE_TABLE)
#endif
1:	EXCEPTION_PROLOG_0 handle_dar_dsisr=1
	EXCEPTION_PROLOG_1
	EXCEPTION_PROLOG_2 handle_dar_dsisr=1
	EXCEPTION_PROLOG_2 DataAccess handle_dar_dsisr=1
	lwz	r5, _DSISR(r11)
	andis.	r0, r5, DSISR_DABRMATCH@h
	bne-	1f
@@ -325,7 +325,7 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
	andi.	r11, r11, MSR_PR

	EXCEPTION_PROLOG_1
	EXCEPTION_PROLOG_2
	EXCEPTION_PROLOG_2 InstructionAccess
	andis.	r5,r9,DSISR_SRR1_MATCH_32S@h /* Filter relevant SRR1 bits */
	stw	r5, _DSISR(r11)
	stw	r12, _DAR(r11)
@@ -336,7 +336,7 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)

/* Alignment exception */
	START_EXCEPTION(0x600, Alignment)
	EXCEPTION_PROLOG handle_dar_dsisr=1
	EXCEPTION_PROLOG Alignment handle_dar_dsisr=1
	addi	r3,r1,STACK_FRAME_OVERHEAD
	EXC_XFER_STD(0x600, alignment_exception)

@@ -353,7 +353,7 @@ BEGIN_FTR_SECTION
 */
	b 	ProgramCheck
END_FTR_SECTION_IFSET(CPU_FTR_FPU_UNAVAILABLE)
	EXCEPTION_PROLOG
	EXCEPTION_PROLOG FPUnavailable
	beq	1f
	bl	load_up_fpu		/* if from user, just load it up */
	b	fast_exception_return
@@ -716,7 +716,7 @@ fast_hash_page_return:

	__HEAD
AltiVecUnavailable:
	EXCEPTION_PROLOG
	EXCEPTION_PROLOG AltiVecUnavailable
#ifdef CONFIG_ALTIVEC
	beq	1f
	bl	load_up_altivec		/* if from user, just load it up */
@@ -727,7 +727,7 @@ AltiVecUnavailable:

	__HEAD
PerformanceMonitor:
	EXCEPTION_PROLOG
	EXCEPTION_PROLOG PerformanceMonitor
	addi	r3,r1,STACK_FRAME_OVERHEAD
	EXC_XFER_STD(0xf00, performance_monitor_exception)