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

Functions

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

Variables

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.

Referenced by cpuid_instruction_supported().

◆ CPUID_EXTENDED

#define CPUID_EXTENDED   0x80000000UL

CPUID extended function.

Definition at line 35 of file cpuid.h.

Referenced by cpuid_supported().

◆ CPUID_HYPERVISOR

#define CPUID_HYPERVISOR   0x40000000UL

CPUID hypervisor function.

Definition at line 38 of file cpuid.h.

Referenced by cpuid_settings_fetch(), and cpuid_supported().

◆ CPUID_VENDOR_ID

#define CPUID_VENDOR_ID   0x00000000UL

Get vendor ID and largest standard function.

Definition at line 41 of file cpuid.h.

Referenced by __setting(), and ucode_exec().

◆ CPUID_FEATURES

#define CPUID_FEATURES   0x00000001UL

Get standard features.

Definition at line 44 of file cpuid.h.

Referenced by ucode_exec(), and x86_intel_features().

◆ CPUID_FEATURES_INTEL_ECX_RDRAND

#define CPUID_FEATURES_INTEL_ECX_RDRAND   0x40000000UL

RDRAND instruction is supported.

Definition at line 47 of file cpuid.h.

Referenced by rdrand_entropy_enable().

◆ CPUID_FEATURES_INTEL_ECX_HYPERVISOR

#define CPUID_FEATURES_INTEL_ECX_HYPERVISOR   0x80000000UL

Hypervisor is present.

Definition at line 50 of file cpuid.h.

Referenced by hv_check_hv().

◆ CPUID_FEATURES_INTEL_EDX_TSC

#define CPUID_FEATURES_INTEL_EDX_TSC   0x00000010UL

TSC is present.

Definition at line 53 of file cpuid.h.

Referenced by rtc_entropy_enable().

◆ 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.

Referenced by check_fxsr().

◆ 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.

Referenced by cpuid_supported().

◆ CPUID_AMD_FEATURES

#define CPUID_AMD_FEATURES   0x80000001UL

Get extended features.

Definition at line 68 of file cpuid.h.

Referenced by x86_amd_features().

◆ CPUID_MODEL

#define CPUID_MODEL   0x80000002UL

Get CPU model.

Definition at line 71 of file cpuid.h.

Referenced by __setting().

◆ CPUID_APM

#define CPUID_APM   0x80000007UL

Get APM information.

Definition at line 74 of file cpuid.h.

Referenced by rdtsc_probe().

◆ CPUID_APM_EDX_TSC_INVARIANT

#define CPUID_APM_EDX_TSC_INVARIANT   0x00000100UL

Invariant TSC.

Definition at line 77 of file cpuid.h.

Referenced by rdtsc_probe().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ __attribute__()

__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)
extern

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 ) !=
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 colour
Colour for debug messages.
Definition acpi.c:42
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
unsigned int uint32_t
Definition stdint.h:12
long discard_c
Definition bigint.h:33
static int cpuid_instruction_supported(void)
Check whether or not CPUID instruction is supported.
Definition cpuid.c:45
#define CPUID_HYPERVISOR
CPUID hypervisor function.
Definition cpuid.h:38
#define CPUID_EXTENDED
CPUID extended function.
Definition cpuid.h:35
#define CPUID_AMD_CHECK_MASK
Extended function existence check mask.
Definition cpuid.h:65
uint8_t function
Function.
Definition edd.h:5
#define DBGC(...)
Definition compiler.h:505
#define EINVAL
Invalid argument.
Definition errno.h:429
#define ENOTTY
Inappropriate I/O control operation.
Definition errno.h:595

References colour, CPUID_AMD_CHECK_MASK, CPUID_EXTENDED, CPUID_HYPERVISOR, cpuid_instruction_supported(), DBGC, discard_c, EINVAL, ENOTTY, function, 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)
extern

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_intel_features(struct x86_features *features)
Get Intel-defined x86 CPU features.
Definition cpuid.c:117
static void x86_amd_features(struct x86_features *features)
Get AMD-defined x86 CPU features.
Definition cpuid.c:141
uint32_t features
Supported features.
Definition ena.h:5
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

◆ 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 91 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 ) )
uint32_t eax
Definition string.h:235
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:91
static uint32_t subfunction
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")

Definition at line 91 of file cpuid.h.

Referenced by hv_map_hypercall(), and hvm_cpuid_base().