From 268281a5705b277eb0b1c9d5f3e63fc0d637c261 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 26 Dec 2023 12:11:15 +0800 Subject: An alternative in getting CPU freq on M-series This solution was retrieved from https://listman.redhat.com/archives/libvir-list/2022-February/228217.html sysctl hw.cpufrequency would result as empty on Apple Silicon (at least) M1, when run natively. Ironically (and that's why it's been working with viewers relying on Rosetta 2), arch -x86_64 /bin/bash -c 'sysctl hw.cpufrequency' run on an Apple Silicon would result in the correct number. --- indra/llcommon/llprocessor.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp index 9d53b9be35..f07a32c179 100644 --- a/indra/llcommon/llprocessor.cpp +++ b/indra/llcommon/llprocessor.cpp @@ -637,7 +637,15 @@ public: LLProcessorInfoDarwinImpl() { getCPUIDInfo(); +#ifdef __arm64__ + auto frequency = getSysctlInt64("hw.tbfrequency"); + struct clockinfo clockrate; + auto clockrate_len = sizeof(clockrate); + if (!sysctlbyname("kern.clockrate", &clockrate, &clockrate_len, NULL, 0)) + frequency *= clockrate.hz; +#else uint64_t frequency = getSysctlInt64("hw.cpufrequency"); +#endif setInfo(eFrequency, (F64)frequency / (F64)1000000); } -- cgit v1.2.3 From 2117dca25e1d15cbbf9def774ec0fac29e5c01dd Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Sun, 31 Dec 2023 20:17:04 +0800 Subject: tbfreq x clockrate.hz only when cpufrequency is 0 Just maybe M3 implements cpufrequency, which should be more accurate than the alternative (different results on my Intel Mac). --- indra/llcommon/llprocessor.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp index f07a32c179..d3ff48073d 100644 --- a/indra/llcommon/llprocessor.cpp +++ b/indra/llcommon/llprocessor.cpp @@ -637,15 +637,15 @@ public: LLProcessorInfoDarwinImpl() { getCPUIDInfo(); -#ifdef __arm64__ - auto frequency = getSysctlInt64("hw.tbfrequency"); - struct clockinfo clockrate; - auto clockrate_len = sizeof(clockrate); - if (!sysctlbyname("kern.clockrate", &clockrate, &clockrate_len, NULL, 0)) - frequency *= clockrate.hz; -#else uint64_t frequency = getSysctlInt64("hw.cpufrequency"); -#endif + if (!frequency) + { + auto tbfrequency = getSysctlInt64("hw.tbfrequency"); + struct clockinfo clockrate; + auto clockrate_len = sizeof(clockrate); + if (!sysctlbyname("kern.clockrate", &clockrate, &clockrate_len, NULL, 0)) + frequency = tbfrequency * clockrate.hz; + } setInfo(eFrequency, (F64)frequency / (F64)1000000); } -- cgit v1.2.3