From c11b88fee5144bf543234c6616dae3d23d3c6dc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 10 Dec 2025 14:16:56 +0800 Subject: [PATCH] CPU (macOS): supports `tempSensor` --- src/detection/cpu/cpu_apple.c | 40 +++++++++++++++++++++-------------- src/util/apple/smc_temps.c | 23 +++++++++++++++++--- src/util/apple/smc_temps.h | 1 + 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/detection/cpu/cpu_apple.c b/src/detection/cpu/cpu_apple.c index f1ca8845a..efa7bb04a 100644 --- a/src/detection/cpu/cpu_apple.c +++ b/src/detection/cpu/cpu_apple.c @@ -3,26 +3,34 @@ #include "util/apple/smc_temps.h" #include "util/stringUtils.h" -static double detectCpuTemp(const FFstrbuf* cpuName) +static double detectCpuTemp(const FFCPUOptions* options, const FFstrbuf* cpuName) { double result = 0; const char* error = NULL; - if (ffStrbufStartsWithS(cpuName, "Apple M")) - { - switch (strtol(cpuName->chars + strlen("Apple M"), NULL, 10)) - { - case 1: error = ffDetectSmcTemps(FF_TEMP_CPU_M1X, &result); break; - case 2: error = ffDetectSmcTemps(FF_TEMP_CPU_M2X, &result); break; - case 3: error = ffDetectSmcTemps(FF_TEMP_CPU_M3X, &result); break; - case 4: error = ffDetectSmcTemps(FF_TEMP_CPU_M4X, &result); break; - default: error = "Unsupported Apple Silicon CPU"; - } - } - else // PPC? - error = ffDetectSmcTemps(FF_TEMP_CPU_X64, &result); - if(error) + if (options->tempSensor.length) + { + error = ffDetectSmcSpecificTemp(options->tempSensor.chars, &result); + } + else + { + if (ffStrbufStartsWithS(cpuName, "Apple M")) + { + switch (strtol(cpuName->chars + strlen("Apple M"), NULL, 10)) + { + case 1: error = ffDetectSmcTemps(FF_TEMP_CPU_M1X, &result); break; + case 2: error = ffDetectSmcTemps(FF_TEMP_CPU_M2X, &result); break; + case 3: error = ffDetectSmcTemps(FF_TEMP_CPU_M3X, &result); break; + case 4: error = ffDetectSmcTemps(FF_TEMP_CPU_M4X, &result); break; + default: error = "Unsupported Apple Silicon CPU"; + } + } + else // PPC? + error = ffDetectSmcTemps(FF_TEMP_CPU_X64, &result); + } + + if (error) return FF_CPU_TEMP_UNSET; return result; @@ -130,7 +138,7 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) detectFrequency(cpu); if (options->showPeCoreCount) detectCoreCount(cpu); - cpu->temperature = options->temp ? detectCpuTemp(&cpu->name) : FF_CPU_TEMP_UNSET; + cpu->temperature = options->temp ? detectCpuTemp(options, &cpu->name) : FF_CPU_TEMP_UNSET; return NULL; } diff --git a/src/util/apple/smc_temps.c b/src/util/apple/smc_temps.c index e415c7300..d16c6e3d5 100644 --- a/src/util/apple/smc_temps.c +++ b/src/util/apple/smc_temps.c @@ -277,15 +277,32 @@ static bool detectTemp(io_connect_t conn, const char* sensor, double* sum) return true; } -const char* ffDetectSmcTemps(enum FFTempType type, double* result) +static io_connect_t conn; + +const char* ffDetectSmcSpecificTemp(const char* sensor, double* result) { - static io_connect_t conn; if (!conn) { if (smcOpen(&conn) != NULL) conn = (io_connect_t) -1; } - else if (conn == (io_connect_t) -1) + if (conn == (io_connect_t) -1) + return "Could not open SMC connection"; + + if (!detectTemp(conn, sensor, result)) + return "Could not read SMC temperature"; + + return NULL; +} + +const char* ffDetectSmcTemps(enum FFTempType type, double* result) +{ + if (!conn) + { + if (smcOpen(&conn) != NULL) + conn = (io_connect_t) -1; + } + if (conn == (io_connect_t) -1) return "Could not open SMC connection"; uint32_t count = 0; diff --git a/src/util/apple/smc_temps.h b/src/util/apple/smc_temps.h index 4adc7a607..031f7c2e1 100644 --- a/src/util/apple/smc_temps.h +++ b/src/util/apple/smc_temps.h @@ -30,4 +30,5 @@ enum FFTempType FF_TEMP_MEMORY, }; +const char* ffDetectSmcSpecificTemp(const char* sensor, double* result); const char* ffDetectSmcTemps(enum FFTempType type, double* result);