/** * CPU information * All of the tags here are highly architecture dependant. * * @return void */ protected function _cpuinfo() { if (CommonFunctions::rfts('/proc/cpuinfo', $bufr)) { $processors = preg_split('/\\s?\\n\\s?\\n/', trim($bufr)); //first stage $_arch = null; $_impl = null; $_part = null; $_hard = null; $_revi = null; $_cpus = null; $_buss = null; foreach ($processors as $processor) { if (!preg_match('/^\\s*processor\\s*:/mi', $processor)) { $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY); foreach ($details as $detail) { $arrBuff = preg_split('/\\s*:\\s*/', trim($detail)); if (count($arrBuff) == 2 && ($arrBuff1 = trim($arrBuff[1])) !== '') { switch (strtolower($arrBuff[0])) { case 'cpu architecture': $_arch = $arrBuff1; break; case 'cpu implementer': $_impl = $arrBuff1; break; case 'cpu part': $_part = $arrBuff1; break; case 'hardware': $_hard = $arrBuff1; break; case 'revision': $_revi = $arrBuff1; break; case 'cpu frequency': if (preg_match('/^(\\d+)\\s+Hz/i', $arrBuff1, $bufr2)) { $_cpus = round($bufr2[1] / 1000000); } break; case 'system bus frequency': if (preg_match('/^(\\d+)\\s+Hz/i', $arrBuff1, $bufr2)) { $_buss = round($bufr2[1] / 1000000); } break; } } } } } //second stage $procname = null; foreach ($processors as $processor) { if (preg_match('/^\\s*processor\\s*:/mi', $processor)) { $proc = null; $arch = null; $impl = null; $part = null; $dev = new CpuDevice(); $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY); foreach ($details as $detail) { $arrBuff = preg_split('/\\s*:\\s*/', trim($detail)); if (count($arrBuff) == 2 && ($arrBuff1 = trim($arrBuff[1])) !== '') { switch (strtolower($arrBuff[0])) { case 'processor': $proc = $arrBuff1; if (is_numeric($proc)) { if (strlen($procname) > 0) { $dev->setModel($procname); } } else { $procname = $proc; $dev->setModel($procname); } break; case 'model name': case 'cpu model': case 'cpu type': case 'cpu': $dev->setModel($arrBuff1); break; case 'cpu mhz': case 'clock': if ($arrBuff1 > 0) { //openSUSE fix $dev->setCpuSpeed($arrBuff1); } break; case 'cycle frequency [hz]': $dev->setCpuSpeed($arrBuff1 / 1000000); break; case 'cpu0clktck': $dev->setCpuSpeed(hexdec($arrBuff1) / 1000000); // Linux sparc64 break; case 'l2 cache': case 'cache size': $dev->setCache(preg_replace("/[a-zA-Z]/", "", $arrBuff1) * 1024); break; case 'initial bogomips': case 'bogomips': case 'cpu0bogo': $dev->setBogomips(round($arrBuff1)); break; case 'flags': if (preg_match("/ vmx/", $arrBuff1)) { $dev->setVirt("vmx"); } elseif (preg_match("/ svm/", $arrBuff1)) { $dev->setVirt("svm"); } elseif (preg_match("/ hypervisor/", $arrBuff1)) { $dev->setVirt("hypervisor"); } break; case 'i size': case 'd size': if ($dev->getCache() === null) { $dev->setCache($arrBuff1 * 1024); } else { $dev->setCache($dev->getCache() + $arrBuff1 * 1024); } break; case 'cpu architecture': $arch = $arrBuff1; break; case 'cpu implementer': $impl = $arrBuff1; break; case 'cpu part': $part = $arrBuff1; break; } } } if ($arch === null) { $arch = $_arch; } if ($impl === null) { $impl = $_impl; } if ($part === null) { $part = $_part; } // sparc64 specific code follows // This adds the ability to display the cache that a CPU has // Originally made by Sven Blumenstein <*****@*****.**> in 2004 // Modified by Tom Weustink <*****@*****.**> in 2004 $sparclist = array('SUNW,UltraSPARC@0,0', 'SUNW,UltraSPARC-II@0,0', 'SUNW,UltraSPARC@1c,0', 'SUNW,UltraSPARC-IIi@1c,0', 'SUNW,UltraSPARC-II@1c,0', 'SUNW,UltraSPARC-IIe@0,0'); foreach ($sparclist as $name) { if (CommonFunctions::rfts('/proc/openprom/' . $name . '/ecache-size', $buf, 1, 32, false)) { $dev->setCache(base_convert($buf, 16, 10)); } } // sparc64 specific code ends // XScale detection code if ($arch === "5TE" && $dev->getBogomips() != null) { $dev->setCpuSpeed($dev->getBogomips()); //BogoMIPS are not BogoMIPS on this CPU, it's the speed $dev->setBogomips(null); // no BogoMIPS available, unset previously set BogoMIPS } if ($dev->getBusSpeed() == 0 && $_buss !== null) { $dev->setBusSpeed($_buss); } if ($dev->getCpuSpeed() == 0 && $_cpus !== null) { $dev->setCpuSpeed($_cpus); } if ($proc != null) { if (!is_numeric($proc)) { $proc = 0; } // variable speed processors specific code follows if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu' . $proc . '/cpufreq/cpuinfo_cur_freq', $buf, 1, 4096, false)) { $dev->setCpuSpeed($buf / 1000); } elseif (CommonFunctions::rfts('/sys/devices/system/cpu/cpu' . $proc . '/cpufreq/scaling_cur_freq', $buf, 1, 4096, false)) { $dev->setCpuSpeed($buf / 1000); } if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu' . $proc . '/cpufreq/cpuinfo_max_freq', $buf, 1, 4096, false)) { $dev->setCpuSpeedMax($buf / 1000); } if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu' . $proc . '/cpufreq/cpuinfo_min_freq', $buf, 1, 4096, false)) { $dev->setCpuSpeedMin($buf / 1000); } // variable speed processors specific code ends if (PSI_LOAD_BAR) { $dev->setLoad($this->_parseProcStat('cpu' . $proc)); } if (CommonFunctions::rfts('/proc/acpi/thermal_zone/THRM/temperature', $buf, 1, 4096, false)) { $dev->setTemp(substr($buf, 25, 2)); } // Raspbery detection if ($arch === '7' && $impl === '0x41' && ($_hard === 'BCM2708' || $_hard === 'BCM2709' || $_hard === 'BCM2710') && $_revi !== null) { if (($cputype = $this->setRaspberry($_revi, $part)) !== "") { if (($cpumodel = $dev->getModel()) !== "") { $dev->setModel($cpumodel . ' - ' . $cputype); } else { $dev->setModel($cputype); } } } else { // other hardware if ($_hard !== null && $this->sys->getMachine() === "") { $this->sys->setMachine($_hard); } } if ($dev->getModel() === "") { $dev->setModel("unknown"); } $this->sys->setCpus($dev); } } } } }