From 9a5f37798ca0c3e4664d83f2b2174d8e11ea14de Mon Sep 17 00:00:00 2001 From: Philippe Gerum Date: Mon, 22 Jun 2009 18:23:32 +0200 Subject: [PATCH] --- yaml --- r: 162675 b: refs/heads/master c: 6b8019c85e18295466095a5778a14c1e9a067554 h: refs/heads/master i: 162673: 1fb7c813ae9368c5f399c63af9a994ff9eb0862d 162671: 21c6c68860c2a3cb42727dbc817ca3d2129006b7 v: v3 --- [refs] | 2 +- trunk/arch/blackfin/kernel/entry.S | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 1256c301b267..5de66e5519ee 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bc569f1a77199926be97ba6266dbea27768264df +refs/heads/master: 6b8019c85e18295466095a5778a14c1e9a067554 diff --git a/trunk/arch/blackfin/kernel/entry.S b/trunk/arch/blackfin/kernel/entry.S index a9cfba9946b5..3f8769b7db54 100644 --- a/trunk/arch/blackfin/kernel/entry.S +++ b/trunk/arch/blackfin/kernel/entry.S @@ -43,8 +43,28 @@ ENTRY(_ret_from_fork) #ifdef CONFIG_IPIPE - [--sp] = reti; /* IRQs on. */ - SP += 4; + /* + * Hw IRQs are off on entry, and we don't want the scheduling tail + * code to starve high priority domains from interrupts while it + * runs. Therefore we first stall the root stage to have the + * virtual interrupt state reflect IMASK. + */ + p0.l = ___ipipe_root_status; + p0.h = ___ipipe_root_status; + r4 = [p0]; + bitset(r4, 0); + [p0] = r4; + /* + * Then we may enable hw IRQs, allowing preemption from high + * priority domains. schedule_tail() will do local_irq_enable() + * since Blackfin does not define __ARCH_WANT_UNLOCKED_CTXSW, so + * there is no need to unstall the root domain by ourselves + * afterwards. + */ + p0.l = _bfin_irq_flags; + p0.h = _bfin_irq_flags; + r4 = [p0]; + sti r4; #endif /* CONFIG_IPIPE */ SP += -12; call _schedule_tail;