diff --git a/src/detection/cpu/cpu_sunos.c b/src/detection/cpu/cpu_sunos.c index 474ba24a6..6f9f668bb 100644 --- a/src/detection/cpu/cpu_sunos.c +++ b/src/detection/cpu/cpu_sunos.c @@ -1,5 +1,6 @@ #include "cpu.h" #include "common/processing.h" +#include "util/stringUtils.h" #include static const char* detectCPUTempByKstat(kstat_ctl_t* kc, FFCPUResult* cpu) @@ -61,6 +62,45 @@ static inline void kstatFreeWrap(kstat_ctl_t** pkc) kstat_close(*pkc); } +static inline uint16_t countTypeId(kstat_ctl_t* kc, const char* type) +{ + uint64_t low = 0, high = 0; + for (kstat_t* ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) + { + if (ffStrStartsWith(ksp->ks_module, "cpu_info")) + { + if (kstat_read(kc, ksp, NULL) < 0) + continue; + + kstat_named_t* stat = kstat_data_lookup(ksp, type); + if (!stat) + continue; + + uint32_t id = 0; + switch (stat->data_type) + { + #ifdef _INT64_TYPE + case KSTAT_DATA_INT64: + case KSTAT_DATA_UINT64: + id = (uint32_t) stat->value.ui64; + break; + #endif + case KSTAT_DATA_INT32: + case KSTAT_DATA_UINT32: + id = stat->value.ui32; + break; + default: + continue; + } + if (__builtin_expect(id > 64, false)) + high |= 1ULL << (id - 64); + else + low |= 1ULL << id; + } + } + return (uint16_t) (__builtin_popcountll(low) + __builtin_popcountll(high)); +} + const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) { __attribute__((__cleanup__(kstatFreeWrap))) kstat_ctl_t* kc = kstat_open(); @@ -93,9 +133,12 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) if (ks && kstat_read(kc, ks, NULL) >= 0) { kstat_named_t* kn = kstat_data_lookup(ks, "ncpus"); - if (kn) cpu->coresLogical = cpu->coresPhysical = cpu->coresOnline = (uint16_t) kn->value.ui32; + if (kn) cpu->coresLogical = cpu->coresOnline = (uint16_t) kn->value.ui32; } + cpu->packages = countTypeId(kc, "chip_id"); + cpu->coresPhysical = countTypeId(kc, "core_id"); + if (options->temp) { if (detectCPUTempByKstat(kc, cpu) != NULL)