home *** CD-ROM | disk | FTP | other *** search
- /***************************************************************
- * C file: cpuid.h... for cpuinf16 DLL
- *
- * This program has been developed by Intel Corporation.
- * You have Intel's permission to incorporate this code
- * into your product, royalty free. Intel has various
- * intellectual property rights which it may assert under
- * certain circumstances, such as if another manufacturer's
- * processor mis-identifies itself as being "GenuineIntel"
- * when the CPUID instruction is executed.
- *
- * Intel specifically disclaims all warranties, express or
- * implied, and all liability, including consequential and
- * other indirect damages, for the use of this code,
- * including liability for infringement of any proprietary
- * rights, and including the warranties of merchantability
- * and fitness for a particular purpose. Intel does not
- * assume any responsibility for any errors which may
- * appear in this code nor any responsibility to update it.
- *
- * * Other brands and names are the property of their respective
- * owners.
- *
- * Copyright (c) 1995, Intel Corporation. All rights reserved.
- ***************************************************************/
-
- #ifndef cpuid_h
- #define cpuid_h
-
-
-
- // OPCODE DEFINITIONS //////////////////////////////////////////
- #define CPU_ID _asm _emit 0x0f _asm _emit 0xa2
- // CPUID instruction
-
- #define RDTSC _asm _emit 0x0f _asm _emit 0x31
- // RDTSC instruction
-
- #define OPND32 _asm _emit 0x66 // Macro for allowing 32-bit
- // in-line assembly opcodes
-
-
-
- // VERSION DEFINITION //////////////////////////////////////////
- #define VERSION 0x0101 // Must be 2 bytes in length.
- // First two digits (upper
- // byte) is the major version.
- // Second two digits (lower
- // byte) is the minor version.
- // i.e. 0x0100 = major version
- // of 1 and minor version 00.
-
-
-
- // VARIABLE STRUCTURE DEFINITIONS //////////////////////////////
- struct TIME_STAMP
- {
- DWORD High; // Upper 32-bits of Time Stamp
- // Register value
-
- DWORD Low; // Lower 32-bits of Time Stamp
- }; // Register value
-
-
-
- // Public Functions ////////////////////////////////////////////
-
- /***************************************************************
- * WORD FAR PASCAL wincpuidsupport()
- * =================================
- * Wincpuidsupport() tells the caller whether the host processor
- * supports the CPUID opcode or not.
- *
- * Inputs: none
- *
- * Returns:
- * 1 = CPUID opcode is supported
- * 0 = CPUID opcode is not supported
- ***************************************************************/
-
- WORD FAR PASCAL _export wincpuidsupport();
-
-
- /***************************************************************
- * WORD FAR PASCAL wincpuid()
- * ========================
- * This routine uses the standard Intel assembly code to
- * determine what type of processor is in the computer, as
- * described in application note AP-485 (Intel Order #241618).
- * Wincpuid() returns the CPU type as an integer (that is,
- * 2 bytes, a WORD) in the AX register.
- *
- * Returns:
- * 0 = 8086/88
- * 2 = 80286
- * 3 = 80386
- * 4 = 80486
- * 5 = Pentium(R) Processor
- * 6 = PentiumPro(R) Processor
- * 7 or higher = Processor beyond the PentiumPro6(R) Processor
- *
- * Note: This function also sets the global variable clone_flag
- ***************************************************************/
- WORD FAR PASCAL _export wincpuid();
-
-
- /***************************************************************
- * WORD FAR PASCAL wincpuidext()
- * =============================
- * Similar to wincpuid(), but returns more data, in the order
- * reflecting the actual output of a CPUID instruction execution:
- *
- * Inputs: none
- *
- * Returns:
- * AX(15:14) = Reserved (mask these off in the calling code
- * before using)
- * AX(13:12) = Processor type (00=Standard OEM CPU, 01=OverDrive,
- * 10=Dual CPU, 11=Reserved)
- * AX(11:8) = CPU Family (the same 4-bit quantity as wincpuid())
- * AX(7:4) = CPU Model, if the processor supports the CPUID
- * opcode; zero otherwise
- * AX(3:0) = Stepping #, if the processor supports the CPUID
- * opcode; zero otherwise
- *
- * Note: This function also sets the global variable clone_flag
- ***************************************************************/
- WORD FAR PASCAL _export wincpuidext();
-
-
- /***************************************************************
- * DWORD FAR PASCAL wincpufeatures()
- * ===============================
- * Wincpufeatures() returns the CPU features flags as a DWORD
- * (that is, 32 bits).
- *
- * Returns:
- * 0 = Processor which does not execute the CPUID instruction.
- * This includes 8086, 8088, 80286, 80386, and some
- * older 80486 processors.
- *
- * Else
- * Feature Flags (refer to App Note AP-485 for description).
- * This DWORD was put into EDX by the CPUID instruction.
- *
- * Current flag assignment is as follows:
- *
- * bit31..10 reserved (=0)
- * bit9=1 CPU contains a local APIC (iPentium-3V)
- * bit8=1 CMPXCHG8B instruction supported
- * bit7=1 machine check exception supported
- * bit6=0 reserved (36bit-addressing & 2MB-paging)
- * 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)
- *
- * Note: New bits will be assigned on future processors... see
- * processor data books for updated information
- *
- * Note: This function also sets the global variable clone_flag
- ***************************************************************/
- DWORD FAR PASCAL _export wincpufeatures();
-
-
- /***************************************************************
- * struct FAR PASCAL TIME_STAMP winrdtsc()
- * =======================================
- * Winrdtsc() returns the value in the Time Stamp Counter (if one
- * exists).
- *
- * Inputs: none
- *
- * Returns:
- * 0 = CPU does not support the time stamp register
- *
- * Else
- * Returns a variable of type TIME_STAMP which is composed of
- * two DWORD variables. The 'High' DWORD contains the upper
- * 32-bits of the Time Stamp Register. The 'Low' DWORD
- * contains the lower 32-bits of the Time Stamp Register.
- *
- * Note: This function also sets the global variable clone_flag
- ***************************************************************/
- struct TIME_STAMP FAR PASCAL _export winrdtsc();
-
-
- /***************************************************************
- * unsigned short FAR PASCAL getdllversion()
- * =========================================
- * Getdllversion() returns the Major and minor version of this
- * DLL.
- *
- * Inputs: none
- *
- * Returns: Major and Minor version of this DLL.
- *
- * i.e. getdllversion() = 0x01 00
- * Major Version<--|-->Minor Version
- *
- ***************************************************************/
- unsigned short FAR PASCAL _export getdllversion(void);
-
-
- // Private Function Declarations ///////////////////////////////
-
- /***************************************************************
- * check_clone()
- *
- * Inputs: none
- *
- * Returns:
- * 1 if processor is clone (limited detection ability)
- * 0 otherwise
- ***************************************************************/
- static WORD check_clone();
-
-
- /***************************************************************
- * check_8086()
- *
- * Inputs: none
- *
- * Returns:
- * 0 if processor 8086
- * 0xffff otherwise
- ***************************************************************/
- static WORD check_8086();
-
-
- /***************************************************************
- * check_80286()
- *
- * Inputs: none
- *
- * Returns:
- * 2 if processor 80286
- * 0xffff otherwise
- ***************************************************************/
- static WORD check_80286();
-
-
- /***************************************************************
- * check_80386()
- *
- * Inputs: none
- *
- * Returns:
- * 3 if processor 80386
- * 0xffff otherwise
- ***************************************************************/
- static WORD check_80386();
-
-
- /***************************************************************
- * check_80486()
- *
- * Inputs: none
- *
- * Returns:
- * 4 if processor 80486
- * 0xffff otherwise
- ***************************************************************/
- static WORD check_80486();
-
-
- /***************************************************************
- * static WORD check_IDProc()
- * ==========================
- * Check_IDProc() uses the CPUID opcode to find the family type
- * of the host processor.
- *
- * Inputs: none
- *
- * Returns:
- * CPU Family (i.e. 4 if Intel 486, 5 if Pentium(R) Processor)
- *
- * Note: This function also sets the global variable clone_flag
- ***************************************************************/
- static WORD check_IDProc();
-
- #endif cpuid_h
-