iPXE
cpuid.h
Go to the documentation of this file.
1#ifndef _IPXE_CPUID_H
2#define _IPXE_CPUID_H
3
4/** @file
5 *
6 * x86 CPU feature detection
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_SECBOOT ( PERMITTED );
12
13#include <stdint.h>
14
15/** An x86 CPU feature register set */
17 /** Features returned via %ecx */
19 /** Features returned via %edx */
21};
22
23/** x86 CPU features */
25 /** Intel-defined features (%eax=0x00000001) */
27 /** AMD-defined features (%eax=0x80000001) */
29};
30
31/** CPUID support flag */
32#define CPUID_FLAG 0x00200000UL
33
34/** CPUID extended function */
35#define CPUID_EXTENDED 0x80000000UL
36
37/** CPUID hypervisor function */
38#define CPUID_HYPERVISOR 0x40000000UL
39
40/** Get vendor ID and largest standard function */
41#define CPUID_VENDOR_ID 0x00000000UL
42
43/** Get standard features */
44#define CPUID_FEATURES 0x00000001UL
45
46/** AES-NI instructions are supported */
47#define CPUID_FEATURES_INTEL_ECX_AESNI 0x02000000UL
48
49/** RDRAND instruction is supported */
50#define CPUID_FEATURES_INTEL_ECX_RDRAND 0x40000000UL
51
52/** Hypervisor is present */
53#define CPUID_FEATURES_INTEL_ECX_HYPERVISOR 0x80000000UL
54
55/** TSC is present */
56#define CPUID_FEATURES_INTEL_EDX_TSC 0x00000010UL
57
58/** FXSAVE and FXRSTOR are supported */
59#define CPUID_FEATURES_INTEL_EDX_FXSR 0x01000000UL
60
61/** Get largest extended function */
62#define CPUID_AMD_MAX_FN 0x80000000UL
63
64/** Extended function existence check */
65#define CPUID_AMD_CHECK 0x80000000UL
66
67/** Extended function existence check mask */
68#define CPUID_AMD_CHECK_MASK 0xffff0000UL
69
70/** Get extended features */
71#define CPUID_AMD_FEATURES 0x80000001UL
72
73/** Get CPU model */
74#define CPUID_MODEL 0x80000002UL
75
76/** Get APM information */
77#define CPUID_APM 0x80000007UL
78
79/** Invariant TSC */
80#define CPUID_APM_EDX_TSC_INVARIANT 0x00000100UL
81
82/**
83 * Issue CPUID instruction
84 *
85 * @v function CPUID function (input via %eax)
86 * @v subfunction CPUID subfunction (input via %ecx)
87 * @v eax Output via %eax
88 * @v ebx Output via %ebx
89 * @v ecx Output via %ecx
90 * @v edx Output via %edx
91 */
92static inline __attribute__ (( always_inline )) void
95
96 __asm__ ( "cpuid"
97 : "=a" ( *eax ), "=b" ( *ebx ), "=c" ( *ecx ), "=d" ( *edx )
98 : "0" ( function ), "2" ( subfunction ) );
99}
100
101extern int cpuid_supported ( uint32_t function );
102extern void x86_features ( struct x86_features *features );
103
104#endif /* _IPXE_CPUID_H */
unsigned int uint32_t
Definition stdint.h:12
uint32_t eax
Definition string.h:235
static uint32_t uint32_t uint32_t * ebx
Definition cpuid.h:93
void x86_features(struct x86_features *features)
Get x86 CPU features.
Definition cpuid.c:164
static uint32_t uint32_t uint32_t uint32_t * ecx
Definition cpuid.h:94
static uint32_t subfunction
Definition cpuid.h:93
static uint32_t uint32_t uint32_t uint32_t uint32_t * edx
Definition cpuid.h:94
int cpuid_supported(uint32_t function)
Check whether or not CPUID function is supported.
Definition cpuid.c:76
uint8_t function
Function.
Definition edd.h:5
uint32_t features
Supported features.
Definition ena.h:5
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:921
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:951
#define __attribute__(x)
Definition compiler.h:10
__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")
An x86 CPU feature register set.
Definition cpuid.h:16
uint32_t edx
Features returned via edx.
Definition cpuid.h:20
uint32_t ecx
Features returned via ecx.
Definition cpuid.h:18
x86 CPU features
Definition cpuid.h:24
struct x86_feature_registers intel
Intel-defined features (eax=0x00000001).
Definition cpuid.h:26
struct x86_feature_registers amd
AMD-defined features (eax=0x80000001).
Definition cpuid.h:28