iPXE
Data Structures | Macros | Functions | Variables
cpuid.h File Reference

x86 CPU feature detection More...

#include <stdint.h>

Go to the source code of this file.

Data Structures

struct  x86_feature_registers
 An x86 CPU feature register set. More...
 
struct  x86_features
 x86 CPU features More...
 

Macros

#define CPUID_FLAG   0x00200000UL
 CPUID support flag. More...
 
#define CPUID_EXTENDED   0x80000000UL
 CPUID extended function. More...
 
#define CPUID_HYPERVISOR   0x40000000UL
 CPUID hypervisor function. More...
 
#define CPUID_VENDOR_ID   0x00000000UL
 Get vendor ID and largest standard function. More...
 
#define CPUID_FEATURES   0x00000001UL
 Get standard features. More...
 
#define CPUID_FEATURES_INTEL_ECX_RDRAND   0x40000000UL
 RDRAND instruction is supported. More...
 
#define CPUID_FEATURES_INTEL_ECX_HYPERVISOR   0x80000000UL
 Hypervisor is present. More...
 
#define CPUID_FEATURES_INTEL_EDX_TSC   0x00000010UL
 TSC is present. More...
 
#define CPUID_FEATURES_INTEL_EDX_FXSR   0x01000000UL
 FXSAVE and FXRSTOR are supported. More...
 
#define CPUID_AMD_MAX_FN   0x80000000UL
 Get largest extended function. More...
 
#define CPUID_AMD_CHECK   0x80000000UL
 Extended function existence check. More...
 
#define CPUID_AMD_CHECK_MASK   0xffff0000UL
 Extended function existence check mask. More...
 
#define CPUID_AMD_FEATURES   0x80000001UL
 Get extended features. More...
 
#define CPUID_MODEL   0x80000002UL
 Get CPU model. More...
 
#define CPUID_APM   0x80000007UL
 Get APM information. More...
 
#define CPUID_APM_EDX_TSC_INVARIANT   0x00000100UL
 Invariant TSC. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static __attribute__ ((always_inline)) void cpuid(uint32_t function
 Issue CPUID instruction. More...
 
int cpuid_supported (uint32_t function)
 Check whether or not CPUID function is supported. More...
 
void x86_features (struct x86_features *features)
 Get x86 CPU features. More...
 

Variables

struct x86_feature_registers __attribute__
 
static uint32_t subfunction
 
static uint32_t uint32_teax
 
static uint32_t uint32_t uint32_tebx
 
static uint32_t uint32_t uint32_t uint32_tecx
 
static uint32_t uint32_t uint32_t uint32_t uint32_tedx
 

Detailed Description

x86 CPU feature detection

Definition in file cpuid.h.

Macro Definition Documentation

◆ CPUID_FLAG

#define CPUID_FLAG   0x00200000UL

CPUID support flag.

Definition at line 32 of file cpuid.h.

◆ CPUID_EXTENDED

#define CPUID_EXTENDED   0x80000000UL

CPUID extended function.

Definition at line 35 of file cpuid.h.

◆ CPUID_HYPERVISOR

#define CPUID_HYPERVISOR   0x40000000UL

CPUID hypervisor function.

Definition at line 38 of file cpuid.h.

◆ CPUID_VENDOR_ID

#define CPUID_VENDOR_ID   0x00000000UL

Get vendor ID and largest standard function.

Definition at line 41 of file cpuid.h.

◆ CPUID_FEATURES

#define CPUID_FEATURES   0x00000001UL

Get standard features.

Definition at line 44 of file cpuid.h.

◆ CPUID_FEATURES_INTEL_ECX_RDRAND

#define CPUID_FEATURES_INTEL_ECX_RDRAND   0x40000000UL

RDRAND instruction is supported.

Definition at line 47 of file cpuid.h.

◆ CPUID_FEATURES_INTEL_ECX_HYPERVISOR

#define CPUID_FEATURES_INTEL_ECX_HYPERVISOR   0x80000000UL

Hypervisor is present.

Definition at line 50 of file cpuid.h.

◆ CPUID_FEATURES_INTEL_EDX_TSC

#define CPUID_FEATURES_INTEL_EDX_TSC   0x00000010UL

TSC is present.

Definition at line 53 of file cpuid.h.

◆ CPUID_FEATURES_INTEL_EDX_FXSR

#define CPUID_FEATURES_INTEL_EDX_FXSR   0x01000000UL

FXSAVE and FXRSTOR are supported.

Definition at line 56 of file cpuid.h.

◆ CPUID_AMD_MAX_FN

#define CPUID_AMD_MAX_FN   0x80000000UL

Get largest extended function.

Definition at line 59 of file cpuid.h.

◆ CPUID_AMD_CHECK

#define CPUID_AMD_CHECK   0x80000000UL

Extended function existence check.

Definition at line 62 of file cpuid.h.

◆ CPUID_AMD_CHECK_MASK

#define CPUID_AMD_CHECK_MASK   0xffff0000UL

Extended function existence check mask.

Definition at line 65 of file cpuid.h.

◆ CPUID_AMD_FEATURES

#define CPUID_AMD_FEATURES   0x80000001UL

Get extended features.

Definition at line 68 of file cpuid.h.

◆ CPUID_MODEL

#define CPUID_MODEL   0x80000002UL

Get CPU model.

Definition at line 71 of file cpuid.h.

◆ CPUID_APM

#define CPUID_APM   0x80000007UL

Get APM information.

Definition at line 74 of file cpuid.h.

◆ CPUID_APM_EDX_TSC_INVARIANT

#define CPUID_APM_EDX_TSC_INVARIANT   0x00000100UL

Invariant TSC.

Definition at line 77 of file cpuid.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ __attribute__()

static __attribute__ ( (always_inline)  )
inlinestatic

Issue CPUID instruction.

Parameters
functionCPUID function (input via eax)
subfunctionCPUID subfunction (input via ecx)
eaxOutput via eax
ebxOutput via ebx
ecxOutput via ecx
edxOutput via edx

◆ cpuid_supported()

int cpuid_supported ( uint32_t  function)

Check whether or not CPUID function is supported.

Parameters
functionCPUID function
Return values
rcReturn status code

Definition at line 76 of file cpuid.c.

76  {
77  uint32_t max_function;
78  uint32_t discard_b;
80  uint32_t discard_d;
81  int rc;
82 
83  /* Check that CPUID instruction is available */
84  if ( ( rc = cpuid_instruction_supported() ) != 0 )
85  return rc;
86 
87  /* Find highest supported function number within this family */
88  cpuid ( ( function & ( CPUID_EXTENDED | CPUID_HYPERVISOR ) ), 0,
89  &max_function, &discard_b, &discard_c, &discard_d );
90 
91  /* Fail if maximum function number is meaningless (e.g. if we
92  * are attempting to call an extended function on a CPU which
93  * does not support them).
94  */
95  if ( ( max_function & CPUID_AMD_CHECK_MASK ) !=
96  ( function & CPUID_AMD_CHECK_MASK ) ) {
97  DBGC ( colour, "CPUID invalid maximum function %#08x\n",
98  max_function );
99  return -EINVAL;
100  }
101 
102  /* Fail if this function is not supported */
103  if ( function > max_function ) {
104  DBGC ( colour, "CPUID function %#08x not supported\n",
105  function );
106  return -ENOTTY;
107  }
108 
109  return 0;
110 }
#define EINVAL
Invalid argument.
Definition: errno.h:429
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define colour
Colour for debug messages.
Definition: cpuid.c:38
#define CPUID_HYPERVISOR
CPUID hypervisor function.
Definition: cpuid.h:38
#define CPUID_AMD_CHECK_MASK
Extended function existence check mask.
Definition: cpuid.h:65
#define DBGC(...)
Definition: compiler.h:505
static int cpuid_instruction_supported(void)
Check whether or not CPUID instruction is supported.
Definition: cpuid.c:45
unsigned int uint32_t
Definition: stdint.h:12
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:595
#define CPUID_EXTENDED
CPUID extended function.
Definition: cpuid.h:35
long discard_c
Definition: bigint.h:33

References colour, CPUID_AMD_CHECK_MASK, CPUID_EXTENDED, CPUID_HYPERVISOR, cpuid_instruction_supported(), DBGC, discard_c, EINVAL, ENOTTY, and rc.

Referenced by cpuid_settings_fetch(), rdtsc_probe(), x86_amd_features(), and x86_intel_features().

◆ x86_features()

void x86_features ( struct x86_features features)

Get x86 CPU features.

Parameters
featuresx86 CPU features to fill in

Definition at line 164 of file cpuid.c.

164  {
165 
166  /* Clear all features */
167  memset ( features, 0, sizeof ( *features ) );
168 
169  /* Get Intel-defined features */
171 
172  /* Get AMD-defined features */
174 }
static void x86_amd_features(struct x86_features *features)
Get AMD-defined x86 CPU features.
Definition: cpuid.c:141
static void x86_intel_features(struct x86_features *features)
Get Intel-defined x86 CPU features.
Definition: cpuid.c:117
uint32_t features
Supported features.
Definition: ena.h:16
void * memset(void *dest, int character, size_t len) __nonnull

References features, memset(), x86_amd_features(), and x86_intel_features().

Referenced by check_fxsr(), cpuid_exec(), hv_check_hv(), rdrand_entropy_enable(), and rtc_entropy_enable().

Variable Documentation

◆ __attribute__

◆ subfunction

uint32_t subfunction

Definition at line 90 of file cpuid.h.

Referenced by cpuid_settings_fetch().

◆ eax

Definition at line 90 of file cpuid.h.

◆ ebx

Definition at line 90 of file cpuid.h.

Referenced by hv_map_hypercall(), and hvm_cpuid_base().

◆ ecx

Definition at line 90 of file cpuid.h.

Referenced by hv_map_hypercall(), and hvm_cpuid_base().

◆ edx

Initial value:
{
__asm__ ( "cpuid"
: "=a" ( *eax ), "=b" ( *ebx ), "=c" ( *ecx ), "=d" ( *edx )
: "0" ( function ), "2" ( subfunction ) )
static uint32_t subfunction
Definition: cpuid.h:90
static uint32_t uint32_t uint32_t * ebx
Definition: cpuid.h:90
static uint32_t uint32_t uint32_t uint32_t * ecx
Definition: cpuid.h:90
static uint32_t uint32_t uint32_t uint32_t uint32_t * edx
Definition: cpuid.h:91
__asm__(".section \".rodata\", \"a\", " PROGBITS "\n\t" "\nprivate_key_data:\n\t" ".size private_key_data, ( . - private_key_data )\n\t" ".equ private_key_len, ( . - private_key_data )\n\t" ".previous\n\t")
static uint32_t uint32_t * eax
Definition: cpuid.h:90

Definition at line 91 of file cpuid.h.

Referenced by hv_map_hypercall(), and hvm_cpuid_base().