add arm cpu detector

This commit is contained in:
Km.Van
2024-07-27 15:52:31 +08:00
parent 346574ac24
commit 7521014a9c

View File

@@ -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');