powerpc: do_break get registers from regs
authorNicholas Piggin <npiggin@gmail.com>
Sat, 30 Jan 2021 13:08:18 +0000 (23:08 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 8 Feb 2021 13:02:09 +0000 (00:02 +1100)
Similar to the previous patch this makes interrupt handler function
types more regular so they can be wrapped with the next patch.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210130130852.2952424-9-npiggin@gmail.com
arch/powerpc/include/asm/debug.h
arch/powerpc/kernel/head_8xx.S
arch/powerpc/kernel/process.c

index ec57daf..0550ece 100644 (file)
@@ -52,8 +52,7 @@ extern void do_send_trap(struct pt_regs *regs, unsigned long address,
                         unsigned long error_code, int brkpt);
 #else
 
-extern void do_break(struct pt_regs *regs, unsigned long address,
-                    unsigned long error_code);
+void do_break(struct pt_regs *regs);
 #endif
 
 #endif /* _ASM_POWERPC_DEBUG_H */
index 0b2c247..7869db9 100644 (file)
@@ -364,10 +364,9 @@ do_databreakpoint:
        addi    r3,r1,STACK_FRAME_OVERHEAD
        mfspr   r4,SPRN_BAR
        stw     r4,_DAR(r11)
-#ifdef CONFIG_VMAP_STACK
-       lwz     r5,_DSISR(r11)
-#else
+#ifndef CONFIG_VMAP_STACK
        mfspr   r5,SPRN_DSISR
+       stw     r5,_DSISR(r11)
 #endif
        EXC_XFER_STD(0x1c00, do_break)
 
index a66f435..4f0f81e 100644 (file)
@@ -659,11 +659,10 @@ static void do_break_handler(struct pt_regs *regs)
        }
 }
 
-void do_break (struct pt_regs *regs, unsigned long address,
-                   unsigned long error_code)
+void do_break(struct pt_regs *regs)
 {
        current->thread.trap_nr = TRAP_HWBKPT;
-       if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
+       if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, regs->dsisr,
                        11, SIGSEGV) == NOTIFY_STOP)
                return;
 
@@ -681,7 +680,7 @@ void do_break (struct pt_regs *regs, unsigned long address,
                do_break_handler(regs);
 
        /* Deliver the signal to userspace */
-       force_sig_fault(SIGTRAP, TRAP_HWBKPT, (void __user *)address);
+       force_sig_fault(SIGTRAP, TRAP_HWBKPT, (void __user *)regs->dar);
 }
 #endif /* CONFIG_PPC_ADV_DEBUG_REGS */