识别几乎任何x86 CPU (2004年)
Identifying almost any x86 CPU (2004)

原始链接: http://web.archive.org/web/20040604002243/http://debs.future.easyspace.com/Programming/OS/cpuid.txt

本文件详细介绍了识别32位x86处理器的方法,重点关注386及更高型号。早期的识别技术涉及移位寄存器测试、PUSHA指令行为以及REP MOVSB的使用,以区分808x/186 CPU。标志位操作,特别是位12-15,对于区分286和32位处理器至关重要。CPUID指令(在较新的处理器上可用)提供厂商和型号信息。 该文件概述了特定厂商的识别方法,包括针对Cyrix、AMD和Intel CPU的技术。Cyrix的识别涉及测试CCR2和CCR3位,使用DIR寄存器,以及检查特定的除法测试和UMOV指令行为。IBM SLC处理器可以使用MSR进行识别。该文件还列出了不同厂商和处理器的各种CPUID返回值,以及步进和修订信息。除了Cyrix除法测试之外,标志位测试可以进一步区分CPU核心。最后,它承认了编译此信息所使用的资料来源。

Hacker News 最新 | 过去 | 评论 | 提问 | 展示 | 招聘 | 提交 登录 识别几乎任何 x86 CPU (2004) (archive.org) michalpleban 1小时前 6 分 | 隐藏 | 过去 | 收藏 | 1 评论 vardump 16分钟前 [–] 那真是……复杂!幸运的是现在有了CPUID指令! 回复 指南 | 常见问题 | 列表 | API | 安全 | 法律 | 申请 YC | 联系我们 搜索:

原文
;-------------------------------------------------------------------------------+ ; + ; Documentation: + ; + ; There are several methods for identifying CPUs. For this documentation, I + ; will concentrate on how to detect different 32-bit processors (as that + ; is all that I am targetting for my OS). I will have more information on + ; detecting other processors on a web site soon. + ; + ; For the purpose of this code, we only need to check if we have a 386 or later + ; processor, and then we can test which processor is present. + ; + ; Debbie Wiles + ; [email protected] + ; + ; + ;-------------------------------------------------------------------------------+ ; Early processor identification: + ; + ; CPU Method + ; + ; 808x/186+ Shift register by 32. Clears register on 808x and NEC V2/30. + ; This is because later CPUs mask sift/rotate value with 01Fh. + ; 808x/NEC PUSHA; NOP; + ; pusha is executed on V20/30, so we can check if SP has changed. + ; On 808x, pusha executes as a 2-byte nop, so SP is not changed. + ; 808x/80C8x REP ES: MOVSB ; CX = 0FFFFh + ; Test within a loop. If CX is non-zero at the end of a loop, + ; then it is a NMOS chip. If always zero, it is CMOS. + ; 18x/286 PUSH SP + ; On 286 and later, the original value of SP is stored. + ; On 18x and earlier, the new value is stored. + ; 8/16-bit Use self-modifying code (808x/8018x/Vx0) + ; The prefetch queue on 8-bit processors is 4 bytes long. + ; The prefetch queue on 16-bit processors is 6 bytes long. + ; For example, change a NOP to an INC. If executed as INC, we + ; we have an 8-bit processor. + ; ---------------------------------------------------------------- + ; ---------------------------------------------------------------- + ; 286/386+ Test behaviour of flags[12-15]. + ; 808x and 8018x: flags[12-15] are always set. + ; 286: flags[12-15] are always clear in real-address mode. + ; 32-bit processors: real-mode: + ; bit 15 is always clear; + ; bits 12-14 have the last value loaded into them. + ; 32-bit processors: protected mode: + ; bit 15 is always clear; + ; bit 14 has the last value loaded into it; + ; and the IOPL bits depends on the (CPL). + ; The IOPL field can be changed only if the CPL is 0. + ; ---------------------------------------------------------------- + ; ---------------------------------------------------------------- + ; 486 Flags[18] can be changed on 486 and later processors. + ; ---------------------------------------------------------------- + ; ---------------------------------------------------------------- + ; 386DX To determine the stepping of 386DX: + ; Stepping B0 and earlier support IBTS/XBTS, later don't. + ; Stepping B1, rep insb with CX=1 doesn't clear CX + ; + ; NexGen Nx586 + ; When we know it's a 386 (and not a 486), we can do a div test: + ; + ; xor ax,ax ; clear ax + ; sahf ; clear flags, + ; ; bit 1 of flags is always set + ; + ; mov ax,5 ; move 5 into the dividend + ; xor dx,dx + ; mov bx,2 ; move 2 into the divisor + ; div bl ; perform div test + ; + ; jz is_NexGen ; flags not changed, + ; ; it's a NexGen CPU + ; + ; ZF will never be set on a NexGen CPU, but will be set on others.+ ; + ; 386SX/DX (Also Cx486SLC/DLC) +Done ; If CR0 bit 4 can be cleared, we have a 386, 386DX or Cx486DLC. + ; If it cannot be cleared, it is a 386SX, 486SLC or a 'real' 486. + ; Always restore CR0 (MSW) after this test. + ; + ; i386 EX has 64M memory space + ; SX has 16M memory space + ; DX has 4G memory space + ; + ; Am386SX/SXL/SXLV + ; If you can execute SMM instructions, it's an SXLV. + ; + ; C&T 386's +Done ; This involves a test for the 386 POPAD bug. + ; The 386 POPAD bug affects all 386DX and early 386SX revisions. + ; I don't have any complete documentation for this, only what + ; RBIL says. + ; Psuedo-code: + ; Set EAX=12345678h ; value that won't roate to same value. + ; set i = 32 + ; DO{ + ; set EBX = EAX + ; clear EDX and EDI + ; push all and pop all (32-bit) + ; set ECX = [EDX + EDI] + ; IF(EAX EBX) exit loop. + ; rotate EAX left by 1 + ; decrement i + ; } WHILE(i > 0) + ; + ; If i = 0, we have a C&T 386, otherwise it's an AMD or Intel. + ; ---------------------------------------------------------------- + ; ---------------------------------------------------------------- + ; CPUID Flags[21] can be changed on processors which support CPUID. + ; ---------------------------------------------------------------- + ; ---------------------------------------------------------------- + ; Cyrix Finds Cyrix, TI, SGS, IBM processors. + ; First check that it is a 486+, then: + ; Method 1: + ; For pre-Pentium and non-SMI modes: + ; UMOV executed as double NOP on Cyrix processors. + ; Method 2: + ; Divide test: + ; Store 0 to flags low byte (bit 1 always set). + ; Divide 5 (in AX) by 2 (Cyrix show it in BL). + ; Read low byte of flags (LAHF). + ; If not equal to 2, it's not a Cyrix processor. + ; + ; IBM 386/486 SLC, 486BL3 (others??) + ; Test initially as 486 and Cyrix. + ; IBM 386 and some 486 use MSRs. + ; + ; UMC I'm not sure what this does. I got it from RBIL. + ; Use this for UMC U486SX. For other UMC processors, use CPUID. + ; + ; db 64h,0dbh ; looks like "SALC FS:", but it's not. + ; cmp eax,0ab6b1b07h + ; je u486SX + ; jne Other + ; + ; FPU (Checks for any processor with FPU) + ; Test for FPU: + ; Clear a memory area [mem] + ; Initialise FPU (perform FNINIT) + ; Store FPU control word to [mem] (perform FNSTCW [mem]) + ; If [mem] is 037Fh, then we have an FPU present. + ; + ; SMM Use UMOV to test for SMM enabled and SL enhanced AMD 386/486s, + ; and IBM 486SLC2. + ; If no SMM, it will generate a #UD. + ; Cyrix executed this as a double nop. + ; Only use this test on 386/486, and make sure it's not a UMC + ; processor first, as they will hang. + ; + ;-------------------------------------------------------------------------------+ ; + ; Visually identifying processors: + ; + ; AMD + ; + ; 486 E6 9425APH + ; 5x86 * * * + ; * * **** ??? + ; * ******** Year/Week of manufacture + ; *********** Revision + ; + ; K5 C 9718GPA + ; * * * + ; * * **** ??? + ; * ******** Year/Week of manufacture + ; *********** Revision: A/B/../G + ; + ; K6 A 9845CPAW + ; K6-2 * * * + ; K6-3 * * **** ??? (EPAW on K66-III ??) + ; * ******** Year/Week of manufacture + ; *********** Revision: A/B/../G + ; + ; Cyrix + ; + ; 6x86 XXYYZ734C + ; 6x86L * * ** * + ; * * ** *** Lot Number + ; * * ******* Year/Week (7 = 1997) + ; * * ******* Mask Revision + ; * ********* ?? (DC/DD/DE/DJ are known...) + ; *********** Version + ; + ; Version Mask Stepping + ; Number Revision + ; + ; G8 ? 2.x + ; 3 2.4 + ; 4 2.5 + ; 5 2.6 + ; 6 2.7 + ; G9 ? 3.x + ; A 3.7 + ; B 3.8 + ; + ; GA ? 4.x 6x86L + ; 3 + ; + ; GE ? ??? + ; + ; Intel + ; + ; i386EX Lot code ends in: Stepping: + ; + ; A/B A + ; C A (Manuals) + ; C B (Website) + ; D B + ; E C + ; 1/2 B (Special Environment) + ; + ; i486DX4 S-Spec Info + ; + ; SK050 Supports CLK x2 and CLK x3 + ; SK053 Ditto + ; SK099 Ditto + ; SX876 Ditto + ; SX877 Ditto + ; + ; others Not tested at CLK x 2 + ; + ; + ;-------------------------------------------------------------------------------+ ; + ; Identifying Cyrix/TI/IBM/ST CPUs + ; + ; Once we know it is a Cyrix (or clone): + ; + ; See if we can toggle CCR2 bit 3 (Lock_NW) and CCR3 bit 4 (MAPEN). + ; The results tell us the following: + ; + ; Can the bit be toggled? + ; + ; CCR2.2 CCR3.4 Processor(s) + ; + ; No No Cyrix/TI 486SLC/DLC, no DIRs + ; TI 486SXLC/SXL, no DIRs + ; IBM SLC/SLC2, no DIRs + ; Yes No Cyrix 486S A-step processor w/out DIRs + ; No Yes Cx486SLC/DLC with DIRs + ; Yes Yes Other Cyrix with DIRs + ; + ; If the processor has DIRs, we can use them to determine the CPU type. + ; + ; If it has no DIRs and is not a 486S: + ; + ; Test for SLC/DLC etc + ; + ; If CR0.4 can be cleared, it's a DLC or SXL + ; IBM has MSRs. Test MSR 1000h (non-IBM gives exception 13). + ; See next section for IBM details. + ; + ; Test cache size using TR4 and 5. + ; + ; Disable cache (TR7.11 = 1 ??) + ; Write 200h to TR4 (on Cx486SLC: is cache line entry valid?). + ; Write 1 to TR5 (cache line write) + ; Write 2 to TR5 (cache line read) + ; Read TR4. If bit 9 is set, it has 1k cache, else it has 8k. + ; + ; +------------------------------+ + ; 16-bit bus32-bit bus + ; +--------+----------+---------- + ; 1k cacheCx486SLC Cx486DLC + ; 8k cacheTI486SXLC TI486SXL + ; +------------------------------+ + ; + ; For SLC/DLC etc: + ; + ; Stepping A has no SMM, Stepping B has them. + ; + ; Enable SMM instructions and then check if legal. + ; (does this involve a specific SMM instruction, such as UMOV?) + ; + ; For 5x86 and 6x86, we need to set ccr4.7 in order to use CPUID. + ; + ; Cyrix Processors ID using DIR registers. + ; + ; Write to port 22h with the index, read from 23h. + ; + ; DIR0 Index 0FEh + ; DIR1 Index 0FFh + ; + ; DIR values: + ; + ; Bits Description + ; + ; DIR0[7-4] CPU Device ID Number + ; DIR0[3-0] CPU Clock Multiplier + ; + ; DIR1[7-4] CPU Step ID Number + ; For TI486DX2, stepping eB0 and later, bit 7 is set. + ; DIR1[3-0] CPU Revision ID + ; + ; Specific DIR values are listed in the bottom table on this page. + ; + ;-------------------------------------------------------------------------------+ ; + ; IBM MSRs (Taken from MSR.LST, distributed with RBIL) + ; + ; MSR 00001000h - IBM 386/486 SLC - PROCESSOR OPERATION REGISTER + ; + ; Size: 19 bits + ; Access: Read/Write + ; + ; Bitfields for IBM 386/486 SLC Processor Operation Register: + ; + ; Bit(s) Description + ; 63-19 reserved + ; 18 (486SLC only) Low Power PLA + ; 17 (486SLC only) Bus Read + ; 16 (486SLC only) Cache Parity Generate Error + ; 15 enable cacheability of NPX operands + ; 14 enable PWI ADS + ; 13 enable Low Power Halt Mode (HLT instruction stops CPU clock) + ; 12 extended Out instruction (CPU waits for READY after any output) + ; 11 cache reload bit + ; 10 enable internal KEN# signal + ; 9 disable cache lock mode + ; 8 reserved + ; 7 enable cache + ; 6 enable DBCS + ; 5 enable Power Interrupt + ; 4 enable Flush Snooping + ; 3 enable Snoop Input + ; 2 address line A20 mask + ; 1 enable cache parity checking + ; 0 Cache Parity Error occurred + ; + ; + ; MSR 00001001h - IBM 386/486 SLC - CACHE REGION CONTROL REGISTER + ; + ; Size: 48 bits + ; + ; Bitfields for IBM 386/486 SLC Cache Region Control Register: + ; + ; Bit(s) Description + ; 63-48 reserved + ; 47-32 extended memory cache memory limit (number of 64K blocks above + ; 1M which may be cached) + ; 31-16 first megabyte read-only flags (each bit represents 64K) + ; 15-0 first megabyte cacheable flags (each bit represents 64K) + ; + ; + ; MSR 00001002h - IBM 386/486 SLC - PROCESSOR OPERATION REGISTER + ; + ; Size: 30 bits + ; + ; Bitfields for IBM 386/486 SLC Processor Operation Register: + ; + ; Bit(s) Description + ; 63-30 reserved + ; 29 enable External Dynamic Frequency Shift + ; 28 Dynamic Frequency Shift ready + ; 27 Dynamic Frequency Shift Mode + ; 26-24 clocking mode + ; 000 clock x1 + ; 011 clock doubler + ; 100 clock tripler + ; 23-0 reserved + ; + ; + ; MSR 00001004h - IBM 486BL3 - PROCESSOR CONTROL REGISTER + ; + ; Size: 24 bits + ; + ; Bitfields for IBM 486BL3 Processor Control Register: + ; + ; Bit(s) Description + ; 63-24 reserved + ; 23 OS/2 boot (0=DD1 hardware, 1=DD0 hardware) + ; 22 MOV CR0,x Decode + ; 0: DD0, DD1A, DD1B, DD1D hardware + ; 1: DD1C hardware + ; 21 reserved + ; 20 Cache Low Power (DD1 only: cache disabled when not in use) + ; 19 reserved + ; 18 NOP timing + ; 0: 2 cycles on DD0, 3 cycles on DD1 + ; 1: 3 cycles on DD0, 2 cycles on DD1 + ; 17 bus pipelining for 16-bit accesses + ; 16-5 reserved??? + ; 4 MOVS split + ; 3 power-saving cache feature + ; 2 reserved + ; 1 enable MOV CRx decode + ; (reserved on DD1B, DD1C) + ; 0 reserved + ; + ;-------------------------------------------------------------------------------+ ; + ; EDX Reset signatures + ; + ; This can take two different forms, one for 386 and alike, the other for 486 + ; and higher, while some Cyrix CPUs have a reset value which is formed + ; from the values in DIR0 and DIR1 (this can be ignored, as we will read + ; the DIRs for those Cyrix chips). The information I have seen about + ; this is different in RBIL to that in Grzegorz Mazurs pages. So far, + ; I have been unable to test this, so I will include what data I have, + ; but my ID code will use the DIRs for Cyrix chips. This will provide + ; an additional method of differentiating between some Cyrix processors + ; and their clones, while also enabling them to be differentiated from + ; Intel and AMD processors. + ; + ; The CPU ID number can sometimes be returned by the BIOS. Use: + ; + ; Int 15h, AX = 0C910h (PS2 & some others) + ; + ; Int 15h, AX = 0DA92h (AMI PCI BIOS) (also returns speed) + ; + ; Additionally, some odlder BIOSes have a function to return the CPU speed + ; + ; Int 15h, AX = 2305 (IBM BIOS - Smart Energy System)(Up to 80MHz) + ; + ;-------------------------------------------------------------------------------+ ; + ; CPUID Return values: + ; + ; CPUID with EAX=0 Returns a vendor ID string in EDX:ECX:EAX + ; + ; String Vendor + ; + ; "GenuineIntel" Intel Corp. + ; "AuthenticAMD" Advanced Micro Devices. + ; "AMD ISBETTER" Some AMD Samples? (1994, according to Grzegorz Mazur) + ; "CyrixInstead" Cyrix Corp., now part of VIA + ; "UMC UMC UMC " United Microelectronics Corporation. + ; "NexGenDriven" NexGen Inc. + ; "CentaurHauls" IDT/Centaur, VIA + ; "RiseRiseRise" Rise + ; "GenuineTMx86" Transmeta + ; + ; Note that IDT processors can have a false ID string written in to them. + ; To correctly identify them: + ; + ; execute CPUID with EAX = 0xC0000000 + ; if EAX 0xC0000000, it's not an IDT + ; execute CPUID again with EAX = 0, and Vendor string will be correct. + ; If it now says IDT, then the only way to guarantee a correct processor + ; value is to reset the CPU. + ; + ; CPUID Return values in EAX for input value of 1. + ; + ; AX = TYPE:FAMILY:MODEL:STEPPING + ; + ; Type Meaning + ; + ; 0 Standard CPU + ; 1 Overdrive + ; 2 2nd CPU in dual-processor system, or overdrive set as 2nd CPU. + ; + ; 386: EDX[15-12] = Model + ; EDX[11-08] = Family + ; EDX[07-00] = Mask + ; + ; 486+: EDX[15-12] = Type + ; EDX[11-08] = Family + ; EDX[07-04] = Model + ; EDX[03-00] = Mask + ; + ;-------------------------------------------------------------------------------+ ; + ; Processor IDs. + ; + ; These IDs are those returned in the low word of EDX at reset, and EAX + ; after executing CPUID with EAX=1. + ; + ; Source: + ; R: RBIL + ; M: Manual + ; G: Grzegorz Mazur + ; P: Plasma Online (http://www.plasma-online.de/index.html) + ; S: Sandpile + ; L: Chiplist + ; B: 86Bugs list + ; X: Linux sources + ; C: Confirmed by myself. + ; + ; 386 processor signatures (most need a CPU reset): + ; + ; M = Model + ; F = Family + ; SS = Stepping + ; + ; MFSS Processor Stepping Comments +Source ; + ; 00xx i386DX A 12 MHz +RPL ; + ; 0300 i386DX A +GMS ; 0300 C&T 38600DX/SX 33-40 MHz, CPUID +P ; 0300 C&T 38605DX/SX 33-40 MHz, CPUID +P ; 512 byte instruction cache + ; + ; 0303 i386DX B0-B10 16-33 MHz +RGPMLS ; + ; 0304 i386DX ? 16-33 MHz +RPmB ; + ; 0305 i386DX D0 16-33 MHz +RGPMLSBC ; 0305 Am386DX(L/LV) A +RGSL ; + ; 0308 i386DX D1,D2,Ex,Fx 16-33 MHz +RGPMLSBC ; 0308 Am386DX(L/LV) B +RGSL ; + ; 030x i386DX any +GMls ; 030x Am386DX any 16-40 MHz, P says xx = 5-8 +RGMP ; 030x Am386DXL any 20-40 MHz +RGMP ; 030x Am386DXLV any 20-33 MHz, SMM +RGMP ; + ; 0340 RapidCAD (tm) A 486DX O/D, 25-33 MHz +RGPLS ; + ; 0341 RapidCAD (tm) B 486DX O/D, 25-33 MHz +RGPLS ; + ; 034x RapidCAD (tm) any 486DX O/D, 25-33 MHz +rgMpls ; L: consists of two chips + ; + ; 2304 i386SX A0 16-33 MHz +RPMgLSB ; + ; 2305 i386SX B 16-33 MHz +RPMgLSB ; 2305 Am386SX(L/LV) A1 +RgSL ; + ; 2306 i386SX C ??? 16-33 MHz +BS ?? ; + ; 2308 i386SX C-E 16-33 MHz +BRPMgLSC ; 2308 Am386SX(L/LV) B +RgSL ; + ; 2309 i386SX D ? 16-33 MHz +S?l? ; 2309 i386CXSA A +RMgLS ; 2309 i386CXSB A +RgSL ; 2309 i386EX A0,B1,C1 +RMgSL ; + ; 2309 i386SXSA A Embedded SX, 16-25 MHz +RPMgS ; + ; 230x Am386SX any 16-40 MHz, P says xx = 5-8 +rgMPL ; 230x Am386SXL any 20-40 MHz +rgMPL ; 230x Am386SXLV any 20-33 MHz, SMM +rgMPL ; 230x i386SX any 16-33 MHz +GMls ; 230x i386CX any SX, 12-25 MHz, Static core, SMM +gMsl ; 230x i386EX any SX, 16-25MHz, Static core, SMM +gMsL ; + ; 3305 i376 A0 +RMgSL ; + ; 3308 i376 B +RMgSL ; + ; 33xxh i376 any Embedded SX, 16-20MHz, +rGPMls ; Pmode only + ; + ; 4303 i386SL ? From C`T, 9/92, p156 + ; + ; 4305 i386SL A0-A3 ? +Rg ; + ; 4310 i386SL A0-A3 Reset ID +SLP ; + ; 4311 i386SL B0-B1 Reset ID +SLP ; + ; 431x i386SL B0-B1 +PRlg ; + ; 43xx i386SL any P says mask = 10-11. +PrGlM ; w/chipset 82360SL, 16-33 MHz + ; L,R says: signature register + ; (OMCU) at 0x30E + ; Value Step + ; 4300 A0,A1 + ; 4301 A2 + ; 4302 A3 + ; 4310 B0 + ; 4311 B1 + ; + ; A301 IBM 386SLC ? +G ; + ; A3xx IBM 386SLC A 8K cache to be enabled by s/w +RgpL ; A3xx IBM 386SLC any +rGP ; + ; 486 processor signatures (many need a CPU reset): + ; + ; ID = TFMS + ; + ; T = Type + ; F = Family + ; M = Model + ; S = Stepping Mask + ; + ; ID Processor Stepping Comments + ; + ; 0000 486DX A1 +B ; + ; 0005 Cx486S any SMM +RL ; 0005 Cx486D any +RL ; + ; 0006 Cx486DX any +RL ; + ; 0007 Cx486DX2 any +RL ; + ; 0008 Cx486DX4 any +R ; + ; 0400 i486DX A0,A1 25-33 MHz +RPmSgL ; + ; 0401 i486DX B2-B6 25-33 MHz +RPmSgLB ; Am486DX B3-B6 +M ; + ; 0402 i486DX C0 25-33 MHz +RPmSgLB ; 0402 Am486DX C0 +M ; + ; 0403 i486DX C1 25-33 MHz +RPmSgL ; + ; 0404 i486DX D0 25-33 MHz +RPmSgLBC ; 0404 Am486DX D0 +M ; + ; 0405 Some i486DX CPUID +Gms ; + ; 040x i486DX "P4" P indicates mask 0-4 only. +GPMSX ; M says no CPUID + ; + ; + ; 0410 i486DX50 cA2,cA3 +RPmSgLB ; 0410 Am486DX cA2,cA3 +Mg ; 0410 Cx486SLC A +Rl ; 0410 TI486SLC/DLC/e A +RPL ; 0410 TI486SXL(C)/2 A +RPL ; + ; 0411 i486DX50 cB0,cB1 +RPmSgLB ; 0411 Am486DX cB0 +Mg ; 0411 TI486SLC/DLC/e B +RPL ; 0411 TI486SXL(C)/2 B +RPL ; + ; 0412 Am486DX any contradicted by manuals +RgSL ; S says up to 40MHz + ; 0412 Am486DXL any 40MHz +PgL ; 0412 Am486DXLV any 33MHz, SMM +PgL ; 0412 Am486DE ? any ??? +Pg ; + ; 0413 i486DX50 cC0 +RPmSgLC ; + ; 0414 i486DX50 aA0,aA1 SL Enahnced +RPmSgl ; + ; 0415 i486DX50 aB0 SL Enahnced +RPmSGLC ; + ; 041x i486DX50 "P4S" ? P says 0-5, R says no 2. +GPMsX ; M says no CPUID + ; 041x Am486DX any +GPML ; 041x UMC U5SD (486DX), CPUID +GSL ; DX pin compatible U5S + ; 041x UMC U5D +X ; 041x Cx486SLC +rL ; 0411 TI486SXL(C)/2 SXL/SXLC/SXL2/SXLC2 +RPL ; also, -v = low power + ; + ; 0420 i486SX A0 +RPSgLB ; 0420 i487SX A0 Full DX, disables SX +RP ; 0420 Cx486SLC A +M ; + ; 0422 i486SX B0 +RPSgLC ; 0422 i487SX B0 Full DX, disables SX +RP ; + ; 0423 i486SX bBx SL Enahnced +RPsgC ; 0423 i486SX D +SL ; 0423 UMC U5S A,any 486SX, CPUID +RGsL ; + ; 0424 i486SX gAx +RPSgL ; + ; 0427 i486SX cA0 CPUID +RGPSL ; + ; 0428 i486SX cB0 CPUID +RGPSLC ; 0428 Cx5x86 (x1) 1+ CPUID result +M ; + ; 0429 Cx5x86 (x2) 1+ CPUID result +RM ; + ; 042A i486SX aA0,aA1 SL Enahnced +RPSgLC ; 042A i486SX E Check this one... +SL ; 042A Cx5x86 (x1) 1+ CPUID result +M ; + ; 042B i486SX aB0,aC0 SL Enahnced +RPsgL ; 042B Cx5x86 (x2) 1+ CPUID result +RM ; + ; 042C Cx5x86 (x4) 1+ CPUID result +M ; + ; 042D Cx5x86 (x3) 1+ CPUID result +RM ; + ; 042E i486SX E +GS ; 042E i486SX E CPUID +Gs ; 042E Cx5x86 (x4) 1+ CPUID result +M ; + ; 042F Cx5x86 (x3) 1+ CPUID result +RM ; + ; 042x i486SX "P23" ? P says 0-B, 16-33 MHz, 8K L1 +GPMSLX ; 042x i486SX "P23S" ? SL Enahnced +GPL ; 042x i486GX ? Embedded, Ultra Low Power +M ; 042x i487SX "P23N" P implies 0-B ? +P ; 042x Cx486SLC +Lm ; 042x Cx5x86 1+ CPUID result +R ; 042x UMC U5S +X ; + ; 0432 i486DX2 A0-A2 +RPmSL ; 1432 i486DX2 A0-A2 overdrive +RPms ; 0432 Am486DX2 any 66 & 80 MHz, CPUID? +RGMsC ; 0432 Am486DXL2 any +RPL ; 0432 Am486DX4 any NV8T, WT mode only +RGMSL ; + ; 0433 i486DX2 B1 +RPmSLC ; 1433 i486DX2 B1 Overdrive +rpmsLC ; + ; 0434 i486DX2 aA0,aA1 SL Enahnced +RGPmSL ; 1434 i486DX2 aA0,aA1 SL Enahnced, overdrive +RGPmsL ; 0434 Am486DX2-66 x2 ? WT mode, CPUID +GMPs ; 0434 Am486DX4 x2 ? SV8B, WT mode, CPUID +GMS ; + ; 0435 i486DX2 aB0,aC0 SL Enahnced, (O/D?) +RGPmSLC ; + ; 0436 i486DX2WT any 436 on CPUID if WT (see 470) +RGPmS ; stepping needs a reset +S ; A + ; + ; 043x UMC U486DX2 any CPUID +RL ; 043x i486DX2 "P24" any 8K L1, 40-66 MHz, step 2-5 +RPMsLX ; 043x i486DX2 "P24S" any SL enhanced +RPMsL ; 143x i486DX2 "P23T" any Overdrive for 486SX +RPmsL ; 143x i486DX2 "P24T" any Overdrive +RPmsL ; 043x i487SX "P23N" +M ; 043x Am486DX2 any Standard version, 50-100 MHz +MSLx ; 043x Am486DX2 any SV8B, WT, CPUID, 66-100 MHz +MSLX ; 043x Am486DE2 66 MHz, CPUID +M ; 043x Am486DX4 NV8T +rgmsL ; + ; 0440 i486SL A 25-33 MHz +RmgSL ; + ; 0441 i486SL ?? +Rmg ; + ; 044x i486SL ?? 8K L1, CPUID, With chipset +GMPSX ; M says CPUID from step 3 + ; R says 44xx from OMCU + ; 044x i486DXL ?? 8K L1 +P ; 044x MediaGX (Cyrix) any x is 0-7, DL = DIR0, CPUID +GPS ; + ; 045B i486SX2 aC0 SL Enahnced +RSL ; + ; 045x i486SX2 A Overdrive, CPUID +Rmg ; 045x i486SX2 any 50-66 MHz, 8K L1, CPUID +rMGPX ; M says no CPUID + ; 045x UMC U486SX2 any CPUID +RL ; + ; 0470 i486DX2WB any 0470 on CPUID if WB (see 436) +RGSL ; stepping needs a reset +S ; + ; 0474 Am486DX2-66 x2 ?? WB Mode, CPUID +GMsC ; 0474 Am486DX4 x2 ?? SV8B, WB mode, CPUID +G ; + ; 047x i486DX2WB P24D, in WB mode +GPSX ; M says CPUID from step 3 + ; 047x Am486DX2 ?? WB Mode, 66-100 MHz, CPUID +GMSLX ; + ; 0480 i486DX4 A CPUID +GRmsl ; 0480 IBM BL486DX2 A +R ; 0480 Cx486DX2-V 4V version of Cx486DX2 +R ; 0480 TI486DX2 any +R ; + ; 0481 TI486DX4 any +R ; + ; 0483 i486DX4 any WT mode +Rms ; + ; 0484 Am486DX4 x3 any SV8B, WT mode, CPUID +RGMs ; 0484 Am5x86 x3 A WT mode, 150MHz, CPUID +RGM ; + ; 048x i486DX4 "P24C" WT mode, 16K L1, CPUID +GMPSLX ; M says CPUID from step 3 + ; 148x i486DX4 "P24CT" any 75/100 MHz, 16K L1, overdrive +PmSL ; 048x Am486DX4 any SV8B, WT mode +RMSLX ; + ; 0490 i486DX4 any WB mode, CPUID +RPmgsC ; 0490 Cx5x86 2+ reset ID (has CPUID) +RGMs ; + ; 0494 Am486DX4 x3 any SV8B, WB mode, CPUID +RGMsxC ; 0494 Am5x86 x3 A WB mode, 150MHz (?), CPUID +R ; + ; 049x i486DX4WB WB Mode, 75/100/120 MHz, CPUID +GMPSX ; 049x Cx5x86 CPUID +RGS ; + ; 04E4 Am486DX5-133 A WT mode, CPUID +M ; 04E4 Am5x86 x4 A WT mode, 133/160MHz, CPUID +RGMs ; + ; 04Ex Am5x86 x4 any WT mode, CPUID +GPMSLX ; + ; 04F4 Am486DX5-133 A WB mode, CPUID +M ; 04F4 Am5x86 x4 A WB mode, 133/160MHz, CPUID +RGMs ; + ; 04Fx Am5x86 x4 any WB mode, CPUID +GPMSLX ; + ; 1480 i486DX4 A "DX4ODPR" Overdrive, 5V DX4 +R ; + ; 0x2x Cx5x86 rev.0 Stepping 0, all revisions +M ; 1x2x Cx5x86 rev.1 Stepping 1, reset ID +M ; The above are both: + ; DH=DIR1, DL=DIR0 +M ; + ; 84xx IBM 486BLX any 15-33 Hz +GPL ; 84xx IBM 486BLX2 any 30-66 MHz +PgL ; 84xx IBM 486BLX3 A 45-100 MHz +RPgL ; + ; A40x IBM 486SLC A +RP ; + ; A412 IBM 486SLC2 A ? +gM ; + ; A41x IBM 486SLC2 Ax 33-80 MHz +RPL ; A41x IBM 486SLC any 16-25 MHz +G ; + ; A421 IBM 486SLC2 ? ? +G ; + ; A422 IBM 486SLC2 ? ? +GM ; + ; A42x IBM 486SLC2 Bx 33-80 MHz +RGPL ; + ; A439 IBM 486SLC3 ? ? 486DLC3 in 16-bit mode +G ; + ; A43x IBM 486SLC2 ?? +R ; A43x IBM 486SLC3 any +G ; + ; A480 IBM BL486DX2 A 66-80MHz (CPUID) +RPgL ; + ; A4xy IBM 486SLC any x = multiplier, y = revision +PGL ; + ; WT enh = Writeback enhanced in WT mode + ; WB enh = Writeback enhanced in WB mode + ; + ; Some sources imply that SL enhanced all have CPUID + ; + ; + ; 586+ processor signatures (all can be found without a CPU reset): + ; + ; ID Processor Step Comments + ; + ; 0500 Am5k86 (SSA5) E Revision 1 +RGMsC ; + ; 0501 Am5k86 (SSA5) F Revision 2 +RGMsC ; + ; 0504 Nx586 100 MHz (G,P) or 120 MHz (R) +RGPs ; + ; 0506 Nx586 E2/C0 120 MHz (G,P) or 133 MHz (R) +RGPs ; + ; 050x Pentium (P5) Ax FDIV bug, 16K L1, 1993 +RGPSLX ; 050x Am5k86 x1.5 any Model 0, SSA5, PR75/90/100 +RGPSMLX ; 050x Nx586 any +RMSX ; 050x Rise mP6 iDragon 0.25u, PR166-366 +GPS ; + ; 0511 K5 x1.5 Initial version, WA faulty? +rGMsC ; + ; 0512 K5 x1.5 early version, WA faulty? +rGMs ; 0512 Pentium "P5" Sample +S ; + ; 0513 Pentium "P5" B1 FDIV bug, 50-66 MHz +RGPMsL ; + ; 0514 Pentium "P5" B2 FDIV bug, 60/66 MHz +RgP ; 0514 K5 x1.5 improved version, WA fixed +rGMs ; + ; 0515 Pentium "P5" C1 FDIV bug, 60/66 MHz +RGPMSLC ; + ; 0517 Pentium "P5" D1 60/66 MHz +RGPMSLC ; + ; 151A Pentium "P5T" tA0 O/D, Ver. 1, 120/133 MHz (P60/66) +RGPMS ; + ; 051x Pentium (P5) Bx,others FDIV bug, 16K L1, 1993 +RGPMSX ; 051x K5 x1.5 any Model 1, PR120/133, PR + 30% +RGPMSX ; + ; 0521 Pentium B1 FDIV Bug, 75-100 MHz +RGPMSLC ; + ; 0522 Pentium B3 FDIV Bug, 75-100 MHz +RGPMsLC ; + ; 0524 Pentium B5 75-120 MHz +RGPMsL C ; 0524 K5 x1.75 ?? Model 2 (5-1-4 x1.75) +RGMs ; + ; 0525 Pentium C1,C2 P54CQS, 75-133 MHz (?) +RGPMSLC ; 0525 Pentium mA1 P54LM, Mobile, 75/90 MHz +RGMsL ; + ; 0526 Pentium E0 P54CQS, 75-120 MHz +RGPMsC ; + ; 052B Pentium cB1 P54CQS, 120/133 MHz +RGPMS ; 052B Pentium mcB1 P54LM, Mobile, 100/120 MHz +RGPMs ; + ; 052C Pentium cC0 P54CS, 120-200 MHz +RGPMSC ; 052C Pentium mcC0 P54LM, Mobile, 100-150 MHz +RGMs ; 252C Pentium O/D aC0 P54CT, 125-166 MHz, for P75-100 +RGPMsL ; + ; 052x Pentium any P54C and variants, 16K L1 +RGPMSX ; 052x K5 x1.75 any Model 2, PR150/166, PR + 40% +RGMPSX ; 052x Cx6x86 Early models, see DIR0 +RGPMS ; 052x Rise mP6 iDragon 0.18u, PR333-433 +GPSM ; + ; 0530 Cx6x86 x1,S For revision, read DIR1 +RM ; IBM266x86 100-133 MHz +P ; + ; 1531 Pentium O/D B1,B2 P24CT, Ver. 1.x, 63 MHz for 486 +RGPMsLx ; 0531 Cx6x86 x2,S For revision, read DIR1 +RM ; + ; 1532 Pentium O/D C0 P24CT, Ver. 2.x, 63/83 MHz for 486 +RGPMsLx ; 0532 Cx6x86 x1,P For revision, read DIR1 +RM ; + ; 0533 Cx6x86 x2,P For revision, read DIR1 +RM ; + ; 0534 K5 x2 ?? 5-1-4 x2 +GMs ; 0534 Cx6x86 x4,S For revision, read DIR1 +RM ; + ; 0535 Cx6x86 x3,S For revision, read DIR1 +RM ; + ; 0536 Cx6x86 x4,P For revision, read DIR1 +RM ; + ; 0537 Cx6x86 x3,P For revision, read DIR1 +RM ; + ; 053x K5 x2 any Model 3, PR200, PR + 50% +RGMPSX ; 053x Cx6x86L any See DIRs for revision +RPM ; + ; 0540 IDT Winchip C6 any +gRs ; IDT Winchip C6 0 Some errors +GsM ; + ; 0541 Pentium MMX A1 P55C +Rg ; 0541 IDT Winchip 1 less errors +GsM ; + ; 0542 Pentium MMX A2 +Rgs ; + ; 0543 Pentium MMX xB1 166-233 MHz +RGPMS ; 0543 Pentium MMX mxB1 Mobile, 120-200 MHz +RGPMs ; 1543 Pentium MMX oxB1 P55CT, 180/200 MHz, O/D for P54 +PgMs ; 0543 Crusoe TM5400 500-677 MHz, 64+64K L1, 256K L2 +P ; + ; 0544 Pentium MMX xA3 150-200 MHz, 32K L1 +RGPMs ; 0544 Pentium MMX mxA3 Mobile, 150/166 MHz, 32K L1 +RGPMs ; 1544 Pentium MMX oxA3 P55CT, 125-166 MHz O/D, for P54 +RGPMs ; + ; 054x Pentium MMX any P55C and variants, 32K L1 +X ; 054x Cyrix MediaGX any GXi, GXm, x is 0-7, DL = DIR0 +RMPG ; 054x IDT Winchip C6 any MMX, 180-240MHz +rGPSMX ; 054x Crusoe any Transmeta Crusoe TM3x00 and TM5x00 +gS ; + ; 155x Pentium MMX P55C Overdrive for 486DX4 +GMP ; + ; 0561 K6 Rev. B +RGMs ; + ; 0562 K6 Rev. C +rGMs ; + ; 156x Pentium MMX P54CTB, 100-200 MHz, O/D for P54C +GP ; 056x K6 Model 6, 166-266 MHz +RGPMSX ; + ; 0570 Pentium mA4 Mobile, 75-100 MHz +RGPMs ; 0570 K6 Rev. A +rGMs ; + ; 057x Pentium ?? P54LM, Mobile, P says it's P54C +PGSX ; 057x K6 Model 7, 166-300 MHz +RGPMSX ; 057x K6M Mobile +rGPs ; 057x K6E Embedded +rGPMs ; + ; 0580 K6-2 Rev. A +rGMPs ; 0580-5 IDT Winchip 2 200-240 MHz +GPsm ; + ; 0581 Pentium MMX myA0 Mobile, 166-266 MHz +RGPMs ; + ; 0582 Pentium MMX myB2 Mobile, 266/300 MHz +PMs ; + ; 0584(?) Pentium MMX mobile, MMX bug +Ps ; + ; 0587-9 IDT Winchip 2A 2A 200-233 MHz +GPsm ; + ; 058A-F IDT Winchip 2B 2B 233-250 MHz +GPsm ; + ; 058C K6-2 Rev A Model 8, 3D-Now! +CRgMPs ; 058C K6-2M Mobile +rgPs ; 058C K6-2-P-M Mobile, 266-475MHz +rgPs ; 058C K6-2E Embedded +rgPs ; + ; 058x Pentium MMX P55C, Mobile +X ; 058x K6-2(E) any Model 8, 200-550 MHz +RGMPSX ; 058x mP6 iDragon II 0.25u, 256K L2 (Rise) +GP ; 058x IDT Winchip C2 any 64K L1, MMX, 3DNow! (samples only) +GPSMX ; + ; 0591 K6-3 1, Rev B +grMs ; + ; 059x K6-2+ any +RM ; 059x K6-3 any Stepping mask = 0-3 +rGMPSX ; 059x K6-3-P any +rgPs ; 059x K6-3+ any +rgP ; 059x K6-3E+ any Embedded +rgP ; 059x IDT Winchip 3 128K L1 +rGPSM ; 059x mP6 iDragon II 0.18u, PR380-466 (Rise) +rGP ; + ; 05D4 K6-2+ M any Mobile +Ps ; 05D4 K6-2E+ any Embedded +Ps ; + ; 05Dx K6-2+,K6-3+ any [7-4] = K6-2+, [3-0] = K6-3+ +GMS ; + ; 05xx Transmeta Crusoe +G ; + ; P24T = PODP5V63, PODP5V83, Socket 3,6 + ; P5T = PODP5V120, PODP5V133, Socket 4 + ; P54LM = Mobile, Vcc=2.9V + ; P54T = PODP3V125, PODP3V150, PODP3V166, Socket 5,7 + ; + ; + ; 0600 Cx6x86MX x1.0 +gmPs ; + ; 0601 Cx6x86MX x2.0 +gmPs ; + ; 0602 Cx6x86MX x2.5 +gmps ; + ; 0603 Cx6x86MX x3.0 +gmps ; + ; 0604 Cx6x86MX x3.5 +gmps ; + ; 0605 Cx6x86MX x4.0 +gmps ; + ; 0606 Cx6x86MX x4.5 +gmps ; + ; 0607 Cx6x86MX x5.0 +gmps ; + ; 0608 Cx6x86MX x1 +gmps ; + ; 0609 Cx6x86MX x2.0 +gmps ; + ; 060A Cx6x86MX x2.5 +gmps ; + ; 060B Cx6x86MX x3.0 +gmps ; + ; 060C Cx6x86MX x3.5 +gmps ; + ; 060D Cx6x86MX x4.0 +gmps ; + ; 060E Cx6x86MX x4.5 +gmps ; + ; 060F Cx6x86MX x5.0 +gmps ; + ; 060x Pentium Pro A(Sample) P6, 120-133 MHz, 16K L1, 256K L2 +RGPSX ; 060x Pentium Pro P6L, 0K L2 +Ps ; 060x Cx6x86MX any Rev. 1.2 has CPUID bug. +GMPS ; DIR1 has step/revision info + ; + ; 0611 Pentium Pro B0,Sample 150 MHz, 256K L2 +RGPMs ; 0611 Athlon C1 Model 1, Slot A, external L2 +gMPsx ; + ; 0612 Pentium Pro C0 150 MHz, 256K L2 +RGPMs ; 0612 Athlon C2 Model 1, Slot A, external L2 +gMPsx ; + ; 0616 Pentium Pro sA0 180/200 MHz, 256K L2 +RGPMs ; + ; 0617 Pentium Pro sA1 166-200 MHz, 256K/512K L2 +RGPMs ; + ; 0619 Pentium Pro sB1 166-200 MHz, 256K/512K/1M L2 +RGPMs ; 1619 PII O/D ?? P6T, 300-333 MHz, PII O/D for P6 +Ps ; + ; 061x Pentium Pro any P6, 256K/512k/1M L2 +rgpmSX ; + ; 0621 Athlon A1 Model 2, Slot A, external L2 +gMPs ; + ; 0622 Athlon A2 Model 2, Slot A, external L2 +gMPs ; + ; 0630 Duron A0 Model 3, CPUID cache error +GMPs ; + ; 0631 Duron A2 Model 3, no CPUID cache error +GMPs ; + ; 0632 PII ? 233-333 MHz +Pgs ; 1632 PII O/D tdB0 Overdrive for PPro +RGs ; + ; 0633 PII C0 233-333 MHz +RGPMs ; + ; 0634 PII C1 233-333 MHz +RGPMs ; + ; 063x PII "Klamath" any 512M cacheable, 32K L1, 512K L2 +RGMPSX ; 163x PII O/D P6T, Overdrive for Socket 8 +Rs ; + ; 0642 Athlon A4-A7 +GMPs ; + ; 0643 Athlon B0 +GPs ; + ; 0644 Athlon A9 +gMPs ; + ; 064x Athlon Thunderbird, Model 4 +gMPs ; 164x Pentium Pro ?? P55CT, PII Overdrive for PPro +GP ; + ; 0650 PII dA0 266/333 MHz +RGPMs ; 0650 PII mdA0 Mobile, 233/266 MHz, 512k L2 +RPMs ; 0650 PII mmdA0 Mobile, 233/266 MHz, 512k L2 +RPMs ; 0650 Celeron dA0 266/300 MHz, 0k +RGPMs ; + ; 0651 PII dA1 300-400 MHz +RGPMs ; 0651 Celeron dA1 266/300 MHz, 0k +RGPMs ; + ; 0652 PII dB0 266-450 MHz +RGPMs ; 0652 PII mdB0 Mobile, 233-300 MHz, 512k L2 +RPMs ; 0652 PII mmdB0 Mobile, 233-300 MHz, 512k L2 +RPMs ; 0652 PII TdB0 Overdrive, 333 MHz +Ms ; 0652 PII Xeon B0 400 MHz, 512K/1M L2 +RGMs ; 0652 Celeron dB0 266/300 MHz, 0k +RGPMs ; + ; 0653 PII dB1 350/400 MHz +gMs ; 0653 PII Xeon B1 400/450 MHz, 512K/1/2M L2 +RgMs ; + ; 065x PII "Deschutes" 266+ MHz, 512K L2, 4G cachable +GPMSX ; 065x PII "Tonga" Mobile, 233-300 MHz, 0K L2 +Ps ??? ; 065x PII Xeon +GPMs ; 065x Celeron "Covington" 266, 300 MHz, 0K L2 +GPMs ; 065x Cx6x86MX If DIR1 is 08h to 07Fh, it's an MII +RMS ; Check DIR1 for steppings etc. + ; 065x VIA Cyrix III any "Joshua". unverified +G ; + ; 0660 Celeron mA0 300-433 MHz +RGPMs ; 0660 PII PE mA0 256k L2 +RGs ; 0660 Athlon A0 Model 6 +MPs ; 0660 Athlon Mobile +Ps ; 0660 VIA CIII Samuel 128K L1, 400-750 MHz +gPms ; + ; 0661 Athlon A2 Model 6 +MPs ; 0661 Athlon Mobile +MPs ; + ; 0662 Athlon A5 Model 6 +MPs ; 0662 Athlon Mobile +MPs ; 0662 Athlon MP Dual CPU +MPs ; 0662 Athlon XP +MPs ; + ; 0665 Celeron mB0 300-533 MHz +gMs ; + ; 066A Celeron mcbA0, Mobile, 233-466 MHz +gMs ; mcpA0, Mobile, 266-466 MHz +gMs ; cmmA0 Mobile, 266-466 MHz +gMs ; 066A PII PE md[xbp]A0, Mobile, 266-400 MHz +gMs ; mq[bp]A1 Mobile, 400 MHz +gMs ; 066A PII PE dmmA0 Mobile, 266-400 MHz +gMs ; + ; 066x PII PE Mobile, 256K L2 +GSX ; 066x Celeron Mendocino, 128K L2 +RGPMs ; 066x Athlon +M ; 066x VIA Cyrix III Samuel Winchip C5A, 450-800 MHz? +GPMS ; + ; 0670 Duron 1 GHz +, Camaro, Morgan +Psm ; 0670 Duron 1 GHz +, Thoroughbred +Psm ; 0670 Duron 1 GHz +, Appaloosa, Dual CPU +Psm ; + ; 0670-7 VIA C3 Samuel II Winchip C5B, 666-733 MHz +PMS ; 0670-7 VIA Eden ESP Samuel 2, 4x100 MHz +PMs ; + ; 0672 PIII kB0 450/500 Hz +gPMs ; 0672 PIII Xeon B0 500 MHz +gMs ; + ; 0673 PIII kC0 450-600 Hz +gPMs ; 0673 PIII Xeon C0 500/550 MHz +gMs ; + ; 0678-F VIA C3 Ezra Winchip C5C, 800-933 MHz +PMS ; 0678-F VIA Eden ESP Ezra, 4x133 MHz +PMs ; + ; 067x PIII "Katmai" 512K L2 +GMSX ; 067x PIII Xeon B0 512/1024/2048K L2 +gMs ; 067x Duron +psM ; 067x VIA C3/Eden 128K L1, 64K L2 +P ; + ; 0680-7 VIA C3 Ezra-T Winchip C5C, 800-933 MHz +PM ; 0680-7 VIA Eden ESP Ezra-T, 5x133 MHz +PM ; + ; 0681 PIII cA2 500-800 MHz +gPMs ; 0681 PIII BA2,PA2,MA2 Mobile, 400-650 MHz +gPMs ; 0681 PIII Xeon A2 600-800 MHz +gMs ; 0681 Celeron BA2,PA2 Mobile, 400-500 MHz +gMs ; 0681 Celeron MA2 Mobile, 450/500 MHz +gMs ; + ; 0683 PIII cB0 500 MHz - 1.0 GHz +gPMS ; 0683 PIII BB0,PB0,MB0 Mobile, 400-750 MHz +gPMs ; 0683 PIII Xeon B0 600-933 MHz +gMs ; 0683 Celeron cB0 533-700 MHz +gMs ; 0683 Celeron BB0,PB0 Mobile, 400-650 MHz +gMs ; 0683 Celeron MB0 Mobile, 450-650 MHz +gMs ; + ; 0686 PIII cC0 600 MHz - 1.13 GHz +gPMS ; 0686 PIII BC0,PC0,MC0 Mobile, 400-900 MHz +gPMS ; 0686 PIII Xeon C0 733 MHz - 1.0 GHz +gMs ; 0686 Celeron C0 566-850 MHz +gMs ; 0686 Celeron BC0,PC0 Mobile, 400-750 MHz +gMs ; 0686 Celeron MC0 Mobile, 450-700 MHz +gMs ; + ; 068A PIII D0 600 MHz - 1.13 GHz +PMS ; 068A PIII BD0,PD0 Mobile, 500-1000 MHz +PMs ; 068A PIII (U)LV D0 Mobile, 500+ MHz +Ps ; 068A Celeron D0 733 MHz - 1.1 GHz +Ms ; 068A Celeron BD0,PD0 Mobile, 500-850 MHz +Ms ; 068A Celeron FBD0,FPD0 Mobile, 733-933 MHz +Ms ; + ; 068x PIII "Coppermine" 256K L2 +GMSX ; 068x PIII Xeon "Coppermine" 800+ MHz, 256K L2 +gMs ; 068x Celeron "Coppermine" 128K L2, W/SSE +GPMs ; 068x VIA Eden 128K L1, 64K L2 +Pm ; + ; 06A0 PIII Xeon A0 Cascades, 700 MHz +gMsx ; + ; 06A1 PIII Xeon A1 Cascades, 700 MHz +gPMsx ; + ; 06A4 PIII Xeon B0 Cascades, 700/900 MHz +gPMsx ; + ; 06Ax PIII Xeon Gallatin?? 1024/2048K L2 +GPMS ; + ; 06B1 PIII tA1 1.0-1.4 GHz +PMs ; 06B1 PIII-M FPA1,FBA1 Mobile, 700-1200 MHz +PMs ; 06B1 Celeron tA1 Tualatin, 1.0-1.3 GHz +PMs ; 06B1 Celeron FBA1 Tualatin, Mobile, 650-1200 MHz +PMs ; 06B1 Celeron FPA1 Tualatin, Mobile, 1066-1200 MHz +PMs ; + ; 06Bx PIII any Tualatin" 256/512K L2 +PMS ; 06Bx PIII-M any Tualatin, 512K L2 +PMs ; 06Bx Celeron any Tualatin, 256K L2 +PMs ; + ; 0F01-4 Pentium 4 1.0 GHz, 16K L1 +Ps ; + ; 0F07 Pentium 4 B2 1.3-1.5 GHz +Ps ; + ; 0F0A Pentium 4 C1 1.3-1.8 GHz +PMs ; 0F0A Pentium 4 Xeon C1 1.4-1.7 GHz +PMs ; + ; 0F11 Pentium 4 Xeon C0 MP, 1.4-1.6 GHz +M ; + ; 0F12 Pentium 4 D0 1.4-2.0 GHz +PMs ; 0F12 Pentium 4 Xeon D0 1.5-2.0 GHz +PMs ; + ; 0F13 Pentium 4 E0 1.6-2.0 GHz +M ; + ; 0F0x-1x Pentium 4 Bx-Dx Willamette, (P: 8+12K L1?), 256K L2 +PMS ; 0F0x-1x P4 Xeon Bx-Dx Foster, As Willamette +PMS ; + ; 0F24 Pentium 4 B0 1.6-2.53 GHz +Ms ; 0F24 Pentium 4 B0 Mobile, 1.6-1.7 GHz +Ms ; 0F24 Pentium 4 Xeon B0 1.8-2.4 GHz +PMs ; + ; 0F2x Pentium 4 Northwood, 512K L2 +MS ; 0F2x P4 Xeon Prestonia, As Northwood +MS ; + ; + ; + ; 0Fxx Pentium 4 Prescott, integrated Northbridge +P ; 1.6+ GHz, single/dual RDRAM + ; 0Fxx Pentium 4 Nocona ??? +P ; 0Fxx Pentium 4 any +GP ; 0Fxx P4 Celeron any 1.8+ GHz, 8+12K L1, 128K L2 +P ; + ; + ; + ;-------------------------------------------------------------------------------+ ; + ; Contents of Debug Registers (in real mode) + ; + ; DR6 OR- 1 DR6 AND 0 DR7 OR -1 DR7 AND 0 Processor + ; + ; 0x0000E00F 0x00000000 0xFFFF23FF 0x00000000 i386xx, i486xx + May use DR7[15,14,12] ? ; Am386xx, Am486xx + ; + ; 0xFFFF01FF 0x00000000 Enhanced Am486xx + ; + ; 0xFFFFFFFF 0xFFFF1FF0 0xFFFF27FF 0x00000400 Pentium + May use DR7[15,14,12] ? ; + ; 0xFFFFCFFF 0xFFFF0FF0 0xFFFF27FF 0x00000400 Cx486DX + DR7 also on cx486DX2/4 ; TI468SXLC/SLC(e) + ; + ; 0xFFFFEFFF 0xFFFF2FF0 0xFFFF23FF 0x00000000 Cx486SLC, TI486SXL + ; + ; 0x0000F00F 0x00000000 0xFFFFFBFF 0x00000000 IBM 486SLC2 + ; + ; 0x0000E00F 0x00000000 0xFFFF13FF 0x00000000 Am486SXLV + ; Am386SXLV/DXLV + ; + ; 0x0000CFFF 0x00000FF0 0xFFFF27FF 0x00000400 Cx6x86, Cx6x86MX + ; + ;-------------------------------------------------------------------------------+ ; + ; Flag tests: + ; + ; Not only Cyrix can be detected by testing the behaviour of flags. + ; + ; The standard test to differentiate Cyrix from other processors is the DIV + ; test, checking whether any flags have changed after the div. + ; + ; Other tests can help differentiate between some processor cores. + ; + ; Known processor cores (386 and later only): + ; + ; Processor Comment Source + ; + ; 386 (vendors aren't all the same) R + ; Cx486SLC/Cx486DX (and clones, like TI486SXL) R + ; i486 R + ; UMC U5S R + ; Cyrix Cx5x86 (M1sc) R + ; Pentium R + ; NexGen Nx5x86 R + ; Cyrix Cx6x86 (M1) R + ; AMD Am5k86 R + ; Pentium Pro R + ; + ; What sort of tests to perform? + ; + ; MUL + ; DIV + ; IMUL + ; IDIV + ; NEG (ZF) + ; AND/OR/XOR/etc (AF) + ; Shift/Rotates (OF) + ; + ; and more (details when I do my own tests). + ; + ; How to test each instruction: + ; + ; xor ah,ah + ; sahf + ; ; insert test sequence + ; lahf + ; mov bh,ah + ; + ; xor ah,ah + ; dec ah + ; sahf + ; ; insert test sequence + ; lahf + ; + ; ; analyse the results to see what flags were changed by which instruction, + ; ; and under what circumstances. + ; + ; Test sequences recorded in RBIL are: + ; + ; MUL: mov ax,0000h + ; mov bx,1234h + ; mul bx + ; + ; DIV: mov ax,1234h + ; mov bl,22h + ; div bl + ; + ; IMUL: mov ax,0092h + ; mov bl,22h + ; imul bl + ; + ; IDIV: mov ax,0ffeeh + ; mov bl,22h + ; idiv bl + ; + ; LOG: mov ax,0ff00h + ; mov bx,0f0fh + ; and ax,bx + ; + ; Flags recorded in RBIL as changing: + ; + ;CPU ------------- Sequence ------------- + ;CORE MUL DIV IMUL IDIV LOG Note + ; ------------------------------------------------------------------------ + ;286 ALL ALL ALL ALL ALL as 386,i486 + ; DRIVEN DRIVEN DRIVEN DRIVEN DRIVEN + ; ------------------------------------------------------------------------ + ;386 ALL ALL ALL ALL ALL as 286,i486 + ; DRIVEN DRIVEN DRIVEN DRIVEN DRIVEN + ; ------------------------------------------------------------------------ + ;i486 ALL ALL ALL ALL ALL as 286,386 + ; DRIVEN DRIVEN DRIVEN DRIVEN DRIVEN + ; ------------------------------------------------------------------------ + ;Cx486SLC ZSPA ALL ZSPA ALL AF + ; PASSED PASSED PASSED PASSED PASSED + ; ------------------------------------------------------------------------ + ;UMC U5S ZSPA ALL ZSPA ALL ALL + ; PASSED PASSED PASSED PASSED DRIVEN + ; ------------------------------------------------------------------------ + ;Cx5x86 PA COPA PA COPA ALL + ; PASSED PASSED PASSED PASSED DRIVEN + ; ------------------------------------------------------------------------ + ;Pentium ZSPA ALL ZSPA ALL ALL as Pentium Pro + ; PASSED DRIVEN PASSED DRIVEN DRIVEN + ; ------------------------------------------------------------------------ + ;Nx5x86 ???? ???? ???? ???? ???? Not yet known + ; ???? ???? ???? ???? ???? + ; ------------------------------------------------------------------------- + ;Cx6x86 ALL C,O ALL C,O ALL + ; DRIVEN PASSED DRIVEN PASSED DRIVEN + ; ------------------------------------------------------------------------ + ;Am5k86 ZSPA CO ZSPA CO ALL + ; PASSED PASSED PASSED PASSED DRIVEN + ; ------------------------------------------------------------------------ + ;Pentium Pro ZSPA ALL ZSPA ALL ALL as Pentium + ; PASSED DRIVEN PASSED DRIVEN DRIVEN + ; + ;-------------------------------------------------------------------------------+ ; + ; Instructions that are only valid on a small range of processors. + ; + ; CMPXCHG 0F A6 /r 486 Step A CMPXCHG486 rm8,reg8 + ; 0F A7 /r 486 Step A CMPXCHG486 rm16,reg16 + ; CMPXCHG486 rm32,reg32 + ; + ; F4X4 DB F1 IIT x87 Multiply vector by 4x4 matrix + ; FNSTDW DF E1 i387SL Mobile Store Device Word Register, no wait + ; FNSTSG DF E2 i387SL Mobile Store Signature Word Register, no wait + ; FRICHOP DD FC Cx FPUs to 486 Round to Integer, chop fractional part + ; FRINEAR DF FC Cx FPUs to 486 Round to Nearest Integer + ; FRINT2 DB FC Cx FPUs to 486 Round to Integer, if fractional is 0.5 + ; rounds absolute to infinity + ; FRSTPM DB E5 i287XL/XLT FPU Reset Pmode + ; FSBP0 DB E8 IIT x87 Set Bank Pointer to Bank #0 + ; FSBP1 DB EB IIT x87 Set Bank Pointer to Bank #1 + ; FSBP2 DB EA IIT x87 Set Bank Pointer to Bank #2 + ; + ; IBTS 0F A7 /r i386 Step A0-B0 Insert Bit String + ; XBTS 0F A6 /r i386 Step A0-B0 Extract Bit String + ; + ; RDMSR 0F 32 IBM 386SLC Read MSR, this works the same as for + ; 486SLC/2/3 Pentium processors. + ; WRMSR 0F 30 IBM 486SLC2 Write MSR, works same as for Pentium + ; + ; RSDC 0F 79 /r Cx486S/S2/D/D2 Restore Register and Descriptor. + ; Cx486DX/DX2/DX4 + ; IBM BL486DX/DX2 + ; TI486SLC/DLC/e + ; TI486SXL/2/C + ; TI Potomac + ; RSLDT 0F 7B /0 as for RSDC Restore LDTR and Descriptor + ; RSTS 0F 7D /0 as for RSDC Restore TR and Descript. + ; SVDC 0F 78 /r as for SVDC Save Register and Descriptor + ; SVDLDT 0F 7A /0 as for SVDC Save LDTR and Descriptor + ; SVTS 0F 7C /0 as for SVDC Save TR and Descriptor + ; + ; + ; SMINT 0F 7E Cx486DX/DX2/DX4 Save CPU State and enter SMM + ; IBM BL486DX/DX2 + ; never in Cx486S/S2/D/D2 + ; never in any TI chips + ; + ; UMOV 0F 10-13 /r Am386SXLV/DXLV Mov Data to Main (User) Memory + ; AMD 486s Valid in SMM and non-SMM modes + ; IBM 486SLC2 #UD if SMM not supported + ; All SL/SMM enhanced + ; + ;-------------------------------------------------------------------------------+ ; + ; Some instructions with known bugs. + ; + ; This list is not intended to be complete. For a complete listing, + ; refer to the file 86BUGS.LST, distributed with Ralf Brown's + ; Interrupt List. + ; + ; BSWAP 0F C8+r 486 Swap byte order in 32-bit register. + ; Faulty on many 486s when in 16-bit with no 0x66 + ; prefix or 32-bit mode with the prefix. + ; + ; FDIV Various 486 On some 486, the FDIV instructions will + ; incorrectly accept a register operand + ; that has been tagged as empty but holds + ; a non-zero value, when there is another + ; FP instruction within 35 FPU clock + ; cycles. When that happens, the FDIV + ; will use the invalid value, and the + ; following instruction will also + ; generate an invalid result. + ; + ; FLDENV D9 /4 387 On some 387s, if the last two bytes of the + ; environment can't be read (whatever the + ; reason), the instruction can't be + ; restarted. + ; A workaround is to make sure the environment+ ; is 128-byte aligned, or to read it + ; before executing the instruction. + ; + ; FPTAN D9 F2 486 On some 486s, a specific set of code, when + ; executed on a specific set of data, + ; will corrupt the FPU stack, without + ; signalling the FPU or CPU. + ; A workaround is to follow FPTAN with FCLEX, + ; FINIT, FLDCW, FSTSW, FSTSWAX, + ; or or by a WAIT and a non-FPU + ; instruction + ; + ; FRSTOR DD /4 387 This bug is the same as that for FLDENV. + ; + ; FSAVE 9B /6 386/7 On some 386s, an incorrect opcode is saved when + ; FNSAVE DD /6 386/7 in real or V86 mode. The right address + ; is saved, and can be used to retrieve + ; the opcode. + ; On some 387's, the same bug as for FLDENV is + ; present. + ; + ; FSCALE D9 FD 486 On some 486s, if -1 zero after REP INS. + ; 486 Early 486 may hang when the destination address + ; spans a dword boundary. + ; + ; INVD 0F 08 486 On some 486s, if a cache line fill is in + ; progress at the same time an INVD is + ; being executed, the line is moved into + ; the cache and not invalidated. + ; Always disable the cache prior to an INVD + ; on a 486. + ; + ; LAR 0F 02 /r 386 On some 386s, this will incorrectly allow + ; access to selector 0 in the GDT. + ; A workaround is to have selector 0 as a + ; NULL descriptor, which cause LAR to + ; execute correctly. + ; + ; LSL 0F 03 /r 386 The first bug is the same as for LAR. + ; On some 386s, if LSL is immediately followed + ; by an instruction that uses the stack, + ; (E)SP will be corrupted. + ; + ; MOVS A4/A5 386 On some 386s, MOVS followed by an instruction + ; with a different address size will + ; result in the wrong destination + ; register being updated. + ; This means that in some cases DI will be + ; updated instead of EDI, or vice-versa. + ; REP MOVS will additionally update (E)SI + ; when this bug is present. + ; + ; MUL F7 /4 386 On some 386s, there is a bug in the 32-bit + ; multiply. In processors with this bug, + ; the high word of the result that should + ; be in EAX is left in DX, and the dword + ; that should be in EDX is left in EAX. I + ; have no more info on what is left in + ; the high word of EDX. + ; Some 386s also have a bug in 16-bit multiplies. + ; I have no more information on this. + ; + ; POPA 61 386 On some 386s, POPA followed by any instruction + ; which uses an EA that has a base + ; register and an index register, where + ; the index isn't (E)AX, EAX will be + ; corrupted. + ; + ; VERR 0F 00 /4 386 These instruction will incorrectly allow a NULL + ; VERW 0F 00 /5 386 selector to be specified on some 386s. + ; + ; WBINVD 0F 0D 486 This has the same bug as INVD. + ; + ; + ;-------------------------------------------------------------------------------+ ;-------------------------------------------------------------------------------+ ; + ; Acknowledgements: + ; + ; The following sources of information were used when developing this code. + ; + ; Source code: + ; + ; CPUID.ZIP Copyright Robert Collins ([email protected]) + ; mostly used to help write code to detect possibility of + ; obtaining a reset signature. + ; The package is available on www.x86.org + ; + ; CYRIXID.ZIP Author unknown + ; Useful for some info on Cyrix ID register values. + ; + ; CPU117.ZIP Copyright Bobby Z and other contributors + ; This is version 1.17 ot the TMi0SDGL(tm) package. + ; This is a useful reference source for identification + ; routines, and has some stepping info. + ; + ; Documentation: + ; + ; Am386 SX/SXL/SXLV Embedded processor Manual 20037.PDF AMD + ; + ; Am486DX/DX2 Hardware Reference Manual 17965.PDF AMD + ; Am486 Microprocessor Software Users Manual 18497.PDF AMD + ; Am486DX4 Microprocessor Datasheet 19160.PDF AMD + ; Am486DX2 Microprocessor Datasheet 19200.PDF AMD + ; Enhanced Am486 Microprocessor Family Manual 19225.PDF AMD + ; Am5x86 Microprocessor Family Manual 18751.PDF AMD + ; Am486DE2 Embedded Microprocessor Manual 20037.PDF AMD + ; Enhanced Am486DX Microprocessor Family Manual 20736.PDF AMD + ; + ; AMD K5 Processor Datasheet 18522.PDF AMD + ; AMD 5K86 Processor Technical Reference Manual 18524.PDF AMD + ; AMD-K5 Processor Software Development Guide 20007.PDF AMD + ; + ; AMD-K6 Processor Datasheet 20695.PDF AMD + ; AMD-K6 MMX Enhanced Processor Manual 20726.PDF AMD + ; Mobile AMD-K6 Processor Data Sheet 21049.PDF AMD + ; AMD-K6 Processor Revision Guide Model 6 21266.PDF AMD + ; AMD-K6 Processor Revision Guide Model 7 21846.PDF AMD + ; + ; AMD-K6-2 Processor Revision Guide Model 8 21641.PDF AMD + ; AMD-K6-2 Processor Data Sheet 21850.PDF AMD + ; Mobile AMD-K6-2 Processor Data Sheet 21896.PDF AMD + ; AMD-K6-2E Processor Data Sheet 22529.PDF AMD + ; Mobile AMD-K6-2+ Processor Data Sheet 23446.PDF AMD + ; AMD-K6-2E+ Embedded Processor Data Sheet 23542.PDF AMD + ; + ; AMD-K6-III Processor Data Sheet 21918.PDF AMD + ; AMD-K6-III Processor Revision Guide - Model 9 22473.PDF AMD + ; Mobile AMD-K6-III-P Processor Data Sheet 22655.PDF AMD + ; Mobile AMD-K6-III+ Processor Data Sheet 23535.PDF AMD + ; AMD-K6-III+ Embedded Processor Data Sheet 23543.PDF AMD + ; + ; AMD Athlon Processor Model 1/2 Revision Guide 22557.PDF AMD + ; AMD Athlon Processor Model 4 Revision Guide 23614.PDF AMD + ; AMD Athlon Processor Model 6 Revision Guide 24332.PDF AMD + ; + ; AMD Duron Processor Model 3 Revision Guide 23865.PDF AMD + ; + ; AMD Processor Recognition Application Note 20734.PDF AMD + ; AMD Processor Recognition Code Sample 21035.PDF AMD + ; + ; + ; IDT Winchip C6 Processor Datasheet Centaur + ; IDT Winchip C6 Processor Family BIOS Writers Guide Centaur + ; + ; IDT Winchip 2 Processor Data Sheet Centaur + ; IDT Winchip 2A Processor Data Sheet Centaur + ; IDT Winchip 2B Processor Data Sheet Centaur + ; + ; IDT Winchip 3 Processor Data Sheet Centaur + ; + ; IDT Winchip Processor Family BIOS Writers Guide ver 4 Centaur + ; + ; + ; 5x86 CPU BIOS Writers Guide Revision 1.1 Cyrix + ; + ; 6x86 Processor Data Sheet Cyrix + ; 6x86L Processor Data Sheet Cyrix + ; + ; Cyrix MII Data Book Cyrix + ; + ; Cyrix MediaGX Data Book Cyrix + ; + ; Cyrix CPU Detection Guide Cyrix + ; + ; + ; IBM 6x86MX Microprocessor Databook IBM + ; IBM 6x86MX Microprocessor BIOS Writers Guide IBM + ; + ; + ; INTEL 80386 PROGRAMMER'S REFERENCE MANUAL Intel + ; Intel386 DX Microprocessor Data Sheet 23163011.PDF Intel + ; Intel386 DX Processor Specification Update 27287402.PDF Intel + ; Intel386 SX Microprocessor Data Sheet 24028708.PDF Intel + ; Intel386 DX Processor Specification Update 27287402.PDF Intel + ; Intel386 CXSA Embedded Microprocessor Datasheet 27241803.PDF Intel + ; Intel386 SXSA Embedded Microprocessor Datasheet 27241903.PDF Intel + ; Intel386 EX Embedded Microprocessor Datasheet 27242004.PDF Intel + ; Intel386 EX Microprocessor User's manual 27248502.PDF Intel + ; Intel386 CX/SXSA Processor Specification Update 27286902.PDF Intel + ; Intel386 EX Processor Specification Update 27287310.PDF Intel + ; + ; Military i486 Processor Family Data Sheet 27132903.PDF Intel + ; Embedded ULP i486 SX Processor Data Sheet 27273102.PDF Intel + ; Embedded ULP i486 GX Processor Data Sheet 27275502.PDF Intel + ; Embedded i486 SX Processor Data Sheet 27276903.PDF Intel + ; Embedded i486 DX2 Processor Data Sheet 27277002.PDF Intel + ; Embedded i486 DX4 WB Processor Data Sheet 27277102.PDF Intel + ; Embedded i486 Family Developers Manual 27302101.PDF Intel + ; + ; Pentium Processor Specification Update 24248041.PDF Intel + ; 60- and 66-MHz Pentium Processor Spec Update 24332601.PDF Intel + ; Pentium Pro Processor Specification Update 24268935.PDF Intel + ; Pentium II Processor Specification Update 24333746.PDF Intel + ; Mobile Pentium II Processor Spec. Update 24388737.PDF Intel + ; Pentium II Xeon Processor Specification Update 24377632.PDF Intel + ; Pentium III Processor Specification Update 24445339.PDF Intel + ; Pentium III Xeon Processor Specification Update 24446032.PDF Intel + ; Mobile Pentium III Processor Spec. Update 24530628.PDF Intel + ; Pentium 4 Processor Specification Update 24919921.PDF Intel + ; Mobile Pentium 4 Processor-M Spec. Update 25072101.PDF Intel + ; Intel Xeon Processor Specification Update 24967812.PDF Intel + ; + ; Intel Processor I/D and the CPUID Instruction 24161819.PDF Intel + ; P 4 Processor I/D and the CPUID Instruction Intel + ; + ; + ; Geode GXm Processor Datasheet GXM.PDF NSC + ; Geode GXLV Processor Series Datasheet GXLV.PDF NSC + ; Geode GX1 Processor Series Datasheet GX1.PDF NSC + ; + ; iDragon MP6 IA Processor Datasheet Rise + ; iDragon MP6 IA Processor BIOS Writers Guide Rise + ; + ; VIA Cyrix III Processor Datasheet VIA + ; VIA C3 Samuel 2 Processor Datasheet VIA + ; VIA C3 Ezra Processor Datasheet VIA + ; VIA C3 Ezra-T Processor Datasheet VIA + ; VIA C3 in EBGA Datasheet VIA + ; VIA Eden Embedded System Platform Processor Datasheet VIA + ; + ; + ; cyrixcpu.txt Christian Ludloff + ; 80x86.cpu ditto + ; + ; Ralf Brown's Interrupt List + ; + ; Websites: + ; + ; http://www.sandpile.org/ + ; http://grafi.ii.pw.edu.pl/gbm/x86/ + ; http://www.plasma-online.de/ + ; + ; People: + ; + ; The following individuals also provided me with some of the information + ; in this document: + ; + ; Norbert Juffa + ; H. Peter Anvin + ; + ; + ; Thanks also to the many other authors whose sites I visited before I started + ; recording my work. + ; + ;-------------------------------------------------------------------------------+
联系我们 contact @ memedata.com