This file includes new knowledge about many Intel processors and their clones.
If you're writing system software, then you should read this file. Thank you!
(C) Copyright Christian Ludloff
(M) 07/1994 Dallas, Texas, USA
(P) 01.03.1996
(V) 3.2.2 eMail : ludloff@anet-dfw.com
(?) 80x86.CPU webpage : http://webusers.anet-dfw.com/~ludloff
This file is mine! And remember: What's mine is mine!
Please, send updates or corrections directly to me and do not modify this file
yourself. I will mention your name at the end of the file when adding your new
knowledge. That's the only way to fight against xxx versions. Thank you!
==============================================================================
The new flags in the EFLAGS register
====================================
------------------------------------------------------------------------------
bit description
------------------------------------------------------------------------------
21 CPUID instruction support flag
If you can use this bit (set/reset), then your CPU supports the new
CPUID instruction. So you must not install a handler for the invalid
opcode exception before you execute this new processor instruction.
20 VIP - Virtual Interrupt Pending flag
19 VIF - Virtual Interrupt Flag
These two bits are used by the virtual interrupt feature of the V86-
enhanced CPUs from Intel. You can use the CPUID instruction to check
your processor for the support of this feature.
------------------------------------------------------------------------------
The new Control Register CR4
============================
This register contains some flag bits to enable or disable the new features.
You will find it only on iPentium processors and on some newer Intel CPUs. To
find out, whether your CPU contains the CR4 or not, you should use the CPUID
instruction (feature flags). If your processor supports the enhanced virtual
mode, then it will support at least bit 0 and 1 of CR4 (as the newer i486 do).
A good method is comparing the CPUID feature flags from EDX with a mask 209Eh:
it indicates all features which "cause" the presence of the CR4. Do not try to
set bits, which are not supported by your CR4 register!
------------------------------------------------------------------------------
bit description
------------------------------------------------------------------------------
31..7 reserved
8 PCE - enable read performance counter instruction (iPentiumPro)
1=enable RDPMC instruction for CPL=0 only
0=enable RDPMC instruction for all CPLs
7 PGE - page global enable (iPentiumPro)
6 MCE - enable machine check exception (new; exception #12h)
1=enable the machine check exception
0=disable the machine check exception (like a i486)
5 PAE - physical address extension enable (iPentiumPro)
4 PSE - enable page size extension
1=enable the 4MB pages
0=disable the 4MB pages (like a i486)
3 DE - enable debugging extension
1=enable the I/O breakpoints (see DR7.R/W) and disable DR4/5 access
0=disable the I/O breakpoints (like a i486)
2 TSD - enable read time stamp counter instruction
1=enable RDTSC instruction for CPL=0 only
0=enable RDTSC instruction for all CPLs
1 PVI - enable protected mode virtual interrupts
1=enable virtual interrupts in protected mode
0=disable virtual interrupts in protected mode (like a i386)
0 VME - enable virtual mode virtual interrupts
1=enable virtual interrupts in virtual mode
0=disable virtual interrupts in virtual mode (like a i386)
------------------------------------------------------------------------------
The new Probe Mode Control Register
===================================
This register is normally visible through an iPentiumICE (In-Circuit-Emulator)
only. Nevertheless it can be accessed through MSR #8000:001Dh on the iPentium.
------------------------------------------------------------------------------
bit description
------------------------------------------------------------------------------
31 SMM (SMM active, read only, similar to former DR6.bit12)
1=SMM is active
0=SMM is not active
30..7 reserved
2 PB1 (performance monitoring or breakpoint monitoring, see MSR #11h.25)
1=pin PM1/BP1 monitors breakpoint #1 matches
0=pin PM1/BP1 monitors performance monitoring counter #1
1 PB0 (performance monitoring or breakpoint monitoring, see MSR #11h.9)
1=pin PM0/BP0 monitors breakpoint #0 matches
0=pin PM0/BP0 monitors performance monitoring counter #0
0 ICEBP (ICEBP enabled, similar to former DR7.bit12)
1=every debug exception activates PRDY and enters the Probe Mode
0=normal behaviour
------------------------------------------------------------------------------
The new R/W-bits in the Debug Register DR7
==========================================
R/W=1-0 - set a breakpoint for I/O accesses
(new; but if CR4.DE=0, then reserved like on i386)
The GD-bit in the Debug Register DR7
====================================
The DR7 contains the GD bit too (bit13). This bit is supported on the i386 and
the i486 too. If it is set to 1, then any access (read and write) to any Debug
register causes the exception #01h. The exception handler is called with GD=0,
so that it can access the Debug Registers. This former undocumented bit can be
used to crash almost all modern debuggers. But remember: If your own code trys
to set the GD bit to 1 and it is always set to 1, then your access to DR7 will
cause the exception #01h too! So I don't recommend you to use this bit, if you
want your software to run as stable and to be as compatible, as possible!
There's only one way, to clear the GD bit and you must be in real mode for the
following routine: install your own IDT by loading a new value to the IDTR and
create a handler for the exception #01h, which leaves the GD bit in DR7 set to
0 and which returns directly to the code, to re-install the old IDTR value. As
you can see, the GD-clearing is not possible (for CPL=3 code) in virtual mode,
because you have to install an 'incomplete' exception #01h handler.
The new implemented model specific registers MSR
================================================
Only the iPentium processor contains these new registers. They are 64 bit wide
and you must use EDX:EAX to handle them. You will find some MSRs on the newer
IBM 386/486SLC processors too. On the new iPentiumPro processor the MSRs are
included too, but Intel has changed their layout and their functions.
Here Intel implemented the Machine Check Exception Registers, the new added
Test Registers (old TR0-7 don't exist any longer!), the Time Stamp Counter and
the two Performance Monitoring Counters #0 and #1 with the Counter Control and
Event Selection Register.
------------------------------------------------------------------------------
MSR description (Intel Pentium processor only!)
------------------------------------------------------------------------------
00h MCA - machine check exception address register (read only)
This register contains the physical address after a data parity er-
ror occured on the CPU bus. This may end up in a machine check ex-
ception (#12h), when you enable it via CR4.MCE.
bit63..0 ADDRESS (64 bit wide)
------------------------------------------------------------------------------
01h MCT - machine check exception type register (read only)
Describes the type of the bus cycle if a machine check exception oc-
cured on your processor's bus.
bit63..6 reserved
bit5 THERR (1=thermal error, 0=no thermal error )
This bit is set to one, if the cooling fan is removed. The
THERR also indicates, if the cooling fan fails (fan state)
and the processor is set to 1:1 clock speed ratio (to save
power). The CHK bit will not be affected by the THERR bit!
bit4 LOCK-state (1=LOCK active, 0=LOCK inactive )
bit3 M/IO-state (1=memory access, 0=I/O access )
bit2 D/C-state (1=data access, 0=code access )
bit1 W/R-state (1=write, 0=read )
bit0 CHK-state (1=MSR #00/01h valid, 0=MSR #00/01h invalid)
------------------------------------------------------------------------------
02h TR1 - parity reversal test register ('write only')
bit63..14 reserved
bit13 MC microcode (reverse parity on read)
bit12 DTD data TLB data
bit11 DTT data TLB tag
bit10 DD data cache data (use byte writes for individual access)
bit9 DT data cache tag
bit8 ITD code TLB data
bit7 ITT code TLB tag
bit6 ID3 code cache data odd bits (255,253..131,129)
bit5 ID2 code cache data even bits (254,252..130,128)
bit4 ID1 code cache data odd bits (127,125..3,1)
bit3 ID0 code cache data even bits (126,124..2,0)
bit2 IT code (instruction) cache tag
bit1 NS no shutdown
1=assert IERR# only on parity error
0=assert IERR# and shutdown on parity error
bit0 PES parity error summary (read&write, set on any par. err.)
Writing a one into bits12..2 reverses the sense of the parity ge-
neration for any write into the corresponding array (for normal and
for testability accesses). For the microcode bad parity may be for-
ced on a read by setting TR1.MC to one.
------------------------------------------------------------------------------
03h reserved by Intel (don't try to read it)
------------------------------------------------------------------------------
04h TR2 - instruction cache end bit test register (read and write)
bit63..4 reserved
bit3..0 END BITS
These bits indicate instruction boundaries. If the given
byte is the last byte in an instruction, the corresponding
end bit is set to one. This mechanism aids the decode of
two variable length instructions per clock by providing
information on where the boundary between instructions is.
------------------------------------------------------------------------------
05h TR3 - cache data test register (read and write)
bit63..32 reserved
bit31..0 DATA
This is where the data is held on its way into or out of
the internal L1 cache.
------------------------------------------------------------------------------
06h TR4 - cache tag test register (read and write)
bit63..32 reserved
bit31..8 TAG
bit7..3 reserved
bit2 LRU
1=points to way #1 0=points to way #0
bit1..0 VALID
if TR5.CD=0 (code cache)
x-1=cache line valid x-0=cache line invalid
if TR5.CD=1 (data cache)
1-1=cache line in M state 1-0=cache line in E state
0-1=cache line in S state 0-0=cache line in I state
------------------------------------------------------------------------------
07h TR5 - cache control test register ('write only')
bit63..15 reserved
bit14 WB - selects writeback or writethrough
1=writeback (for that particular line; data cache only)
0=writethrough (for that particular line; both caches)
bit13 CD - selects code or data cache
1=data cache 0=code cache
bit12 ENTRY - selects one of the two ways in the cache
1=way #1 0=way #0
bit11..5 SET
0..127h - select one of the 128 sets
bit4..2 BUFFER
0..7h - select one of the 8 portions of a cache line to be
visible through TR3
bit1..0 CONTROL - select the operation
1-1=flush 1-0=testability read
0-1=testability write 0-0=normal operation
------------------------------------------------------------------------------
08h TR6 - TLB command test register (read and write)
bit63..32 reserved
bit31..12 LINEAR ADDRESS
bit11 V - valid state (valid or invalid TLB entry)
1=valid TLB-entry 0=invalid TLB-entry
bit10 D - dirty state (write access made to page; data TLB only)
1=write access was made 0=write access was not made
bit9 U - user state (privilege level access allowed)
1=CPL=0 0=CPL=0..3
bit8 W - writeable state (writes allowed; data TLB only)
1=allows writes 0=no writes, read only
bit7..3 reserved
bit2 PS - selects the page size (data TLB only)
1=4MB pages 0=4KB pages
bit1 CD - selects code or data TLB
1=data TLB 0=code TLB
bit0 OP - selects the operation
1=TLB read 0=TLB write
------------------------------------------------------------------------------
09h TR7 - TLB data test register (read and write)
bit63..32 reserved
bit31..12 PHYSICAL ADDRESS
bit11 PCD - page level cache disable bit (paging attribute PCD)
bit10 PWT - page level write through bit (paging attribute PWT)
bit9 L2 \
bit8 L1 > three LRU bits (entry to be replaced)
bit7 L0 /
bit6..5 reserved
bit4 H - hit indicator (set to 1 during testability writes)
1=input linear address matches a valid entry
0=input linear address don't matches a valid entry
bit3..2 ENTRY - select one of the four ways
testability write -> way to write
testability read -> way that resulted in a read hit
bit1..0 reserved
------------------------------------------------------------------------------
0Ah reserved by Intel (don't try to read it)
Because the iPentium A-step processor was supposed to include a 36bit-
addressing and 2MB-paging, there has been the TR8 too. But at the last
minute Intel has removed these features and the TR8 from the iPentium.
TR8 - TLB data test register (part II)
bit63..4 reserved
bit3..0 PHYSICAL ADDRESS (A35..A32)
------------------------------------------------------------------------------
0Bh TR9 - BTB tag test register (read and write)
bit63..32 reserved
bit31..6 TAG ADDRESS
bit5..2 reserved
bit1..0 HISTORY
------------------------------------------------------------------------------
0Ch TR10 - BTB target test register (read and write)
bit63..32 reserved
bit31..0 TARGET ADDRESS
------------------------------------------------------------------------------
0Dh TR11 - BTB control test register (read and write)
bit63..12 reserved
bit11..6 SET
0..63h - select one of the 64 sets to access
bit5..4 reserved
bit3..2 ENTRY - select a way
0..3h - select one of the four ways within the set
bit1..0 CONTROL - select the operation
1-1=flush 1-0=testability read
0-1=testability write 0-0=normal operation
------------------------------------------------------------------------------
0Eh TR12 - new feature control register ('write only')
bit63..15 ? reserved
bit14 II ignore interrupt (iP54C 052Bh, 052Ch)
1=ignore interrupt, asserted during a window that in-
terrupts are disabled (after CLI and before STI)
0=behave as earlier steppings
bit13..10 ? unknown
bit9 ITR interrupt priority
1=enable I/O instruction restart feature for the SMM
and change the interrupt priority
0=disable I/O instruction restart feature for the SMM
and use the standard interrupt priority
See Pentium Family User's Manual volume #1 (data book)
table 19-2 for some details. This bit should be suppor-
ted only on the iP54C models with the new added I/O in-
struction restart feature for the SMM.
bit8 fTR fast tracing (see TR12.TR too)
1=CPU generates fast branch-trace-message bus-cycles
0=CPU don't generates fast branch-trace-message bus-
cycles
The fast tracing feature should exist only on such Pen-
tium processors working with different ex- and internal
speeds (like the new iP54C model). So the new fast mes-
sages produce only the second bus-cycle.
bit7 FDP? unknown (but used!)
bit6 AHD auto halt disable (iP54C only)
1=auto halt feature disabled
0=auto halt feature enabled
bit5 ? unknown (but used!)
bit4 AD APIC disable (iP54C 0521h, 0522h, 0524h and 0525h only)
1=internal APIC disabled
0=internal APIC enabled
To re-enable the APIC, a warm reset of the part must be
performed, after clearing this bit.
bit3 CI cache inhibit
1=internal L1 cache disabled (L2 cache unchanged)
0=internal L1 cache enabled (L2 cache unchanged)
bit2 SE single pipe execution
1=v-pipeline disabled and not used
0=both pipelines enabled and used
bit1 TR tracing
1=CPU generates branch-trace-message bus-cycles for
the external execution control
0=CPU don't generates the branch-trace-message bus-
cycles
bit0 NBP no branch prediction
1=BTB not used (then a move to CR3 disables BTB use!)
0=BTB used to predict branches
------------------------------------------------------------------------------
0Fh reserved by Intel (don't try to read it)
------------------------------------------------------------------------------
10h time stamp counter (read and write)
This counter counts the internal CPU clock cycles since the last re-
set. It has a capacity of about 5850 years when you have a 100 MHz
processor. You can read the value via the RDTSC / RDMSR instruction.
bit63..0 time stamp counter value (64 bit wide, read/write)
------------------------------------------------------------------------------
11h counter event selection and control register (read and write)
This register controls the two internal counters #0 and #1. They can
be programmed to count about 40 different events.
bit63..32 reserved (for two more counters in future models?)
bit31..26 reserved
bit25 external pin PM1 selection
1=pin shows counter overflows
0=pin shows counter increments
bit24 counter type for counter #1
1=count clock cycles only
0=count events
bit23 enable counting in CPL=3 for counter #1
1=enable counting when CPL=3 ('count user software')
0=disable counting when CPL=3
bit22 enable couning in CPL=2..0 for counter #1
1=enable counting when CPL=2..0 ('count system overhead')
0=disable counting when CPL=2..0
bit21..16 event type to count with counter #1 (see list below!)
bit15..10 reserved
bit 9 external pin PM0 selection
1=pin shows counter overflows
0=pin shows counter increments
bit8 counter type for counter #0
1=count clock cycles only
0=count events
bit7 enable counting in CPL=3 for counter #0
1=enable counting when CPL=3 ('count user software')
0=disable counting when CPL=3
bit6 enable counting in CPL=2..0 for counter #0
1=enable counting when CPL=2..0 ('count system overhead')
0=disable counting when CPL=2..0
bit5..0 event type to count with counter #0 (see list below!)
------------------------------------------------------------------------------
12h counter #0 (read and write)
bit63..40 reserved
bit39..0 counter #0 value (40 bit wide)
------------------------------------------------------------------------------
13h counter #1 (read and write)
bit63..40 reserved
bit39..0 counter #1 value (40 bit wide)
------------------------------------------------------------------------------
14h APIC related? (only visible when the integrated APIC is enabled?)
------------------------------------------------------------------------------
>13/14h reserved by Intel (don't try to read them)
------------------------------------------------------------------------------
The IBM 386/486SLC processors include the following Model Specific Registers:
------------------------------------------------------------------------------
MSR description (IBM 386/486SLC and IBM 486BL3 'Blue Lightning' only!)
------------------------------------------------------------------------------
1000h processor operation register (IBM 386/486SLC)
bit63..19 reserved
bit18 LPPLA - low power PLA mode (IBM 486SLC only?)
1=power down additional dynamic parts during halt-state
0=don't power down these parts during low-power halt-state
bit17 BUSRD - factory read test (ignores cache, IBM 486SLC only?)
1=force all reads from ext. memory, even if cache is on
0=don't force all reads from external memory
bit16 CPGE - factory internal cache parity test (IBM 486SLC only?)
1=use odd parity (generates a cache parity error)
0=use even parity (normal operation)
bit15 CNPX - enable cacheability of floating point operand reads
1=boosts performance, if an external Cyrix FPU is used
0=normal operation (if an external Intel FPU is used!!!)
bit14 switch the ERROR input line...
1=...to a hidden memory address strobe output line
You can set this bit only at the first WRMSR after a CPU
reset. Further attempts at changing the bit are ignored!
0=...to the ERROR input pin to Intel compatible ERROR
bit13 LPH - low power halt mode (HLT stops internal clock)
1=enable low power halt mode
0=disable low power halt mode
bit12 XTOUT - wait for READY after output
1=the processor waits until READY is active after all out-
put instructions, before executing the next instruction
0=don't wait for READY
bit11 CRLD - cache reload status (set, when cache reload occurs)
bit10 IKEN - internal L1 cache enable set source
1=use MSR #1001h for the limits set
You can set this bit only at the first WRMSR after a CPU
reset. Further attempts at changing the bit are ignored!
0=use external hardware line input
bit9 DCLM - disable cache lock mode
1=allows the CPU to recognize the locked read-modify-write
cycle, but does not cache the line
0=normal operation
bit8 reserved for unknown function or unused
bit7 CE - enable internal L1 cache (not via CR0.CD!)
1=enable internal L1 cache
0=disable internal L1 cache
bit6 DBCS - disable caching for E0000h to E0FFFh (4K)
1=disable caching (if Double Byte Character Support used)
0=enable caching (if DBCS not used on japanes systems)
bit5 PMI - enable power interrupt PWI
1=enable power interrupt PWI
0=disable power interrupt PWI
bit4 ASNP - enable flush snooping
1=enable flush snooping (can be used, if bit3=0)
0=disable flush snooping
bit3 SNP - enable snoop input
1=enable snoop input
0=disable snoop input
bit2 A20M - enable A20 mask
1=line A20 disabled, unless paging is active (see CR0.PG)
0=external control or entire address range is accessable
bit1 CPC - enable cache parity
1=if a parity error occurs, then the internal L1 cache is
flushed, disabled (bit7=0), the flag is set (bit0=1) and
cache parity is disabled (bit1=0); NMI handler is called
0=disable cache parity
bit0 CPE - parity error occured
1=parity error occured (even, if bit1=1 -> no action)
0=no parity error occured (set bit0=0 to clear this flag)
------------------------------------------------------------------------------
1001h cache region control register (IBM 386/486SLC)
bit63..48 reserved
bit47..32 EMCL - extended memory cache limit
number of 64K blocks starting at the 1M boundary, that can
be cached (so 0Fh means 15MB are cacheable...)
bit31..16 LMRO - read only cache blocks
each bit represents a 64K region in the 1st MB, that has a
ROM memory (bit31=1 -> ROM at F000h...), a write into area
marked as ROM will not be updated in cache memory
bit15..0 LMC - first 1MB cacheable
each bit represents a 64K region in the first MB, that can
be cached (bit15=1 -> cache F000h ... bit0=1 -> cache 0h)
------------------------------------------------------------------------------
1002h processor clock control register (not on IBM 386SLC)
bit63..30 reserved
bit29 EDFS - enable external dynamic frequency shift
1=enable external dynamic frequency shift
0=disable external dynamic frequency shift
bit28 DFSRDY - dynamic frequency shift ready
1=CPU is ready for the shift (requested by hardware or by
setting bit27=1) -> clock can be changed
0=CPU is not ready for the shift
bit27 DFSREQ - dynamic frequency shift request
1=request the CPU to prepare for a clock input frq. change
0=normal operation
bit26..24 clock mode
000=1:1 (divide incoming clock by 2 (same as i386SX))
011=2:1 (use the incoming clock; make no divide; used for
doubling the internal CPU speed)
100=3:1 clock mode
bit23..0 reserved
------------------------------------------------------------------------------
1004h processor control register (at least IBM 486BL3)
bit63-24 reserved
bit23 OS2B - OS/2 boot
0=for DD1-hardware
1=for DD0-hardware: for OS/2 boot
bit22 CR0D - MOV CR0 decode
0=for DD0-, DD1A-, DD1B-, DD1D-hardware
1=for DD1C-hardware
bit21 reserved
bit20 CLP - cache low power
0=DD0: ever, DD1: cache stays on
1=DD1: disable cache when not in use
bit19 reserved
bit18 NOP
0=DD0: NOP=2 cycles, DD1: NOP=3 cycles
1=DD0: NOP=3 cycles, DD1: NOP=2 cycles
bit17 NA16 (bus pipelining for 16 bit)
bit16..5 unknown
bit4 MOVS split
bit3 power saving cache feature
bit2 reserved
bit1 enable MOV CRx decode (DD1B, DD1C: reserved)
bit0 reserved
------------------------------------------------------------------------------
The iPentiumPro processor contains the following Model Specific Registers. The
registers are mapped at every 4000h between 0000:0000h and FFFF:FFFFh, similar
to the 'illegal' MSRs above 8000:0000h on an iPentium (see below). The indexes
of these MSRs were collected, using the MSR searching program, coming with 4P.
The names can be obtained from the American Arium iPentiumPro ICE manual which
is available without a non-disclosure agreement (NDA).
------------------------------------------------------------------------------
MSR description (Intel PentiumPro processor only!)
------------------------------------------------------------------------------
00h Machine Check Address Register (?)
01h Machine Check Type Register (?)
10h Time Stamp Counter
------------------------------------------------------------------------------
18h,1Bh,2Ah,32h,33h,34h,3Ah,50h,51h,52h,53h,54h,79h,88h,89h,8Ah,8Bh,AEh,C1h,
C2h,FEh,116h,118h,119h,11Bh,131h,14Eh,14Fh,150h,151h,154h,15Bh,15Fh,174h,175h,
176h,179h,17Ah,186h,187h,1D3h,1D9h,1DBh,1DCh,1DDh,1DEh,1E0h,200h,201h,202h,
203h,204h,205h,206h,207h,208h,209h,20Ah,20Bh,20Ch,20Dh,20Eh,20Fh,250h,258h,
259h,268h,269h,26Ah,26Bh,26Ch,26Dh,26Eh,26Fh,2FFh,400h,401h,402h,404h,405h,
406h,408h,409h,40Ah,40Ch,410h,411h,412h are valid MSRs, which contain the:
------------------------------------------------------------------------------
Range Model Specific Registers which set various memory attributes; PentiumPro
processor architecture also introduces two more newer memory attributes in ad-
dition to the usual Write Through (WT) and Write Back (WB) types; the new me-
mory attributes are Write Combining (WC) and Write Protected (WP); the WC type
is used on frame buffers and the WP type is used for ROM shadow regions
fixed Memory Type Range Registers (MTRRs), as:
MTRRCap (info about included MTRRs), MTRRdefType,
MTRRfix_64K_00000, MTRRfix_16K_80000, MTRRfix_16K_A0000,
MTRRfix_4K_C0000, MTRRfix_4K_C8000, MTRRfix_4K_D0000, MTRRfix_4K_D8000,
MTRRfix_4K_E0000, MTRRfix_4K_E8000, MTRRfix_4K_F0000, MTRRfix_4K_F8000,
variable Memory Type Range Registers (MTRRs), as:
MTRRphysBase0, MTRRphysBase1, MTRRphysBase2, MTRRphysBase3,
MTRRphysBase4, MTRRphysBase5, MTRRphysBase6, MTRRphysBase7,
Debug/Performance Model Specific Registers, as:
TSC (=#10h), PerfEvtSel0, PerfCtr0, PerfEvtSel1, PerfCtr1, DebugCtlMSR,
LastBranchFromIP, LastBranchToIP, LastExceptionFromIP, LastExceptionToIP
Machine Check Model Specific Registers, as:
MCG_CAP, MCG_STATUS, P5_MC_ADDR (=#00h?), P5_MC_TYPE (=#01h?),
MC0_CTL, MC0_STATUS, MC0_ADDR, MC0_MISC,
MC1_CTL, MC1_STATUS, MC1_ADDR, MC1_MISC,
MC2_CTL, MC2_STATUS, MC2_ADDR, MC2_MISC,
MC3_CTL, MC3_STATUS, MC3_ADDR, MC3_MISC,
MC4_CTL, MC4_STATUS, MC4_ADDR, MC4_MISC,
MC5_CTL, MC5_STATUS, MC5_ADDR, MC5_MISC
other Model Specific Registers, as:
APIC_Base_MSR
The PentiumPro processor has the capability to correct specific errata through
the loading of an Intel-supplied data block. A "hidden" MSR #79h is related to
this new feature (see: BIOS writer's guide, 8.2.1 update loading procedure). A
MSR #8Bh may contain an updated value for the CPUID instruction. This happens,
when you load the BIOS update, mentioned above.
------------------------------------------------------------------------------
Appendix H -- supplemental information
--------------------------------------
Some non-essential information regarding other iPentiumPro MSRs are considered
confidential and proprietary and have not been documented in this publication.
This information is provided in my new Supplement to the 80x86.CPU file and is
available with the appropriate non-disclosure agreements in place. Please con-
tact Christian Ludloff for details.
My new Supplement to the 80x86.CPU file contains confidential information on
architecture extensions to the iPentiumPro processor which are non-essential
for standard applications. This includes some low-level registers that provide
access to internal features.
This information is specifically targeted at writers of the following type of
software:
* operating system kernels
* virtual memory managers
* BIOS software
* any other 80x86 software
If you are writing software that does not fall into one of these categories,
this information is non-essential and all required details are contained in my
publicly available 80x86.CPU file.
------------------------------------------------------------------------------
Some MSRs could exist on every ≥386 CPU. They are used by the vendor during a
test at the factory. I wish you a happy searching. But if you find one, you're
not able to use it, before you know it's structure. Send me the no., please!
The iPentium processor's RDMSR/WRMSR instruction bug
====================================================
Introduction
------------
This part contains information about another microcode bug of an iPentium CPU.
One of the last 'specification updates' for the iPentium processor manuals [1]
states the RDMSR and WRMSR instruction to be buggy, when executed with illegal
indices on all iPentium processors (iP5, iP54 and iP24T).
Because the Intel documentation states this bug not to be fixed in the future,
I believe, that it isn't a bug, but a hidden feature of the iPentium processor
for testing MSRs and accessing hidden MSRs.
The search
----------
Of course I have tried to find out a little bit more about these MSRs. So I've
started some searching, using an iPentium P54 processor with the C2-mask (this
means: CPUID=0525h; SX968; 90MHz-CPU, STD voltage). Another iPentium processor
was used to compare the results (CPUID=0517h; SX948; 60MHz-CPU).
Only illegal MSRs from 8000:0000h to FFFF:FFFFh seem to be legal. First I have
dumped them into a file, using my new 'range MSR search' feature from the last
4P package v3.1.2 [2].
Then I have tried to find out whether there are repeated values or not. What a
surprise -- they are repeated. :) Only 20h (32dec) different MSRs seem to be
accessable. (I have found this, because MSR 8000:0010h has a very large value,
as MSR 8000:0030h, 8000:0050h etc. too -- like the TSC...)
The next idea must have been, that the legal MSRs from 0000:0000h - 0000:0013h
(or 0000:0014h on some iPentium processors; maybe that MSR #14h is related to
the integrated APIC?) could be mapped to these illegal MSRs.
Of course this is true. And here is, what I have found:
The results
-----------
MSR MSR base address base address base address
#xxh name 8000:0000h 8000:0020h... FFFF:FFE0h (highest possible)
-------------------------------------------------------------------------------
00 MCA changing changing changing (okay)
The Machine Check Exception Address register changes its value,
even when CR4.MCE is disabled.
01 MCT changing changing changing (okay)
The Machine Check Exception Type register changes its value, if
the MCA changes its value, to indicate the MCE type.
02 TR1 MSR# * 2 dito + 40h FF80:3FC4h (instead FFFF:FFC4h)
The Test Register #1 is 'write only' (means: you can read a TR1
value, but it isn't the true value of the register). The bit#13
is the last documented and implemented TR1 bit. Here I've found
a mysterious value at the highest possible base address. (Other
machines had the predicted correct value.)
03 --- MSR# * 2 dito + 40h dito + 40h
This MSR is documented to be reserved and never implemented. So
the RDMSR microcode doubles the MSR# from ECX to EDX:EAX and it
cleares bit#32 then. Probably this has been included to be able
to test unimplemented or 'write only' MSRs.
04 TR2 0000:0001h dito dito (okay)
05 TR3 0000:0080h dito dito (okay)
06 TR4 0000:0000h dito dito (okay)
07 TR5 MSR# * 2 dito + 40h dito + 40h
The Test Register #5 is 'write only' (see TR1).
08 TR6 0000:0000h dito dito (okay)
09 TR7 0000:0000h dito dito (okay)
0A TR8 MSR# * 2 dito + 40h dito + 40h
TR8 is documented to be removed and not longer implemented.
0B TR9 0000:0000h dito dito (okay)
0C TR10 0000:0000h dito dito (okay)
0D TR11 MSR# * 2 dito + 40h dito + 40h
The Test Register #11 seems to be 'write only' (see TR1). Older
Intel documents have described it to be 'read/write'.
0E TR12 0000:0000h dito + 40h FFFF:1800h instead FFFF:FFC0h
The Test Register #12 is 'write only' (see TR1). The TR12 bit#9
is the last documented and implemented bit. Here I have found a
mysterious value at the highest possible base address (as TR1).
(Other machines had the predicted correct value.)
0F --- MSR# * 2 dito + 40h dito + 40h
This MSR is documented to be reserved and never implemented. It
is possible to set all bits, except bit#0, which hangs the chip
immediately, causing a stop of all bus activity. Restarting the
machine is only possible with a reset then. So the iPentium CPU
enters the tristate mode, which can only be leaved via a reset.
10 TSC changing changing changing (okay)
11 CESR changing dito dito (okay)
12 CTR#0 changing changing changing (okay)
13 CTR#1 changing changing changing (okay)
The Time Stamp Counter and the 3 Performance Monitoring related
registers change their values.
14 --- 0000:0000 dito dito (APIC?)
This register is not implemented in all iPentium processors. It
may be APIC related. (Just check, whether the iPentium includes
an APIC via the feature flag bits in EDX after CPUID level #1.)
My iPentium had none of its bits (reason: no integrated APIC).
15 --- MSR# * 2 dito + 40h dito + 40h
16 --- MSR# * 2 dito + 40h dito + 40h
17 --- MSR# * 2 dito + 40h dito + 40h
Maybe these MSRs are 'write only'?
18 --- unknown dito dito (4h,8h have been found)
Without a memory manager the value was 4h. When loading an EMM-
driver, then its value changed to 8h. A switch to the protected
mode only did not changed the value, but enabling the paging by
setting CR0.PG did.
19 --- 'read only' dito dito FP last prefetched OC
1A --- 'read only' dito dito FP last non-control OC
1B --- 'read/write' dito dito FP last exception OC
These MSRs provide access to the floating point unit's instruc-
tion stream. The first register contains the most-recently pre-
fetched FP opcode, while the second register contains the most-
recently executed non-control opcode (i.e. instructions such as
FSTENV or FRSTOR don't change the MSR). The third register con-
tains the opcode of the last non-control instruction encounte-
ring an exception, and it is a part of the environment accessed
through the FSTENV, FLDENV, FSAVE, and FRSTOR instructions. Any
value written to this MSR will appear in the opcode field of an
immediately following FSTENV or FSAVE environment image. All 3
registers consist of 11 bits, the high 3 bits of which are the
low 3 bits of the instruction's opcode, and the low 8 bits of
which are the 2nd byte of the floating-point instruction (there
is an ambiguity because FWAIT is stored in MSR #8000:0019h as
09Bh, as is the variant of FCOMP coded by D8h-9Bh). The most-
recently prefetched instruction needn't be the same as the most
recently executed instruction, the most recent instruction may
have been a control instruction (not stored in MSRs #8000:001Ah
or #8000:001Bh) or the processor may have branched to another
location before reaching the prefetched instruction [3].
1C --- unknown dito dito (0h,4h have been found)
1D --- 0000:0000 dito dito (bit#3-0 can be set)
This is the Probe Mode Control register, which normally is only
visible through an iPentium ICE (In-Circuit-Emulator) [4].
1E --- 0000:0000 dito dito (bit#31-0 can be set)
1F --- 0000:0000 dito dito (bit#31-0 can be set)
These MSRs are implemented. They seem to contain some hidden or
temporary registers, which indeed exist.
The timing
----------
I have done some timing for the RDMSR instruction. Only the MCA, TSC, CTR#0 or
CTR#1 accesses need 4 more clock cycles than all the other valid MSR accesses.
Indeed all other valid MSRs are 32 bit wide only...
The sources
-----------
[1] Pentium Processor Specification Update, release 6/95, order #242480-005
[2] 4P package v3.1.2 (released October 1st 1995, pointing to illegal MSRs)
[3] private eMail from Ralf Brown (ralf@pobox.com) to C. Ludloff
[4] private eMail from Robert Collins (rcollins@metronet.com) to C. Ludloff
This part owes a great deal to discussions with Ralf Brown and Robert Collins.
The events for the two iPentium counters #0 and #1
==================================================
------------------------------------------------------------------------------
bits no description
------------------------------------------------------------------------------
000000 00h data reads
000001 01h data writes
000010 02h data TLB misses
000011 03h data read misses
000100 04h data write misses
000101 05h writes (hits) to M or E state lines
000110 06h data cache lines written back
000111 07h external snoops
001000 08h data cache snoop hits
001001 09h memory accesses in both pipes
001010 0Ah bank conflicts
001011 0Bh misaligned data memory references
001100 0Ch code reads
001101 0Dh code TLB misses
001110 0Eh code cache misses
001111 0Fh any segment register loaded
010000 10h segment descriptor cache accesses
010001 11h segment descriptor cache hits
010010 12h branches
010011 13h BTB hits
010100 14h taken branches or BTB hits
010101 15h pipeline flushes
010110 16h instructions executed in both pipes
010111 17h instructions executed in the v-pipe
011000 18h clocks while bus cycle in progress (bus utilization)
011001 19h pipe stalled by full write buffers (writes backup)
011010 1Ah pipe stalled by waiting for data memory reads
011011 1Bh pipe stalled by writes to M or E lines
011100 1Ch locked bus cycles
011101 1Dh I/O read or write cycles
011110 1Eh non-cacheable memory references
011111 1Fh pipeline stalled by address generation interlock
100000 20h unknown, but counts
100001 21h unknown, but counts
100010 22h floating-point operations
100011 23h breakpoint matches on DR0 register
100100 24h breakpoint matches on DR1 register
100101 25h breakpoint matches on DR2 register
100110 26h breakpoint matches on DR3 register
100111 27h hardware interrupts
101000 28h data reads or data writes
101001 29h data read misses or data write misses
2Ah..3Fh reserved and unused (no counting)
------------------------------------------------------------------------------
It seems, that the list described above is not totally correct. We should test
every possible event now, because Intel has hidden some things here too.
The configuration registers on Cyrix processors
===============================================
Most Cyrix processors contain special registers, which can be accessed via I/O
operations on port 22h (command port) and 23h (data port). The following short
sequences should be used to read or write such a register:
READ: OUT 22h,reg# WRITE: OUT 22h,reg#
IN 23h,value OUT 23h,value
The Cyrix Cx486SLC/DLC and TI486 processors contain the following registers:
------------------------------------------------------------------------------
name reg# description
------------------------------------------------------------------------------
CCR0 C0h configuration control register #0 (=0h after reset)
bit7 SUSP - enable SUSPI# input pin and SUSPA# output pin
1=enabled, 0=disabled (=pins float)
bit6 CO - cache organisation
1=direct mapped, 0=2-way set assiociative
bit5 BARB - enable L1 cache flush when beginning HOLD state
1=enabled, 0=disabled
bit4 FLUSH - enable FLUSH# input pin
1=enabled, 0=disabled
bit3 KEN - enable KEN# input pin
1=enabled, 0=disabled
bit2 A20M - enable A20M# input pin
1=enabled, 0=disabled
bit1 NC1 - caching for 640K..1M area (bug in A4/A5-step?)
1=disabled (=never), 0=enabled (but see NCRx!)
bit0 NC0 - caching for 1M..1M+64K area (real and V86 mode)
1=disabled, 0=enabled
------------------------------------------------------------------------------
CCR1 C1h configuration control register #1 (=xxxxxxx0b after reset)
bit7..1 reserved
bit0 RPL - enable RPLSET# and RPLVAL# pins
1=enabled, 0=disabled (=pins float)
------------------------------------------------------------------------------
NCR1 C4..C6h non-cacheable region #1 (=0h,0h,0Fh after reset (on SLC))
NCR2 C7..C9h non-cacheable region #2 (=0h,0h,0h after reset)
NCR3 CA..CCh non-cacheable region #3 (=0h,0h,0h after reset)
NCR4 CD..CFh non-cacheable region #4 (=0h,0h,0h after reset)
+0h bit7..0 address bits A31..A24 of non-cacheable region start
(reserved on SLC, see value after reset)
+1h bit7..0 address bits A23..A16 of non-cacheable region start
+2h bit7..4 address bits A15..A12 of non-cacheable region start
bit3..0 size of non-cacheble block
0000=dis. 0100=32K 1000=512K 1100=8M
0001=4K 0101=64K 1001=1M 1101=16M
0010=8K 0110=128K 1010=2M 1110=32M
0011=16K 0111=256K 1011=4M 1111=4G
------------------------------------------------------------------------------
The Cyrix Cx486S/S2/D/D2/DX/DX2 processors contain the following registers:
------------------------------------------------------------------------------
name reg# description
------------------------------------------------------------------------------
CCR1 C1h configuration control register #1 (=0h after reset)
bit7..5 reserved
bit4 N_LOCK - negate LOCK#
1=enabled, 0=disabled
bit3 MMAC - enable main memory accesses when CCR1.SMAC=1
1=enabled, 0=disabled
bit2 SMAC - enable SMM memory accesses with SMAADS# active
1=enabled (SMI# ignored), 0=disabled
bit1 SMI - enable SMM pins (SMI# I/O pin and SMADS# output pin)
1=enabled, 0=disabled (=pins float)
bit0 RPL - enable RPLSET# and RPLVAL# pins
1=enabled, 0=disabled (=pins float)
------------------------------------------------------------------------------
CCR2 C2h configuration control register #2 (=0h after reset)
bit7 SUSP - enable SUSP# input pin and SUSPA# ouput pin
1=enabled, 0=disabled (=pins float)
bit6 BWRT - enable (16byte WB) burst write cycle
1=enabled, 0=disabled
bit5 BARB - enable cache coherency on bus arbitration
1=enable write back of all dirty cache data when HOLD is
requered and prior to asserting HLDA
0=disabled
bit4 WT1 - caching for 640K..1M area
1=force all writes to 640K..1M area that hit in cache
issued on the external bus
0=disabled
bit3 HALT - enable entering suspend mode on HLT inctructions
1=enabled, 0=disabled
bit2 LockNW - prohibits changing the state of the CR0.NW bit
1=enabled (=prohibited), 0=disabled (=allowed)
bit1 WBAK - enable WB cache pins (INVAL, WM_RST, HITM#)
1=enabled, 0=disabled (=pins float)
bit0 reserved
------------------------------------------------------------------------------
CCR3 C3h configuration control register #3 (=0h after reset)
(not on Cyrix Cx486S A-step processors but on newer Cx486SLC/DLC)
bit7..2 reserved
bit1 NMIEN - enable NMI during SMM
1=enabled, 0=disabled
bit0 SMI_LOCK - SMM register lock
1=CCR1.bit3..1 and CCR3.bit1 can't be changed in SMM;
CCR3.bit0 can be changed in SMM; only RESET clears it!
0=disabled
------------------------------------------------------------------------------
SMAR CD..CFh SMM address region (=0h,0h,0h after reset)
CDh bit7..0 address bits A32..A24 of SMM region start
CEh bit7..0 address bits A23..A16 of SMM region start
CFh bit7..4 address bits A15..A12 of SMM region start
bit3..0 size of SMM region
0000=dis. 0100=32K 1000=512K 1100=8M
0001=4K 0101=64K 1001=1M 1101=16M
0010=8K 0110=128K 1010=2M 1110=32M
0011=16K 0111=256K 1011=4M 1111=4G
------------------------------------------------------------------------------
DIR0 FEh device identification register #0
(not on Cyrix Cx486S A-step processors but on newer Cx486SLC/DLC)
bit7..0 processor model
00h - Cx486SLC 08h - Cx486SRu 1Ah - Cx486DX
01h - Cx486DLC 09h - Cx486DRu 1Bh - Cx486DX2
02h - Cx486SLC2 0Ah - Cx486SRu2 1Fh - Cx486DX4
03h - Cx486DLC2 0Bh - Cx486DRu2 2xh - Cyrix 5x86
04h - Cx486SRx 10h - Cx486S 3xh - Cyrix 6x86
05h - Cx486DRx 11h - Cx486S2
06h - Cx486SRx2 12h - Cx486Se FFh - probably not a
07h - Cx486DRx2 13h - Cx486S2e Cyrix processor
-------------------------------------------------------------------
28h/2Ah - Cyrix 5x86 1x clock mode The first value indicates a
29h/2Bh - Cyrix 5x86 2x clock mode Cyrix 5x86 / 6x86 processor
2Dh/2Fh - Cyrix 5x86 3x clock mode "S"-part, and the second is
2Ch/2Eh - Cyrix 5x86 4x clock mode an indicator for a "P" part
------------------------------------ processor. Even an engineer
30h/32h - Cyrix 6x86 1x clock mode from Cyrix had no idea what
31h/33h - Cyrix 6x86 2x clock mode the difference is.
35h/37h - Cyrix 6x86 3x clock mode
34h/36h - Cyrix 6x86 4x clock mode
------------------------------------------------------------------------------
DIR1 FFh device identification register #1
(not on Cyrix Cx486S A-step processors but on newer Cx486SLC/DLC)
bit7..4 processor stepping (0..Fh)
bit3..0 processor revision (0..Fh)
------------------------------------------------------------------------------
The Cyrix and IBM 5x86 processors contains the following registers:
------------------------------------------------------------------------------
name reg# description
------------------------------------------------------------------------------
CCR1 C1h configuration control register #1 (=0h after reset)
bit7..4 reserved
bit3 MMAC - enable main memory accesses when CCR1.SMAC=1
1=enabled, 0=disabled
bit2 SMAC - enable SMM memory accesses with SMAADS# active
1=enabled (SMI# ignored), 0=disabled
bit1 SMI - enable SMM pins (SMI# I/O pin and SMADS# output pin)
1=enabled, 0=disabled (=pins float)
bit0 reserved
------------------------------------------------------------------------------
CCR2 C2h configuration control register #2 (=0h after reset)
bit7 SUSP - enable SUSP# input pin and SUSPA# ouput pin
1=enabled, 0=disabled (=pins float)
bit6 BWRT - enable (16byte WB) burst write cycle
1=enabled, 0=disabled
bit5 reserved
bit4 WT1 - caching for 640K..1M area
1=force all writes to 640K..1M area that hit in cache
issued on the external bus
0=disabled
bit3 HALT - enable entering suspend mode on HLT inctructions
1=enabled, 0=disabled
bit2 LockNW - prohibits changing the state of the CR0.NW bit
1=enabled (=prohibited), 0=disabled (=allowed)
bit1 WBAK - enable WB cache pins (INVAL, WM_RST, HITM#)
1=enabled, 0=disabled (=pins float)
bit0 reserved
------------------------------------------------------------------------------
CCR3 C3h configuration control register #3 (=0h after reset)
bit7..4 MAPEN - select active control register set for D0h..FDh
0001=default (others are not valid at the moment)
bit3 SMIACT - enable Intel compatible SMM (i486SL?)
1=enabled, 0=disabled
bit2 LINBRST - enable linear address sequence for burst cycles
1=enabled, 0=disabled
bit1 NMIEN - enable NMI during SMM
1=enabled, 0=disabled
bit0 SMI_LOCK - SMM register lock
1=CCR1.bit3..1 and CCR3.bit1 can't be changed in SMM;
CCR3.bit0 can be changed in SMM; only RESET clears it!
0=disabled
------------------------------------------------------------------------------
CCR4 E8h configuration control register #4 (set CCR3.MAPEN=0001 before)
bit7 CPUID
1=enable EFLAGS.bit21 and CPUID instruction
0=disable EFLAGS.bit21 and CPUID instruction
bit6 reserved
bit5 FP_FAST - enable fast FPU exception reporting
1=enabled, 0=disabled
bit4 DTE_EN - enable directory table entry cache
1=enabled, 0=disabled
bit3 MEM_BYP - enable memory bypassing
1=enabled, 0=disabled
bit2..0 IORT - I/O recovery time
xxx=2^0..7 bus clock cycles
------------------------------------------------------------------------------
PMR F0h power management register (set CCR3.MAPEN=0001 before)
bit7 SMCC - self modifying code checking
1=disabled, 0=enabled
bit6..3 reserved
bit2 CCLK - core clock
1=1/2external bus clock, if bus is idle, 0=normal
bit1..0 clock mode core/bus
11=reserved (4:1?), 10=3:1, 01=2:1, 00=1:1
------------------------------------------------------------------------------
PCR 20h performance control register (set CCR3.MAPEN=0001 before)
bit7 LSO - load/store ordering
1=strong, 0=weak
bit6 BTBTR - enable BTB test register
1=enabled, 0=disabled
bit5 reserved
bit4 MLR - enable reordering of misaligned loads
1=enabled, 0=disabled
bit3 AIS - enable all instructions stalled to serialize pipe
1=enabled, 0=disabled
bit2 LOOP - enable loopmode
1=enabled, 0=disabled
bit1 BTB - enable BTB
1=enabled, 0=disabled
bit0 RS - enable return stack
1=enabled, 0=disabled
------------------------------------------------------------------------------
??? 60h unknown existing register
??? 61h unknwon existing register
------------------------------------------------------------------------------
SMAR CD..CFh SMM address region (see description above!)
------------------------------------------------------------------------------
DIR0 FEh device identification register #0 (see description above!)
DIR1 FFh device identification register #1 (see description above!)
A DIR1 value of 13h indicates the revision 1.30, as 15h indicates a
revision 1.50 processor. I don't know how the sub-stepping (so i.e.
1.41 or 1.42) can be differed. Do you? BTW: Why do I believe that a
substepping like 1.41 or 1.42 exists? Because I have a document for
the 5x86 processor, containing exactly this information.
------------------------------------------------------------------------------
The Cyrix and IBM 6x86 processors contains the following registers:
------------------------------------------------------------------------------
CCR0 C0h configuration control register #0 (=0h after reset)
bit7..2 reserved
bit1 NC1 - caching for 640K..1M area
1=disabled (=never), 0=enabled
bit0 reserved
------------------------------------------------------------------------------
CCR1 C1h configuration control register #1 (=0h after reset)
bit7 SM3 - SMM address space address region register #3
1=enable address region register #3 for SMM addr. space
0=disabled (see also CCR5.ARREN, independent!)
bit6..4 reserved
bit4 N_LOCK - negate LOCK#
1=enabled, 0=disabled
bit3 reserved
bit2 SMAC - enable SMM memory accesses with SMAADS# active
1=enabled (SMI# ignored), 0=disabled
bit1 SMI - enable SMM pins (SMI# I/O pin and SMADS# output pin)
1=enabled, 0=disabled (=pins float)
bit0 reserved
------------------------------------------------------------------------------
CCR2 C2h configuration control register #2 (=0h after reset)
bit7 SUSP - enable SUSP# input pin and SUSPA# ouput pin
1=enabled, 0=disabled (=pins float)
bit6..5 reserved
bit4 WT1 - caching for 640K..1M area
1=force all writes to 640K..1M area that hit in cache
issued on the external bus
0=disabled
bit3 HALT - enable entering suspend mode on HLT inctructions
1=enabled, 0=disabled
bit2 LockNW - prohibits changing the state of the CR0.NW bit
1=enabled (=prohibited), 0=disabled (=allowed)
bit1..0 reserved
------------------------------------------------------------------------------
CCR3 C3h configuration control register #3 (=0h after reset)
bit7..4 MAPEN - select active control register set for D0h..FDh
0001=default (others are not valid at the moment)
bit3 reserved
bit2 LINBRST - enable linear address sequence for burst cycles
1=enabled, 0=disabled
bit1 NMIEN - enable NMI during SMM
1=enabled, 0=disabled
bit0 SMI_LOCK - SMM register lock
1=CCR1.bit3..1 and CCR3.bit1 can't be changed in SMM;
CCR3.bit0 can be changed in SMM; only RESET clears it!
0=disabled
------------------------------------------------------------------------------
CCR4 E8h configuration control register #4 (set CCR3.MAPEN=0001 before)
bit7 CPUID
1=enable EFLAGS.bit21 and CPUID instruction
0=disable EFLAGS.bit21 and CPUID instruction
bit6..5 reserved
bit4 DTE_EN - enable directory table entry cache
1=enabled, 0=disabled
bit3 reserved
bit2..0 IORT - I/O recovery time
xxx=2^0..7 bus clock cycles
------------------------------------------------------------------------------
CCR5 E9h configuration control register #5 (set CCR3.MAPEN=0001 before)
bit7..6 reserved
bit5 ARREN - address region registers enabled
1=enabled, 0=disabled (see also CCR1.SM3, independent!)
bit4 LBR1 - LBR# pin
1=assert LBR# for all accesses to 640K-1M, 0=disabled
bit3..1 resreved
bit0 WT_ALLOC - WT allocation
1=allocate new cache lines for read and write misses
0=allocate new cache lines for read misses only
------------------------------------------------------------------------------
ARR0 C4..C6h address region register #0
ARR1 C7..C9h address region register #1
ARR2 CA..CCh address region register #2
ARR3 CD..CFh address region register #3
ARR4 D0..D2h address region register #4 (set CCR3.MAPEN=0001 before)
ARR5 D3..D5h address region register #5 (set CCR3.MAPEN=0001 before)
ARR6 D6..D8h address region register #6 (set CCR3.MAPEN=0001 before)
ARR7 D9..DBh address region register #7 (set CCR3.MAPEN=0001 before)
+0h bit7..0 address bits A31..A24 of region start
+1h bit7..0 address bits A23..A16 of region start
+2h bit7..4 address bits A15..A12 of region start
bit3..0 size of non-cacheble block for ARR0..ARR6
0000=dis. 0100=32K 1000=512K 1100=8M
0001=4K 0101=64K 1001=1M 1101=16M
0010=8K 0110=128K 1010=2M 1110=32M
0011=16K 0111=256K 1011=4M 1111=4G
bit3..0 size of non-cacheble block for ARR7
0000=dis. 0100=2M 1000=32M 1100=512M
0001=256K 0101=4M 1001=64M 1101=1G
0010=512K 0110=8M 1010=128M 1110=2G
0011=1M 0111=16M 1011=256M 1111=4G
------------------------------------------------------------------------------
RCR0 DCh region control register #0 (set CCR3.MAPEN=0001 before)
RCR1 DDh region control register #1 (set CCR3.MAPEN=0001 before)
RCR2 DEh region control register #2 (set CCR3.MAPEN=0001 before)
RCR3 DFh region control register #3 (set CCR3.MAPEN=0001 before)
RCR4 E0h region control register #4 (set CCR3.MAPEN=0001 before)
RCR5 E1h region control register #5 (set CCR3.MAPEN=0001 before)
RCR6 E2h region control register #6 (set CCR3.MAPEN=0001 before)
RCR7 E3h region control register #7 (set CCR3.MAPEN=0001 before)
bit7..6 reserved
bit5 NLB - negate LBA#
1=enabled, 0=disabled
bit4 WT - write through caching
1=enabled, 0=disabled
bit3 WG - write gathering
1=enabled, 0=disabled
bit2 WL - weak locking
1=enabled, 0=disabled
bit1 WWO - weak write ordering
1=enabled, 0=disabled
bit0 RCD - cache disabled region (for RCR0..6 only)
1=enabled, 0=disabled
RCE - cache enabled region (for RCR7 only)
1=enabled (implies that the address space outside of the
region specified by ARR7 is non-cacheable), 0=disabled
------------------------------------------------------------------------------
DIR0 FEh device identification register #0 (see description above!)
DIR1 FFh device identification register #1 (see description above!)
------------------------------------------------------------------------------
The new instructions
====================
i486: The newer processors with "&" printed on the package will support the
CPUID-flag in EFLAGS, the CPUID instruction, the CR4 register bits1/0
and instructions for access to the CR4 register, the enhanced virtual
mode, the system management mode SMM and the RSM instruction. The new
i486DX2WB processor supports the 4MB-pages too. If this CPU runs with
writeback mode, then the CPUID value is '0470'. If it is running with
writethrough mode, then you receive the value '0436'. The real mask-
revision (stepping) you will get only after the processor reset!
Pentium: The iPentium processors support all the news listed above and the new
instructions listed below.
PentPro: The iPentiumPro processors support all the news listed above and some
new instructions listed below.
UMC,AMD: The UMC U5S and U5D, the AMD enhanced DX2/DX4 processors and newer Nx
NexGen, 586/686 CPUs support the CPUID instruction. The Nx586 doesn't support
Cyrix the CPUID bit #21 in EFLAGS. The Cyrix 5x86/6x86 processors support a
CPUID instruction and the EFLAGS bit, but only if CCR4.bit7 is set to
one. Please, refer to the Cyrix control register description. Neither
the Cyrix 5x86, nor the Cyrix 6x86 support other features reported by
a CPUID feature flag field, than the FPU (no enhanced V86 mode etc.).
IBM: The IBM 386/486SLC and the IBM 486BL3 'Blue Lightning' processors are
supporting some MSRs (see above) and the instructions to use them.
------------------------------------------------------------------------------
name opcodes description
------------------------------------------------------------------------------
CPUID 0F A2 CPU identification
in: EAX=0 get max. identification level and vendor
out: EAX=1/2 max. identification level is 1 or 2 now
EBX-EDX-ECX vendor identification
'GenuineIntel' - Intel i486, iPentium or iPentiumPro
'UMC UMC UMC ' - UMC U5S or U5D processor
'AuthenticAMD' - AMD 486DX2 or DX4 (enh.) processor
'CyrixInstead' - Cyrix 6x86 processor
'NexGenDriven' - NexGen Nx586 or Nx686 processor
in: EAX=1 get chip type and the supported features
out: EAX=0:TFMS CPU type (type, family, model, stepping)
type The type is encoded in the bits13/12.
00=1st dual iPentium CPU (iP54C)
01=iPentium OverDrive processor
10=2nd dual iPentium CPU (iP54C)
11=reserved
family 4=486, 5=iPentium, 6=iPentiumPro
model Intel486: 0=DX, 1=DX50, 2=SX, 3=DX2,
4=SL, 5=SX2, 7=DX2WB, 8=DX4,
9=DX4WB
UMC486: 1=U5D, 2=U5S
AMD486: 3=DX2, 7=DX2WB, 8=DX4, 9=DX4WB
E=X5WT, F=X5WB
Cyrix: 9=Cyrix 5x86
iPentium: 0=5V-60/66 MHz A-step chips,
1=5V-60/66 MHz, 2=3.3V-75/90/
100/120/133MHz, 3=P24T, 4=OvDr
for iPentium-3.3V, 5=OvDr for
iDX4, 6=OvDr for iPentium-5V
Nx586: 0=newer Nx586 or Nx586FPU
Cyrix: 3=Cyrix 6x86
iPentPro: 0=iPentiumPro A-step chips,
1=iPentiumPro, 4=P55CT iP54C
socket OverDrive (droped?)
stepping steppings sometimes cover several masks
comment iPentium-5V: no fDIVbug since step no.7
iPentium-3V: no fDIVbug since step no.4
EDX=flags supported features (i486, iPentium, iP6)
bit31..16 reserved (=0)
bit15=1 CMOVcc (and FCMOVcc/FCOMI) supported
bit14=1 machine check architecture supported
bit13=1 page global enable supported
bit12=1 memory type range registers supported
bit11=0 reserved
bit10=0 reserved
bit9=1 CPU contains an enabled local APIC
bit8=1 CMPXCHG8B instruction supported
bit7=1 machine check exception supported
bit6=1 physical address extension supported
bit5=1 iPentium-style MSRs supported
bit4=1 time stamp counter TSC supported
bit3=1 page size extensions supported
bit2=1 I/O breakpoints supported
bit1=1 enhanced virtual 8086 mode supported
bit0=1 CPU contains a floating-point unit (FPU)
comment At the moment all Intel clones support a
FPU presence bit only (bit0), because no
clone supports other listed features.
in: EAX=2 get cache configuration descriptors
out: AL=01h configuration descriptors are valid
AL<>1 reserved for future use
EAX..EDX 4x4 8bit configuration descriptors
00h=null descriptor (=unused descriptor)
01h=code TLB, 4K pages, 4 ways, 64 entries
02h=code TLB, 4M pages, 4 ways, 4 entries
03h=data TLB, 4K pages, 4 ways, 64 entries
04h=data TLB, 4M pages, 4 ways, 8 entries
06h=code L1 cache, 8KB, 4 ways, 32 byte lines
0Ah=data L1 cache, 8KB, 2 ways, 32 byte lines
41h=c+d L2 cache, 128KB, 4 ways, 32 byte lines
42h=c+d L2 cache, 256KB, 4 ways, 32 byte lines
43h=c+d L2 cache, 512KB, 4 ways, 32 byte lines
xxh=other values are reserved for future use
A descriptor is only valid if its highest bit is 0!
EAX=03020101h on an iPentiumPro (example)
EBX=00000000h on an iPentiumPro (example)
ECX=00000000h on an iPentiumPro (example)
EDX=06040A42h on an iPentiumPro (example)
Because AL is 01h, the descriptors are valid. All of
the descriptors are valid, because their highest bit
is 0. This iPentiumPro includes the 4K/M c/d TLB, an
8+8 KB c/d L1 cache and a 256 KB c+d L2 cache.
in: EAX>maximum max. supported CPUID level can be higher
than the max. returned level from CPUID,
so hidden levels are not impossible now!
out: undefined EAX, EBX, ECX, EDX values are undefined
info: can be used in all CPLs; serializes the pipelines; the
A-step iPentiums did not support several CPUID levels
and they show EAX=FMS and EBX-EDX-ECX=vendor only! (so
they seem to provide more than 500h CPUID levels); bug
in i486DX2 processor? (level #2..7FFFFFFFh=zero, level
#80000000..FFFFFFFFh=as level #1; has no side effect),
this bug is not present in the i486DX2WB processor
------------------------------------------------------------------------------
RDMSR 0F 32 read a model specific register value
in: ECX number of the MSR
out: EDX:EAX value of the MSR (64 bit wide, filled with 0)
clks: 24 (MCA, TSC, C#0, C#1) or 20 (other MSRs) (iPentium)
info: instruction can only be used when CPL=0 (but many EMMs
do allow the usage from CPL>0 without problems; if the
instruction is used in a Windows 3.1 DOS-box, then the
DOS-session will be 'crashed' due to an opcode error)
------------------------------------------------------------------------------
WRMSR 0F 30 write a value to a model specific register
in: ECX number of the MSR
EDX:EAX value (64 bit wide, filled with 0)
clks: 30-45 (iPentium)
info: instruction can only be used when CPL=0 (but some EMMs
like QEMM 7.04 do allow the usage from CPL>0)
------------------------------------------------------------------------------
RDTSC 0F 31 read time stamp counter value
out: EDX:EAX time stamp counter value (64 bit wide)
clks: 6 (iPentium, CPL=0), 11 (iPentium, CPL=1-3)
info: instruction can be disabled for CPL=1..3 via CR4.TSD
------------------------------------------------------------------------------
RDPMC 0F 33 read performance monitoring counter (iPentiumPro only)
in: ECX number of the counter (supported: 0 or 1)
out: EDX:EAX performance monitoring counter value (64 bit)
info: instruction can be enabled for CPL=1..3 via CR4.PCE
------------------------------------------------------------------------------
CMPXCHG8B 0F C7 compare & exchange 64 bits, similar to CMPXCHG
RSM 0F AA resume from system management mode (only in SMM!)
MOV EAX,CR4 0F 20 E0 read the CR4 register value
MOV CR4,EAX 0F 22 E0 write a value to the CR4 register
------------------------------------------------------------------------------
CMOVcc 0F 40-4F supported by iPentiumPro processors, similar to 70-7F
FCMOVcc, FCOMI supported by iPentiumPro processors with a FPU
------------------------------------------------------------------------------
The iPentiumPro also supports the new opcodes 0Fh,18-1Fh and 0Fh,34-35h.
------------------------------------------------------------------------------
The MOV ...,TRxh and MOV TRxh,... instructions are not longer supported by the
iPentium/Pro processors, because the Test Registers were placed into the MSRs.
The iPentium and iPentiumPro stepping values
============================================
Intel Pentium P5 processor
------------------------------------------------------------------------------
type family model step mask clock SX-no Vcc in V °C note
------------------------------------------------------------------------------
0 5 1 3 B1 50/50 Q0399 4.75-5.25 85 1,2
0 5 1 3 B1 60/60 Q0352 4.75-5.25 85 1
0 5 1 3 B1 60/60 Q0400 4.75-5.25 75 1,2
0 5 1 3 B1 60/60 Q0394 4.75-5.25 80 2,3
0 5 1 3 B1 66/66 Q0353 4.90-5.25 75 1
0 5 1 3 B1 66/66 Q0395 4.90-5.25 70 2,3
0 5 1 3 B1 60/60 Q0412 4.75-5.25 85 1
0 5 1 3 B1 60/60 SX753 4.75-5.25 85 1
0 5 1 3 B1 66/66 Q0413 4.90-5.40 75 1
0 5 1 3 B1 66/66 SX754 4.90-5.40 75 1,4
------------------------------------------------------------------------------
0 5 1 5 C1 60/60 Q0466 4.75-5.25 80 3
0 5 1 5 C1 60/60 SX835 4.75-5.25 80 3
0 5 1 5 C1 60/60 SZ949 4.75-5.25 80 3,5
0 5 1 5 C1 66/66 Q0467 4.90-5.40 70 3
0 5 1 5 C1 66/66 SX837 4.90-5.40 70 3
0 5 1 5 C1 66/66 SZ950 4.90-5.40 70 3,5
------------------------------------------------------------------------------
0 5 1 7 D1 60/60 Q0625 4.75-5.25 80 3
0 5 1 7 D1 60/60 SX948 4.75-5.25 80 3
0 5 1 7 D1 60/60 SX974 5.15-5.40 70 3
0 5 1 7 D1 60/60 ----- 4.75-5.25 80 3,5,6
0 5 1 7 D1 66/66 Q0626 4.90-5.40 70 3
0 5 1 7 D1 66/66 SX950 4.90-5.40 70 3
0 5 1 7 D1 66/66 Q0627 5.15-5.40 70 3
0 5 1 7 D1 66/66 SX949 5.15-5.40 70 3
0 5 1 7 D1 66/66 ----- 4.90-5.40 70 3,5,6
------------------------------------------------------------------------------
1: non-heat spreader package
2: engineering samples only
3: heat spreader package
4: 66 MHz B1 shipped after work week 34 of 1993 were tested to Vcc=4.90-5.40V
5: boxed iPentium processor
6: not marked with a S-spec number
Intel Pentium P54 processor
------------------------------------------------------------------------------
type family model step mask clock SX-no comment
------------------------------------------------------------------------------
0 5 2 1 B1 75/50 Q0540 ES
0 5 2 1 B1 75/50 Q0541 ES
0 5 2 1 B1 90/60 Q0542 STD
0 5 2 1 B1 90/60 Q0613 VR
0 5 2 1 B1 90/60 Q0543 DP
0 5 2 1 B1 100/66 Q0563 STD
0 5 2 1 B1 100/66 Q0587 VR
0 5 2 1 B1 100/66 Q0614 VR
0 5 2 1 B1 75/50 Q0601 TCP
0 5 2 1 B1 90/60 SX879 STD
0 5 2 1 B1 90/60 SX885 MD
0 5 2 1 B1 90/60 SX909 VR
0 5 2 1 B1 90/60 SX874 DP,STD
0 5 2 1 B1 100/66 SX886 MD
0 5 2 1 B1 100/66 SX910 VR,MD
------------------------------------------------------------------------------
0 5 2 2 B3 90/60 Q0628 STD
0/2 5 2 2 B3 90/60 Q0611 STD
0/2 5 2 2 B3 90/60 Q0612 VR
0 5 2 2 B3 100/66 Q0677 VRE,MD
0 5 2 2 B3 75/50 Q0606 TCP
0 5 2 2 B3 75/50 SX951 TCP
0 5 2 2 B3 90/60 SX923 STD
0 5 2 2 B3 90/60 SX922 VR
0 5 2 2 B3 90/60 SX921 MD
2 5 2 2 B3 90/60 SX942 DP,STD
2 5 2 2 B3 90/60 SX943 DP,VR
2 5 2 2 B3 90/60 SX944 DP,MD
0 5 2 2 B3 90/50 SZ951 STD,#5
0 5 2 2 B3 100/66 SX960 VRE,MD
------------------------------------------------------------------------------
0/2 5 2 4 B5 75/50 Q0704 TCP
0/2 5 2 4 B5 75/50 Q0666 STD
0/2 5 2 4 B5 90/60 Q0653 STD
0/2 5 2 4 B5 90/60 Q0654 VR
0/2 5 2 4 B5 90/60 Q0655 MD
0/2 5 2 4 B5 100/66 Q0656 MD
0/2 5 2 4 B5 100/66 Q0657 VR,MD
0/2 5 2 4 B5 100/66 Q0658 VRE,MD
0/2 5 2 4 B5 120/60 Q0707 VRE,MD,#1
0/2 5 2 4 B5 120/60 Q0708 STD,#1
0/2 5 2 4 B5 75/50 SX975 TCP
0/2 5 2 4 B5 75/50 SX961 STD
0/2 5 2 4 B5 75/50 SZ977 STD,#5
0/2 5 2 4 B5 90/60 SX957 STD
0/2 5 2 4 B5 90/60 SX958 VR
0/2 5 2 4 B5 90/60 SX959 MD
0/2 5 2 4 B5 90/60 SZ978 STD,#5
0/2 5 2 4 B5 100/66 SX962 VRE,MD
------------------------------------------------------------------------------
0/2 5 2 5 C2 75/50 Q0725 TCP
0/2 5 2 5 C2 75/50 Q0700 STD
0/2 5 2 5 C2 75/50 Q0749 MD
0/2 5 2 5 C2 90/60 Q0699 STD
0/2 5 2 5 C2 100/50,66 Q0698 VRE,MD
0/2 5 2 5 C2 100/50,66 Q0697 STD
0/2 5 2 5 C2 120/60 Q0711 VRE,MD
0/2 5 2 5 C2 120/60 Q0732 VRE,MD
0/2 5 2 5 C2 133/66 Q0733 MD
0/2 5 2 5 C2 133/66 Q0751 MD
0/2 5 2 5 C2 133/66 Q0775 VRE,MD
0/2 5 2 5 C2 75/50 SK079 TCP
0/2 5 2 5 C2 75/50 SX969 STD
0/2 5 2 5 C2 75/50 SX998 MD
0/2 5 2 5 C2 75/50 SZ994 STD,#5
0/2 5 2 5 C2 90/60 SX968 STD
0/2 5 2 5 C2 90/60 SZ995 STD,#5
0/2 5 2 5 C2 90/60 SU031 STD,#6
0/2 5 2 5 C2 100/50,66 SX970 VRE,MD
0/2 5 2 5 C2 100/50,66 SX963 STD
0/2 5 2 5 C2 100/50,66 SZ996 STD,#5
0/2 5 2 5 C2 100/66,50 SU032 STD,#6
0/2 5 2 5 C2 120/60 SK086 VRE,MD
0/2 5 2 5 C2 120/60 SX994 VRE,MD
0/2 5 2 5 C2 120/60 SU033 VRE,MD,#6
0/2 5 2 5 C2 133/66 SK098 MD
0/2 5 2 5 C2 133/66 SK103 VRE,MD
------------------------------------------------------------------------------
0 5 2 5 mA1 75/50 Q0686 VRT,TCP,#4
0 5 2 5 mA1 75/50 Q0689 VRT,SPGA,#4
0 5 2 5 mA1 90/60 Q0694 VRT,TCP,#4
0 5 2 5 mA1 90/60 Q0695 VRT,SPGA,#4
0 5 2 5 mA1 75/50 SK089 VRT,TCP,#4
0 5 2 5 mA1 75/50 SK091 VRT,SPGA,#4
0 5 2 5 mA1 90/60 SK090 VRT,TCP,#4
0 5 2 5 mA1 90/60 SK092 VRT,SPGA,#4
------------------------------------------------------------------------------
0/2 5 2 B cB1 120/60 Q0776 STD,no kit,#3,#4
0/2 5 2 B cB1 133/66 Q0772 STD,no kit,#3,#4
0/2 5 2 B cB1 133/66 Q0773 STD,#4
0/2 5 2 B cB1 133/66 Q0774 VRE,MD,no kit,#3,#4
0/2 5 2 B cB1 120/60 SK110 STD,no kit,#3,#4
0/2 5 2 B cB1 133/66 SK106 STD,no kit,#3,#4
0/2 5 2 B cB1 133/66 SK106J STD,no kit,#3,#4,#7
0/2 5 2 B cB1 133/66 SK107 STD,#4
0/2 5 2 B cB1 133/66 SU038 STD,no kit,#3,#4,#6
------------------------------------------------------------------------------
0 5 2 B mcB1 120/60 Q0779 VRT,TCP,#4
0 5 2 B mcB1 120/60 Q0808 3.3V,SPGA,#4
0 5 2 B mcB1 120/60 SK113 VRT,TCP,#4
0 5 2 B mcB1 120/60 SK118 VRT,TCP,#4,#7
0 5 2 B mcB1 120/60 SX999 3.3V,SPGA,#4
------------------------------------------------------------------------------
0/2 5 2 C cC0 150/60 Q0835 STD
0/2 5 2 C cC0 166/66 Q0836 VRE,no kit,#3
0/2 5 2 C cC0 166/66 Q0841 VRE/STD
0/2 5 2 C cC0 150/60 SY015 STD
0/2 5 2 C cC0 166/66 SY016 VRE,no kit,#3
0/2 5 2 C cC0 166/66 SY017 VRE/STD
------------------------------------------------------------------------------
STD : Vcc=3.135-3.465V DP : dual processor
VR : Vcc=3.300-3.465V MD : modified timing
VRE : Vcc=3.450-3.600V ES : engineering sample
VRT : see #2
TCP : TCP package
SPGA : SPGA package
#1 : Tcase max. 60°C
#2 : VRT Intel's Voltage Reduction Technology: Vcc for I/O is 3.3V, core Vcc
(accounting for about 90% of power usage) is reduced to 2.9V, to reduce
power consumption and heating
#3 : that part meets the EDS specifications but is not tested to support the
82498/82493 and 82497/82492 cache timings
#4 : cB1 stepping is logically equivalent to the C2 step, but on a different
manufacturing process; mcB1 stepping is logically equivalent to the cB1
step (except it does not support DP, APIC or FRC); mcB1 or mA1 step use
VRT (see #2) and are available in the TCP and SPGA package primarily to
support mobile applications; these steppings are distinguished by this
additional "m" prefix, for "mobile"
#5 : boxed iPentium processor without the attached fan heatsink
#6 : boxed iPentium processor with an attached fan heatsink
#7 : this part does not support boundary scan
Intel Pentium OverDrive P24T processor
------------------------------------------------------------------------------
type family model step mask clock SX-no comment
------------------------------------------------------------------------------
1 5 3 1 B1 63/25 SZ953 version 1.0
1 5 3 1 B2 63/25 SZ990 version 1.1
1 5 3 2 C0 83/33 SU014 version 2.1
------------------------------------------------------------------------------
Intel PentiumPro P6 processor
------------------------------------------------------------------------------
type family model step mask clock SX-no Vcc °C notes
------------------------------------------------------------------------------
0 6 1 1 B0 150/60 SY002 3.1V 0-85 #1
0 6 1 1 B0 150/60 SY011 3.1V 0-85
0 6 1 1 B0 150/60 SY014 3.1V 0-85
------------------------------------------------------------------------------
0 6 1 2 C0 150/60 SY010 3.1V 0-85
------------------------------------------------------------------------------
0 6 1 6 sA0 180/60 SY012 3.3V 0-85 #2
0 6 1 6 sA0 200/66 SY013 3.3V 0-85 #2
0 6 1 6 sA0 166/60 SY024 3.3V 0-85 #2,#3
0 6 1 6 sA0 200/66 SY025 3.3V 0-85 #2,#3
------------------------------------------------------------------------------
#1 : The VID pins are not supported on these parts.
#2 : The sA0 stepping is logically equivalent to the C0 stepping (shrinked).
#3 : These parts are equipped with a 512KB L2 cache.
The (known) iPentium and iPentiumPro bugs
=========================================
Intel Pentium processors
------------------------------------------------------------------------------
P5 P54C P24T <-- the 1st columns indicate the affected iPentium steppings
BCD BBBCABBC BBC P5=B1/C1/D1; P54=B1/B3/B5/C2/mA1/cB1/mcB1/cC0; P24T=B1/B2/C0
111 13521110 120 errata descriptions; see Intel order #242480 for all details
------------------------------------------------------------------------------
E.. ........ ... BOFF# hold timing
E.. ........ ... incomplete initialization may flush the internal pipeline
E.. ........ ... IV pin may not be asserted under certain conditions
E.. ........ ... testability writes to data TLB may store wrong parity
E.. ........ ... LRU bits in the data cache TLBs are updated incorrectly
E.. ........ ... a replacement writeback cycle may invade a locked seqeunce
E.. ........ ... RUNBIST instruction generates incorrect BIST signature
EE. ........ ... data BP mistakenly remembered on a faulty instruction
EEE ........ ... RESET affects RUNBIST instruction execution in boundary scan
EE. EEE..... EEE locked operation during instr. exec tracing may hang CPU
EE. EEE..... EEE BP or single-step may be missed for one instr. after STI
EE. ........ ... internal snoop problem due to reflection on address bus
EE. ........ ... internal parity error on uninitialized data cache entry
EE. EEE..... EEE missing shutdown after an IERR#
EE. E....... ... processor core may not serialize on bus idle
EE. EEEEEE.. EEE SMIACT# assertion during replacement writeback cycle
EEE EEE..... ... overflow undetected on some number on FIST
EEE EEE..... ... six operands result in unexpected FIST operation
EE. E....... ... snoop with tablewalk violation may not invalid. snooped line
EE. EE...... ... FDIV bug (Intel: 'slight precision loss')
EEE ........ ... power-up BIST failure
EEE EEE..... EEE FLUSH#, INIT or MCE dropped due to floating-point exception
EEE EEEEEE.E EEE floating point operations may clear alignment check bit (AC)
EEE EEEEEE.E EEE CMPXCHG8B accross page bound. may cause invalid opcode exc.
EEE EEE..... EEE single step debug exception breaks out of HALT
EEE EEEEEEE. EEE EIP altered after specific FP oper. followed by MOV Sreg,Reg
EEE EEEEEEEE EEE WRMSR into illegal MSR does not generate GP fault
EEE EEE..... EEE inconsist. data cache state from concurr. snoop/memory write
EEE EEEEEEEE EEE incorrect FIP after RESET
EEE EEEEEEEE EEE second assertion of FLUSH# not ignored
EEE EEEEEEEE EEE segment limit violation by FPU operand may corrupt FPU state
EEE EEEEEEEE EEE FP exception inside SMM with pending NMI hangs system
EEE EEEEEEE. ... incorrect decode of certain 0F instructions
EEE EEEEEEEE EEE data breakpoint deviations
EEE EEEEEEEE EEE event monitor discrepancies
EEE EEEEEEEE EEE VERR type instr. causing PGF TSW with T=1 may corrupt CS:EIP
EEE EEEEEEEE ... BUSCHK# interrupt has wrong priority
EEE EEEEEEEE EEE fault causing a page fault can execute instructions twice
EEE EEEEEEEE ... MCE pending, then HLT, can incorrect/skip instr. or hang
EEE EEEEEEEE EEE FBSTP stores BCD incorrectly if address wrap and FPU error
EEE EEEEEEEE EEE V86 int routine at illegal CPL causes spurious pushes
EEE EEEEEEEE EEE corrupted HLT flag can incorrect/skip instructions or hang
EEE EEEEEEEE EEE benign exceptions can erronemously cause double fault
EEE EEEEEEEE EEE double fault counter may not increment correctly
... ....E.E. ... input pins may float hi if core Vcc powers up after I/O Vcc
EEE EEEEEEEE EEE short form of MOV EAX/AX/AL may not pair
EEE EEEEEEEE EEE turning off paging may result in prefetch to random location
... EEE..... EEE no I/O restart during single-stepping or data BP exceptions
... EEE..... EEE NMI or INIT in SMM with I/O restart during single-stepping
... EEE..... EEE SMI# and FLUSH# during shutdown
... EEE..... EEE FLUSH# with a breakpoint pending causes false DR6 values
... EEEEEEEE EEE STPCLK# deassertion not recognized for 5 CLKs after BRDY#
... EEE..... ... future Pentium OvDr CPU FERR# contention in 2-socket systems
... E....... ... code cache lines not invalidated if snooped on AutoHALT/stop
... E....... ... STPCLK# assertion during HALT instruction hangs system
... EEEEEEEE EEE NMI or INIT during HALT within SMM causes bus activity
... EEEEEEEE ... RUNBIST restrictions when run through bound. scan circuitry
... EEEE.E.E ... FRC mode miscompare due to uninitialized internal register
... EEEEEEEE EEE STPCLK# restrictions during EWBE#
... EEE..... EE. multiple allocations into branch target buffer
... EEE..... ... 100 MHz REP MOVS speed path
... EEE..... EEE branche trace message corruption in slow trace mode
... EEEE.E.E ... FRC lock-step failure during APIC write
... EEEEEEE. ... BE4#-BE0# sampled incorrectly at Min Vih
... EEEE.E.. ... incorrect PCHK# output during boundary scan if in DP mode
... EEE..... ... BE3#-BE0# not driven during boundary scan if RESET high
... EEEEEEE. EEE current in stop clock state exceeds specification
... EEEEEEE. ... STPCLK# buffer samples incorr. during bound. scan testing
... EEEEE... ... BF&CPUTYP buffers sample incorr. during bound. scan testing
... EEEEEEEE EEE matched but disabled data BP can be lost by STPCLK# assert.
... EEEEEEEE EEE STPCLK# ignored in SMM when INT or NMI pending
... EEEEEEEE ... STPCLK# pullup not engaged at RESET
... EEEEEEEE EEE STPCLK# or FLUSH# after STI
... EEEEEEEE EEE REP string instruction not interruptable by STPCLK#
... EEEEEEEE EEE single step may not be reported on first instr. after FLUSH#
... EEEE.E.E ... double fault may generate illegal bus cycle
... ........ EE. BIST disabled
... ........ EEE maximum Icc usage
... ........ EE. CLK required for UP# to be driven
... ........ E.. FMUL bug (errors in least signif. bit with spec. operands)
... ........ E.. A4 pin connected to Vcc (incomp. with many older boards)
------------------------------------------------------------------------------
... DDD..... ... problem with ext. snooping while 2 cycles are pending on bus
... DDD..... ... STPCLK# assertion and the stop grant bus cycle
... DDD..... ... external snooping with AHOLD asserted may cause CPU to hang
... DDD..... ... address parity check not supported in dual processing mode
... DD...... ... incons. cache state from interCPU pipelined READ -> WRITE
... DDD..... ... processors hang during zero WS, pipelined bus cycles
... DDD..... ... bus lock-up problem in spec. dual processing mode sequence
... DDDD.D.. ... incorrect assertion of PHITM# without PHIT#
... DDDD.D.. ... double issuance of read cycles
... DDDD.D.. ... line invalidation may occur on read or prefetch cycles
... DDDD.D.D ... EADS# or floating ADS# may cause extra invalidates
... DDDD.D.. ... HOLD&BOFF# during APIC cycle may cause DP arbitrition prob.
... DDDD.D.. ... system hang after hold during local APIC 2nd INTA cycle
... DDDD.D.D ... external snoop can be incorrectly invalidated
------------------------------------------------------------------------------
... AAA..... ... remote read message shows valid status after a checksum err.
... AAA..... ... change of clearing an unread error in the error register
... AAA..... ... writes to error register clear register
... AAA..... ... 3 interrupts of the same priority cause lost local interrupt
... AAA..... ... APIC bus synch lost due to checksum error on remote read msg
... AAA..... ... HOLD during READ from local APIC reg. causes incorr. PCHK#
... AAA..... ... HOLD during outstanding interCPU pipel. APIC cycle hangs CPU
... AAA..... ... PICCLK reflection may cause an APIC checksum error
... AAAA.A.A ... spurious interrupt in APIC through local mode
... AAA..... ... pot. for lost INTs while using APIC in through local mode
... AAAA.A.. ... back to back asserts of HOLD may cause lost APIC write cycle
... AAAA.A.A ... system hangs when BOFF# is asserted during 2nd INTA cycle
... AAAA.A.A ... APIC pipe cycle during cache LF cause restarted cycle
... AAAA.A.A ... INIT and SMI via APIC three wire bus may be lost
... .......A ... IERR# in FRC lock-step mode during APIC write
... AAAAAAAA ... inadvertent BRDY# during external INT A cycle with BOFF#
------------------------------------------------------------------------------
... T....... ... CPU may not reset correctly due to floating FRCMC# pin
... T..TT.T. ... BRDY# does not have buffer selection capability
------------------------------------------------------------------------------
. : error does not exist in this mask revision
E : error exists in this mask revision
D : dual processing related errata
A : APIC related errata
T : 75 MHz TCP related errata
Intel PentiumPro processor
------------------------------------------------------------------------------
P6 <-- the 1st columns indicate the affected iPentiumPro steppings
BCA P6=B0/C0/sA0
000 errata descriptions; see Intel order #242689 for all details
------------------------------------------------------------------------------
EEE mixed cacheability of lock variables is problematic in MP systems
EEE FEA incorr. calculated after FP access which wraps 64K in 16 bit code
EEE differences exist in debug exception reporting
EEE FLUSH# servicing delayed while waiting for STARTUP_IPI in MP systems
E.. fast string REP MOVS may not transfer all data
E.. CR3 change during task switch using mode C paging may corrupt EIP
EEE code fetch matching disabled debug register may cause debug exception
EEE mode C paging in SMM causes use of incorrect page tables
E.. memory indirect near call may corrupt EIP
E.. L2 single bit correctable error may cancel simultaneous valid data
E.. page split access before write to CR3 may cause hang
E.. active A20# during SMM dump
E.. split access across 4K page boundary may cause hang
EEE checker BIST failure in FRC mode not signaled
EEE BINIT# assertion causes FRCERR assertion in FRC mode
EEE extra page fault may occur on IRET during task switch
E.. some caching models in SMM may cause shutdown
E.. fast strings feature re-enabled after INIT event
E.. THERMTRIP# feature not present
EEE OUT instruction, branch trace message may write incorrect data
.EE THERMTRIP# pin not asserted for catastrophic thermal condition
EEE LBR data may be written to LBER
EEE BTM for SMI will contain incorrect FROM EIP
EEE task switch fault may allow read access of linear address 0h
E.. low frequencies with 5:2 core:bus clock ratio may fail in FRC
EEE RDPMC cannot be used in conjunction with SMM
EEE PWRGOOD forced to 0 during boundary scan resets TAP
EEE BIST failure not indicated when RUNBIST TAP command used
EEE INVLPG may not invalidate targeted cTLB entry
EEE SMI does not flush TLB entries with PGE enabled
EEE I/O restart in SMM may fail after simultaneous MCE
EEE SMBASE reset on INIT# or INIT_IPI
EEE MCE due to L2 ECC error gives L1 MCACOD.LL
EEE INVLPG does not invalidate entire 0 to 4M region
E.. BINIT# assertion during snoop hit may cause double MCE
EEE MCE handler may not always execute successfully
EEE double ECC error on read may result in BINIT#
EEE RSM cannot return to HALT or SHUTDOWN in 32bit OS
EEE accesses of modified data may hang system
EEE branch traps do not function if BTMs are also enabled
EEE cache line may exist in two different ways in MP systems
EEE HALT, SHUTDOWN and STPCLK special cycles not issued
------------------------------------------------------------------------------
AAA APIC access to cacheable memory causes shutdown
AAA MP systems may hang due to catastrophic errors during BSP determination
AAA INIT_IPI after 2xSTARTUP_IPI sequence may cause AP to execute at 0h
------------------------------------------------------------------------------
. : error does not exist in this mask revision
E : error exists in this mask revision
A : APIC related errata
The (newer) iPentium P54 processor package bottom prints
========================================================
SX-no/vtm
SX-no = SX number (production code, see list of iPentium steppings)
v = voltage (S=3.135-3.600V, V=3.400-3.600V)
t = timing (S=standard, M=min. valid delay spec.)
m = MP support (S=standard (with DP/MP/UP support), U=no DP support)
DP = dual processing (two CPUs with shared memory environment)
MP = multi processing (two or more CPUs with seperate L2 caches)
UP = uni processing (only one CPU)
The NexGen Nx586 processor package top prints
=============================================
Nx586-xxxx-vvv-ppt-sss
xxxx = performance id value (P75, P80, P90 (84MHz), P100 (93MHz), P120)
vvv = voltage (ie. 4.0=4V)
pp = package type (ie. CP=ceramic PGA)
t = temperature (ie. C=commercial)
sss = stepping id value (ie. 201=D0, 202=D1)
The AMD 80486 processor package top prints
==========================================
p80486DXn-xxx-svct
p = package type (A=PGA, S=SQFP)
n = processor model (2=DX2, 4=DX4)
xxx = internal clock speed (66, 75, 80, 100, 120 MHz)
s = SMM microcode ( =Intel code, N=no (disabled) Intel code, S=AMD code)
v = voltage (V=3.3V core and 5V I/O tolerance)
c = L1 cache size (8=8KB, 1=16KB)
t = L1 cache type (T=WT, B=WB)
The AMD X5 processor package top prints
=======================================
AMD-X5-xxx-pvt
xxx = internal clock speed (133 MHz)
p = package type (A=PGA, S=SQFP)
v = voltage (F=3.3V, D=3.45V)
t = max. case temperature (W=55°C, Y=75°C, Z=85°C)
The RESET-EDX-CPUID-method
==========================
All the ≥i386 processors will show their CPUID value after the processor reset
in the DX register. Sometimes the value seems to be stored in the high part or
in both, the high and the low part of the EDX register. This shift is done by
some BIOS versions (probably to save the value during the power on self test).
You can get access to the EDX-after-reset-value via generating a processor re-
set using the triple-fault-method or the keyboard-controller-reset-method. The
reset test will only be useable when running under real mode!
On the iPentium processor there are two different resets: the standard and the
fast reset (only two clock cycles, without erasing caches...). I sometimes re-
ceived a hang-up on the iPentium-60 I checked my reset-software on.
Please, remember, that this reset test will not work with all BIOS versions!!!
------------------------------------------------------------------------------
some register values after a processor reset
------------------------------------------------------------------------------
EAX processor is okay, if zero (if not, then contact me and the vendor)
EDX value like the CPUID instruction xFMS value
386-xFMS 03xx=i386DX, 13xx=i376?, 23xx=i386SX/CX/EX, 033xx=i376,
034x=iRapidCAD, 43xx=i386SL
486-xFMS A3xx=IBM386SLC, A41x=IBM486SLC, A42x=IBM486SLC2, 84xx=IBM486BLC3
0005=CyrixM5, 0006=CyrixM6, 0007=CyrixM7,
d1d0=Cyrix 5x86 (d1=DIR1 value, d0=DIR0 value), 0490=newer 5x86
586-xFMS 15xx=NexGen Nx586 (similar to iPentium, 1=OverDrive?)
03D5=Nx586-100 or -100FPU (CPUID=0504), 15FB=Nx586 (D1/B0-step),
15F9=Nx586-120 (E2/C0-step, CPUID=0506),
existing CPU/FPU steppings: C3/-- (for VLB), D1/B0, D1/B1, E2/C0
053x=Cyrix 6x86 (similar to iPentium OverDrive?)
family 04=i486, 05=iPentium, 06=iPentiumPro
model i486: 0=DX, 1=DX50, 2=SX, 3=DX2, 4=SL, 5=SX2, 7=DX2WB, 8=DX4
9=DX4WB, E=X5WT, F=X5WB
iPentium: 0/1=5V-60/66 MHz, 2=3V-75/90/100/120/133 MHz, 3=P24T,
4=OvDr for iP5-3.3V, 5=OvDr for iDX4, 6=OvDr for iP5-5V
iPentPro: 0/1=iPentiumPro, 4=iP55CT (iP6 OvDr for iP54C socket)
stepping steppings sometimes cover several masks
------------------------------------------------------------------------------
Known 386/486 processor mask revisions
======================================
------------------------------------------------------------------------------
CPU known mask revisions for the RESET-EDX-CPUID stepping value
------------------------------------------------------------------------------
i386SX 4=A0, 5=B, 6=C?, 8=C-E, 9=D
i386CX/EX 9=A
i386DX 0=A, 3=B0-B10, 5=D0, 8=D1-D2
i386SL 10=A0-A3, 11=B0-B1
iRapidCAD 0=A, 1=B
i376 5=A, 8=B
------------------------------------------------------------------------------
AMD386SX 5=A, 8=B
AMD386DX 5=A, 8=B
------------------------------------------------------------------------------
i486DX25/33 0=A0-A1, 1=B2-B6, 2=C0, 3=C1, 4=D0
i486DX50 0=cA2-cA3, 1=cB0-cB1, 3=cC0, 4=aA0-aA1, 5=aB0
i486SL 0=A
i486DX2 2=A0-A2, 3=B1, 4=aA0-aA1, 5=aB0/aC0
i486SX 0=A0, 2=B0, 4=gAx, 7=cA0, 8=cB0, 3=D, A=E/aA0-aA1, B=aB0/aC0
i486SX2 B=aC0
------------------------------------------------------------------------------
AMD486DX 12=any (means: DX up to 40MHz)
AMD486DX2 32=any (means: DX2)
------------------------------------------------------------------------------
iP5 3=B1, 5=C1, 7=D1
iP54 1=B1, 2=B3, 4=B5, 5=C2/mA1, B=cB1/mcB1, C=cC0
iP24T 1=B1/B2, 2=C0
------------------------------------------------------------------------------
iP6 1=B0, 2=C0, 6=sA0
------------------------------------------------------------------------------
Used 'short-cuts'
=================
------------------------------------------------------------------------------
P9 Intel 80386SX processor
P4 Intel 80486DX processor
P4S Intel 80486SX processor
P23S Intel 80487SX processor
P23T Intel 80486 OverDrive processor (169 pin PGA)
P4T Intel 80486 OverDrive processor (168 pin PGA)
P24S Intel 80486DX2 processor
P24D Intel 80486DX2WB processor (integrated 8 KB writeback L1 cache)
P24C Intel 80486DX4 processor
P24T Intel Pentium OverDrive processor (with 63 or 83 MHz; Vcc=5V)
P24CT Intel Pentium OverDrive processor (with 63 or 83 MHz; Vcc=3.3V)
P5 Intel Pentium processor (with 60 or 66 MHz; Vcc=5V)
P54C Intel Pentium processor (with 75, 90, 100, 120, 133, 150, 166 Mhz)
P54CT Intel Pentium processor (with 125 to 180 MHz; ZIF socket #5)
P54CTB Intel Pentium processor (with 160, 180 or 200 MHz; ZIF socket #7)
P55C Intel Pentium processor (like P54CTB: new mask with 16+16K L1 cache)
P55CT Intel PentiumPro OverDrive processor (for the iP54C socket)
P6 Intel PentiumPro processor (with 133, 150, 166, 180 or 200 MHz)
------------------------------------------------------------------------------
i386 Intel 80386 CPU (i386SX/CX/EX, i386DX)
i486 Intel 80486 CPU (i486SX, i486SX2, i486DX, i486DX2(WB), i486DX4(WB))
------------------------------------------------------------------------------
Saturn Intel 82420TX chipset for i80486 processors
82423TX - data path unit
82424TX - cache and DRAM controller
82378IB/ZB - system I/O (for PCI to ISA bridge)
82374EB - EISA system component (for PCI to EISA bridge)
82375EB - PCI-EISA bridge (for PCI to EISA bridge)
------------------------------------------------------------------------------
Saturn2 Intel 82420ZX chipset for i80486 processors
82423TX - data path unit
82424ZX - cache and DRAM controller
82378ZB - system I/O (for PCI to ISA bridge)
82374EB - EISA system component (for PCI to EISA bridge)
82375EB - PCI-EISA bridge (for PCI to EISA bridge)
------------------------------------------------------------------------------
Aries Intel 82420EX chipset for i80486 processors
82425EX - PCI system controller
82426EX - ISA bridge
------------------------------------------------------------------------------
Mercury Intel 82430LX chipset for iPentium processors
82434LX - PCI cache and memory controller
82433LX - local bus accelerator
82378ZB - system I/O (for PCI to ISA bridge)
82374EB - EISA system component (for PCI to EISA bridge)
82375EB - PCI-EISA bridge (for PCI to EISA bridge)
------------------------------------------------------------------------------
Neptune Intel 82430NX chipset for iPentium processors
82434NX - PCI cache and memory controller
82433NX - local bus accelerator
82378ZB - system I/O (for PCI to ISA bridge)
82374EB/SB - EISA system component (for PCI to EISA bridge)
82375EB/SB - PCI-EISA bridge (for PCI to EISA bridge)
------------------------------------------------------------------------------
Triton Intel 82430FX chipset for iPentium processors
82437FX - Triton system controller
82438FX - Triton data path (there are two of these in the system)
82371FB - PCI ISA IDE accelerator (PIIX)
Triton2 Intel Triton-II Xcelerated Controller for iPentium processors (TCX)
BGA (Ball Grid Array), burst-EDO-DRAM support, new PCI bus buffers, up
to 512MB cacheable RAM, parity or ECC, DP support, PIIX3: PCI 2.1, two
seperate EIDE channels, USB support (Universal Serial Bus)
------------------------------------------------------------------------------
OrionKX Intel 82450KX chipset for iPentiumPro processors
82452KX, 82453KX, 82454KX, 82451KX (4x), 82371AB or 82378/9ZB
one PCI bus, 2 CPU MP support
OrionGX Intel 82450GX chipset for iPentiumPro processors
ECC, address and data bus parity, two PCI busses, 4 CPU MP support
Mars Intel chipset for iPentiumPro processors (codename 'Natoma')
==============================================================================
Nx586 This is the NexGen586 processor. It has iPentium-like structures. This
CPU has been created as a competitor for the iPentium processor. There
are the following technical parameters: 33 MHz external and 2.5x33 MHz
internal clock speed; no FPU (there will be a Nx587 part including the
FPU which replaces the Nx586); integrated L2 cache controller; 3.3V; a
i386 compatible core (no enhanced virtual mode, MSRs and so on); a L1-
cache with 2x16 KB; features like branch prediction, register renaming
and data forwarding or speculative execution; a 463 pin PGA package; a
0.5µ CMOS technology. The Nx586VL chipset has been created to use this
processor in an environment with Vesa Local Bus (VLB). This processor
will not fit in the original iPentium socket and it is not compatible
to the iPentium by internal (programming) details, but by the speed!
------------------------------------------------------------------------------
Nx686 NexGen Nx686 processor (samples: NexGen pinout, finals: iP54C pinout)
This processor will contain 16K code and 32K data integrated L1 cache,
an integrated L2 cache controller (up to 2MB) and the L2 cache bus (at
core speed). Also included: seven units (INT,INT,FPU,load,store,branch
and multimedia). The first chips will probably run at 180 MHz.
------------------------------------------------------------------------------
NexGen processor detection example (check for i386 compatibility 1st!)
is_a_386: MOV AX,5555h ; To detect the NexGen processor, first do
set_zero: XOR DX,DX ; check, whether it is an i80386 compatible
MOV CX,2h ; processor, or not. If it is a 32 bit CPU,
DIV CX ; then execute the division, which changes
JNZ no_NexGen ; zero flag on non-NexGen processors. Only
JZ is_NexGen ; the NexGen will not change the zero flag.
This test routine is based on the original NexGen processor detection.
----------------------------------------------------------------------
Some Cyrix 486 CPUs may show a similar behaviour on a DIV instruction,
so that you must combine your test routine with an EFLAGS.AC check. Do
a check for the AC-bit in EFLAGS too -- the NexGen processor does not
support toggling this bit, but Cyrix processors do. (So the NexGen CPU
will only be detected as an 80386 clone by the most test programs. The
test, which differs between a 386 and a 486, is normally based on this
AC-bit-toggling in EFLAGS.)
----------------------------------------------------------------------
The newer NexGen processors (about Q4/95) support a CPUID instruction.
==============================================================================
X5-133 AMD Am5x86-P75 80486DX4 processor with 4x33 MHz and 16 KB L1 cache
SS/5 AMD K5 lite processor for the i54C socket with iPentium-75 speed
------------------------------------------------------------------------------
K86 AMD processor with an architecture, similar to the Intel iPentiumPro
compareable to the iPentium-120/133 by the speed (130 MIPS)
==============================================================================
M5 Cyrix Cx80486S(2), Cx80486D(2), Cx80486S(2)-V, Cx80486D(2)-V processor
M6 Cyrix Cx80486DX, Cx80486DX-V processor
M7 Cyrix Cx80486DX2, Cx80486DX2-V processor
------------------------------------------------------------------------------
6x86 Cyrix processor with an architecture, similar to the Intel iPentiumPro
compareable to the iPentium-90..166 by the speed
5x86 Cyrix processor with an architecture, similar to the Intel 80486DX4
compareable to the iPentium-75 by the speed; fits into 80486 sockets
5gx86 Cyrix 5x86 with VGA, PCI and DRAM controller (EDO), L2 cache interface
------------------------------------------------------------------------------
Cyrix processor detection example (check for 80486 compatibility 1st!)
is_a_486: MOV AX,5555h ; To detect a Cyrix processor, first check,
XOR DX,DX ; whether it is an i80486 compatible CPU or
MOV CX,2h ; not. If it is an 80486 CPU, then execute
del_carry: CLC ; the division which changes the carry flag
DIV CX ; on non-Cyrix processors. Then you can do
JC no_Cyrix ; some accesses to the ports 22h/23h to get
JNC is_Cyrix ; more detailed information (see below).
This test routine is based on my own debugging sessions on Cyrix CPUs.
----------------------------------------------------------------------
For differing the Cyrix processors you need the CCR2 and CCR3 register
and the DIR0 and DIR1 register (see description of Cyrix registers).
First check whether CCR2.bit2 (LockNW) can be toggled (="res#1"). Then
check whether CCR3.bit4 (reserved or MAPEN) can be toggled (="res#2").
res#1 res#2 result
no no old Cx486SLC/DLC processor with no DIR0/DIR1 register
yes no A-step Cx486S processor with no DIR0/DIR1 register
no yes Cx486SLC/DLC processor with DIR0/DIR1 register
yes yes Cx486 processor with DIR0/DIR1 register
The old Cx486SLC/DLC processors with no DIR0/1 register can be checked
for A- or B-step, using a test for SMM opcode support. If you need the
detailed information about this complex test, then contact me, please!
==============================================================================
CPL actual Code Privilege Level (0..2=system, 3=user)
When running under real mode you are at CPL=0. If you use a memory ma-
nager like EMM386, WIN/3, QEMM or 386MAX, then the manager is running
at CPL=0 and your DOS-session/-box runs with CPL=3.
------------------------------------------------------------------------------
CRx Control Register x
DRx Debug Register x
TRx Test Register x
CCRx Cyrix Control Register x (accessed via port 22/23h)
------------------------------------------------------------------------------
MSR Model Specific Register (64 bit wide)
TSC Time Stamp Counter (64 bit wide)
------------------------------------------------------------------------------
TLB Translation Lookaside Buffer (≥i486)
BTB Branch Target Buffer (≥iPentium)
------------------------------------------------------------------------------
Used sources
============
------------------------------------------------------------------------------
Intel 386 CXSA embedded microprocessor, #272418-003, 11/94
Intel 386 EX embedded microprocessor, #272420-004, 09/94
------------------------------------------------------------------------------
military Intel 486 processor family, #271329-001, 02/95
ICE 486 in circuit emulator user's guide, #483298-001, 08/90
ICE 486 in circuit emulator installation/configuration, #483299-001, 06/90
ICE 486 in circuit emulator, #484019, 1990
------------------------------------------------------------------------------
Pentium processor family developer's manual volume #1, #241428-004, 1995
Pentium processor family developer's manual volume #2, #241429-004, 1995
Pentium processor family developer's manual volume #3, #241430-004, 1995
Pentium processor specification update, #242480-012, 01/96
Pentium processor ICE (with manuals) from Microtek International
------------------------------------------------------------------------------
PentiumPro processor developer's manual volume #1, #242690-00?, ??/??
PentiumPro processor developer's manual volume #2, #242691-00?, ??/??
PentiumPro processor developer's manual volume #3, #242692-00?, ??/??
PentiumPro processor at 150 MHz, #242769-001, 10/95
PentiumPro processor BIOS writer's guide, #??????-002, 01/96
PentiumPro processor specification update, #242689-003, 01/96
PentiumPro processor ICE (with manuals) from American Arium
------------------------------------------------------------------------------
multiprocessor specification 1.4, #242016-004, 06/95
optimizations for Intel's 32-bit processors, #241799-001, 02/94
processor identification with the CPUID, #241618-004, 12/95
------------------------------------------------------------------------------
Nx586 processor recognition application note, #754006-02
------------------------------------------------------------------------------
AMD 80486DX2 processor description, #19200, rev D, 08/95
AMD 80486DX4 processor description, #19160, rev D, 07/95
AMD enh. 80486DX4 processor description, #19225, rev B, 05/95
AMD 5x86 processor description, #19751, rev B, 12/95
------------------------------------------------------------------------------
IBM 80486BL processor data book addendum, #40018, 06.06.95
IBM 80486DX4 processor BIOS writer's guide, #40030, 03.10.95
IBM 80486DX4 processor application note, #40023, 05.09.95
IBM 5x86 processor BIOS writer's guide, #40038, 27.09.95
IBM 5x86 processor application note, #40036, 22.09.95
IBM 5x86 processor application note, #40040, 28.11.95
IBM 6x86 processor BIOS writer's guide, #40205, 11.01.96
IBM 6x86 processor application note, #40203, 11.01.96
IBM 6x86 processor application note, #40206, 15.01.96
------------------------------------------------------------------------------
Hans-Peter Messmer, Pentium, Addison-Wesley 1994, ISBN 3-89319-630-7
Hans-Peter Messmer, PC-Hardwarebuch, Addison-Wesley 1995, ISBN 3-89319-710-9
Ross P. Nelson, 80386/486, Microsoft Press, ISBN 3-86063-200-0
A. Schulman, Undocumented DOS 2nd ed., Addison-Wesley 1994, ISBN 0-201-63287-X
Frank van Gilluwe, Undocumented PC, Addison-Wesley 1994, ISBN 0-201-62277-7
------------------------------------------------------------------------------
Mike Schmit, Optimizing Pentium Code, Dr. Dobbs 1/94 p.40 - about the iPentium
Terje Mathisen, Pentium Secrets, BYTE 7/94 p.191 - about the iPentium
Georg Schnurer, Noch'n Gedicht, c't 9/94 p.27 - about the UMC U5S
Andreas Stiller, Kontrapunkt, c't 11/94 p.79 - about the Nx586
Christian Ludloff, Zwischen den Zeilen, c't 11/94 p.266 - about the iPentium
Andreas Stiller, Schwindel entlarvt, c't 12/94 p.62 - some CPUID models
Christian Ludloff, Wundersame Wandlung, c't 02/95 p.242 - about the iPentium
Andreas Stiller, Intels Antwort, c't 03/95 p.66 - some CPUID models
Andreas Stiller, Prozessorgeflüster, c't 04/95 p.26 - some CPUID models
Georg Schnurer, Discovery 6, c't 04/95 p.120 - about the new iP6
Georg Schnurer, Wider den Flaschenhals, c't 04/95 p.132 - about the iPentium
Andreas Stiller, Prozessorgeflüster, c't 05/95 p.34 - about the Cyrix M1
Andreas Stiller, Prozessorgeflüster, c't 06/95 p.26 - about the Cyrix M1
Andreas Stiller, Waschzettel, c't 07/95 p.186 - about masks & bugs
Alex Wolfe, Pentium secrets revealed, EE Times 7/3/95 p.1 - about 4p_v302.zip
Alex Wolfe, Embedded Insights, EE Times 7/10/95 p.43 - about 4p_v302.zip
Andreas Stiller, Prozessorgeflüster, c't 08/95 p.24 - about the iP55CT
Georg Schnurer, Offenbarungseid, c't 09/95 p.20 - about the new iP6
Georg Schnurer, Klappe zu, c't 09/95 p.22 - about new packages
Andreas Stiller, Prozessorgeflüster, c't 10/95 p.27 - about no iP55CT :(
Andreas Stiller, Prozessorgeflüster, c't 11/95 p.20 - about the AMD X5
Andreas Stiller, Tarnen und Täuschen, c't 12/95 p.20 - about iP54 SSS/VMU
Andreas Stiller, Herbststürme, c't 12/95 p.22 - about Nx686/AMD X5
Andreas Stiller, Prozessorgeflüster, c't 01/96 p.26 - about the Nx586FPU
Andreas Stiller, Leichte Vollwertkost, c't 01/96 p.84 - about new Nx586s
Andreas Stiller, Pro-Liferation, c't 01/96 p.210 - about iPentiumPros
Andreas Stiller, Prozessorgeflüster, c't 02/96, p.20 - about iP6 bugs
Andreas Stiller, Umdeklariert, c't 02/96, p.22 - about faked "iPP"s
Arno Kral, Im Zweifünftel-Takt, c't 02/96, p.54 - about iP54-150/166
Andreas Stiller, Pro-File, c't 02/96, p.58 - about dual iP6 PCs
------------------------------------------------------------------------------
software package thanks for
INFO.EXE SimCity2000 game CPUID
MFT.EXE QEMM v7.04 memory manager CPUID, Performance Monitoring
QEMM.SYS QEMM v7.04 memory manager CR4use, eV86, enabled WRMSR
TASM 3.2 Borland Pascal 7.0 Professional debugging
TP 7.0 Borland Pascal 7.0 Professional making 'DB 66h' 32bit code
CPUIDF.EXE Intel's Processor Detection Code CPUID, bug-free iPentiums
CPU_ID.ZIP NexGen's Processor Detection Pack NexGen detection code sample
CTCHIP32.ZIP c't magazine chip setter v3.2 Cyrix 5x86 feature control
CACHETST.COM Intel's Cache Type Detection Code differing WT and WB caches
CYRIXID.ZIP Cyrix's Processor Detection Pack 5x86 and 6x86 DIR0 values
------------------------------------------------------------------------------
Thanks to c't magazine author Peter Siering for my 1st article in 11/94.
Thanks to c't magazine author Andreas Stiller for testing all CPUID 'models'.
Thanks to c't magazine author Georg Schnurer for testing and his knowledge.
Thanks to Thomas Mönkemeier and his VGA-COPY/386 with my knowledge added in.
Thanks to Harald Feldmann from the Netherlands for knowledge/letters/faxes.
Thanks to Terje Mathisen from Norway for knowledge and his iPentium article.
Thanks to Ralf Brown for adding some knowledge to his DOS-INT-database.
Thanks to Peter Frühauf, the CBF-iPentium-60 and all the software-ß-testers.
Thanks to Maciej Rozycki from Gdansk (Poland) for his excellent CPU knowledge.
Thanks to Don Donato from Folsom (CA, USA) for the P24T test results (CPUID).
Thanks to Michael Steele from the NexGen corporation for his CPUID support.
Thanks to Alexander Konosevich for the Cyrix processor types and ID values.
Thanks to Alex Wolfe for his articles about the 4P package in the EE Times.
Thanks to Ingo Warnke for his basic knowledge for the V86 mode by-passing.
Thanks to Andrew Piziali for providing information from iPentium spec updates.
Thanks to Ton Plooy for his very useful Windows VxD for some the CPL=0 access.
Thanks to all my unnamed friends and their help. Sorry, if I forgot your name.
------------------------------------------------------------------------------
Peter Siering - ps@ct.ix.de - c't magazine (software)
Andreas Stiller - as@ct.ix.de - c't magazine (processors)
Georg Schnurer - gs@ct.ix.de - c't magazine (hardware)
Michael Steele - michael.steele@nexgen.com - NexGen prod.market.manag.
Harald Feldmann - feldmann@xs4all.nl (new!) - processor programming
Mike Schmit - 76347.3661@compuserve.com - processor programming
Terje Mathisen - terjem@hda.hydro.com - processor programming
Maciej Rozycki - prr09rm@loqi.elka.pg.gda.pl - processor programming
Thomas Mönkemeier - thm@vgasoft.com - VGA-Copy/386 and mailbox
Ralf Brown - ralf@pobox.com - DOS interrupt list
Andrew Schulman - andrew@ora.com - book The undocumented DOS
Frank van Gilluwe - 74000.635@compuserve.com - book The undocumented PC
Robert R. Collins - rcollins@x86.org - Check http://www.x86.org!
------------------------------------------------------------------------------
Trademarks are the property of their respective owners. The file may be copied
and distributed freely as long as it is distributed in its entirety and it is
not distributed for profit. I don't guarantee anything. End of file!
------------------------------------------------------------------------------