@@ -628,6 +628,8 @@ class LLProcessorInfoWindowsImpl : public LLProcessorInfoImpl
628
628
629
629
#elif LL_DARWIN
630
630
631
+ #include < CoreFoundation/CoreFoundation.h>
632
+ #include < IOKit/IOKitLib.h>
631
633
#include < mach/machine.h>
632
634
#include < sys/sysctl.h>
633
635
@@ -638,6 +640,43 @@ class LLProcessorInfoDarwinImpl : public LLProcessorInfoImpl
638
640
{
639
641
getCPUIDInfo ();
640
642
uint64_t frequency = getSysctlInt64 (" hw.cpufrequency" );
643
+ if (frequency == 0 )
644
+ {
645
+ CFMutableDictionaryRef arm_io_matching = IOServiceMatching (" AppleARMIODevice" );
646
+ io_iterator_t iter;
647
+ kern_return_t ret = IOServiceGetMatchingServices (kIOMasterPortDefault , arm_io_matching, &iter);
648
+ if (ret == KERN_SUCCESS)
649
+ {
650
+ io_object_t obj;
651
+ while ((obj = IOIteratorNext (iter)))
652
+ {
653
+ io_name_t obj_class;
654
+ ret = IOObjectGetClass (obj, obj_class);
655
+ if (ret == KERN_SUCCESS)
656
+ {
657
+ io_name_t obj_name;
658
+ ret = IORegistryEntryGetName (obj, obj_name);
659
+ if (ret == KERN_SUCCESS)
660
+ {
661
+ if (strncmp (obj_name, " pmgr" , sizeof (obj_name)) == 0 )
662
+ {
663
+ CFTypeRef cfData = IORegistryEntryCreateCFProperty (obj, CFSTR (" voltage-states5-sram" ), kCFAllocatorDefault , 0 ); // pcore frequency
664
+ if (cfData)
665
+ {
666
+ CFIndex size = CFDataGetLength ((CFDataRef)cfData);
667
+ std::vector<U8> databuf (size);
668
+ CFDataGetBytes ((CFDataRef)cfData, CFRangeMake (0 , size), databuf.data ());
669
+
670
+ frequency = 0x00000000FFFFFFFF & ((databuf[size-5 ] << 24 ) | (databuf[size-6 ] << 16 ) | (databuf[size-7 ] << 8 ) | (databuf[size-8 ]));
671
+ CFRelease (cfData);
672
+ }
673
+ break ;
674
+ }
675
+ }
676
+ }
677
+ }
678
+ }
679
+ }
641
680
setInfo (eFrequency, (F64)frequency / (F64)1000000 );
642
681
}
643
682
0 commit comments