--- a/kernel/eka/kernel/arm/cache_maintenance.cpp Tue Aug 31 16:34:26 2010 +0300
+++ b/kernel/eka/kernel/arm/cache_maintenance.cpp Wed Sep 01 12:34:56 2010 +0100
@@ -1116,11 +1116,33 @@
void TCacheBroadcast::DoThreadOp()
{
CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"TCacheBroadcast::DoThreadOp");
- TCoreCycler cycler;
- while (cycler.Next()==KErrNone)
- {
+ NKern::ThreadEnterCS();
+ NThreadGroup* g = NKern::LeaveGroup();
+ TInt frz = NKern::FreezeCpu();
+ if (frz)
+ __crash(); // already frozen so won't be able to migrate :-(
+ TInt orig_cpu = NKern::CurrentCpu();
+ TInt ncpu = NKern::NumberOfCpus();
+ TInt cpu = orig_cpu;
+ TUint32 orig_affinity = 0;
+ do {
+ TUint32 affinity = NKern::ThreadSetCpuAffinity(NKern::CurrentThread(), (TUint32)cpu);
+ if (cpu == orig_cpu)
+ {
+ orig_affinity = affinity;
+ NKern::EndFreezeCpu(frz);
+ }
+ TInt cpu_now = NKern::CurrentCpu();
+ if (cpu_now != cpu)
+ __crash();
Isr(this);
- }
+ if (++cpu == ncpu)
+ cpu = 0;
+ } while (cpu != orig_cpu);
+ NKern::ThreadSetCpuAffinity(NKern::CurrentThread(), orig_affinity);
+ if (g)
+ NKern::JoinGroup(g);
+ NKern::ThreadLeaveCS();
}
void InternalCache::Invalidate(TUint aMask, TLinAddr aBase, TUint aSize)