diff --git a/src/Components/Utils/UtilsCpu.php b/src/Components/Utils/UtilsCpu.php index d2afc60..6e0ea09 100644 --- a/src/Components/Utils/UtilsCpu.php +++ b/src/Components/Utils/UtilsCpu.php @@ -6,6 +6,233 @@ use COM; final class UtilsCpu { + private static $HW_IMPLEMENTER = array( + '0x41' => array(array( + '0x810' => 'ARM810', + '0x920' => 'ARM920', + '0x922' => 'ARM922', + '0x926' => 'ARM926', + '0x940' => 'ARM940', + '0x946' => 'ARM946', + '0x966' => 'ARM966', + '0xa20' => 'ARM1020', + '0xa22' => 'ARM1022', + '0xa26' => 'ARM1026', + '0xb02' => 'ARM11 MPCore', + '0xb36' => 'ARM1136', + '0xb56' => 'ARM1156', + '0xb76' => 'ARM1176', + '0xc05' => 'Cortex-A5', + '0xc07' => 'Cortex-A7', + '0xc08' => 'Cortex-A8', + '0xc09' => 'Cortex-A9', + '0xc0d' => 'Cortex-A17/A12', + '0xc0f' => 'Cortex-A15', + '0xc0e' => 'Cortex-A17', + '0xc14' => 'Cortex-R4', + '0xc15' => 'Cortex-R5', + '0xc17' => 'Cortex-R7', + '0xc18' => 'Cortex-R8', + '0xc20' => 'Cortex-M0', + '0xc21' => 'Cortex-M1', + '0xc23' => 'Cortex-M3', + '0xc24' => 'Cortex-M4', + '0xc27' => 'Cortex-M7', + '0xc60' => 'Cortex-M0+', + '0xd01' => 'Cortex-A32', + '0xd02' => 'Cortex-A34', + '0xd03' => 'Cortex-A53', + '0xd04' => 'Cortex-A35', + '0xd05' => 'Cortex-A55', + '0xd06' => 'Cortex-A65', + '0xd07' => 'Cortex-A57', + '0xd08' => 'Cortex-A72', + '0xd09' => 'Cortex-A73', + '0xd0a' => 'Cortex-A75', + '0xd0b' => 'Cortex-A76', + '0xd0c' => 'Neoverse-N1', + '0xd0d' => 'Cortex-A77', + '0xd0e' => 'Cortex-A76AE', + '0xd13' => 'Cortex-R52', + '0xd15' => 'Cortex-R82', + '0xd16' => 'Cortex-R52+', + '0xd20' => 'Cortex-M23', + '0xd21' => 'Cortex-M33', + '0xd22' => 'Cortex-M55', + '0xd23' => 'Cortex-M85', + '0xd40' => 'Neoverse-V1', + '0xd41' => 'Cortex-A78', + '0xd42' => 'Cortex-A78AE', + '0xd43' => 'Cortex-A65AE', + '0xd44' => 'Cortex-X1', + '0xd46' => 'Cortex-A510', + '0xd47' => 'Cortex-A710', + '0xd48' => 'Cortex-X2', + '0xd49' => 'Neoverse-N2', + '0xd4a' => 'Neoverse-E1', + '0xd4b' => 'Cortex-A78C', + '0xd4c' => 'Cortex-X1C', + '0xd4d' => 'Cortex-A715', + '0xd4e' => 'Cortex-X3', + '0xd4f' => 'Neoverse-V2', + '0xd80' => 'Cortex-A520', + '0xd81' => 'Cortex-A720', + '0xd82' => 'Cortex-X4', + ), 'ARM'), + '0x42' => array(array( + '0x0f' => 'Brahma-B15', + '0x100' => 'Brahma-B53', + '0x516' => 'ThunderX2', + ), 'Broadcom'), + '0x43' => array(array( + '0x0a0' => 'ThunderX', + '0x0a1' => 'ThunderX-88XX', + '0x0a2' => 'ThunderX-81XX', + '0x0a3' => 'ThunderX-83XX', + '0x0af' => 'ThunderX2-99xx', + '0x0b0' => 'OcteonTX2', + '0x0b1' => 'OcteonTX2-98XX', + '0x0b2' => 'OcteonTX2-96XX', + '0x0b3' => 'OcteonTX2-95XX', + '0x0b4' => 'OcteonTX2-95XXN', + '0x0b5' => 'OcteonTX2-95XXMM', + '0x0b6' => 'OcteonTX2-95XXO', + '0x0b8' => 'ThunderX3-T110', + ), 'Cavium'), + '0x44' => array(array( + '0xa10' => 'SA110', + '0xa11' => 'SA1100', + ), 'DEC'), + '0x46' => array(array( + '0x001' => 'A64FX', + ), 'FUJITSU'), + '0x48' => array(array( + '0xd01' => 'TaiShan-v110', // used in Kunpeng-920 SoC + '0xd02' => 'TaiShan-v120', // used in Kirin 990A and 9000S SoCs + '0xd40' => 'Cortex-A76', // HiSilicon uses this ID though advertises A76 + '0xd41' => 'Cortex-A77', // HiSilicon uses this ID though advertises A77 + ), 'HiSilicon'), + '0x49' => array(null, 'Infineon'), + '0x4d' => array(null, 'Motorola/Freescale'), + '0x4e' => array(array( + '0x000' => 'Denver', + '0x003' => 'Denver 2', + '0x004' => 'Carmel', + ), 'NVIDIA'), + '0x50' => array(array( + '0x000' => 'X-Gene', + ), 'APM'), + '0x51' => array(array( + '0x00f' => 'Scorpion', + '0x02d' => 'Scorpion', + '0x04d' => 'Krait', + '0x06f' => 'Krait', + '0x201' => 'Kryo', + '0x205' => 'Kryo', + '0x211' => 'Kryo', + '0x800' => 'Falkor-V1/Kryo', + '0x801' => 'Kryo-V2', + '0x802' => 'Kryo-3XX-Gold', + '0x803' => 'Kryo-3XX-Silver', + '0x804' => 'Kryo-4XX-Gold', + '0x805' => 'Kryo-4XX-Silver', + '0xc00' => 'Falkor', + '0xc01' => 'Saphira', + ), 'Qualcomm'), + '0x53' => array(array( + '0x001' => 'exynos-m1', + '0x002' => 'exynos-m3', + '0x003' => 'exynos-m4', + '0x004' => 'exynos-m5', + ), 'Samsung'), + '0x56' => array(array( + '0x131' => 'Feroceon-88FR131', + '0x581' => 'PJ4/PJ4b', + '0x584' => 'PJ4B-MP', + ), 'Marvell'), + '0x61' => array(array( + '0x000' => 'Swift', + '0x001' => 'Cyclone', + '0x002' => 'Typhoon', + '0x003' => 'Typhoon/Capri', + '0x004' => 'Twister', + '0x005' => 'Twister/Elba/Malta', + '0x006' => 'Hurricane', + '0x007' => 'Hurricane/Myst', + '0x008' => 'Monsoon', + '0x009' => 'Mistral', + '0x00b' => 'Vortex', + '0x00c' => 'Tempest', + '0x00f' => 'Tempest-M9', + '0x010' => 'Vortex/Aruba', + '0x011' => 'Tempest/Aruba', + '0x012' => 'Lightning', + '0x013' => 'Thunder', + '0x020' => 'Icestorm-A14', + '0x021' => 'Firestorm-A14', + '0x022' => 'Icestorm-M1', + '0x023' => 'Firestorm-M1', + '0x024' => 'Icestorm-M1-Pro', + '0x025' => 'Firestorm-M1-Pro', + '0x026' => 'Thunder-M10', + '0x028' => 'Icestorm-M1-Max', + '0x029' => 'Firestorm-M1-Max', + '0x030' => 'Blizzard-A15', + '0x031' => 'Avalanche-A15', + '0x032' => 'Blizzard-M2', + '0x033' => 'Avalanche-M2', + '0x034' => 'Blizzard-M2-Pro', + '0x035' => 'Avalanche-M2-Pro', + '0x036' => 'Sawtooth-A16', + '0x037' => 'Everest-A16', + '0x038' => 'Blizzard-M2-Max', + '0x039' => 'Avalanche-M2-Max', + ), 'Apple'), + '0x66' => array(array( + '0x526' => 'FA526', + '0x626' => 'FA626', + ), 'Faraday'), + '0x69' => array(array( + '0x200' => 'i80200', + '0x210' => 'PXA250A', + '0x212' => 'PXA210A', + '0x242' => 'i80321-400', + '0x243' => 'i80321-600', + '0x290' => 'PXA250B/PXA26x', + '0x292' => 'PXA210B', + '0x2c2' => 'i80321-400-B0', + '0x2c3' => 'i80321-600-B0', + '0x2d0' => 'PXA250C/PXA255/PXA26x', + '0x2d2' => 'PXA210C', + '0x411' => 'PXA27x', + '0x41c' => 'IPX425-533', + '0x41d' => 'IPX425-400', + '0x41f' => 'IPX425-266', + '0x682' => 'PXA32x', + '0x683' => 'PXA930/PXA935', + '0x688' => 'PXA30x', + '0x689' => 'PXA31x', + '0xb11' => 'SA1110', + '0xc12' => 'IPX1200', + ), 'Intel'), + '0x6d' => array(array( + '0xd49' => 'Azure-Cobalt-100', + ), 'Microsoft'), + '0x70' => array(array( + '0x303' => 'FTC310', + '0x660' => 'FTC660', + '0x661' => 'FTC661', + '0x662' => 'FTC662', + '0x663' => 'FTC663', + '0x664' => 'FTC664', + '0x862' => 'FTC862', + ), 'Phytium'), + '0xc0' => array(array( + '0xac3' => 'Ampere-1', + '0xac4' => 'Ampere-1a', + ), 'Ampere'), + ); + public static function getLoadAvg() { if (UtilsApi::isWin()) { @@ -29,6 +256,28 @@ final class UtilsCpu return 2 === \count($matches) ? $matches[1] : array(); } + public static function getArmCpu($content) + { + $searchImplementer = self::match($content, 'CPU implementer'); + $implementer = \count($searchImplementer) ? $searchImplementer[0] : ''; + $implementer = isset(self::$HW_IMPLEMENTER[$implementer]) ? self::$HW_IMPLEMENTER[$implementer] : ''; + if ( ! $implementer) { + return array(); + } + $searchPart = self::match($content, 'CPU part'); + $part = \count($searchPart) ? $searchPart[0] : ''; + if ( ! $part) { + return array($implementer); + } + $parts = $implementer[0]; + $partName = isset($parts[$part]) ? " {$parts[$part]}" : ''; + // features + $searchFeatures = self::match($content, 'Features'); + $features = \count($searchFeatures) ? " ({$searchFeatures[0]})" : ''; + + return array("{$implementer[1]}{$partName}{$features}"); + } + public static function getModel() { $filePath = '/proc/cpuinfo'; @@ -41,23 +290,11 @@ final class UtilsCpu } if (self::isArm($content)) { $cores = substr_count($content, 'processor'); - $searchArchitecture = self::match($content, 'CPU architecture'); - // CPU variant - $searchVariant = self::match($content, 'CPU variant'); - // CPU part - $searchPart = self::match($content, 'CPU part'); - // CPU revision - $searchRevision = self::match($content, 'CPU revision'); if ( ! $cores) { return ''; } - return "{$cores} x " . implode(' / ', array_filter(array( - \count($searchArchitecture) ? "ARMv{$searchArchitecture[0]}" : 'ARM', - \count($searchVariant) ? "variant {$searchVariant[0]}" : '', - \count($searchPart) ? "part {$searchPart[0]}" : '', - \count($searchRevision) ? "revision {$searchRevision[0]}" : '', - ))); + return "{$cores} x " . implode(' / ', array_filter(self::getArmCpu($content))); } // cpu cores $cores = \count(self::match($content, 'cpu cores')) ?: substr_count($content, 'vendor_id');