1114 } |
1114 } |
1115 |
1115 |
1116 void TCacheBroadcast::DoThreadOp() |
1116 void TCacheBroadcast::DoThreadOp() |
1117 { |
1117 { |
1118 CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"TCacheBroadcast::DoThreadOp"); |
1118 CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"TCacheBroadcast::DoThreadOp"); |
1119 TCoreCycler cycler; |
1119 NKern::ThreadEnterCS(); |
1120 while (cycler.Next()==KErrNone) |
1120 NThreadGroup* g = NKern::LeaveGroup(); |
1121 { |
1121 TInt frz = NKern::FreezeCpu(); |
|
1122 if (frz) |
|
1123 __crash(); // already frozen so won't be able to migrate :-( |
|
1124 TInt orig_cpu = NKern::CurrentCpu(); |
|
1125 TInt ncpu = NKern::NumberOfCpus(); |
|
1126 TInt cpu = orig_cpu; |
|
1127 TUint32 orig_affinity = 0; |
|
1128 do { |
|
1129 TUint32 affinity = NKern::ThreadSetCpuAffinity(NKern::CurrentThread(), (TUint32)cpu); |
|
1130 if (cpu == orig_cpu) |
|
1131 { |
|
1132 orig_affinity = affinity; |
|
1133 NKern::EndFreezeCpu(frz); |
|
1134 } |
|
1135 TInt cpu_now = NKern::CurrentCpu(); |
|
1136 if (cpu_now != cpu) |
|
1137 __crash(); |
1122 Isr(this); |
1138 Isr(this); |
1123 } |
1139 if (++cpu == ncpu) |
|
1140 cpu = 0; |
|
1141 } while (cpu != orig_cpu); |
|
1142 NKern::ThreadSetCpuAffinity(NKern::CurrentThread(), orig_affinity); |
|
1143 if (g) |
|
1144 NKern::JoinGroup(g); |
|
1145 NKern::ThreadLeaveCS(); |
1124 } |
1146 } |
1125 |
1147 |
1126 void InternalCache::Invalidate(TUint aMask, TLinAddr aBase, TUint aSize) |
1148 void InternalCache::Invalidate(TUint aMask, TLinAddr aBase, TUint aSize) |
1127 { |
1149 { |
1128 __KTRACE_OPT(KMMU,Kern::Printf("Cache::Invalidate %x %08x+%08x",aMask,aBase,aSize)); |
1150 __KTRACE_OPT(KMMU,Kern::Printf("Cache::Invalidate %x %08x+%08x",aMask,aBase,aSize)); |