dr_proc.h File Reference

Utility routines for identifying features of the processor. More...

Data Structures

struct  features_t

Defines

#define PAGE_SIZE   (4*1024)
#define FAMILY_ITANIUM_2_DC   17
#define FAMILY_ITANIUM_2   16
#define FAMILY_K8L   16
#define FAMILY_K8   15
#define FAMILY_PENTIUM_4   15
#define FAMILY_ITANIUM   7
#define FAMILY_CORE_2   6
#define FAMILY_CORE   6
#define FAMILY_PENTIUM_M   6
#define FAMILY_PENTIUM_3   6
#define FAMILY_PENTIUM_2   6
#define FAMILY_PENTIUM_PRO   6
#define FAMILY_ATHLON   6
#define FAMILY_PENTIUM   5
#define FAMILY_K6   5
#define FAMILY_K5   5
#define FAMILY_486   4
#define MODEL_PENTIUM_M_1MB   9
#define MODEL_PENTIUM_M   13
#define MODEL_CORE   14
#define MODEL_CORE_2   15

Enumerations

enum  {
  VENDOR_INTEL,
  VENDOR_AMD,
  VENDOR_UNKNOWN
}
enum  feature_bit_t {
  FEATURE_FPU = 0,
  FEATURE_VME = 1,
  FEATURE_DE = 2,
  FEATURE_PSE = 3,
  FEATURE_TSC = 4,
  FEATURE_MSR = 5,
  FEATURE_PAE = 6,
  FEATURE_MCE = 7,
  FEATURE_CX8 = 8,
  FEATURE_APIC = 9,
  FEATURE_SEP = 11,
  FEATURE_MTRR = 12,
  FEATURE_PGE = 13,
  FEATURE_MCA = 14,
  FEATURE_CMOV = 15,
  FEATURE_PAT = 16,
  FEATURE_PSE_36 = 17,
  FEATURE_PSN = 18,
  FEATURE_CLFSH = 19,
  FEATURE_DS = 21,
  FEATURE_ACPI = 22,
  FEATURE_MMX = 23,
  FEATURE_FXSR = 24,
  FEATURE_SSE = 25,
  FEATURE_SSE2 = 26,
  FEATURE_SS = 27,
  FEATURE_HTT = 28,
  FEATURE_TM = 29,
  FEATURE_IA64 = 30,
  FEATURE_PBE = 31,
  FEATURE_SSE3 = 0 + 32,
  FEATURE_MONITOR = 3 + 32,
  FEATURE_DS_CPL = 4 + 32,
  FEATURE_VMX = 5 + 32,
  FEATURE_EST = 7 + 32,
  FEATURE_TM2 = 8 + 32,
  FEATURE_SSSE3 = 9 + 32,
  FEATURE_CID = 10 + 32,
  FEATURE_CX16 = 13 + 32,
  FEATURE_xPTR = 14 + 32,
  FEATURE_SYSCALL = 11 + 64,
  FEATURE_XD_Bit = 20 + 64,
  FEATURE_EM64T = 29 + 64,
  FEATURE_LAHF = 0 + 96
}
enum  cache_size_t {
  CACHE_SIZE_8_KB,
  CACHE_SIZE_16_KB,
  CACHE_SIZE_32_KB,
  CACHE_SIZE_64_KB,
  CACHE_SIZE_128_KB,
  CACHE_SIZE_256_KB,
  CACHE_SIZE_512_KB,
  CACHE_SIZE_1_MB,
  CACHE_SIZE_2_MB,
  CACHE_SIZE_UNKNOWN
}

Functions

size_t proc_get_cache_line_size (void)
bool proc_is_cache_aligned (void *addr)
ptr_uint_t proc_bump_to_end_of_cache_line (ptr_uint_t sz)
void * proc_get_containing_page (void *addr)
uint proc_get_vendor (void)
uint proc_get_family (void)
uint proc_get_type (void)
uint proc_get_model (void)
uint proc_get_stepping (void)
bool proc_has_feature (feature_bit_t feature)
features_tproc_get_all_feature_bits (void)
char * proc_get_brand_string (void)
cache_size_t proc_get_L1_icache_size (void)
cache_size_t proc_get_L1_dcache_size (void)
cache_size_t proc_get_L2_cache_size (void)
const char * proc_get_cache_size_str (cache_size_t size)
size_t proc_fpstate_save_size (void)
size_t proc_save_fpstate (byte *buf)
void proc_restore_fpstate (byte *buf)
void dr_insert_save_fpstate (void *drcontext, instrlist_t *ilist, instr_t *where, opnd_t buf)
void dr_insert_restore_fpstate (void *drcontext, instrlist_t *ilist, instr_t *where, opnd_t buf)

Detailed Description

Utility routines for identifying features of the processor.


Define Documentation

#define FAMILY_486   4

proc_get_family() processor family: 486

#define FAMILY_ATHLON   6

proc_get_family() processor family: Athlon

#define FAMILY_CORE   6

proc_get_family() processor family: Core

#define FAMILY_CORE_2   6

proc_get_family() processor family: Core 2

#define FAMILY_ITANIUM   7

proc_get_family() processor family: Itanium

#define FAMILY_ITANIUM_2   16

proc_get_family() processor family: Itanium 2

#define FAMILY_ITANIUM_2_DC   17

proc_get_family() processor family: Itanium 2 DC

#define FAMILY_K5   5

proc_get_family() processor family: K5

#define FAMILY_K6   5

proc_get_family() processor family: K6

#define FAMILY_K8   15

proc_get_family() processor family: AMD K8

#define FAMILY_K8L   16

proc_get_family() processor family: AMD K8L

#define FAMILY_PENTIUM   5

proc_get_family() processor family: Pentium

#define FAMILY_PENTIUM_2   6

proc_get_family() processor family: Pentium 2

#define FAMILY_PENTIUM_3   6

proc_get_family() processor family: Pentium 3

#define FAMILY_PENTIUM_4   15

proc_get_family() processor family: Pentium 4

#define FAMILY_PENTIUM_M   6

proc_get_family() processor family: Pentium M

#define FAMILY_PENTIUM_PRO   6

proc_get_family() processor family: Pentium Pro

#define MODEL_CORE   14

proc_get_model() processor model: Core

#define MODEL_CORE_2   15

proc_get_model() processor model: Core 2

#define MODEL_PENTIUM_M   13

proc_get_model() processor model: Pentium M 2MB L2

#define MODEL_PENTIUM_M_1MB   9

proc_get_model() processor model: Pentium M 1MB L2

#define PAGE_SIZE   (4*1024)

Size of a page of memory. Convenience macro to align to the start of a page of memory.


Enumeration Type Documentation

anonymous enum

Constants returned by proc_get_vendor().

Enumerator:
VENDOR_INTEL 

proc_get_vendor() processor identification: Intel

VENDOR_AMD 

proc_get_vendor() processor identification: AMD

VENDOR_UNKNOWN 

proc_get_vendor() processor identification: unknown

L1 and L2 cache sizes, used by proc_get_L1_icache_size(), proc_get_L1_dcache_size(), proc_get_L2_cache_size(), and proc_get_cache_size_str().

Enumerator:
CACHE_SIZE_8_KB 

L1 or L2 cache size of 8 KB.

CACHE_SIZE_16_KB 

L1 or L2 cache size of 16 KB.

CACHE_SIZE_32_KB 

L1 or L2 cache size of 32 KB.

CACHE_SIZE_64_KB 

L1 or L2 cache size of 64 KB.

CACHE_SIZE_128_KB 

L1 or L2 cache size of 128 KB.

CACHE_SIZE_256_KB 

L1 or L2 cache size of 256 KB.

CACHE_SIZE_512_KB 

L1 or L2 cache size of 512 KB.

CACHE_SIZE_1_MB 

L1 or L2 cache size of 1 MB.

CACHE_SIZE_2_MB 

L1 or L2 cache size of 2 MB.

CACHE_SIZE_UNKNOWN 

Unknown L1 or L2 cache size.

Feature bits returned by cpuid. Pass one of these values to proc_has_feature() to determine whether the underlying processor has the feature.

Enumerator:
FEATURE_FPU 

Floating-point unit on chip

FEATURE_VME 

Virtual Mode Extension

FEATURE_DE 

Debugging Extension

FEATURE_PSE 

Page Size Extension

FEATURE_TSC 

Time-Stamp Counter

FEATURE_MSR 

Model Specific Registers

FEATURE_PAE 

Physical Address Extension

FEATURE_MCE 

Machine Check Exception

FEATURE_CX8 

CMPXCHG8 Instruction Supported

FEATURE_APIC 

On-chip APIC Hardware Supported

FEATURE_SEP 

Fast System Call

FEATURE_MTRR 

Memory Type Range Registers

FEATURE_PGE 

Page Global Enable

FEATURE_MCA 

Machine Check Architecture

FEATURE_CMOV 

Conditional Move Instruction

FEATURE_PAT 

Page Attribute Table

FEATURE_PSE_36 

36-bit Page Size Extension

FEATURE_PSN 

Processor serial # present & enabled

FEATURE_CLFSH 

CLFLUSH Instruction supported

FEATURE_DS 

Debug Store

FEATURE_ACPI 

Thermal monitor & SCC supported

FEATURE_MMX 

MMX technology supported

FEATURE_FXSR 

Fast FP save and restore

FEATURE_SSE 

SSE Extensions supported

FEATURE_SSE2 

SSE2 Extensions supported

FEATURE_SS 

Self-snoop

FEATURE_HTT 

Hyper-threading Technology

FEATURE_TM 

Thermal Monitor supported

FEATURE_IA64 

IA64 Capabilities

FEATURE_PBE 

Pending Break Enable

FEATURE_SSE3 

SSE3 Extensions supported

FEATURE_MONITOR 

MONITOR/MWAIT instructions supported

FEATURE_DS_CPL 

CPL Qualified Debug Store

FEATURE_VMX 

Virtual Machine Extensions

FEATURE_EST 

Enhanced Speedstep Technology

FEATURE_TM2 

Thermal Monitor 2

FEATURE_SSSE3 

SSSE3 Extensions supported

FEATURE_CID 

Context ID

FEATURE_CX16 

CMPXCHG16B instruction supported

FEATURE_xPTR 

Send Task Priority Messages

FEATURE_SYSCALL 

SYSCALL/SYSRET instructions supported

FEATURE_XD_Bit 

Execution Disable bit

FEATURE_EM64T 

Extended Memory 64 Technology

FEATURE_LAHF 

LAHF/SAHF available in 64-bit mode


Function Documentation

void dr_insert_restore_fpstate ( void *  drcontext,
instrlist_t *  ilist,
instr_t where,
opnd_t  buf 
)

Inserts into ilist prior to where meta-instruction(s) to restore the floating point state from the 16-byte-aligned buffer referred to by buf, which must be 512 bytes for processors with the FXSR feature, and 108 bytes for those without (where this routine does not support 16-bit operand sizing). buf should have size of OPSZ_512; this routine will automatically adjust it to OPSZ_108 if necessary.

Note:
proc_fpstate_save_size() can be used to determine the particular size needed.
void dr_insert_save_fpstate ( void *  drcontext,
instrlist_t *  ilist,
instr_t where,
opnd_t  buf 
)

Inserts into ilist prior to where meta-instruction(s) to save the floating point state into the 16-byte-aligned buffer referred to by buf, which must be 512 bytes for processors with the FXSR feature, and 108 bytes for those without (where this routine does not support 16-bit operand sizing). buf should have size of OPSZ_512; this routine will automatically adjust it to OPSZ_108 if necessary.

Note:
proc_fpstate_save_size() can be used to determine the particular size needed.
ptr_uint_t proc_bump_to_end_of_cache_line ( ptr_uint_t  sz  ) 

Returns n >= sz such that n is a multiple of the cache line size.

size_t proc_fpstate_save_size ( void   ) 

Returns the size in bytes needed for a buffer for saving the floating point state.

features_t* proc_get_all_feature_bits ( void   ) 

Returns all 4 32-bit feature values. Use proc_has_feature to test for specific features.

char* proc_get_brand_string ( void   ) 

Returns the processor brand string as given by the cpuid instruction.

size_t proc_get_cache_line_size ( void   ) 

Returns the cache line size in bytes of the processor.

const char* proc_get_cache_size_str ( cache_size_t  size  ) 

Converts a cache_size_t type to a string.

void* proc_get_containing_page ( void *  addr  ) 

Returns n <= addr such that n is a multiple of the page size.

uint proc_get_family ( void   ) 

Returns the processor family as given by the cpuid instruction, adjusted by the extended family as described in the Intel documentation. The FAMILY_ constants identify important family values.

cache_size_t proc_get_L1_dcache_size ( void   ) 

Returns the size of the L1 data cache.

cache_size_t proc_get_L1_icache_size ( void   ) 

Returns the size of the L1 instruction cache.

cache_size_t proc_get_L2_cache_size ( void   ) 

Returns the size of the L2 cache.

uint proc_get_model ( void   ) 

Returns the processor model as given by the cpuid instruction, adjusted by the extended model as described in the Intel documentation. The MODEL_ constants identify important model values.

uint proc_get_stepping ( void   ) 

Returns the processor stepping ID.

uint proc_get_type ( void   ) 

Returns the processor type as given by the cpuid instruction.

uint proc_get_vendor ( void   ) 

Returns one of the VENDOR_ constants.

bool proc_has_feature ( feature_bit_t  feature  ) 

Tests if processor has selected feature.

bool proc_is_cache_aligned ( void *  addr  ) 

Returns true only if addr is cache-line-aligned.

void proc_restore_fpstate ( byte *  buf  ) 

Restores the floating point state from the 16-byte-aligned buffer buf, which must be 512 bytes for processors with the FXSR feature, and 108 bytes for those without (where this routine does not support 16-bit operand sizing).

Note:
proc_fpstate_save_size() can be used to determine the particular size needed.
size_t proc_save_fpstate ( byte *  buf  ) 

Saves the floating point state into the 16-byte-aligned buffer buf, which must be 512 bytes for processors with the FXSR feature, and 108 bytes for those without (where this routine does not support 16-bit operand sizing).

Note:
proc_fpstate_save_size() can be used to determine the particular size needed.

DR does NOT save the application's floating-point, MMX, or SSE state on context switches! Thus if a client performs any floating-point operations in its main routines called by DR, the client must save and restore the floating-point/MMX/SSE state. If the client needs to do so inside the code cache the client should implement that itself. Returns number of bytes written.


  DynamoRIO API version 2.0.0 --- Thu Apr 22 10:11:32 2010