Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d300627c authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Michael Ellerman
Browse files

powerpc/6xx: Handle DABR match before calling do_page_fault



On legacy 6xx 32-bit procesors, we checked for the DABR match bit
in DSISR from do_page_fault(), in the middle of a pile of ifdef's
because all other CPU types do it in assembly prior to calling
do_page_fault. Fix that.

Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
[mpe: Add #ifdef CONFIG_6xx]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent c433ec04
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -586,7 +586,11 @@ ppc_swapcontext:
handle_page_fault:
	stw	r4,_DAR(r1)
	addi	r3,r1,STACK_FRAME_OVERHEAD
	andis.  r0,r5,DSISR_DABRMATCH@h
#ifdef CONFIG_6xx
	bne-    handle_dabr_fault
	bl	do_page_fault
#endif
	cmpwi	r3,0
	beq+	ret_from_except
	SAVE_NVGPRS(r1)
@@ -599,6 +603,17 @@ handle_page_fault:
	bl	bad_page_fault
	b	ret_from_except_full

#ifdef CONFIG_6xx
	/* We have a data breakpoint exception - handle it */
handle_dabr_fault:
	SAVE_NVGPRS(r1)
	lwz	r0,_TRAP(r1)
	clrrwi	r0,r0,1
	stw	r0,_TRAP(r1)
	bl      do_break
	b	ret_from_except_full
#endif

/*
 * This routine switches between two different tasks.  The process
 * state of one is saved on its kernel stack.  Then the state
+0 −9
Original line number Diff line number Diff line
@@ -242,15 +242,6 @@ static int __do_page_fault(struct pt_regs *regs, unsigned long address,
		goto bail;
	}

#if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE) || \
      defined(CONFIG_PPC_BOOK3S_64) || defined(CONFIG_PPC_8xx))
  	if (error_code & DSISR_DABRMATCH) {
		/* breakpoint match */
		do_break(regs, address, error_code);
		goto bail;
	}
#endif

	/* We restore the interrupt state now */
	if (!arch_irq_disabled_regs(regs))
		local_irq_enable();