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); |
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; |