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

Commit 45852766 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull powerpc fixes from Benjamin Herrenschmidt:
 "Fixes for two nasty regression affecting powerpc in 3.4."

* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc:
  powerpc: Fix typo in runlatch code
  powerpc: Fix page fault with lockdep regression
parents f549e088 fae2e0fb
Loading
Loading
Loading
Loading
+21 −18
Original line number Diff line number Diff line
@@ -206,40 +206,43 @@ reenable_mmu: /* re-enable mmu so we can */
	andi.	r10,r10,MSR_EE		/* Did EE change? */
	beq	1f

	/* Save handler and return address into the 2 unused words
	 * of the STACK_FRAME_OVERHEAD (sneak sneak sneak). Everything
	 * else can be recovered from the pt_regs except r3 which for
	 * normal interrupts has been set to pt_regs and for syscalls
	 * is an argument, so we temporarily use ORIG_GPR3 to save it
	 */
	stw	r9,8(r1)
	stw	r11,12(r1)
	stw	r3,ORIG_GPR3(r1)
	/*
	 * The trace_hardirqs_off will use CALLER_ADDR0 and CALLER_ADDR1.
	 * If from user mode there is only one stack frame on the stack, and
	 * accessing CALLER_ADDR1 will cause oops. So we need create a dummy
	 * stack frame to make trace_hardirqs_off happy.
	 *
	 * This is handy because we also need to save a bunch of GPRs,
	 * r3 can be different from GPR3(r1) at this point, r9 and r11
	 * contains the old MSR and handler address respectively,
	 * r4 & r5 can contain page fault arguments that need to be passed
	 * along as well. r12, CCR, CTR, XER etc... are left clobbered as
	 * they aren't useful past this point (aren't syscall arguments),
	 * the rest is restored from the exception frame.
	 */
	stwu	r1,-32(r1)
	stw	r9,8(r1)
	stw	r11,12(r1)
	stw	r3,16(r1)
	stw	r4,20(r1)
	stw	r5,24(r1)
	andi.	r12,r12,MSR_PR
	beq	11f
	stwu	r1,-16(r1)
	b	11f
	bl	trace_hardirqs_off
	addi	r1,r1,16
	b	12f

11:
	bl	trace_hardirqs_off
12:
	lwz	r5,24(r1)
	lwz	r4,20(r1)
	lwz	r3,16(r1)
	lwz	r11,12(r1)
	lwz	r9,8(r1)
	addi	r1,r1,32
	lwz	r0,GPR0(r1)
	lwz	r3,ORIG_GPR3(r1)
	lwz	r4,GPR4(r1)
	lwz	r5,GPR5(r1)
	lwz	r6,GPR6(r1)
	lwz	r7,GPR7(r1)
	lwz	r8,GPR8(r1)
	lwz	r9,8(r1)
	lwz	r11,12(r1)
1:	mtctr	r11
	mtlr	r9
	bctr				/* jump to handler */
+2 −2
Original line number Diff line number Diff line
@@ -1235,7 +1235,7 @@ void __ppc64_runlatch_on(void)
	ctrl |= CTRL_RUNLATCH;
	mtspr(SPRN_CTRLT, ctrl);

	ti->local_flags |= TLF_RUNLATCH;
	ti->local_flags |= _TLF_RUNLATCH;
}

/* Called with hard IRQs off */
@@ -1244,7 +1244,7 @@ void __ppc64_runlatch_off(void)
	struct thread_info *ti = current_thread_info();
	unsigned long ctrl;

	ti->local_flags &= ~TLF_RUNLATCH;
	ti->local_flags &= ~_TLF_RUNLATCH;

	ctrl = mfspr(SPRN_CTRLF);
	ctrl &= ~CTRL_RUNLATCH;