#include #include #include enum cpuinfo_uarch cpuinfo_x86_decode_uarch( enum cpuinfo_vendor vendor, const struct cpuinfo_x86_model_info* model_info) { switch (vendor) { case cpuinfo_vendor_intel: switch (model_info->family) { #if CPUINFO_ARCH_X86 case 0x05: switch (model_info->model) { case 0x01: // Pentium (60, 66) case 0x02: // Pentium (75, 90, // 100, 120, 133, // 150, 166, 200) case 0x03: // Pentium OverDrive // for Intel486-based // systems case 0x04: // Pentium MMX return cpuinfo_uarch_p5; case 0x09: return cpuinfo_uarch_quark; } break; #endif /* CPUINFO_ARCH_X86 */ case 0x06: switch (model_info->model) { /* Mainstream cores */ #if CPUINFO_ARCH_X86 case 0x01: // Pentium Pro case 0x03: // Pentium II // (Klamath) and // Pentium II // Overdrive case 0x05: // Pentium II // (Deschutes, // Tonga), Pentium II // Celeron // (Covington), // Pentium II Xeon // (Drake) case 0x06: // Pentium II // (Dixon), Pentium // II Celeron // (Mendocino) case 0x07: // Pentium III // (Katmai), Pentium // III Xeon (Tanner) case 0x08: // Pentium III // (Coppermine), // Pentium II Celeron // (Coppermine-128), // Pentium III Xeon // (Cascades) case 0x0A: // Pentium III Xeon // (Cascades-2MB) case 0x0B: // Pentium III // (Tualatin), // Pentium III // Celeron // (Tualatin-256) return cpuinfo_uarch_p6; case 0x09: // Pentium M // (Banias), Pentium // M Celeron // (Banias-0, // Banias-512) case 0x0D: // Pentium M // (Dothan), Pentium // M Celeron // (Dothan-512, // Dothan-1024) case 0x15: // Intel 80579 // (Tolapai) return cpuinfo_uarch_dothan; case 0x0E: // Core Solo/Duo // (Yonah), Pentium // Dual-Core T2xxx // (Yonah), Celeron M // (Yonah-512, // Yonah-1024), // Dual-Core Xeon // (Sossaman) return cpuinfo_uarch_yonah; #endif /* CPUINFO_ARCH_X86 */ case 0x0F: // Core 2 Duo // (Conroe, // Conroe-2M, Merom), // Core 2 Quad // (Tigerton), Xeon // (Woodcrest, // Clovertown, // Kentsfield) case 0x16: // Celeron (Conroe-L, // Merom-L), Core 2 // Duo (Merom) return cpuinfo_uarch_conroe; case 0x17: // Core 2 Duo // (Penryn-3M), Core // 2 Quad // (Yorkfield), Core // 2 Extreme // (Yorkfield), Xeon // (Harpertown), // Pentium Dual-Core // (Penryn) case 0x1D: // Xeon (Dunnington) return cpuinfo_uarch_penryn; case 0x1A: // Core iX // (Bloomfield), Xeon // (Gainestown) case 0x1E: // Core iX // (Lynnfield, // Clarksfield) case 0x1F: // Core iX // (Havendale) case 0x2E: // Xeon (Beckton) case 0x25: // Core iX // (Clarkdale) case 0x2C: // Core iX // (Gulftown), Xeon // (Gulftown) case 0x2F: // Xeon (Eagleton) return cpuinfo_uarch_nehalem; case 0x2A: // Core iX (Sandy // Bridge) case 0x2D: // Core iX (Sandy // Bridge-E), Xeon // (Sandy Bridge // EP/EX) return cpuinfo_uarch_sandy_bridge; case 0x3A: // Core iX (Ivy // Bridge) case 0x3E: // Ivy Bridge-E return cpuinfo_uarch_ivy_bridge; case 0x3C: case 0x3F: // Haswell-E case 0x45: // Haswell ULT case 0x46: // Haswell with eDRAM return cpuinfo_uarch_haswell; case 0x3D: // Broadwell-U case 0x47: // Broadwell-H case 0x4F: // Broadwell-E case 0x56: // Broadwell-DE return cpuinfo_uarch_broadwell; case 0x4E: // Sky Lake Client // Y/U case 0x55: // Sky/Cascade/Cooper // Lake Server case 0x5E: // Sky Lake Client // DT/H/S case 0x8E: // Kaby/Whiskey/Amber/Comet // Lake Y/U case 0x9E: // Kaby/Coffee Lake // DT/H/S case 0xA5: // Comet Lake H/S case 0xA6: // Comet Lake U/Y return cpuinfo_uarch_sky_lake; case 0x66: // Cannon Lake (Core // i3-8121U) return cpuinfo_uarch_palm_cove; case 0x6A: // Ice Lake-DE case 0x6C: // Ice Lake-SP case 0x7D: // Ice Lake-Y case 0x7E: // Ice Lake-U return cpuinfo_uarch_sunny_cove; /* Low-power cores */ case 0x1C: // Diamondville, // Silverthorne, // Pineview case 0x26: // Tunnel Creek return cpuinfo_uarch_bonnell; case 0x27: // Medfield case 0x35: // Cloverview case 0x36: // Cedarview, // Centerton return cpuinfo_uarch_saltwell; case 0x37: // Bay Trail case 0x4A: // Merrifield case 0x4D: // Avoton, Rangeley case 0x5A: // Moorefield case 0x5D: // SoFIA return cpuinfo_uarch_silvermont; case 0x4C: // Braswell, Cherry // Trail case 0x75: // Spreadtrum // SC9853I-IA return cpuinfo_uarch_airmont; case 0x5C: // Apollo Lake case 0x5F: // Denverton return cpuinfo_uarch_goldmont; case 0x7A: // Gemini Lake return cpuinfo_uarch_goldmont_plus; /* Knights-series cores */ case 0x57: return cpuinfo_uarch_knights_landing; case 0x85: return cpuinfo_uarch_knights_mill; } break; case 0x0F: switch (model_info->model) { case 0x00: // Pentium 4 Xeon // (Foster) case 0x01: // Pentium 4 Celeron // (Willamette-128), // Pentium 4 Xeon // (Foster, Foster // MP) case 0x02: // Pentium 4 // (Northwood), // Pentium 4 EE // (Gallatin), // Pentium 4 Celeron // (Northwood-128, // Northwood-256), // Pentium 4 Xeon // (Gallatin DP, // Prestonia) return cpuinfo_uarch_willamette; break; case 0x03: // Pentium 4 // (Prescott), // Pentium 4 Xeon // (Nocona) case 0x04: // Pentium 4 // (Prescott-2M), // Pentium 4 EE // (Prescott-2M), // Pentium D // (Smithfield), // Celeron D // (Prescott-256), // Pentium 4 Xeon // (Cranford, // Irwindale, // Paxville) case 0x06: // Pentium 4 (Cedar // Mill), Pentium D // EE (Presler), // Celeron D (Cedar // Mill), Pentium 4 // Xeon (Dempsey, // Tulsa) return cpuinfo_uarch_prescott; } break; } break; case cpuinfo_vendor_amd: switch (model_info->family) { #if CPUINFO_ARCH_X86 case 0x5: switch (model_info->model) { case 0x00: case 0x01: case 0x02: return cpuinfo_uarch_k5; case 0x06: case 0x07: case 0x08: case 0x0D: return cpuinfo_uarch_k6; case 0x0A: return cpuinfo_uarch_geode; } break; case 0x6: return cpuinfo_uarch_k7; #endif /* CPUINFO_ARCH_X86 */ case 0xF: // Opteron, Athlon 64, Sempron case 0x11: // Turion return cpuinfo_uarch_k8; case 0x10: // Opteron, Phenom, Athlon, Sempron case 0x12: // Llano APU return cpuinfo_uarch_k10; case 0x14: return cpuinfo_uarch_bobcat; case 0x15: switch (model_info->model) { case 0x00: // Engineering // samples case 0x01: // Zambezi, // Interlagos return cpuinfo_uarch_bulldozer; case 0x02: // Vishera case 0x10: // Trinity case 0x13: // Richland return cpuinfo_uarch_piledriver; case 0x38: // Godavari case 0x30: // Kaveri return cpuinfo_uarch_steamroller; case 0x60: // Carrizo case 0x65: // Bristol Ridge case 0x70: // Stoney Ridge return cpuinfo_uarch_excavator; default: switch (model_info->extended_model) { case 0x0: return cpuinfo_uarch_bulldozer; case 0x1: // No // L3 // cache case 0x2: // With // L3 // cache return cpuinfo_uarch_piledriver; case 0x3: // With // L3 // cache case 0x4: // No // L3 // cache return cpuinfo_uarch_steamroller; } break; } break; case 0x16: if (model_info->extended_model >= 0x03) { return cpuinfo_uarch_puma; } else { return cpuinfo_uarch_jaguar; } case 0x17: switch (model_info->extended_model) { case 0x0: // model 01h -> 14 nm // Naples/Whitehaven/Summit // Ridge/Snowy Owl, // model 08h -> 12 nm // Colfax/Pinnacle // Ridge case 0x1: // model 11h -> 14 nm // Raven Ridge/Great // Horned Owl, model // 18h -> 14 nm Banded // Kestrel / 12 nm // Picasso return cpuinfo_uarch_zen; case 0x3: // model 31h -> // Rome/Castle Peak case 0x4: // model 47h -> Xbox // Series X case 0x6: // model 60h -> // Renoir/Grey Hawk, // model 68h -> // Lucienne case 0x7: // model 71h -> // Matisse case 0x9: // model 90h -> Van // Gogh, model 98h -> // Mero return cpuinfo_uarch_zen2; } break; case 0x19: switch (model_info->extended_model) { case 0x0: // model 00h -> // Genesis, model 01h // -> Milan, model 08h // -> Chagall case 0x2: // model 21h -> // Vermeer case 0x3: // model 30h -> // Badami, Trento case 0x4: // model 40h -> // Rembrandt case 0x5: // model 50h -> // Cezanne return cpuinfo_uarch_zen3; case 0x1: // model 10h..1Fh -> // Stones case 0x6: // model 60h..6Fh -> // Raphael case 0x7: // model 70h..77h -> // Phoenix/Hawkpoint1, // model 78h..7Fh -> // Phoenix // 2/Hawkpoint2 case 0xA: // model A0h..AFh -> // Stones-Dense return cpuinfo_uarch_zen4; } break; } break; case cpuinfo_vendor_hygon: switch (model_info->family) { case 0x00: return cpuinfo_uarch_dhyana; } break; default: break; } return cpuinfo_uarch_unknown; }