1*2b54f0dbSXin Li #include <stdint.h> 2*2b54f0dbSXin Li 3*2b54f0dbSXin Li #include <cpuinfo.h> 4*2b54f0dbSXin Li #include <x86/api.h> 5*2b54f0dbSXin Li 6*2b54f0dbSXin Li 7*2b54f0dbSXin Li /* Intel vendor string: "GenuineIntel" */ 8*2b54f0dbSXin Li #define Genu UINT32_C(0x756E6547) 9*2b54f0dbSXin Li #define ineI UINT32_C(0x49656E69) 10*2b54f0dbSXin Li #define ntel UINT32_C(0x6C65746E) 11*2b54f0dbSXin Li 12*2b54f0dbSXin Li /* AMD vendor strings: "AuthenticAMD", "AMDisbetter!", "AMD ISBETTER" */ 13*2b54f0dbSXin Li #define Auth UINT32_C(0x68747541) 14*2b54f0dbSXin Li #define enti UINT32_C(0x69746E65) 15*2b54f0dbSXin Li #define cAMD UINT32_C(0x444D4163) 16*2b54f0dbSXin Li #define AMDi UINT32_C(0x69444D41) 17*2b54f0dbSXin Li #define sbet UINT32_C(0x74656273) 18*2b54f0dbSXin Li #define ter UINT32_C(0x21726574) 19*2b54f0dbSXin Li #define AMD UINT32_C(0x20444D41) 20*2b54f0dbSXin Li #define ISBE UINT32_C(0x45425349) 21*2b54f0dbSXin Li #define TTER UINT32_C(0x52455454) 22*2b54f0dbSXin Li 23*2b54f0dbSXin Li /* VIA (Centaur) vendor strings: "CentaurHauls", "VIA VIA VIA " */ 24*2b54f0dbSXin Li #define Cent UINT32_C(0x746E6543) 25*2b54f0dbSXin Li #define aurH UINT32_C(0x48727561) 26*2b54f0dbSXin Li #define auls UINT32_C(0x736C7561) 27*2b54f0dbSXin Li #define VIA UINT32_C(0x20414956) 28*2b54f0dbSXin Li 29*2b54f0dbSXin Li /* Hygon vendor string: "HygonGenuine" */ 30*2b54f0dbSXin Li #define Hygo UINT32_C(0x6F677948) 31*2b54f0dbSXin Li #define nGen UINT32_C(0x6E65476E) 32*2b54f0dbSXin Li #define uine UINT32_C(0x656E6975) 33*2b54f0dbSXin Li 34*2b54f0dbSXin Li /* Transmeta vendor strings: "GenuineTMx86", "TransmetaCPU" */ 35*2b54f0dbSXin Li #define ineT UINT32_C(0x54656E69) 36*2b54f0dbSXin Li #define Mx86 UINT32_C(0x3638784D) 37*2b54f0dbSXin Li #define Tran UINT32_C(0x6E617254) 38*2b54f0dbSXin Li #define smet UINT32_C(0x74656D73) 39*2b54f0dbSXin Li #define aCPU UINT32_C(0x55504361) 40*2b54f0dbSXin Li 41*2b54f0dbSXin Li /* Cyrix vendor string: "CyrixInstead" */ 42*2b54f0dbSXin Li #define Cyri UINT32_C(0x69727943) 43*2b54f0dbSXin Li #define xIns UINT32_C(0x736E4978) 44*2b54f0dbSXin Li #define tead UINT32_C(0x64616574) 45*2b54f0dbSXin Li 46*2b54f0dbSXin Li /* Rise vendor string: "RiseRiseRise" */ 47*2b54f0dbSXin Li #define Rise UINT32_C(0x65736952) 48*2b54f0dbSXin Li 49*2b54f0dbSXin Li /* NSC vendor string: "Geode by NSC" */ 50*2b54f0dbSXin Li #define Geod UINT32_C(0x646F6547) 51*2b54f0dbSXin Li #define e_by UINT32_C(0x79622065) 52*2b54f0dbSXin Li #define NSC UINT32_C(0x43534E20) 53*2b54f0dbSXin Li 54*2b54f0dbSXin Li /* SiS vendor string: "SiS SiS SiS " */ 55*2b54f0dbSXin Li #define SiS UINT32_C(0x20536953) 56*2b54f0dbSXin Li 57*2b54f0dbSXin Li /* NexGen vendor string: "NexGenDriven" */ 58*2b54f0dbSXin Li #define NexG UINT32_C(0x4778654E) 59*2b54f0dbSXin Li #define enDr UINT32_C(0x72446E65) 60*2b54f0dbSXin Li #define iven UINT32_C(0x6E657669) 61*2b54f0dbSXin Li 62*2b54f0dbSXin Li /* UMC vendor string: "UMC UMC UMC " */ 63*2b54f0dbSXin Li #define UMC UINT32_C(0x20434D55) 64*2b54f0dbSXin Li 65*2b54f0dbSXin Li /* RDC vendor string: "Genuine RDC" */ 66*2b54f0dbSXin Li #define ine UINT32_C(0x20656E69) 67*2b54f0dbSXin Li #define RDC UINT32_C(0x43445220) 68*2b54f0dbSXin Li 69*2b54f0dbSXin Li /* D&MP vendor string: "Vortex86 SoC" */ 70*2b54f0dbSXin Li #define Vort UINT32_C(0x74726F56) 71*2b54f0dbSXin Li #define ex86 UINT32_C(0x36387865) 72*2b54f0dbSXin Li #define SoC UINT32_C(0x436F5320) 73*2b54f0dbSXin Li 74*2b54f0dbSXin Li cpuinfo_x86_decode_vendor(uint32_t ebx,uint32_t ecx,uint32_t edx)75*2b54f0dbSXin Lienum cpuinfo_vendor cpuinfo_x86_decode_vendor(uint32_t ebx, uint32_t ecx, uint32_t edx) { 76*2b54f0dbSXin Li switch (ebx) { 77*2b54f0dbSXin Li case Genu: 78*2b54f0dbSXin Li switch (edx) { 79*2b54f0dbSXin Li case ineI: 80*2b54f0dbSXin Li if (ecx == ntel) { 81*2b54f0dbSXin Li /* "GenuineIntel" */ 82*2b54f0dbSXin Li return cpuinfo_vendor_intel; 83*2b54f0dbSXin Li } 84*2b54f0dbSXin Li break; 85*2b54f0dbSXin Li #if CPUINFO_ARCH_X86 86*2b54f0dbSXin Li case ineT: 87*2b54f0dbSXin Li if (ecx == Mx86) { 88*2b54f0dbSXin Li /* "GenuineTMx86" */ 89*2b54f0dbSXin Li return cpuinfo_vendor_transmeta; 90*2b54f0dbSXin Li } 91*2b54f0dbSXin Li break; 92*2b54f0dbSXin Li case ine: 93*2b54f0dbSXin Li if (ecx == RDC) { 94*2b54f0dbSXin Li /* "Genuine RDC" */ 95*2b54f0dbSXin Li return cpuinfo_vendor_rdc; 96*2b54f0dbSXin Li } 97*2b54f0dbSXin Li break; 98*2b54f0dbSXin Li #endif 99*2b54f0dbSXin Li } 100*2b54f0dbSXin Li break; 101*2b54f0dbSXin Li case Auth: 102*2b54f0dbSXin Li if (edx == enti && ecx == cAMD) { 103*2b54f0dbSXin Li /* "AuthenticAMD" */ 104*2b54f0dbSXin Li return cpuinfo_vendor_amd; 105*2b54f0dbSXin Li } 106*2b54f0dbSXin Li break; 107*2b54f0dbSXin Li case Cent: 108*2b54f0dbSXin Li if (edx == aurH && ecx == auls) { 109*2b54f0dbSXin Li /* "CentaurHauls" */ 110*2b54f0dbSXin Li return cpuinfo_vendor_via; 111*2b54f0dbSXin Li } 112*2b54f0dbSXin Li break; 113*2b54f0dbSXin Li case Hygo: 114*2b54f0dbSXin Li if (edx == nGen && ecx == uine) { 115*2b54f0dbSXin Li /* "HygonGenuine" */ 116*2b54f0dbSXin Li return cpuinfo_vendor_hygon; 117*2b54f0dbSXin Li } 118*2b54f0dbSXin Li break; 119*2b54f0dbSXin Li #if CPUINFO_ARCH_X86 120*2b54f0dbSXin Li case AMDi: 121*2b54f0dbSXin Li if (edx == sbet && ecx == ter) { 122*2b54f0dbSXin Li /* "AMDisbetter!" */ 123*2b54f0dbSXin Li return cpuinfo_vendor_amd; 124*2b54f0dbSXin Li } 125*2b54f0dbSXin Li break; 126*2b54f0dbSXin Li case AMD: 127*2b54f0dbSXin Li if (edx == ISBE && ecx == TTER) { 128*2b54f0dbSXin Li /* "AMD ISBETTER" */ 129*2b54f0dbSXin Li return cpuinfo_vendor_amd; 130*2b54f0dbSXin Li } 131*2b54f0dbSXin Li break; 132*2b54f0dbSXin Li case VIA: 133*2b54f0dbSXin Li if (edx == VIA && ecx == VIA) { 134*2b54f0dbSXin Li /* "VIA VIA VIA " */ 135*2b54f0dbSXin Li return cpuinfo_vendor_via; 136*2b54f0dbSXin Li } 137*2b54f0dbSXin Li break; 138*2b54f0dbSXin Li case Tran: 139*2b54f0dbSXin Li if (edx == smet && ecx == aCPU) { 140*2b54f0dbSXin Li /* "TransmetaCPU" */ 141*2b54f0dbSXin Li return cpuinfo_vendor_transmeta; 142*2b54f0dbSXin Li } 143*2b54f0dbSXin Li break; 144*2b54f0dbSXin Li case Cyri: 145*2b54f0dbSXin Li if (edx == xIns && ecx == tead) { 146*2b54f0dbSXin Li /* "CyrixInstead" */ 147*2b54f0dbSXin Li return cpuinfo_vendor_cyrix; 148*2b54f0dbSXin Li } 149*2b54f0dbSXin Li break; 150*2b54f0dbSXin Li case Rise: 151*2b54f0dbSXin Li if (edx == Rise && ecx == Rise) { 152*2b54f0dbSXin Li /* "RiseRiseRise" */ 153*2b54f0dbSXin Li return cpuinfo_vendor_rise; 154*2b54f0dbSXin Li } 155*2b54f0dbSXin Li break; 156*2b54f0dbSXin Li case Geod: 157*2b54f0dbSXin Li if (edx == e_by && ecx == NSC) { 158*2b54f0dbSXin Li /* "Geode by NSC" */ 159*2b54f0dbSXin Li return cpuinfo_vendor_nsc; 160*2b54f0dbSXin Li } 161*2b54f0dbSXin Li break; 162*2b54f0dbSXin Li case SiS: 163*2b54f0dbSXin Li if (edx == SiS && ecx == SiS) { 164*2b54f0dbSXin Li /* "SiS SiS SiS " */ 165*2b54f0dbSXin Li return cpuinfo_vendor_sis; 166*2b54f0dbSXin Li } 167*2b54f0dbSXin Li break; 168*2b54f0dbSXin Li case NexG: 169*2b54f0dbSXin Li if (edx == enDr && ecx == iven) { 170*2b54f0dbSXin Li /* "NexGenDriven" */ 171*2b54f0dbSXin Li return cpuinfo_vendor_nexgen; 172*2b54f0dbSXin Li } 173*2b54f0dbSXin Li break; 174*2b54f0dbSXin Li case UMC: 175*2b54f0dbSXin Li if (edx == UMC && ecx == UMC) { 176*2b54f0dbSXin Li /* "UMC UMC UMC " */ 177*2b54f0dbSXin Li return cpuinfo_vendor_umc; 178*2b54f0dbSXin Li } 179*2b54f0dbSXin Li break; 180*2b54f0dbSXin Li case Vort: 181*2b54f0dbSXin Li if (edx == ex86 && ecx == SoC) { 182*2b54f0dbSXin Li /* "Vortex86 SoC" */ 183*2b54f0dbSXin Li return cpuinfo_vendor_dmp; 184*2b54f0dbSXin Li } 185*2b54f0dbSXin Li break; 186*2b54f0dbSXin Li #endif 187*2b54f0dbSXin Li } 188*2b54f0dbSXin Li return cpuinfo_vendor_unknown; 189*2b54f0dbSXin Li } 190