574 asm("fs_signal_wake: "); |
574 asm("fs_signal_wake: "); |
575 asm("stmfd sp!, {r4-r6,lr} "); |
575 asm("stmfd sp!, {r4-r6,lr} "); |
576 asm("mov r4, r0 "); |
576 asm("mov r4, r0 "); |
577 asm("mov r5, r1 "); |
577 asm("mov r5, r1 "); |
578 asm("mov r0, r1 "); |
578 asm("mov r0, r1 "); |
579 asm("bl AcqSLock__12NSchedulable "); |
579 asm("bl AcqSLock__12NSchedulable "); // CSM needed |
580 asm("add r0, r5, #%a0" : : "i" _FOFF(NThreadBase, iWaitState)); |
580 asm("add r0, r5, #%a0" : : "i" _FOFF(NThreadBase, iWaitState)); |
581 asm("mov r1, #%a0" : : "i" ((TInt)NThreadBase::EWaitFastSemaphore)); |
581 asm("mov r1, #%a0" : : "i" ((TInt)NThreadBase::EWaitFastSemaphore)); |
582 asm("mov r2, r4 "); |
582 asm("mov r2, r4 "); |
583 asm("mov r3, #0 "); |
583 asm("mov r3, #0 "); |
584 asm("bl UnBlockT__16NThreadWaitStateUiPvi "); |
584 asm("bl UnBlockT__16NThreadWaitStateUiPvi "); // CSM needed |
585 asm("mov r0, r5 "); |
585 asm("mov r0, r5 "); |
586 asm("ldmfd sp!, {r4-r6,lr} "); |
586 asm("ldmfd sp!, {r4-r6,lr} "); |
587 asm("b RelSLock__12NSchedulable "); |
587 asm("b RelSLock__12NSchedulable "); // CSM needed |
588 } |
588 } |
589 |
589 |
590 |
590 |
591 /** Signals a fast semaphore multiple times. |
591 /** Signals a fast semaphore multiple times. |
592 |
592 |
705 asm("add r12, r12, #1 "); // lock the kernel |
705 asm("add r12, r12, #1 "); // lock the kernel |
706 asm("str r12, [r3, #%a0]" : : "i" _FOFF(TSubScheduler,iKernLockCount)); |
706 asm("str r12, [r3, #%a0]" : : "i" _FOFF(TSubScheduler,iKernLockCount)); |
707 __ASM_STI(); |
707 __ASM_STI(); |
708 asm("bl fs_signal_wake "); // wake up the thread |
708 asm("bl fs_signal_wake "); // wake up the thread |
709 asm("ldmfd sp!, {r4,lr} "); |
709 asm("ldmfd sp!, {r4,lr} "); |
710 asm("b Unlock__5NKern "); |
710 asm("b " CSM_ZN5NKern6UnlockEv); |
711 } |
711 } |
712 |
712 |
713 |
713 |
714 /** Signals a fast semaphore multiple times. |
714 /** Signals a fast semaphore multiple times. |
715 |
715 |
958 STREXD( 12,2,0); // yes - wait matches - try to write return value |
958 STREXD( 12,2,0); // yes - wait matches - try to write return value |
959 asm("cmp r12, #0 "); // success? |
959 asm("cmp r12, #0 "); // success? |
960 asm("bne 1b "); // no - retry |
960 asm("bne 1b "); // no - retry |
961 asm("mov r6, r0 "); |
961 asm("mov r6, r0 "); |
962 asm("tst r4, #%a0" : : "i" ((TInt)EWtStTimeout)); |
962 asm("tst r4, #%a0" : : "i" ((TInt)EWtStTimeout)); |
963 asm("blne CancelTimerT__16NThreadWaitState "); |
963 asm("blne CancelTimerT__16NThreadWaitState "); // CSM needed |
964 asm("tst r4, #%a0" : : "i" ((TInt)EWtStWaitActive)); |
964 asm("tst r4, #%a0" : : "i" ((TInt)EWtStWaitActive)); |
965 asm("beq 0f "); |
965 asm("beq 0f "); |
966 asm("ldr r1, [r6, #%a0]" : : "i" (_FOFF(NThreadBase,iPauseCount)-_FOFF(NThreadBase,iWaitState))); |
966 asm("ldr r1, [r6, #%a0]" : : "i" (_FOFF(NThreadBase,iPauseCount)-_FOFF(NThreadBase,iWaitState))); |
967 asm("sub r0, r6, #%a0" : : "i" _FOFF(NThreadBase,iWaitState)); // r0 = Thread() |
967 asm("sub r0, r6, #%a0" : : "i" _FOFF(NThreadBase,iWaitState)); // r0 = Thread() |
968 asm("movs r1, r1, lsl #16 "); // check if iPauseCount=iSuspendCount=0 |
968 asm("movs r1, r1, lsl #16 "); // check if iPauseCount=iSuspendCount=0 |
969 asm("andeq r1, r4, #%a0" : : "i" ((TInt)EWtStObstructed)); |
969 asm("andeq r1, r4, #%a0" : : "i" ((TInt)EWtStObstructed)); |
970 asm("bleq ReadyT__12NSchedulableUi "); // if so, make thread ready |
970 asm("bleq ReadyT__12NSchedulableUi "); // if so, make thread ready // CSM needed |
971 asm("0: "); |
971 asm("0: "); |
972 asm("mov r0, #0 "); |
972 asm("mov r0, #0 "); |
973 __POPRET(" r4-r6,"); // return KErrNone |
973 __POPRET(" r4-r6,"); // return KErrNone |
974 |
974 |
975 asm("2: "); |
975 asm("2: "); |
1037 asm("stmfd sp!, {r0,lr} "); |
1037 asm("stmfd sp!, {r0,lr} "); |
1038 asm("mov r1, r0 "); |
1038 asm("mov r1, r0 "); |
1039 asm("ldr r0, btrace_hdr_fmsignal "); |
1039 asm("ldr r0, btrace_hdr_fmsignal "); |
1040 asm("mov r2, #0 "); |
1040 asm("mov r2, #0 "); |
1041 asm("mov r3, #0 "); |
1041 asm("mov r3, #0 "); |
1042 asm("bl OutX__6BTraceUlUlUlUl "); |
1042 asm("bl " CSM_ZN6BTrace4OutXEmmmm); |
1043 asm("ldmfd sp!, {r0,lr} "); |
1043 asm("ldmfd sp!, {r0,lr} "); |
1044 #endif |
1044 #endif |
1045 GET_RWNO_TID(,r3); |
1045 GET_RWNO_TID(,r3); |
1046 asm("mov r12, #0 "); |
1046 asm("mov r12, #0 "); |
1047 __DATA_MEMORY_BARRIER__(r12); |
1047 __DATA_MEMORY_BARRIER__(r12); |
1067 // there is contention |
1067 // there is contention |
1068 asm("2: "); |
1068 asm("2: "); |
1069 asm("orr r12, r0, #1 "); |
1069 asm("orr r12, r0, #1 "); |
1070 asm("str r12, [r1, #%a0]" : : "i" _FOFF(NThreadBase,iHeldFastMutex)); |
1070 asm("str r12, [r1, #%a0]" : : "i" _FOFF(NThreadBase,iHeldFastMutex)); |
1071 __ASM_STI(); |
1071 __ASM_STI(); |
1072 asm("b DoSignalL__10NFastMutex "); |
1072 asm("b DoSignalL__10NFastMutex "); // CSM needed |
1073 } |
1073 } |
1074 |
1074 |
1075 |
1075 |
1076 /** Acquires the System Lock. |
1076 /** Acquires the System Lock. |
1077 |
1077 |
1135 // BTraceContext4(BTrace::EFastMutex, BTrace::EFastMutexWait, aMutex); |
1135 // BTraceContext4(BTrace::EFastMutex, BTrace::EFastMutexWait, aMutex); |
1136 asm("mov r1, r0 "); |
1136 asm("mov r1, r0 "); |
1137 asm("ldr r0, btrace_hdr_fmwait "); |
1137 asm("ldr r0, btrace_hdr_fmwait "); |
1138 asm("mov r2, #0 "); |
1138 asm("mov r2, #0 "); |
1139 asm("mov r3, #0 "); |
1139 asm("mov r3, #0 "); |
1140 asm("b OutX__6BTraceUlUlUlUl "); |
1140 asm("b " CSM_ZN6BTrace4OutXEmmmm); |
1141 #endif |
1141 #endif |
1142 __JUMP(,lr); // mutex acquired without contention |
1142 __JUMP(,lr); // mutex acquired without contention |
1143 |
1143 |
1144 // there is contention |
1144 // there is contention |
1145 asm("2: "); |
1145 asm("2: "); |
1147 asm("str r0, [r1, #%a0]" : : "i" _FOFF(NThreadBase,iHeldFastMutex)); |
1147 asm("str r0, [r1, #%a0]" : : "i" _FOFF(NThreadBase,iHeldFastMutex)); |
1148 asm("str r2, [r3, #%a0]" : : "i" _FOFF(TSubScheduler,iKernLockCount)); |
1148 asm("str r2, [r3, #%a0]" : : "i" _FOFF(TSubScheduler,iKernLockCount)); |
1149 __ASM_STI(); |
1149 __ASM_STI(); |
1150 __DATA_MEMORY_BARRIER_Z__(r12); |
1150 __DATA_MEMORY_BARRIER_Z__(r12); |
1151 asm("stmfd sp!, {r4,lr} "); |
1151 asm("stmfd sp!, {r4,lr} "); |
1152 asm("bl DoWaitL__10NFastMutex "); |
1152 asm("bl DoWaitL__10NFastMutex "); // CSM needed |
1153 asm("ldmfd sp!, {r4,lr} "); |
1153 asm("ldmfd sp!, {r4,lr} "); |
1154 asm("b Unlock__5NKern "); |
1154 asm("b " CSM_ZN5NKern6UnlockEv); |
1155 |
1155 |
1156 asm("__SystemLock: "); |
1156 asm("__SystemLock: "); |
1157 asm(".word %a0" : : "i" ((TInt)&TheScheduler.iLock)); |
1157 asm(".word %a0" : : "i" ((TInt)&TheScheduler.iLock)); |
1158 #ifdef BTRACE_FAST_MUTEX |
1158 #ifdef BTRACE_FAST_MUTEX |
1159 asm("btrace_hdr_fmwait: "); |
1159 asm("btrace_hdr_fmwait: "); |
1193 asm("stmfd sp!, {r0,lr} "); |
1193 asm("stmfd sp!, {r0,lr} "); |
1194 asm("mov r1, r0 "); |
1194 asm("mov r1, r0 "); |
1195 asm("ldr r0, btrace_hdr_fmsignal "); |
1195 asm("ldr r0, btrace_hdr_fmsignal "); |
1196 asm("mov r2, #0 "); |
1196 asm("mov r2, #0 "); |
1197 asm("mov r3, #0 "); |
1197 asm("mov r3, #0 "); |
1198 asm("bl OutX__6BTraceUlUlUlUl "); |
1198 asm("bl " CSM_ZN6BTrace4OutXEmmmm); |
1199 asm("ldmfd sp!, {r0,lr} "); |
1199 asm("ldmfd sp!, {r0,lr} "); |
1200 #endif |
1200 #endif |
1201 __ASM_CLI(); |
1201 __ASM_CLI(); |
1202 GET_RWNO_TID(,r3); |
1202 GET_RWNO_TID(,r3); |
1203 asm("mov r12, #0 "); |
1203 asm("mov r12, #0 "); |
1221 asm("mov r12, #1 "); |
1221 asm("mov r12, #1 "); |
1222 asm("orr r4, r0, #1 "); |
1222 asm("orr r4, r0, #1 "); |
1223 asm("str r12, [r3, #%a0]" : : "i" _FOFF(TSubScheduler,iKernLockCount)); |
1223 asm("str r12, [r3, #%a0]" : : "i" _FOFF(TSubScheduler,iKernLockCount)); |
1224 asm("str r4, [r1, #%a0]" : : "i" _FOFF(NThreadBase,iHeldFastMutex)); |
1224 asm("str r4, [r1, #%a0]" : : "i" _FOFF(NThreadBase,iHeldFastMutex)); |
1225 __ASM_STI(); |
1225 __ASM_STI(); |
1226 asm("bl DoSignalL__10NFastMutex "); |
1226 asm("bl DoSignalL__10NFastMutex "); // CSM needed |
1227 asm("ldmfd sp!, {r4,lr} "); |
1227 asm("ldmfd sp!, {r4,lr} "); |
1228 asm("b Unlock__5NKern "); |
1228 asm("b " CSM_ZN5NKern6UnlockEv); |
1229 } |
1229 } |
1230 |
1230 |
1231 |
1231 |
1232 /** Temporarily releases the System Lock if there is contention. |
1232 /** Temporarily releases the System Lock if there is contention. |
1233 |
1233 |
1296 asm("mov r1, r0 "); |
1296 asm("mov r1, r0 "); |
1297 asm("ldr r0, btrace_hdr_fmsignal "); |
1297 asm("ldr r0, btrace_hdr_fmsignal "); |
1298 asm("stmfd sp!, {r4,lr} "); |
1298 asm("stmfd sp!, {r4,lr} "); |
1299 asm("mov r2, #0 "); |
1299 asm("mov r2, #0 "); |
1300 asm("mov r3, #0 "); |
1300 asm("mov r3, #0 "); |
1301 asm("bl OutX__6BTraceUlUlUlUl "); |
1301 asm("bl " CSM_ZN6BTrace4OutXEmmmm); |
1302 asm("ldmfd sp!, {r4,lr} "); |
1302 asm("ldmfd sp!, {r4,lr} "); |
1303 #endif |
1303 #endif |
1304 asm("mov r0, #0 "); |
1304 asm("mov r0, #0 "); |
1305 __JUMP(,lr); // return FALSE |
1305 __JUMP(,lr); // return FALSE |
1306 |
1306 |
1313 asm("mov r12, #1 "); |
1313 asm("mov r12, #1 "); |
1314 asm("str r12, [r3, #%a0]" : : "i" _FOFF(TSubScheduler,iKernLockCount)); |
1314 asm("str r12, [r3, #%a0]" : : "i" _FOFF(TSubScheduler,iKernLockCount)); |
1315 __ASM_STI(); |
1315 __ASM_STI(); |
1316 asm("stmfd sp!, {r4,lr} "); |
1316 asm("stmfd sp!, {r4,lr} "); |
1317 asm("mov r4, r0 "); |
1317 asm("mov r4, r0 "); |
1318 asm("bl Signal__10NFastMutex "); |
1318 asm("bl " CSM_ZN10NFastMutex6SignalEv); |
1319 asm("bl PreemptionPoint__5NKern "); |
1319 asm("bl " CSM_ZN5NKern15PreemptionPointEv); |
1320 asm("mov r0, r4 "); |
1320 asm("mov r0, r4 "); |
1321 asm("bl Wait__10NFastMutex "); |
1321 asm("bl " CSM_ZN10NFastMutex4WaitEv); |
1322 asm("bl Unlock__5NKern "); |
1322 asm("bl " CSM_ZN5NKern6UnlockEv); |
1323 asm("ldmfd sp!, {r4,lr} "); |
1323 asm("ldmfd sp!, {r4,lr} "); |
1324 asm("mov r0, #1 "); |
1324 asm("mov r0, #1 "); |
1325 __JUMP(,lr); // return TRUE |
1325 __JUMP(,lr); // return TRUE |
1326 } |
1326 } |
1327 #endif |
1327 #endif |