summary refs log tree commit diff
path: root/arch/frv/kernel
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-11-02 12:05:44 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-11-02 12:08:25 -0400
commit1d72d9f83df057e71c7951def41138a0230bf737 (patch)
tree32e1d5b7bb3f906faa7b62bbb53a91209d73024c /arch/frv/kernel
parent7b7ade117951dcc5ec947595ea7ff622fa56895e (diff)
downloadlinux-1d72d9f83df057e71c7951def41138a0230bf737.tar.gz
frv: fix the broken preempt
Just get %icc2 into the state we would have after local_irq_disable()
and physical IRQ having happened since then.  Then we can simply
use preempt_schedule_irq() and be done with the whole mess.

Acked-by: David Howells <dhowells@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/frv/kernel')
-rw-r--r--arch/frv/kernel/entry.S23
1 files changed, 3 insertions, 20 deletions
diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S
index b1cd7e8145bb..dfcd263c0517 100644
--- a/arch/frv/kernel/entry.S
+++ b/arch/frv/kernel/entry.S
@@ -1075,27 +1075,10 @@ __entry_return_from_kernel_interrupt:
 	subicc		gr5,#0,gr0,icc0
 	beq		icc0,#0,__entry_return_direct
 
-__entry_preempt_need_resched:
-	ldi		@(gr15,#TI_FLAGS),gr4
-	andicc		gr4,#_TIF_NEED_RESCHED,gr0,icc0
-	beq		icc0,#1,__entry_return_direct
-
-	setlos		#PREEMPT_ACTIVE,gr5
-	sti		gr5,@(gr15,#TI_PRE_COUNT)
-
-	andi		gr23,#~PSR_PIL,gr23
-	movgs		gr23,psr
-
-	call		schedule
-	sti		gr0,@(gr15,#TI_PRE_COUNT)
-
-	movsg		psr,gr23
-	ori		gr23,#PSR_PIL_14,gr23
-	movgs		gr23,psr
-	bra		__entry_preempt_need_resched
-#else
-	bra		__entry_return_direct
+	subcc		gr0,gr0,gr0,icc2		/* set Z and clear C */
+	call		preempt_schedule_irq
 #endif
+	bra		__entry_return_direct
 
 
 ###############################################################################