powerpc/32: Provide a name to exception prolog continuation in virtual mode
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Fri, 12 Mar 2021 12:50:30 +0000 (12:50 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 29 Mar 2021 02:22:06 +0000 (13:22 +1100)
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
arch/powerpc/kernel/head_32.h
arch/powerpc/kernel/head_40x.S
arch/powerpc/kernel/head_8xx.S
arch/powerpc/kernel/head_book3s_32.S

index 3c0aa45..160ebd5 100644 (file)
  * 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)
        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)
index e7d8856..86883cc 100644 (file)
@@ -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)),
index d16d0ec..932702a 100644 (file)
@@ -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)
index 4a74bbe..4ff67c5 100644 (file)
@@ -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)