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: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/d96374218815a6627e1e922ab2aba994050fb87a.1615552867.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
dc13b889b5
commit
8f844c06f4
@ -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 @@ label:
|
||||
|
||||
#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 @@ vmap_stack_overflow:
|
||||
#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)
|
||||
|
@ -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)),
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user