Next: Intel_CPU Package Body, Previous: Check_CPU Procedure, Up: A Complete Example
Intel_CPU
Package Specification------------------------------------------------------------------------- -- -- -- file: intel_cpu.ads -- -- -- -- ********************************************* -- -- * WARNING: for 32-bit Intel processors only * -- -- ********************************************* -- -- -- -- This package contains a number of subprograms that are useful in -- -- determining the Intel x86 CPU (and the features it supports) on -- -- which the program is running. -- -- -- -- The package is based upon the information given in the Intel -- -- Application Note AP-485: "Intel Processor Identification and the -- -- CPUID Instruction" as of April 1998. This application note can be -- -- found on www.intel.com. -- -- -- -- It currently deals with 32-bit processors only, will not detect -- -- features added after april 1998, and does not guarantee proper -- -- results on Intel-compatible processors. -- -- -- -- Cache info and x386 fpu type detection are not supported. -- -- -- -- This package does not use any privileged instructions, so should -- -- work on any OS running on a 32-bit Intel processor. -- -- -- ------------------------------------------------------------------------- with Interfaces; use Interfaces; -- for using unsigned types with System.Machine_Code; use System.Machine_Code; -- for using inline assembler code with Ada.Characters.Latin_1; use Ada.Characters.Latin_1; -- for inserting control characters package Intel_CPU is ---------------------- -- Processor bits -- ---------------------- subtype Num_Bits is Natural range 0 .. 31; -- the number of processor bits (32) -------------------------- -- Processor register -- -------------------------- -- define a processor register type for easy access to -- the individual bits type Processor_Register is array (Num_Bits) of Boolean; pragma Pack (Processor_Register); for Processor_Register'Size use 32; ------------------------- -- Unsigned register -- ------------------------- -- define a processor register type for easy access to -- the individual bytes type Unsigned_Register is record L1 : Unsigned_8; H1 : Unsigned_8; L2 : Unsigned_8; H2 : Unsigned_8; end record; for Unsigned_Register use record L1 at 0 range 0 .. 7; H1 at 0 range 8 .. 15; L2 at 0 range 16 .. 23; H2 at 0 range 24 .. 31; end record; for Unsigned_Register'Size use 32; --------------------------------- -- Intel processor vendor ID -- --------------------------------- Intel_Processor : constant String (1 .. 12) := "GenuineIntel"; -- indicates an Intel manufactured processor ------------------------------------ -- Processor signature register -- ------------------------------------ -- a register type to hold the processor signature type Processor_Signature is record Stepping : Natural range 0 .. 15; Model : Natural range 0 .. 15; Family : Natural range 0 .. 15; Processor_Type : Natural range 0 .. 3; Reserved : Natural range 0 .. 262143; end record; for Processor_Signature use record Stepping at 0 range 0 .. 3; Model at 0 range 4 .. 7; Family at 0 range 8 .. 11; Processor_Type at 0 range 12 .. 13; Reserved at 0 range 14 .. 31; end record; for Processor_Signature'Size use 32; ----------------------------------- -- Processor features register -- ----------------------------------- -- a processor register to hold the processor feature flags type Processor_Features is record FPU : Boolean; -- floating point unit on chip VME : Boolean; -- virtual mode extension DE : Boolean; -- debugging extension PSE : Boolean; -- page size extension TSC : Boolean; -- time stamp counter MSR : Boolean; -- model specific registers PAE : Boolean; -- physical address extension MCE : Boolean; -- machine check extension CX8 : Boolean; -- cmpxchg8 instruction APIC : Boolean; -- on-chip apic hardware Res_1 : Boolean; -- reserved for extensions SEP : Boolean; -- fast system call MTRR : Boolean; -- memory type range registers PGE : Boolean; -- page global enable MCA : Boolean; -- machine check architecture CMOV : Boolean; -- conditional move supported PAT : Boolean; -- page attribute table PSE_36 : Boolean; -- 36-bit page size extension Res_2 : Natural range 0 .. 31; -- reserved for extensions MMX : Boolean; -- MMX technology supported FXSR : Boolean; -- fast FP save and restore Res_3 : Natural range 0 .. 127; -- reserved for extensions end record; for Processor_Features use record FPU at 0 range 0 .. 0; VME at 0 range 1 .. 1; DE at 0 range 2 .. 2; PSE at 0 range 3 .. 3; TSC at 0 range 4 .. 4; MSR at 0 range 5 .. 5; PAE at 0 range 6 .. 6; MCE at 0 range 7 .. 7; CX8 at 0 range 8 .. 8; APIC at 0 range 9 .. 9; Res_1 at 0 range 10 .. 10; SEP at 0 range 11 .. 11; MTRR at 0 range 12 .. 12; PGE at 0 range 13 .. 13; MCA at 0 range 14 .. 14; CMOV at 0 range 15 .. 15; PAT at 0 range 16 .. 16; PSE_36 at 0 range 17 .. 17; Res_2 at 0 range 18 .. 22; MMX at 0 range 23 .. 23; FXSR at 0 range 24 .. 24; Res_3 at 0 range 25 .. 31; end record; for Processor_Features'Size use 32; ------------------- -- Subprograms -- ------------------- function Has_FPU return Boolean; -- return True if a FPU is found -- use only if CPUID is not supported function Has_CPUID return Boolean; -- return True if the processor supports the CPUID instruction function CPUID_Level return Natural; -- return the CPUID support level (0, 1 or 2) -- can only be called if the CPUID instruction is supported function Vendor_ID return String; -- return the processor vendor identification string -- can only be called if the CPUID instruction is supported function Signature return Processor_Signature; -- return the processor signature -- can only be called if the CPUID instruction is supported function Features return Processor_Features; -- return the processors features -- can only be called if the CPUID instruction is supported private ------------------------ -- EFLAGS bit names -- ------------------------ ID_Flag : constant Num_Bits := 21; -- ID flag bit end Intel_CPU;