#include cpu_hwmon_t detectCpuHwmon(std::string pci) { cpu_hwmon_t hw; std::string path = "/sys/bus/pci/devices/" + pci + "/hwmon"; try { for (const auto& entry : std::filesystem::directory_iterator(path)) hw.path = getFirstDir(path); } catch (...) { std::println("[CpuHwmon] NO CPU HWMON KERNEL MODULE DETECTED"); return hw; } hw.zenpower = readFile((hw.path + "/name"), 128) == "zenpower"; std::println("[CpuHwmon] Detected module \"{}\" in path \"{}\"", hw.zenpower ? "zenpower" : "k10temp", hw.path); return hw; } cpu_t getCpu(cpu_hwmon_t hw) { cpu_t cpu; // commented out unused values so its faster if (hw.path == "") return cpu; // break if no module if (hw.zenpower) { // cpu.tdie = std::stoi(readFile(hw.path + "/temp1_input", 2)); cpu.tctl = std::stoi(readFile(hw.path + "/temp2_input", 2)); cpu.tccd1 = std::stoi(readFile(hw.path + "/temp3_input", 2)); cpu.pcore = (double)(std::stoi(readFile(hw.path + "/power1_input", 3)) / 100.0); cpu.psoc = (double)(std::stoi(readFile(hw.path + "/power2_input", 3)) / 100.0); cpu.ptotal = cpu.pcore + cpu.psoc; cpu.vcore = (double)(std::stoul(readFile(hw.path + "/in1_input", 4)) / 1000.0); // cpu.vsoc = (double)(std::stoul(readFile(hw.path + "/in2_input")) / 1000.0); } else { cpu.tctl = std::stoi(readFile(hw.path + "/temp1_input", 2)); cpu.tccd1 = std::stoi(readFile(hw.path + "/temp3_input", 2)); } // lots of reads but still faster than reading /proc/cpuinfo char buf[5]; for (uint8_t i = 0; i < N_CPU; i++) { readFile2("/sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq", buf, sizeof(buf)); cpu.avg_freq += strtol(buf, NULL, 10); } cpu.avg_freq /= N_CPU; return cpu; }