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

Commit 1d72d9f8 authored by Al Viro's avatar Al Viro
Browse files

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: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 7b7ade11
Loading
Loading
Loading
Loading
+3 −20
Original line number Diff line number Diff line
@@ -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


###############################################################################