Skip to content

Commit

Permalink
frv: fix the broken preempt
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Al Viro committed Nov 2, 2012
1 parent 7b7ade1 commit 1d72d9f
Showing 1 changed file with 3 additions and 20 deletions.
23 changes: 3 additions & 20 deletions arch/frv/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -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


###############################################################################
Expand Down

0 comments on commit 1d72d9f

Please sign in to comment.