kernel/eka/kernel/sutils.cpp
branchRCL_3
changeset 43 c1f20ce4abcf
parent 42 a179b74831c9
child 44 3e88ff8f41d5
equal deleted inserted replaced
42:a179b74831c9 43:c1f20ce4abcf
  1578 	return r;
  1578 	return r;
  1579 	}
  1579 	}
  1580 
  1580 
  1581 TInt DThread::OpenObject(TOwnerType aType, const TDesC& aName, TInt& aHandle, DObject*& anObj, TInt aObjType)
  1581 TInt DThread::OpenObject(TOwnerType aType, const TDesC& aName, TInt& aHandle, DObject*& anObj, TInt aObjType)
  1582 	{
  1582 	{
  1583 	__KTRACE_OPT(KEXEC,Kern::Printf("DThread::OpenObject %lS",&aName));
  1583 	__KTRACE_OPT(KEXEC,Kern::Printf("DThread::OpenObject %S",&aName));
  1584 	anObj=NULL;
  1584 	anObj=NULL;
  1585 	TInt r=Kern::ValidateFullName(aName);
  1585 	TInt r=Kern::ValidateFullName(aName);
  1586 	if (r!=KErrNone)
  1586 	if (r!=KErrNone)
  1587 		return r;
  1587 		return r;
  1588 	DObject* pO=NULL;
  1588 	DObject* pO=NULL;
  2371         error codes.
  2371         error codes.
  2372 */
  2372 */
  2373 EXPORT_C TInt Kern::SemaphoreCreate(DSemaphore*& aSem, const TDesC& aName, TInt aInitialCount)
  2373 EXPORT_C TInt Kern::SemaphoreCreate(DSemaphore*& aSem, const TDesC& aName, TInt aInitialCount)
  2374 	{
  2374 	{
  2375 	CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL,"Kern::SemaphoreCreate");				
  2375 	CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL,"Kern::SemaphoreCreate");				
  2376 	__KTRACE_OPT(KSEMAPHORE,Kern::Printf("Kern::SemaphoreCreate %lS init %d", &aName, aInitialCount));
  2376 	__KTRACE_OPT(KSEMAPHORE,Kern::Printf("Kern::SemaphoreCreate %S init %d", &aName, aInitialCount));
  2377 	TInt r = KErrNoMemory;
  2377 	TInt r = KErrNoMemory;
  2378 	DSemaphore* pS = new DSemaphore;
  2378 	DSemaphore* pS = new DSemaphore;
  2379 	if (pS)
  2379 	if (pS)
  2380 		{
  2380 		{
  2381 		r = pS->Create(NULL, &aName, aInitialCount, EFalse);
  2381 		r = pS->Create(NULL, &aName, aInitialCount, EFalse);
  2536 	if (timeout)
  2536 	if (timeout)
  2537 		return KErrTimedOut;
  2537 		return KErrTimedOut;
  2538 	return KErrNone;
  2538 	return KErrNone;
  2539 	}
  2539 	}
  2540 
  2540 
  2541 TInt K::KernelHal(TInt aFunction, TAny* a1, TAny* /*a2*/)
  2541 TInt K::KernelHal(TInt aFunction, TAny* a1, TAny* a2)
  2542 	{
  2542 	{
       
  2543 	(void)a2;
  2543 	TInt r=KErrNone;
  2544 	TInt r=KErrNone;
  2544 	switch (aFunction)
  2545 	switch (aFunction)
  2545 		{
  2546 		{
  2546 		case EKernelHalMemoryInfo:
  2547 		case EKernelHalMemoryInfo:
  2547 			{
  2548 			{
  2680 			break;
  2681 			break;
  2681 
  2682 
  2682 		case EKernelHalLockThreadToCpu:
  2683 		case EKernelHalLockThreadToCpu:
  2683 			{
  2684 			{
  2684 #ifdef __SMP__
  2685 #ifdef __SMP__
       
  2686 			r = KErrArgument;
  2685 			TUint32 cpuId = (TUint32)a1;
  2687 			TUint32 cpuId = (TUint32)a1;
  2686 			if (cpuId < (TUint32)NKern::NumberOfCpus())
  2688 			TUint32 ncpus = NKern::NumberOfCpus();
       
  2689 			if (cpuId < ncpus)
  2687 				{
  2690 				{
  2688 				NKern::ThreadSetCpuAffinity(NKern::CurrentThread(), cpuId);
  2691 				NKern::ThreadSetCpuAffinity(NKern::CurrentThread(), cpuId);
  2689 				r = KErrNone;
  2692 				r = KErrNone;
  2690 				}
  2693 				}
  2691 			else
  2694 			else if (cpuId & NTHREADBASE_CPU_AFFINITY_MASK)
  2692 				{
  2695 				{
  2693 				r = KErrArgument;
  2696 				TUint32 mask = cpuId & ~NTHREADBASE_CPU_AFFINITY_MASK;
       
  2697 				TUint32 amask = ~((~0u)<<ncpus);
       
  2698 				if (cpuId==KCpuAffinityAny || ((mask & amask) && (mask &~ amask)==0))
       
  2699 					{
       
  2700 					NKern::ThreadSetCpuAffinity(NKern::CurrentThread(), cpuId);
       
  2701 					r = KErrNone;
       
  2702 					}
  2694 				}
  2703 				}
  2695 #else
  2704 #else
  2696 			r = KErrNone;
  2705 			r = KErrNone;
  2697 #endif
  2706 #endif
  2698 			break;	
  2707 			break;	
  2700 
  2709 
  2701 		case EKernelHalConfigFlags:
  2710 		case EKernelHalConfigFlags:
  2702 			// return bottom 31 bits of config flags so as not to signal an error
  2711 			// return bottom 31 bits of config flags so as not to signal an error
  2703 			r=K::KernelConfigFlags() & 0x7fffffff;
  2712 			r=K::KernelConfigFlags() & 0x7fffffff;
  2704 			break;
  2713 			break;
  2705 	
  2714 
       
  2715 #ifdef __SMP__
       
  2716 		case EKernelHalCpuStates:
       
  2717 			{
       
  2718 			SCpuStates states;
       
  2719 			memclr(&states, sizeof(states));
       
  2720 
       
  2721 			TScheduler& s = TheScheduler;
       
  2722 			TInt irq = s.iGenIPILock.LockIrqSave();
       
  2723 			states.iTA = s.iThreadAcceptCpus;
       
  2724 			states.iIA = s.iIpiAcceptCpus;
       
  2725 			states.iCU = s.iCpusComingUp;
       
  2726 			states.iGD = s.iCpusGoingDown;
       
  2727 			states.iDC = s.iCCDeferCount;
       
  2728 			states.iSC = s.iCCSyncCpus;
       
  2729 			states.iRC = s.iCCReactivateCpus;
       
  2730 			states.iCCS = s.iCCState;
       
  2731 			states.iPO = TUint8(s.iPoweringOff ? (s.iPoweringOff->iCpuNum|0x80) : 0);
       
  2732 			states.iPODC = s.iDetachCount;
       
  2733 			TInt i;
       
  2734 			TInt nc = NKern::NumberOfCpus();
       
  2735 			for (i=0; i<nc; ++i)
       
  2736 				{
       
  2737 				TSubScheduler& ss = TheSubSchedulers[i];
       
  2738 				states.iDS[i] = ss.iDeferShutdown;
       
  2739 #ifdef __CPU_ARM
       
  2740 				volatile TUint32* p = (volatile TUint32*)ss.iUncached;
       
  2741 				states.iUDC[i] = p[0];
       
  2742 				states.iUAC[i] = p[1];
       
  2743 #endif
       
  2744 				}
       
  2745 			s.iGenIPILock.UnlockIrqRestore(irq);
       
  2746 
       
  2747 			kumemput32(a1, &states, sizeof(states));
       
  2748 			r = KErrNone;
       
  2749 			break;
       
  2750 			}
       
  2751 
       
  2752 		case EKernelHalSetNumberOfCpus:
       
  2753 			{
       
  2754 			TInt n = (TInt)a1;
       
  2755 			if (n<=0 || n>NKern::NumberOfCpus())
       
  2756 				r = KErrArgument;
       
  2757 			else
       
  2758 				{
       
  2759 				NKern::SetNumberOfActiveCpus(n);
       
  2760 				r = KErrNone;
       
  2761 				}
       
  2762 			break;
       
  2763 			}
       
  2764 #endif
  2706 		default:
  2765 		default:
  2707 			r=KErrNotSupported;
  2766 			r=KErrNotSupported;
  2708 			break;
  2767 			break;
  2709 		}
  2768 		}
  2710 	return r;
  2769 	return r;