/** * Processor Management */ /** * Processor Identification */ /** * Name Title Revision * ---------------------------------------------------------------------------------------------------- * AMD AMD-K6 Processor Model 6 Revision Guide G 1998 August * AMD AMD-K6 Processor Model 7 Revision Guide H 1999 June * AMD AMD-K6-2 Processor Model 8 Revision Guide F 1999 June * AMD AMD-K6-III Processor Model 9 Revision Guide C 1999 July * AMD AMD Athlon Processor Model 1 & Model 2 Revision Guide D 2000 August * AMD AMD Duron Processor Model 3 Revision Guide I 2002 December * AMD AMD Athlon Processor Model 4 Revision Guide I 2002 December * AMD AMD Athlon Processor Model 6 Revision Guide E 2002 December * AMD AMD Duron Processor Model 7 Revision Guide C 2002 December * AMD AMD Athlon Processor Model 8 Revision Guide C 2002 December * * Intel Intel386 CX/SXSA Microprocessor Specification Update 002 1997 January * Intel Intel386 DX Processor Specification Update 002 1997 January * Intel Intel386 EX Embedded Processor Specification Update 010 1998 October * Intel 60- and 66-MHz Pentium Processor Specification Update 001 1997 February * Intel Pentium Processor Specification Update 041 1999 January * Intel Pentium Pro Processor Specification Update 039 1999 January * Intel Mobile Intel Celeron Processor at 466 MHz, ... Specification Update 038 2002 November * Intel Mobile Intel Pentium II Processor Specification Update 046 2002 November * Intel Intel Pentium II Xeon Processor Specification Update 032 2002 January * Intel Intel Pentium II Processor Specification Update 049 2002 July * Intel Intel Celeron Processor Specification Update 047 2002 October * Intel Intel Pentium III Processor Specification Update 045 2002 November * Intel Mobile Intel Celeron Processor (0.18µ and 0.13µ) Specification Update 030 2002 August * Intel Mobile Intel Pentium III Processor and ... Specification Update 036 2002 November * Intel Intel Pentium III Xeon Processor Specification Update 037 2002 July * Intel Intel Pentium 4 Processor Specification Update 029 2002 November * Intel Mobile Intel Pentium 4 Processor-M Specification Update 008 2002 November * Intel Intel Celeron Processor in the 478-Pin Package Specification Update 005 2002 November * Intel Mobile Intel Celeron Processor on .13 Micron ... Specification Update 002 2002 August * Intel Intel Xeon Processor Specification Update 020 2002 November * Intel Intel Xeon Processor MP Specification Updata 009 2002 November * Intel Low Voltage Intel Xeon Processor Specification Update 003 2002 November * Intel Intel Pentium M Processor 001 2003 March * Intel Intel Itanium Processor Specification Update 008 2003 January * Intel Intel Itanium 2 Processor Specification Update 007 2003 January * AMD AMD Processor Recognition W-1 2002 November * Intel Intel Processor Identification and the CPUID Instruction 023 2003 March * Intel Intel Processor Serial Number 001 1999 March * IDT IDT WinChip C6 Data Sheet 1.10 1998 March */ /** * Mobile Athlon Detection * * Problems with CPU identication: * 1) How much information? * 2) Getting the information * * CPU identification has two purposes: OS information and user information. Since this module wil be * used in TriOS we'll only need OS information (ident upto stepping for erratas) No process size, * packaging or voltage info. I can be found withofficial name and codename. To prevent user confusion * we need to show the diff between Celeron / Pentium / Xeon. Cache info is important for some memory * defragmentation and alignment algorithms, perhaps. * * OLD CPUS: * * i4004 / i4040 * i8008 / i8080 / i8080A / Zilog Z80 / i8085A / i8085AH * * 2.13 Contemporary CPUs * Contemporary 16 bit CPUs to 8086/8088 were Zilog Z8000 CPU, Fairchild 9445 CPU, Texas Instruments TI9900 CPU and Mil-Std 1750A CPU. Last is reason DOD (Department Of Defence) contractors were not interested in 8086/8088. Mil-Std 1750A CPU was specified in all contracts of 1979 - 1984 period. * Texas Instruments TI9900 CPU was probably the best of the lot, but Texas Instruments considered it a closed architecture, so no-one used it. * * 8086 - 80368 Intel Only * 80486 Lots of manufacturers, almost no stpping info * 80586 Lots of incorrect information and processors that were never sold, no stepping info * 80686 Celeron / Pentium / Xeon // !Mobile! (Inel realy srewed up the names here) * 80786 VERY WELL DONE BY INTEL (at least names are a bit more consistant) * 80886 Not officialy realeasd at the moment * * Intel detection: AAA xxh doesn't #UD * Cyrix Detection: Read the chipset data, but I heard there was a better one * AMD Detection If there not TI, IBM, UMC, Cyrix or Intel, must be AMD, need sometin' better * UMC Detection support CPUID I believe * Texas Detection Models do not real conflic (aren't those things the same as IBM have to check) * IBM Detection Ax or 8x as family (but there are exceptions) and models do not conflict * * CYRIX/TI/IBM Identificaton through Chipset Data (I/O 22h and 23h) * * Not about the use of stepping and revision: * * Stepping is used always. I try to change this into: Stepping = A0 / Revision = 3h * Intel also calls the revion Stepping ID * * 386 Reset Data * 0- 3 Minor Stepping Revision * 4- 7 Major Stepping Model * 8-11 Family Family * 12-15 Type DX/SX/SL and TI/IBM/Intel * * 486+ Reset Data * 0- 3 Revision * 4- 7 Model * 8-11 Family * 12-13 Type 0 = Normal, 1 = OverDrive, 2 = Second Processor, 3 = Reserved * 14-15 Reserved * 16-19 Extended Model * 20-27 Extended Family * 28-30 Reserved * 31 Reserved Has Serial Number * * All over drives could also have type 0 if they are an errata (whatever that means) * * Legal Mumbo Jumbo: In the CPUID Documentation, Intel says the PSN could be reported wrongly, for * example if the voltage or frequency is wrong. It doesn't say it's corec when the processor is * working on the correct voltage and frequency... * * IF HighetExtened CPUID Fucntion > 0x80000000 Brand String is supported, even if 0x800000001 or 2 ??? * * Should OverDrives just be ignored? According to Intel internal caches or execution times may vary * According to Intel CPUID is unreliable in V86 Mode * According to Intel MSRs vary between different Models of the Pentium (P5 that is) * PSN is not guaranteed to be unique * Intel PSN Style: XXXX-XXXX-XXXX-XXXX-XXXX-XXXX (96 bit) * Transmeta PSN S: XXXXXXXX:XXXXXXXX:XXXXXXXX:XXXXXXXX (128 bit) * * Intel says apps need to use the BRAND STRING to identify the processor (ARE THEY CRAZY???) * Intel says apps need to use the BRAND ID to identify the processor (not crazy, but useless) * * DAZ DAZ DAZ DAZ DAZ DAZ DAZ * * 11 DENORMALS ARE ZERO * With the introduction of the SSE2 extensions, some Intel Architecture processors have the ability to convert SSE * and SSE2 source operand denormal numbers to zero. This feature is referred to as Denormals -Are-Zero (DAZ). The * DAZ mode is not compatible with IEEE Standard 754. The DAZ mode is provided to improve processor * performance for applications such as streaming media processing, where rounding a denormal operand to zero does * not appreciably affect the quality of the processed data. * Some processor steppings support SSE2 but do not support the DAZ mode. To determine if a processor supports the * DAZ mode, software must perform the following steps. * 1. Execute the CPUID instruction with an input value of EAX=0 and ensure the vendor-ID string returned is “GenuineIntel”. * 2. Execute the CPUID instruction with EAX=1. This will load the EDX register with the feature flags. * 3. Ensure that the FXSR feature flag (EDX bit 24) is set. This indicates the processor supports the FXSAVE and FXRSTOR * instructions. * 4. Ensure that the XMM feature flag (EDX bit 25) or the EMM feature flag (EDX bit 26) is set. This indicates that the * processor supports at least one of the SSE/SSE2 instruction sets and its MXCSR control register. * 5. Zero a 16-byte aligned, 512-byte area of memory. This is necessary since some implementations of FXSAVE do not modify * reserved areas within the image. * 6. Execute an FXSAVE into the cleared area. * 7. Bytes 28-31 of the FXSAVE image are defined to contain the MXCSR_MASK. If this value is 0, then the processor's * MXCSR_MASK is 0xFFBF, otherwise MXCSR_MASK is the value of this dword. * 8. If bit 6 of the MXCSR_MASK is set, then DAZ is supported. * After completing this algorithm, if DAZ is supported, software can enable DAZ mode by setting bit 6 in the * MXCSR register save area and executing the FXRSTOR instruction. Alternately software can enable DAZ mode by * setting bit 6 in the MXCSR by executing the LDMXCSR instruction. Refer to the chapter titled “Programming with * the Streaming SIMD Extensions (SSE)” in the Intel Architecture Software Developer’s Manual volume 1: Basic * Architecture. * * DAZ DAZ DAZ DAZ DAZ DAZ DAZ * * Legacy detecyion * 8086 EFLAGS 12-15 are always set * 80286 EFLAGS 12-15 are clear in RM * 80366 EFLAGS 18 Cant be set, if it can it a 486+ * 80848 EFLAGS 21 Can't be set, if it can use CPUID * * FPU If control/status word can be saved it's present * 27/387 Infinity control Rounding Stuff * 487 486 with coproc * * What about the Xeon DP???? * * CMXCHG8B Disabled because of Stuoid MSWinNT bug (studpid. Microsft not diabling. stupid) * * sAVE bRAND sTRING BEFRORE s3 POWER DOWN * * NSC Geode!!!! * * "The iAPX 286 will push a different value on the stack for PUSH SP than the iAPX 86/88." * "When a word write is performed at offset FFFFh in a segment, the 8086 will write one byte at offset * FFFFh, and the other at offset 0, while an 80186 family processor will write one byte at offset * FFFFh, and the other at offset 10000h (one byte beyond the end of the segment)." * * A finalty note: I'm looking for some information on the Intel Timna (Intel's MediaGX). The project * was abandonned so Intel never published any useful material on this. It was based on the P-III. * Also some info in the Microsoft X-Box' special P-III would help */ #include <stdint.h> #include "bootlog.h" typedef struct { unsigned n; char* i; char* v; } VENDORLIST; VENDORLIST VendorList[] = { {0x0001, "ThinkTrinary", "Trinary Technologies"}, {0x0002, "GenuineIntel", "Intel"}, {0x0003, "AuthenticAMD", "AMD"}, {0x0003, "AMD ISBETTER", "AMD"}, {0x0004, "CentaurHauls", "Centaur (IDT / VIA)"}, {0x0005, "CyrixInstead", "Cyrix (VIA)"}, {0x0006, "GenuineTMx86", "Transmeta"}, {0x0007, "Geode by NSC", "National Semiconductor"}, {0x0008, "NexGenDriven", "NexGen"}, {0x0009, "RiseRiseRise", "Rise"}, {0x000A, "SiS SiS SiS ", "SiS"}, {0x000B, "UMC UMC UMC ", "UMC"}, }; typedef struct { long long id; bool verified; char* name; } PROCLIST; PROCLIST ProcessorList[] = { {0x00FFFFFF, false, "Unknown x86 Processor"}, {0x0000FFFF, false, "Unknown 8086 Compatible Processor"}, {0x0001FFFF, false, "Unknown 186 Compatible Processor"}, {0x0002FFFF, false, "Unknown 286 Compatible Processor"}, {0x0003FFFF, false, "Unknown 386 Compatible Processor"}, {0x0004FFFF, false, "Unknown 486 Compatible Processor"}, {0x0005FFFF, false, "Unknown 586 Compatible Processor"}, {0x0006FFFF, false, "Unknown 686 Compatible Processor"}, {0x02FFFFFF, false, "Unknown Intel Processor"}, {0x0203FFFF, false, "Unknown Intel i386 Processor"}, {0x0204FFFF, false, "Unknown Intel i486 Processor"}, {0x0205FFFF, false, "Unknown Intel Pentium Processor"}, {0x020501FF, false, "Intel Pentium Classic"}, {0x020502FF, false, "Intel Pentium"}, {0x020503FF, false, "Intel Pentium OverDrive"}, {0x020504FF, false, "Intel Pentium MMX"}, {0x020507FF, false, "Intel Pentium Mobile"}, {0x020508FF, false, "Intel Pentium MMX Mobile 'Tillamook'"}, {0x0206FFFF, false, "Unknown Intel P6 Processor"}, {0x020601FF, false, "Intel Pentium Pro"}, {0x020603FF, false, "Unknown Intel Pentium II"}, {0x02060301, false, "Intel Pentium II 'Klamath'"}, /* 0512 - 0512 */ {0x02060305, false, "Intel Pentium II OverDrive"}, /* OVERDRIVE */ {0x020605FF, false, "Unknown Intel Pentium II"}, {0x02060500, false, "Intel Celeron II 'Covington'"}, /* 0000 - 0000 */ {0x02060501, false, "Intel Pentium II 'Deschutes'"}, /* 0512 - 0512 */ {0x02060502, false, "Intel Xeon II 'Drake'"}, /* 0512 - 2048 */ {0x02060504, false, "Intel Pentium II Mobile 'Tonga'"}, /* 0512 - 0512 */ {0x020606FF, false, "Unknown Intel Pentium II"}, {0x02060600, false, "Intel Celeron II 'Mendocino'"}, /* 0128 - 0128 */ /**/ {0x02060603, false, "Intel Celeron II Mobile"}, /* 0128 - 0128 (A) */ {0x02060604, false, "Intel Pentium II Mobile 'Dixon'"}, /* 0256 - 0256 (A) */ {0x020607FF, false, "Unknown Intel Pentium III"}, {0x02060701, false, "Intel Pentium III 'Katmai'"}, /* 0512 - 0512 */ {0x02060702, false, "Intel Xeon III 'Tanner'"}, /* 0512 - 2048 */ {0x020608FF, false, "Unknown Intel Pentium III"}, {0x02060801, false, "Intel Celeron III 'Coppermine'"}, {0x02060802, false, "Intel Pentium III (Mobile) 'Coppermine'"}, {0x02060803, false, "Intel Xeon III 'Cascades'"}, {0x020609FF, false, "Unknown Intel Pentium M"}, {0x02060916, false, "Intel Pentium M 'Banias'"}, {0x02060AFF, false, "Unknown Intel Pentium III"}, {0x02060A03, false, "Intel Xeon III 'Cascades'"}, {0x02060BFF, false, "Unknown Intel Pentium III"}, {0x02060B03, false, "Intel Celeron III 'Tualatin'"}, {0x02060B04, false, "Intel Pentium III 'Coppermine'"}, {0x02060B06, false, "Intel Pentium III Mobile 'Geyserville'"}, {0x02060B07, false, "Intel Celeron III Mobile 'Geyserville'"}, {0x0207FFFF, false, "Unknown Intel Itanium"}, {0x020FFFFF, false, "Unknown Intel NetBurst Processor"}, {0x020F0008, false, "Intel Pentium 4 'Willamette'"}, {0x020F000E, false, "Intel Xeon 4 'Foster'"}, {0x020F0108, false, "Intel Pentium 4 'Willamette'"}, {0x020F0109, false, "Intel Pentium 4 'Willamette'"}, {0x020F010A, false, "Intel Celeron 4 'Willamette'"}, {0x020F010B, false, "Intel Xeon 4 MP 'Foster'"}, {0x020F010E, false, "Intel Xeon 4 'Foster'"}, {0x020F020C, false, "Intel Xeon 4 MP 'Gallatin'"}, {0x020F0208, false, "Intel Celeron 4 Mobile 'Northwood'"}, {0x020F0209, false, "Intel Pentium 4 'Northwood'"}, {0x020F020B, false, "Intel Xeon 4 'Prestonia'"}, {0x020F020E, false, "Intel Pentium 4 Mobile 'Northwood'"}, {0x020F020A, false, "Intel Celeron 4 'Northwood'"}, {0x0210FFFF, false, "Unknown Intel Itanium 2"}, {0x03FFFFFF, false, "Unknown AMD Processor"}, {0x0306FFFF, false, "Unknown AMD Athlon Processor"}, {0x030601FF, false, "AMD Athlon 'Pluto'"}, {0x030602FF, false, "AMD Athlon 'Argon'"}, {0x030603FF, false, "AMD Duron 'Spitfire'"}, {0x030604FF, false, "AMD Athlon 'Thunderbird'"}, {0x030605FF, false, "AMD Athlon Ultra 'Mustang'"}, {0x030606FF, false, "AMD Athlon MP 'Palomino'"}, {0x030606FF, false, "AMD Athlon XP/MP 'Palomino'"}, {0x030606FF, false, "AMD Athlon 4 Mobile 'Palomino'"}, {0x030607FF, false, "AMD Duron 'Morgan'"}, {0x030607FF, false, "AMD Duron MP 'Morgan'"}, {0x030607FF, false, "AMD Duron Mobile 'Morgan'"}, {0x030608FF, false, "AMD Athlon XP 'Thoroughbred'"}, {0x030608FF, false, "AMD Athlon MP 'Thoroughbred'"}, {0x030608FF, false, "AMD Athlon XP Mobile 'Thoroughbred'"}, {0x030609FF, false, "AMD Duron 'Appaloosa'"}, {0x030609FF, false, "AMD Duron MP 'Appaloosa'"}, {0x030609FF, false, "AMD Duron Mobile 'Appaloosa'"}, {0x03060AFF, false, "AMD Athlon XP 'Barton'"}, {0x03060AFF, false, "AMD Athlon MP 'Barton'"}, {0x04FFFFFF, false, "Unknown IDT / VIA Processor"}, {0x0405FFFF, false, "Unknown IDT WinChip"}, {0x040504FF, false, "IDT WinChip C6"}, {0x040508FF, false, "IDT WinChip 2"}, {0x040509FF, false, "IDT WinChip 3"}, {0x0406FFFF, false, "Unknown VIA C3"}, {0x040606FF, false, "VIA C3 'Samuel 1' / VIA Eden 4000"}, {0x040607FF, false, "VIA C3 'Samuel 2 / Ezra' / VIA Eden 5000 / VIA Eden 6000"}, /* 0-7 / 8-F */ {0x040608FF, false, "VIA C3 'Ezra-T' (VIA Eden 7000)"}, // {0x040609FF, false, "VIA C3 'Nehalem VIA Eden 8000"}, {0x05FFFFFF, false, "Unknown Cyrix Processor"}, {0x0506FFFF, false, "Unknown VIA Cyrix III"}, {0x050605FF, false, "VIA Cyrix III 'Joshua'"}, {0x06FFFFFF, false, "Unknown Transmeta Processor"}, {0x0604FFFF, false, "Transmeta Crusoe 3x00 / 5x00 Processor"}, {0x08FFFFFF, false, "Unknown NexGen Processor"}, {0x0805FFFF, false, "Unknown NexGen Nx586 / Nx686 Processor"}, {0x080500FF, false, "Unknown NexGen Nx586"}, {0x08050000, false, "NexGen Nx586"}, {0x08050001, false, "NexGen Nx586FP"}, //{0x0805??FF, false, "Unknown NexGen Nx686"}, {0x0CFFFFFF, false, "Unknown UMC Processor"}, {0x0C04FFFF, false, "Unknown UMC 486 Processor"}, {0x0C0401FF, false, "UMC U5SD"}, {0x0C0402FF, false, "UMC U5S"}, {0x0C0403FF, false, "UMC U486DX2"}, {0x0C0405FF, false, "UMC U486SX2"}, {0xABCDABCD, false, "XXX"} }; #if 0 /**********************************************************************************************/ // {"GenuineIntel", 0x05, 0x00, 0x0?, 0, false, "Intel Pentium Classic (A*)"}, // {"GenuineIntel", 0x05, 0x01, 0x02, 0, false, "Intel Pentium Classic (B*)"}, // {"GenuineIntel", 0x05, 0x01, 0x04, 0, false, "Intel Pentium Classic (B2)"}, // {"GenuineIntel", 0x05, 0x04, 0x01, 0, false, "Intel Pentium MMX (A1)"}, // {"GenuineIntel", 0x05, 0x04, 0x02, 0, false, "Intel Pentium MMX (A2)"}, // {"GenuineIntel", 0x05, 0x05, 0x0?, 0, false, "Intel Pentium MMX OverDrive"}, // {"GenuineIntel", 0x05, 0x06, 0x0?, 0, false, "Intel Pentium MMX OverDrive"}, // {"GenuineIntel", 0x06, 0x00, 0x0?, 0, false, "Intel Pentium Pro (A0)"}, // {"GenuineIntel", 0x06, 0x04, 0x0?, 0, false, "Intel Pentium II OverDrive (?)"}, // {"GenuineIntel", 0x0F, 0x02, 0x07, 0x0E, false, "Intel Pentium 4 Mobile (C1)"}, // {"AuthenticAMD", 0x06, 4, 4, 0, false, "AMD Athlon 'Thunderbird' Model 4 (B0)"}, //??Grzegorz // {"AuthenticAMD", 0x06,5?, ?, 0, false, "AMD Athlon Ultra 'Mustang' Model 5? (??)"}, /* CANCELED */ // {"GenuineIntel",F?,3?, ?, ?, "Intel Pentium 4 'Prescott' (??)"}, //.09 // {"GenuineIntel",F?,3?, ?, ?, "Intel Xeon 4 'Nocona' (??)"}, //.09 // {"GenuineIntel",F?,4?, ?, ?, "Intel Pentium 4 'Tyler' (??)"}, // {"GenuineIntel",F?,4?, ?, ?, "Intel Pentium 4 'Tejas' (??)"}, // {"GenuineIntel",F?,4?, ?, ?, "Intel Xeon 4 'Potomac' (??)"}, //GI Nehalem Pentium 5 // {"GenuineIntel", ?,?, ?, ?, "Intel Mobillium 'Banias' (??)"}, // {"GenuineIntel", ?,?, ?, ?, "Intel Mobillium 'Dothan' (??)"}, // {"GenuineIntel", ?,?, ?, ?, "Intel Mobillium 'Morem' (??)"}, /* Next GEN!!!! */ // {"GenuineIntel", ?,?, ?, ?, "Intel Mobillium 'Gilo' (??)"}, /* Next GEN!!!! */ // Intel's truly mobile processor. Intel says this is a completly new processor. Sources say it's just // a rework of the PIII or P4. I don't believe this, beacause it has SSE2 (not in PIII) and is faster // than the P4. I guess they just shortened the enormous 20 stage P4 pipeline a bit, which is too long // to be used effecivly. More backup is provided for the fact that the Pentium 5 will be based upon // this chip. And another thing many sources will tell you this chip will be called 'Intel Banias', // didn't Intel call the Pentium III, Intel Katmai for a very long time. With this in mind it wouldn't // even surprise me if this processor is goin to be called Pentium 5. Sorry but I have to go one now // I'm brainstorming. The mobile part of it might not even be used for mobile computers, but for // desktops and servers as well, because cooling has become almost impossible today. If speeds are // going to get even higher the next couple of years, the processor cores will just melt. Because // AMD's processors get even hotter and isn't working on a similar project Intel might even regain // it's market monopoly (wheter this is good or bad, I don't know?) // {"GenuineIntel",F?,?, ?, ?, "Intel Pentium 5 'Nehalem' (??)"}, // This is just a rumor. It's supposed to come out in 2006, run at 6Ghz and have a bus speed of // 1.5Ghz. It COULD be using the Intel Banias core. Suggesting the Banias is a Pentium 5 and that it // IS completely new. IF you read the note above this could also be the Pentium 6 or something. // {"GenuineIntel", 7, 6, 4, 0, "Intel Itanium 'Merced' (C0)"}, //0007000604 // {"GenuineIntel", 7, 7, 4, 0, "Intel Itanium 'Merced' (C1)"}, //0007000704 // {"GenuineIntel", 7, 7, 4, 0, "Intel Itanium 'Merced' (C2)"}, //0007000804 // {"GenuineIntel", 0x10, 0, ?, 0, "Intel Itanium 2 'McKinley' (B3)"}, //001F000704 // {"GenuineIntel",A?, ?, ?, ?, ???, "Intel Itanium 2 'Madison' (??)"}, // {"GenuineIntel",A?, ?, ?, ?, ???, "Intel Itanium 2 'Deerfield' (??)"},XXX // {"GenuineIntel",A?, ?, ?, ?, ???, "Intel Itanium 2 'Montecito' (??)"} // {"GenuineIntel",A?, ?, ?, ?, ???, "Intel Itanium 2 'Shavano' (??)"}, // {"GenuineIntel",A?, ?, ?, ?, ???, "Intel Itanium 2? 'Yosemite' (??)"}, // {"GenuineIntel",A?, ?, ?, ?, ???, "Intel Itanium 2? 'Tanglewood' (??)"}, // {"AuthenticAMD", ?, ?, ?, ?, "AMD Athlon XP64 / Hammer 'Clawhammer' (??)"}, // {"AuthenticAMD", ?, ?, ?, ?, "AMD Athlon XP64 / Hammer 'San Diego' (??)"}, // {"AuthenticAMD", ?, ?, ?, ?, "AMD Athlon XP64 / Hammer Mobile 'Odessa' (??)"}, // {"AuthenticAMD", ?, ?, ?, ?, "AMD Opteron 'Sledgehammer' (??)"}, // {"AuthenticAMD", ?, ?, ?, ?, "AMD Opteron 'Athens' (??)"}, // {"CentaurHauls", 0x05, 0x08, 0x01, 0x00, false, "IDT WinChip 2"}, // {"CentaurHauls", 6, 0xA, ?, 0, "IDT WinChip 4"}, //PROBABLY DOESN'T EXIST! -> Is a VIA C3!!! /** Intel 8086 / 8088 (Includes model manufactured by AMD, Harris, Siemens, Hitachi) ************/ //I belive there an alroithm to identify the diff between HMOS and CMOS models {"GenuineIntel", 1, 0, 0, 0, false, "Intel 8088"}, {"GenuineIntel", 1, 0, 0, 1, false, "Intel 8086"}, {"GenuineIntel", 1, 0, 0, 2, false, "Intel 80C88"}, {"GenuineIntel", 1, 0, 0, 3, false, "Intel 80C86"}, {"GenuineIntel", 1, 0, 0, 4, false, "Intel 80188"}, //XL/EA/EB/EC AMD/Siemens {"GenuineIntel", 1, 0, 0, 5, false, "Intel 80186"}, //XL/EA/EB/EC AMD/Siemens {"GenuineIntel", 1, 0, 0, 6, false, "NEC V20"}, //V20H/V25/V25 Plus/V25 Softwae Guard/V40/V40H//V45 {"GenuineIntel", 1, 0, 0, 7, false, "NEC V30"}, //V30H/V35/V35 Plus/V35 Softwae Guard/V50/V50H//V55 //Intel 80886??? {"GenuineIntel", 2, 0, 0, 0, false, "Intel 80286"},//amd/harris/siemens/fujitsu/kruger /** Intel 386 ***********************************************************************************/ //The 386 use a very different format: Family (8-bits!) + Revision (8-bits! Model+Stepping) //Not to myself: The high four bits of the family should coume in the extra field //These chips were also munufactured by AMD!!! They are affected by the POPAD bug???? //Old (sigma-pi) i386 have 32-bit multipy bug //C&T 38600DX do not have POPAD bug. IBM 386SLC unknwon //AMD 386DX & DXL hav Intel microcode //AMD 386DXLV & SXLV hav UMOV??? //Nx586 has no AC has 386 instr set //Erly modles (A stepping) as Famuly: 0, Revision: ??? (In Intel Docs! Support the 'Bit Instrucs') //0300 // * Intel i386DX : F0 {"GenuineIntel", 3, 0, 3, 0, false, "Intel i386DX (B0/B1/B2/B3/B4/B5/B6/B7/B8/B9/B10)"}, {"GenuineIntel", 3, 0, 4, 0, false, "Intel i386DX (C???)"}, // Stepping not confiremed {"GenuineIntel", 3, 0, 5, 0, false, "Intel i386DX (D0)"}, {"GenuineIntel", 3, 0, 8, 0, false, "Intel i386DX (D1/D2/E0/E1/F0)"}, //E0/E1/F0 coulld also be 9!!! //The family 23 could also simply be 3 (I don't know were the 2 stands for???) Officialy not part //Difference between DX and SX perhaps (I hope so) // * Intel i386CX/SXSA : A2 / B // * Intel i386EX : A0 / B1 / B2 {"GenuineIntel",23, 0, 4, 0, false, "Intel i386SX (A0)"}, {"GenuineIntel",23, 0, 5, 0, false, "Intel i386SX (B)"}, {"GenuineIntel",23, 0, 8, 0, false, "Intel i386SX (C/D/E)"}, {"GenuineIntel",23, 0, 8, 0, false, "Intel i386CXSA/B (A) / i386EX (A) / i386SXSA (?)"}, //A || B {"GenuineIntel",23, 0, 9, 0, false, "Intel i386SX (?)"}, //EMBEDDED (CX/FX {"GenuineIntel",23, 0, 9, 0, false, "Intel i386EX (A0/B1/C1)"}, //Dito for 33 (376 perhaps) {"GenuineIntel",33, 0, 5, 0, false, "Intel i376 (A0)"}, //Never used in PC because they only work in PM {"GenuineIntel",33, 0, 8, 0, false, "Intel i376 (B)"}, //... //And againt for 43 (386SL) //have a signatur register @ 30e //step level A0: 0x4300, //step level A1: 0x4300, //step level A2: 0x4301, //step level A3: 0x4302, //step level B0: 0x4310, //step level B1: 0x4311. // {"GenuineIntel",43, 0, 5, ?, false, "Intel i386SL (B)"}, // {"GenuineIntel",43, 0, 5, ?, false, "Intel i386SL (A0/A1/A2/A3)"}, //Not sure about this // {"GenuineIntel",43, 1, 0, 0, false, "Intel i386SL (A0/A1/A2/A3)"}, // {"GenuineIntel",43, 1, 1, 0, false, "Intel i386SL (B0/B1)"}, //RapidCADs are not so familiar to me, where they ever used in PCs??? {"GenuineIntel", 3, 4, 0, 0, false, "Intel RapidCAD (A)"}, {"GenuineIntel", 3, 4, 1, 0, false, "Intel RapidCAD (B)"}, /** Intel 486 ***********************************************************************************/ //According to Intel only SL Enhanced and WB Enhanced processors support CPUID {"GenuineIntel", 4, 0, 0, 0, false, "Intel i486DX (A0/A1)"}, {"GenuineIntel", 4, 0, 1, 0, false, "Intel i486DX (B2/B3/B4/B5/B6)"}, {"GenuineIntel", 4, 0, 2, 0, false, "Intel i486DX (C0)"}, {"GenuineIntel", 4, 0, 3, 0, false, "Intel i486DX (C1)"}, {"GenuineIntel", 4, 0, 4, 0, false, "Intel i486DX (D0)"}, // {"GenuineIntel", 4, 0, ?, 0, false, "Intel i486DX"}, {"GenuineIntel", 4, 1, 0, 0, false, "Intel i486DX (cA2/cA3)"}, {"GenuineIntel", 4, 1, 1, 0, false, "Intel i486DX (cB0/cB1)"}, {"GenuineIntel", 4, 1, 3, 0, false, "Intel i486DX (cC0)"}, {"GenuineIntel", 4, 1, 4, 0, false, "Intel i486DX (aA0/aA1)"}, //SL Enhanced {"GenuineIntel", 4, 1, 5, 0, false, "Intel i486DX (aB0)"}, //SL Enhanced // {"GenuineIntel", 4, 1, ?, 0, false, "Intel i486DX"}, {"GenuineIntel", 4, 2, 0, 0, false, "Intel i486SX / i487SX (A0)"}, //Should 487 be model 3 {"GenuineIntel", 4, 2, 1, 0, false, "Intel i487SX (B0)"}, //Should 487 be model 3 {"GenuineIntel", 4, 2, 2, 0, false, "Intel i486SX (B0)"}, {"GenuineIntel", 4, 2, 3, 0, false, "Intel i486SX (bBx)"}, //SL Enhanced and... CPUID {"GenuineIntel", 4, 2, 4, 0, false, "Intel i486SX (gAx)"}, {"GenuineIntel", 4, 2, 7, 0, false, "Intel i486SX (cA0)"}, {"GenuineIntel", 4, 2, 8, 0, false, "Intel i486SX (cB0)"}, {"GenuineIntel", 4, 2, 0xA, 0, false, "Intel i486SX (aA0/aA1)"}, //SL Enhanced {"GenuineIntel", 4, 2, 0xB, 0, false, "Intel i486SX (aB0/aC0)"}, //SL Enhanced {"GenuineIntel", 4, 2, 0xE, 0, false, "Intel i486SX (E)"}, //SL Enhanced??? Grzegorz // {"GenuineIntel", 4, 2, ?, 0, false, "Intel i486SX"}, // {"GenuineIntel", 4, 3, ?, 0, false, "Intel i486DX2 / i486DX2 OverDrive / i487"}, {"GenuineIntel", 4, 3, 2, 0, false, "Intel i486DX2 (A0/A1/A2)"}, {"GenuineIntel", 4, 3, 3, 0, false, "Intel i486DX2 (B1)"}, {"GenuineIntel", 4, 3, 4, 0, false, "Intel i486DX2 (aA0/aA1)"}, //SL Enhanced {"GenuineIntel", 4, 3, 5, 0, false, "Intel i486DX2 (aB0/aC0)"}, //SL Enhanced {"GenuineIntel", 4, 3, 6, 0, false, "Intel i486DX2"}, //Possibly as WB in WT Mode {"GenuineIntel", 4, 4, 0, 0, false, "Intel i486SL (A)"}, {"GenuineIntel", 4, 4, 1, 0, false, "Intel i486SL (?)"}, {"GenuineIntel", 4, 4, 3, 0, false, "Intel i486SL (?)"}, //In Intel Docs, saupoosed to support CPUID // {"GenuineIntel", 4, 4, ?, 0, false, "Intel i486SL"}, // {"GenuineIntel", 4, 5, ?, 0, false, "Intel i486SX2"}, {"GenuineIntel", 4, 5, 0xB, 0, false, "Intel i486SX2 (aC0)"}, //SL Enhanced {"GenuineIntel", 4, 7, 0, 0, false, "Intel i486DX2-WB (A)"}, {"GenuineIntel", 4, 7, 3, 0, false, "Intel i486DX2-WB (?)"}, //In Intel Docs, saupoosed to support CPUID // {"GenuineIntel", 4, 7, ?, 0, false, "Intel i486DX2-WB"}, {"GenuineIntel", 4, 8, 0, 0, false, "Intel i486DX4 (A)"}, {"GenuineIntel", 4, 8, 0, 1, false, "Intel i486DX4 OverDrive (A)"}, {"GenuineIntel", 4, 8, 3, 0, false, "Intel i486DX4 (A)"}, //Possibly as WB in WT Mode, Support CPUID // {"GenuineIntel", 4, 8, ?, 0, false, "Intel i486DX4 / i486DX4 OverDrive"}, {"GenuineIntel", 4, 9, 0, 0, false, "Intel i486DX4-WB (A)"}, //(Do not exist according to Intel CPUID Inf) // {"GenuineIntel", 4, 9, ?, 0, false, "Intel i486DX4-WB"}, /** AMD *****************************************************************************************/ {"AuthenticAMD", 4, 1, 2, 0, false, "AMD 486DX"}, {"AuthenticAMD", 4, 3, 2, 0, false, "AMD 486DX/2"}, //DX4 (WT2x) toooo && DXL2 / DX4NV8T {"AuthenticAMD", 4, 3, 4, 0, false, "AMD 486DX/2"}, //DX4 (WT2x) toooo && DXL2 / DX4SV8B // {"AuthenticAMD", 4, 7, ?, 0, false, "AMD 486DX/2-WB"}, //DX4 (WB2x) {"AuthenticAMD", 4, 7, 4, 0, false, "AMD SV8B (WT)"}, // {"AuthenticAMD", 4, 8, ?, 0, false, "AMD 486DX/4"}, //5x86 toooo {"AuthenticAMD", 4, 8, 4, 0, false, "AMD 486DX/4"}, //3xWT {"AuthenticAMD", 4, 9, 4, 0, false, "AMD 486DX/4-WB"}, //3xWB {"AuthenticAMD", 4, 0xE, 4, 0, false, "AMD Am5x86-WT"}, //AMD Enhanced 486 {"AuthenticAMD", 4, 0xF, 4, 0, false, "AMD Am5x86-WB (4)"}, //AMD Enhanced 486 //cores: 5.0 / 5.0 (MMX) / 5.1 / 5.2 {"AuthenticAMD", 5, 0, 0, 0, false, "AMD K5 SSA/5 (E)"}, //??? Stepping Name {"AuthenticAMD", 5, 0, 1, 0, false, "AMD K5 SSA/5 (F)"}, //??? Stepping Name // {"AuthenticAMD", 5, 0, ?, 0, false, "AMD K5 SSA/5 (?)"}, //??? Stepping Name // {"AuthenticAMD", 5, 1, ?, 0, false, "AMD K5 5k86 Model 1 (?)"}, //??? Stepping Name {"AuthenticAMD", 5, 1, 1, 0, false, "AMD K5 5k86 Model 1 (?)"}, //??? Stepping Name {"AuthenticAMD", 5, 1, 2, 0, false, "AMD K5 5k86 Model 1 (?)"}, //??? Stepping Name {"AuthenticAMD", 5, 1, 4, 0, false, "AMD K5 5k86 Model 1 (?)"}, //CLKMUL=1.5 // {"AuthenticAMD", 5, 2, ?, 0, false, "AMD K5 5k86 Model 1 (?)"}, //??? Stepping Name {"AuthenticAMD", 5, 2, 4, 0, false, "AMD K5 5k86 Model 2 (?)"}, //CLKMUL=1.75 // {"AuthenticAMD", 5, 3, ?, 0, false, "AMD K5 5k86 Model 3 (?)"}, //??? Stepping Name (NOT RELEASED) {"AuthenticAMD", 5, 3, 4, 0, false, "AMD K5 5k86 Model 1 (?)"}, //CLKMUL=2.0 //Missing: MobileS (= k6-7!!!) / K6-2+ n/ K6-III+ {"AuthenticAMD", 5, 6, 1, 0, false, "AMD-K6 Model 6 (B)"}, {"AuthenticAMD", 5, 6, 2, 0, false, "AMD-K6 Model 6 (C)"}, {"AuthenticAMD", 5, 7, 0, 0, false, "AMD-K6 Model 7 'Little Foot' (A)"}, {"AuthenticAMD", 5, 8, 0, 0, false, "AMD-K6-2 Model 8 'Chomper' (A0)"}, //doesnt CXT stnd fr Chomber XT // {"AuthenticAMD", 5, 8, 8, 0, false, "AMD-K6-2 Model 8 'Chomper' (AC)"}, //In Recognition < CXT {"AuthenticAMD", 5, 8, 0xC, 0, false, "AMD-K6-2 Model 8 'Chomper' (AC)"}, //CXT Core (Write COmbining) I believe YES!!! avvording to Chase {"AuthenticAMD", 5, 9, 1, 0, false, "AMD-K6-III 'Sharptooth' Model 9 (B)"}, // {"AuthenticAMD", 5, 0xD, ?, 0, false, "AMD-K6-2+ / K6-III+ 'Sharptooth' (?)"}, //Not doced by AMD (3DNow!+) //* {"AuthenticAMD", 6, 0, ?, 0, "AMD K7 [ES]"}, //UNDOCUMENTED!?! /* Cyrix **************************************************************************************/ //My sources are unreliable at best for these suckers, so I list them all //Also I belive the names aren't entire ly correct, confused codename/ actualt name and extensions {"CyrixInstead", 0, 0, 5, 0, false, "Cyrix M5 Cx486S/D"}, //No CPUID I believe (is family correct?) {"CyrixInstead", 0, 0, 6, 0, false, "Cyrix M6 Cx486DX"}, //... {"CyrixInstead", 0, 0, 7, 0, false, "Cyrix M7 Cx486DX2"}, //... {"CyrixInstead", 0, 0, 8, 0, false, "Cyrix M8 Cx486DX4"}, //... {"CyrixInstead", 4, 1, 0, 0, false, "Cyrix 4x86SLC"}, // {"CyrixInstead", 4, 2, ?, 0, false, "Cyrix 5x86"}, {"CyrixInstead", 4, 2, 9, 0, false, "Cyrix 5x86 (Rev 1-)"}, //Bus *2 {"CyrixInstead", 4, 2, 0xB, 0, false, "Cyrix 5x86 (Rev 1-)"}, //Bus *2 {"CyrixInstead", 4, 2, 0xD, 0, false, "Cyrix 5x86 (Rev 1-)"}, //Bus *3 {"CyrixInstead", 4, 2, 0xF, 0, false, "Cyrix 5x86 (Rev 1-)"}, //Bus *3 // {"CyrixInstead", 4, 4, ?, 0, false, "Cyrix MediaGX"}, {"CyrixInstead", 4, 9, 0, 0, false, "Cyrix 5x86 (Rev 2+)"}, // {"CyrixInstead", 4, 9, ?, 0, false, "Cyrix 5x86"}, // IBM ID=15h Top (65 KB JPG) and Bottom (104 KB JPG) // IBM ID=17h Top (71 KB JPG) and Bottom (110 KB JPG) // Cyrix ID=17h Top (63 KB JPG) and Bottom (102 KB JPG) // IBM ID=22h Top (82 KB JPG) and Bottom (99 KB JPG) // {"CyrixInstead", 5, 0, ?, 0, false, "Cyrix M1 (6x86)"}, //Grzegorz {"CyrixInstead", 5, 2, 0, 0, false, "Cyrix M1 (6x86)"}, //Early Models (L / non-L versions???? (LV too)) // {"CyrixInstead", 5, 2, ?, 0, false, "Cyrix M1 (6x86)"}, //Early Models (L / non-L versions???? (LV too)) {"CyrixInstead", 5, 3, 0, 0, false, "Cyrix M1 (6x86)"}, //1.0x Bus Ratio {"CyrixInstead", 5, 3, 1, 0, false, "Cyrix M1 (6x86)"}, //2.0x Bus Ratio {"CyrixInstead", 5, 3, 2, 0, false, "Cyrix M1 (6x86)"}, //1.0x Bus Ratio {"CyrixInstead", 5, 3, 3, 0, false, "Cyrix M1 (6x86)"}, //2.0x Bus Ratio {"CyrixInstead", 5, 3, 4, 0, false, "Cyrix M1 (6x86)"}, //3.0x Bus Ratio {"CyrixInstead", 5, 3, 5, 0, false, "Cyrix M1 (6x86)"}, //4.0x Bus Ratio {"CyrixInstead", 5, 3, 6, 0, false, "Cyrix M1 (6x86)"}, //3.0x Bus Ratio {"CyrixInstead", 5, 3, 7, 0, false, "Cyrix M1 (6x86)"}, //4.0x Bus Ratio // {"CyrixInstead", 5, 4, ?, 0, false, "Cyrix MediaGX MMX"}, // ID=02h Top (73 KB JPG) and Bottom (100 KB JPG) // ID=04h Top (79 KB JPG) and Bottom (106 KB JPG) // ID=08h Top (66 KB JPG) and Bottom (101 KB JPG) // ID=53 07 {"CyrixInstead", 6, 0, 0, 0, false, "Cyrix MII (6x86MX)"}, // {"CyrixInstead", 6, 0, ?, 0, "Cyrix MII (6x86MX)"}, //These guys are actualy a Cyrix M2 with minor enhancemets (3DNow! / better FPU), but who cares, //they were never taken into procuvtion. Although VIA C3 probalby stands for Cyrix M3 and not, //Centaur WinChip 3. THey got a WinChip 4 core. Josua was nOT released! Start with samual and Samual 2 then Ezra and Ezra-T // {"CyrixInstead", 6, 5, 1, 0, false, "VIA Cyrix III 'Joshua'"}, //2.0x Bus Ratio //Other names heard: Cyrix M-III 'Mojave' (Chase, so reliable never produced!) // Cayenne / Gobi / Jalapeno // Cayenne, then Gobi, then Joshua //THE VIA Series!!!!! //New models : C4 'Nehemia' Has SSE instead of #dnOW! newer modles will be Esther // CZA is a P4 clone /************************************************************************************************/ // I'm not sure about the CNs // {"RiseRiseRise", 5, 0, ?, 0, "Rise mP6 iDragon '6401?' (Model 0)"}, //0.25 // {"RiseRiseRise", 5, 0, 4, 0, "Rise mP6 iDragon '6401?' (Model 0)"}, //0.25 // {"RiseRiseRise", 5, 1, ?, 0, "Rise mP6 iDragon 'Kirin?' (Model 1)"}, // {"RiseRiseRise", 5, 2, ?, 0, "Rise mP6 iDragon 'Lynx?' (Model 2)"}, //0.18 // {"RiseRiseRise", 5, 8, ?, 0, "Rise mP6 iDragon II"}, // {"RiseRiseRise", 5, 9, ?, 0, "Rise mP6 iDragon II"}, // Rise Tiger = MMX+SSE Unknown Nmae #endif /* 0 */ typedef struct __CPU___PROCINFORMATION__ { bool pCertified; char *pName; uint32_t vFamily; uint32_t vModel; uint32_t vStepping; uint32_t vType; uint32_t vBrand; char vVendor[13]; char *vName; bool iFloatingPoint; bool iTranscedental; bool iCompareExchange64; bool iConditionalMove; bool iCLFLUSH; bool iMMX; bool iSSE; bool iSSE2; bool iSSE3; bool iMonitor; bool iFastSystemCall; bool iFXSR; bool fVirtualModeExtensions; bool fDebuggingExtensions; bool fPageSizeExtensions; bool fTimeStampCounter; bool fModelSpecificRegisters; bool fPhysicalAddressExtension; bool fMachineCheckException; bool fLocalAPIC; bool fMemoryTypeRangeRegisters; bool fPageGlobalEnable; bool fMachineCheckArchitecture; bool fPageAttributeTable; bool fPageSizeExtension; bool fProcessorSerialNumber; bool fDebugStore; bool fACPI; bool fSelfSnoop; bool fHyperThreading; bool fThermalMonitor; bool fIA64; bool fSignalBreakOnFERR; bool fQualifiedDebugStore; bool fThermalMonitor2; bool fContextID; uint32_t cLineSize; uint32_t cL1CodeCacheSize; uint32_t cL1CodeCacheAssociativity; uint32_t cL1CodeCacheLineSize; uint32_t cL1CodeCacheLinesPerTag; uint32_t cL1DataCacheSize; uint32_t cL1DataCacheAssociativity; uint32_t cL1DataCacheLineSize; uint32_t cL1DataCacheLinesPerTag; uint32_t cL1UnifiedCacheSize; uint32_t cL1UnifiedCacheAssociativity; uint32_t cL1UnifiedCacheLineSize; uint32_t cL1UnifiedCacheLinesPerTag; uint32_t cL1CodeTLB4KEntries; uint32_t cL1CodeTLB2MEntries; uint32_t cL1DataTLB2MEntries; uint32_t cL1CodeTLB4MEntries; uint32_t cL1DataTLB4KEntries; uint32_t cL1DataTLB4MEntries; uint32_t cL2UnifiedCacheSize; uint32_t cL2UnifiedCacheAssociativity; uint32_t cL2UnifiedCacheLineSize; uint32_t cL2UnifiedCacheLinesPerTag; uint32_t cL2CodeTLB4KEntries; uint32_t cL2CodeTLB2MEntries; uint32_t cL2CodeTLB4MEntries; uint32_t cL2DataTLB4KEntries; uint32_t cL2DataTLB2MEntries; uint32_t cL2DataTLB4MEntries; uint32_t cL2UnifiedTLB4KEntries; uint32_t cL2UnifiedTLB2MEntries; uint32_t cL2UnifiedTLB4MEntries; uint32_t cL3UnifiedCacheSize; uint32_t cL3UnifiedCacheAssociativity; uint32_t cL3UnifiedCacheLineSize; uint32_t cL3UnifiedCacheLinesPerTag; int32_t cL1CodeTLB4KAssociativity; int32_t cL1CodeTLB2MAssociativity; int32_t cL1CodeTLB4MAssociativity; int32_t cL1DataTLB4KAssociativity; int32_t cL1DataTLB2MAssocitivity; int32_t cL1DataTLB4MAssociativity; int32_t cL2CodeTLB4KAssociativity; int32_t cL2CodeTLB2MAssociativity; int32_t cL2CodeTLB4MAssociativity; int32_t cL2DataTLB4KAssociativity; int32_t cL2DataTLB2MAssociativity; int32_t cL2DataTLB4MAssociativity; int32_t cL2UnifiedTLB4KAssociativity; int32_t cL2UnifiedTLB2MAssociativity; int32_t cL2UnifiedTLB4MAssociativity; bool cTraceCachePresent; uint32_t cTraceCacheMicroOps; uint32_t cTraceCacheAssociativity; uint32_t uOnChipFPU; uint32_t uLogicalProcessorCount; uint32_t uAPICID; bool rFeature10; bool rFeature20; bool rFeature33; bool rFeature34; bool rFeature37; bool rFeature38; bool rFeature39; bool rFeature41; bool rFeature42; bool rFeature43; bool rFeature44; bool rFeature45; bool rFeature46; bool rFeature47; bool rFeature48; bool rFeature49; bool rFeature50; bool rFeature51; bool rFeature52; bool rFeature53; bool rFeature54; bool rFeature55; bool rFeature56; bool rFeature57; bool rFeature58; bool rFeature59; bool rFeature60; bool rFeature61; bool rFeature62; bool rFeature63; } prcInformation; void prcInit(void); void prcIdentify(uint64_t processor, prcInformation* information); void prcCPUID(uint64_t processor, uint32_t function, uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d); void IdentifyIntelCache(prcInformation* information, int descriptor); void IdentifyProcessor(prcInformation* information, int Extra); typedef union __CPU___PROCINFORMATIONDATA__ { unsigned int d; unsigned short w[2]; unsigned char b[4]; } prcIdentificationData; void printf(const char *fmt, ...); void init_cpu(void) { prcInformation information; prcIdentify(0, &information); //logStatus(logSuccess); //logSubItem("Processor #0", information.pName); //logSubItem("MMX", information.iMMX ? "Yes" : "No"); printf("Proccessor: %s MMX %s", information.pName, information.iMMX ? "Yes" : "No"); } void prcIdentify(uint64_t processor, prcInformation* information) { uint32_t a, b, c, d; uint32_t highestStandard, highestExtended; int i, n, Extra; /*** 0x00000000 - Vendor **********************/ prcCPUID(processor, 0x00000000, &a, &b, &c, &d); highestStandard = a; *((uint32_t*)(information->vVendor + 0)) = b; *((uint32_t*)(information->vVendor + 4)) = d; *((uint32_t*)(information->vVendor + 8)) = c; information->vVendor[12] = '\0'; /*** 0x00000001 - Version and Features ********/ prcCPUID(processor, 0x00000001, &a, &b, &c, &d); information->vStepping = (a & 0x0000000F) >> 0; information->vModel = (a & 0x000000F0) >> 4; information->vFamily = (a & 0x00000F00) >> 8; information->vType = (a & 0x00003000) >> 12; if(information->vModel == 0xF) information->vModel += (a & 0x000F0000) >> 16; if(information->vFamily == 0xF) information->vFamily += (a & 0x0FF00000) >> 20; information->uOnChipFPU = (d >> 0) & 0x00000001; information->fVirtualModeExtensions = (d >> 1) & 0x00000001; information->fDebuggingExtensions = (d >> 2) & 0x00000001; information->fPageSizeExtension = (d >> 3) & 0x00000001; information->fTimeStampCounter = (d >> 4) & 0x00000001; information->fModelSpecificRegisters = (d >> 5) & 0x00000001; information->fPhysicalAddressExtension = (d >> 6) & 0x00000001; information->fMachineCheckException = (d >> 7) & 0x00000001; information->iCompareExchange64 = (d >> 8) & 0x00000001; information->fLocalAPIC = (d >> 9) & 0x00000001; information->rFeature10 = (d >> 10) & 0x00000001; information->iFastSystemCall = (d >> 11) & 0x00000001; information->fMemoryTypeRangeRegisters = (d >> 12) & 0x00000001; information->fPageGlobalEnable = (d >> 13) & 0x00000001; information->fMachineCheckArchitecture = (d >> 14) & 0x00000001; information->iConditionalMove = (d >> 15) & 0x00000001; information->fPageAttributeTable = (d >> 16) & 0x00000001; information->fPageSizeExtension = (d >> 17) & 0x00000001; information->fProcessorSerialNumber = (d >> 18) & 0x00000001; information->iCLFLUSH = (d >> 19) & 0x00000001; information->rFeature20 = (d >> 20) & 0x00000001; information->fDebugStore = (d >> 21) & 0x00000001; information->fACPI = (d >> 22) & 0x00000001; information->iMMX = (d >> 23) & 0x00000001; information->iFXSR = (d >> 24) & 0x00000001; information->iSSE = (d >> 25) & 0x00000001; information->iSSE2 = (d >> 26) & 0x00000001; information->fSelfSnoop = (d >> 27) & 0x00000001; information->fHyperThreading = (d >> 28) & 0x00000001; information->fThermalMonitor = (d >> 29) & 0x00000001; information->fIA64 = (d >> 30) & 0x00000001; information->fSignalBreakOnFERR = (d >> 31) & 0x00000001; information->iSSE3 = (c >> 0) & 0x00000001; information->rFeature33 = (c >> 1) & 0x00000001; information->rFeature34 = (c >> 2) & 0x00000001; information->iMonitor = (c >> 3) & 0x00000001; information->fQualifiedDebugStore = (c >> 4) & 0x00000001; information->rFeature37 = (c >> 5) & 0x00000001; information->rFeature38 = (c >> 6) & 0x00000001; information->rFeature39 = (c >> 7) & 0x00000001; information->fThermalMonitor2 = (c >> 8) & 0x00000001; information->rFeature41 = (c >> 9) & 0x00000001; information->fContextID = (c >> 10) & 0x00000001; information->rFeature43 = (c >> 11) & 0x00000001; information->rFeature44 = (c >> 12) & 0x00000001; information->rFeature45 = (c >> 13) & 0x00000001; information->rFeature46 = (c >> 14) & 0x00000001; information->rFeature47 = (c >> 15) & 0x00000001; information->rFeature48 = (c >> 16) & 0x00000001; information->rFeature49 = (c >> 17) & 0x00000001; information->rFeature50 = (c >> 18) & 0x00000001; information->rFeature51 = (c >> 19) & 0x00000001; information->rFeature52 = (c >> 20) & 0x00000001; information->rFeature53 = (c >> 21) & 0x00000001; information->rFeature54 = (c >> 22) & 0x00000001; information->rFeature55 = (c >> 23) & 0x00000001; information->rFeature56 = (c >> 24) & 0x00000001; information->rFeature57 = (c >> 25) & 0x00000001; information->rFeature58 = (c >> 26) & 0x00000001; information->rFeature59 = (c >> 27) & 0x00000001; information->rFeature60 = (c >> 28) & 0x00000001; information->rFeature61 = (c >> 29) & 0x00000001; information->rFeature62 = (c >> 30) & 0x00000001; information->rFeature63 = (c >> 31) & 0x00000001; information->vBrand = (b & 0x000000FF) >> 0; if(information->iCLFLUSH) information->cLineSize = (b & 0x0000FF00) >> 8; if(information->fHyperThreading) information->uLogicalProcessorCount = (b & 0x00FF0000) >> 16; if(information->vFamily >= 0xF) information->uAPICID = (b & 0xFF000000) >> 24; /*** 0x00000002 - Cache Descriptors ***********/ n = 1; for(i = 0; i < n; i++) { prcCPUID(processor, 0x00000002, &a, &b, &c, &d); n = a & 0x000000FF; if(!(a & 0x80000000)) { IdentifyIntelCache(information, (a >> 8) & 0x000000FF); IdentifyIntelCache(information, (a >> 16) & 0x000000FF); IdentifyIntelCache(information, (a >> 24) & 0x000000FF); } if(!(b & 0x80000000)) { IdentifyIntelCache(information, (b >> 0) & 0x000000FF); IdentifyIntelCache(information, (b >> 8) & 0x000000FF); IdentifyIntelCache(information, (b >> 16) & 0x000000FF); IdentifyIntelCache(information, (b >> 24) & 0x000000FF); } if(!(c & 0x80000000)) { IdentifyIntelCache(information, (c >> 0) & 0x000000FF); IdentifyIntelCache(information, (c >> 8) & 0x000000FF); IdentifyIntelCache(information, (c >> 16) & 0x000000FF); IdentifyIntelCache(information, (c >> 24) & 0x000000FF); } if(!(d & 0x80000000)) { IdentifyIntelCache(information, (d >> 0) & 0x000000FF); IdentifyIntelCache(information, (d >> 8) & 0x000000FF); IdentifyIntelCache(information, (d >> 16) & 0x000000FF); IdentifyIntelCache(information, (d >> 24) & 0x000000FF); } } /*** 0x00000003 - Serial Number ***************/ /*** 0x00000004 - Cache Parameters ************/ /*** 0x00000005 - Monitor *********************/ /** * THE EXTRA NUMBER * Type * Pentium II + III Cache * Pentium III + 4 Brand ID * Athlon Multi Processing / Cache */ Extra = information->vType; if(!strcmp(information->vVendor, "GenuineIntel") && information->vFamily == 6 && information->vModel >= 3 && information->vModel <= 7) { Extra = information->cL2UnifiedCacheSize; } if(!strcmp(information->vVendor, "GenuineIntel") && information->vFamily == 6 && information->vModel >= 8) { Extra = information->vBrand; } if(!strcmp(information->vVendor, "GenuineIntel") && information->vFamily == 0xF) { Extra = information->vBrand; } if(!strcmp(information->vVendor, "AuthenticAMD") && information->vFamily == 6) { Extra = 0; } IdentifyProcessor(information, Extra); } void prcCPUID(uint64_t processor, uint32_t function, uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d) { asm ( "cpuid" : "=a" (*a), "=b" (*b), "=c" (*c), "=d" (*d) : "a" (function) ); } void IdentifyIntelCache(prcInformation* information, int descriptor) { switch(descriptor) { case 0x00: return; case 0x40: return; case 0x01: information->cL1CodeTLB4KEntries = 32; information->cL1CodeTLB4KAssociativity = 4; return; case 0x02: information->cL1CodeTLB4MEntries = 2; information->cL1CodeTLB4MAssociativity = -1; return; case 0x03: information->cL1DataTLB4KEntries = 64; information->cL1DataTLB4KAssociativity = 4; return; case 0x04: information->cL1DataTLB4MEntries = 8; information->cL1DataTLB4MAssociativity = 4; return; case 0x06: information->cL1CodeCacheSize = 8; information->cL1CodeCacheAssociativity = 4; information->cL1CodeCacheLineSize = 32; information->cL1CodeCacheLinesPerTag = -1; return; case 0x08: information->cL1CodeCacheSize = 16; information->cL1CodeCacheAssociativity = 4; information->cL1CodeCacheLineSize = 32; information->cL1CodeCacheLinesPerTag = -1; return; case 0x0A: information->cL1DataCacheSize = 8; information->cL1DataCacheAssociativity = 2; information->cL1DataCacheLineSize = 32; information->cL1DataCacheLinesPerTag = -1; return; case 0x0C: information->cL1DataCacheSize = 16; information->cL1DataCacheAssociativity = 4; information->cL1DataCacheLineSize = 32; information->cL1DataCacheLinesPerTag = -1; return; case 0x22: information->cL3UnifiedCacheSize = 512; information->cL3UnifiedCacheAssociativity = 4; information->cL3UnifiedCacheLineSize = 64; information->cL3UnifiedCacheLinesPerTag = -1; return; case 0x23: information->cL3UnifiedCacheSize = 1024; information->cL3UnifiedCacheAssociativity = 8; information->cL3UnifiedCacheLineSize = 64; information->cL3UnifiedCacheLinesPerTag = -1; return; case 0x25: information->cL3UnifiedCacheSize = 2048; information->cL3UnifiedCacheAssociativity = 8; information->cL3UnifiedCacheLineSize = 64; information->cL3UnifiedCacheLinesPerTag = -1; return; case 0x29: information->cL3UnifiedCacheSize = 4096; information->cL3UnifiedCacheAssociativity = 8; information->cL3UnifiedCacheLineSize = 64; information->cL3UnifiedCacheLinesPerTag = -1; return; case 0x39: information->cL2UnifiedCacheSize = 128; information->cL2UnifiedCacheAssociativity = 4; information->cL2UnifiedCacheLineSize = 64; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x3B: information->cL2UnifiedCacheSize = 128; information->cL2UnifiedCacheAssociativity = 2; information->cL2UnifiedCacheLineSize = 64; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x3C: information->cL2UnifiedCacheSize = 256; information->cL2UnifiedCacheAssociativity = 4; information->cL2UnifiedCacheLineSize = 64; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x41: information->cL2UnifiedCacheSize = 128; information->cL2UnifiedCacheAssociativity = 4; information->cL2UnifiedCacheLineSize = 32; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x42: information->cL2UnifiedCacheSize = 256; information->cL2UnifiedCacheAssociativity = 4; information->cL2UnifiedCacheLineSize = 32; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x43: information->cL2UnifiedCacheSize = 512; information->cL2UnifiedCacheAssociativity = 4; information->cL2UnifiedCacheLineSize = 32; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x44: information->cL2UnifiedCacheSize = 1024; information->cL2UnifiedCacheAssociativity = 4; information->cL2UnifiedCacheLineSize = 32; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x45: information->cL2UnifiedCacheSize = 2048; information->cL2UnifiedCacheAssociativity = 4; information->cL2UnifiedCacheLineSize = 32; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x50: information->cL1CodeTLB4KEntries = 64; information->cL1CodeTLB4KAssociativity = -1; information->cL1CodeTLB2MEntries = 64; information->cL1CodeTLB2MAssociativity = -1; information->cL1CodeTLB4MEntries = 64; information->cL1CodeTLB4MAssociativity = -1; return; case 0x51: information->cL1CodeTLB4KEntries = 128; information->cL1CodeTLB4KAssociativity = -1; information->cL1CodeTLB2MEntries = 128; information->cL1CodeTLB2MAssociativity = -1; information->cL1CodeTLB4MEntries = 128; information->cL1CodeTLB4MAssociativity = -1; return; case 0x52: information->cL1CodeTLB4KEntries = 256; information->cL1CodeTLB4KAssociativity = -1; information->cL1CodeTLB2MEntries = 256; information->cL1CodeTLB2MAssociativity = -1; information->cL1CodeTLB4MEntries = 256; information->cL1CodeTLB4MAssociativity = -1; return; case 0x5B: information->cL1DataTLB4KEntries = 64; information->cL1DataTLB4KAssociativity = -1; information->cL1DataTLB4MEntries = 64; information->cL1DataTLB4MAssociativity = -1; return; case 0x5C: information->cL1DataTLB4KEntries = 128; information->cL1DataTLB4KAssociativity = -1; information->cL1DataTLB4MEntries = 128; information->cL1DataTLB4MAssociativity = -1; return; case 0x5D: information->cL1DataTLB4KEntries = 256; information->cL1DataTLB4KAssociativity = -1; information->cL1DataTLB4MEntries = 256; information->cL1DataTLB4MAssociativity = -1; return; case 0x66: information->cL1DataCacheSize = 8; information->cL1DataCacheAssociativity = 4; information->cL1DataCacheLineSize = 64; information->cL1DataCacheLinesPerTag = -1; return; case 0x67: information->cL1DataCacheSize = 16; information->cL1DataCacheAssociativity = 4; information->cL1DataCacheLineSize = 64; information->cL1DataCacheLinesPerTag = -1; return; case 0x68: information->cL1DataCacheSize = 32; information->cL1DataCacheAssociativity = 4; information->cL1DataCacheLineSize = 64; information->cL1DataCacheLinesPerTag = -1; return; case 0x70: information->cTraceCacheMicroOps = 12; information->cTraceCacheAssociativity = 8; return; case 0x71: information->cTraceCacheMicroOps = 16; information->cTraceCacheAssociativity = 8; return; case 0x72: information->cTraceCacheMicroOps = 32; information->cTraceCacheAssociativity = 8; return; case 0x77: information->cL1CodeCacheSize = 16; information->cL1CodeCacheAssociativity = 4; information->cL1CodeCacheLineSize = 64; information->cL1CodeCacheLinesPerTag = -1; return; case 0x79: information->cL2UnifiedCacheSize = 128; information->cL2UnifiedCacheAssociativity = 8; information->cL2UnifiedCacheLineSize = 64; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x7A: information->cL2UnifiedCacheSize = 256; information->cL2UnifiedCacheAssociativity = 8; information->cL2UnifiedCacheLineSize = 64; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x7B: information->cL2UnifiedCacheSize = 512; information->cL2UnifiedCacheAssociativity = 8; information->cL2UnifiedCacheLineSize = 64; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x7C: information->cL2UnifiedCacheSize = 1024; information->cL2UnifiedCacheAssociativity = 8; information->cL2UnifiedCacheLineSize = 64; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x7E: information->cL2UnifiedCacheSize = 256; information->cL2UnifiedCacheAssociativity = 8; information->cL2UnifiedCacheLineSize = 128; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x82: information->cL2UnifiedCacheSize = 128; information->cL2UnifiedCacheAssociativity = 8; information->cL2UnifiedCacheLineSize = 32; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x83: information->cL2UnifiedCacheSize = 256; information->cL2UnifiedCacheAssociativity = 8; information->cL2UnifiedCacheLineSize = 32; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x84: information->cL2UnifiedCacheSize = 512; information->cL2UnifiedCacheAssociativity = 8; information->cL2UnifiedCacheLineSize = 32; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x85: information->cL2UnifiedCacheSize = 1024; information->cL2UnifiedCacheAssociativity = 8; information->cL2UnifiedCacheLineSize = 32; information->cL2UnifiedCacheLinesPerTag = -1; return; case 0x8D: information->cL3UnifiedCacheSize = 3072; information->cL3UnifiedCacheAssociativity = 12; information->cL3UnifiedCacheLineSize = 128; information->cL3UnifiedCacheLinesPerTag = -1; return; } /*printf("Unknown Intel Cache Descriptor: %x\n", CacheDescriptor);*/ } int AMDAssociativity(int Value) { switch (Value) { case 0x00: return 0; case 0x01: return 1; case 0x02: return 2; case 0x04: return 4; case 0x06: return 8; case 0x08: return 16; case 0x0F: return -1; } /*puts("Unknown AMD Cache Descriptor");*/ return -1; } void IdentifyProcessor(prcInformation* information, int Extra) { int i; for(i = 0; i < (sizeof(ProcessorList) / sizeof(PROCLIST)); i++) { if(ProcessorList[i].id == 0x02000000 + (information->vFamily << 16) + (information->vModel << 8) + Extra) { information->pName = ProcessorList[i].name; information->pCertified = ProcessorList[i].verified; return; } } for(i = 0; i < (sizeof(ProcessorList) / sizeof(PROCLIST)); i++) { if(ProcessorList[i].id == 0x020000FF + (information->vFamily << 16) + (information->vModel << 8)) { information->pName = ProcessorList[i].name; information->pCertified = ProcessorList[i].verified; return; } } for(i = 0; i < (sizeof(ProcessorList) / sizeof(PROCLIST)); i++) { if(ProcessorList[i].id == 0x0200FFFF + (information->vFamily << 16)) { information->pName = ProcessorList[i].name; information->pCertified = ProcessorList[i].verified; return; } } for(i = 0; i < (sizeof(ProcessorList) / sizeof(PROCLIST)); i++) { if(ProcessorList[i].id == 0x02FFFFFF) { information->pName = ProcessorList[i].name; information->pCertified = ProcessorList[i].verified; return; } } information->pName = "Unknown Processor"; information->pCertified = false; }