kernel/eka/nkernsmp/arm/ncthrd.cia
branchGCC_SURGE
changeset 184 0e2270015475
parent 90 947f0dc9f7a8
equal deleted inserted replaced
183:9953e74bcef5 184:0e2270015475
   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:		");
  1000 	asm("ldmfd	sp!, {r4-r5} ");
  1000 	asm("ldmfd	sp!, {r4-r5} ");
  1001 	__JUMP(,	lr);
  1001 	__JUMP(,	lr);
  1002 
  1002 
  1003 	asm("2:		");
  1003 	asm("2:		");
  1004 	asm("mov	r5, lr ");
  1004 	asm("mov	r5, lr ");
  1005 	asm("bl		CancelTimerT__16NThreadWaitState ");
  1005 	asm("bl		CancelTimerT__16NThreadWaitState "); // CSM needed
  1006 	asm("mov	r0, r4 ");
  1006 	asm("mov	r0, r4 ");
  1007 	asm("mov	lr, r5 ");
  1007 	asm("mov	lr, r5 ");
  1008 	asm("ldmfd	sp!, {r4-r5} ");
  1008 	asm("ldmfd	sp!, {r4-r5} ");
  1009 	__JUMP(,	lr);
  1009 	__JUMP(,	lr);
  1010 	}
  1010 	}
  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