270 lines
8.1 KiB
C
270 lines
8.1 KiB
C
/***************************************************************
|
|
* C file: cpuid.h... for cpuinf32 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
|
|
|
|
|
|
// 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
|
|
|
|
|
|
|
|
// Function Prototypes /////////////////////////////////////////
|
|
|
|
/***************************************************************
|
|
* WORD 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 wincpuidsupport();
|
|
|
|
|
|
/***************************************************************
|
|
* WORD 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 wincpuid();
|
|
|
|
|
|
/***************************************************************
|
|
* WORD wincpuidext()
|
|
* ==================
|
|
* Similar to wincpuid(), but returns more data, in the order
|
|
* reflecting the actual output of a CPUID instruction execution:
|
|
*
|
|
* 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 wincpuidext();
|
|
|
|
|
|
/***************************************************************
|
|
* DWORD wincpufeatures()
|
|
* ======================
|
|
* Wincpufeatures() returns the CPU features flags as a DWORD
|
|
* (that is, 32 bits).
|
|
*
|
|
* Inputs: none
|
|
*
|
|
* 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 wincpufeatures();
|
|
|
|
|
|
/***************************************************************
|
|
* struct 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 winrdtsc();
|
|
|
|
|
|
/***************************************************************
|
|
* unsigned short 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 getdllversion(void);
|
|
|
|
|
|
|
|
// Private Function Declarations ///////////////////////////////
|
|
|
|
/***************************************************************
|
|
* static WORD check_clone()
|
|
*
|
|
* Inputs: none
|
|
*
|
|
* Returns:
|
|
* 1 if processor is clone (limited detection ability)
|
|
* 0 otherwise
|
|
***************************************************************/
|
|
static WORD check_clone();
|
|
|
|
|
|
/***************************************************************
|
|
* static WORD check_8086()
|
|
*
|
|
* Inputs: none
|
|
*
|
|
* Returns:
|
|
* 0 if processor 8086
|
|
* 0xffff otherwise
|
|
***************************************************************/
|
|
static WORD check_8086();
|
|
|
|
|
|
/***************************************************************
|
|
* static WORD check_80286()
|
|
*
|
|
* Inputs: none
|
|
*
|
|
* Returns:
|
|
* 2 if processor 80286
|
|
* 0xffff otherwise
|
|
***************************************************************/
|
|
static WORD check_80286();
|
|
|
|
|
|
/***************************************************************
|
|
* static WORD check_80386()
|
|
*
|
|
* Inputs: none
|
|
*
|
|
* Returns:
|
|
* 3 if processor 80386
|
|
* 0xffff otherwise
|
|
***************************************************************/
|
|
static WORD check_80386();
|
|
|
|
|
|
/***************************************************************
|
|
* 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
|