|
iPXE
|
x86 CPUID settings More...
#include <string.h>#include <errno.h>#include <byteswap.h>#include <ipxe/init.h>#include <ipxe/settings.h>#include <ipxe/cpuid.h>Go to the source code of this file.
Macros | |
| #define | CPUID_TAG(function, subfunction, flags, num_registers, register1, register2, register3, register4) |
| Construct CPUID setting tag. More... | |
| #define | CPUID_FUNCTION(tag) ( (tag) & 0xc00000ffUL ) |
| Extract starting function number from CPUID setting tag. More... | |
| #define | CPUID_SUBFUNCTION(tag) ( ( (tag) >> 24 ) & 0x7f ) |
| Extract subfunction number from CPUID setting tag. More... | |
| #define | CPUID_NUM_FUNCTIONS(tag) ( ( ( (tag) >> 24 ) & 0x3f ) + 1 ) |
| Extract number of consecutive functions from CPUID setting tag. More... | |
| #define | CPUID_REGISTERS(tag) ( ( (tag) >> 8 ) & 0xff ) |
| Extract register array from CPUID setting tag. More... | |
| #define | CPUID_NUM_REGISTERS(tag) ( ( ( (tag) >> 16 ) & 0x3 ) + 1 ) |
| Extract number of registers from CPUID setting tag. More... | |
Enumerations | |
| enum | cpuid_registers { CPUID_EAX = 0, CPUID_EBX = 1, CPUID_ECX = 2, CPUID_EDX = 3 } |
| CPUID setting tag register indices. More... | |
| enum | cpuid_flags { CPUID_LITTLE_ENDIAN = 0x00800000UL, CPUID_USE_SUBFUNCTION = 0x00400000UL } |
| CPUID setting tag flags. More... | |
Functions | |
| FILE_LICENCE (GPL2_OR_LATER_OR_UBDL) | |
| static int | cpuid_settings_applies (struct settings *settings __unused, const struct setting *setting) |
| Check applicability of CPUID setting. More... | |
| static int | cpuid_settings_fetch (struct settings *settings, struct setting *setting, void *data, size_t len) |
| Fetch value of CPUID setting. More... | |
| static void | cpuid_settings_init (void) |
| Initialise CPUID settings. More... | |
| struct init_fn cpuid_settings_init_fn | __init_fn (INIT_NORMAL) |
| CPUID settings initialiser. More... | |
| const struct setting cpuvendor_setting | __setting (SETTING_HOST_EXTRA, cpuvendor) |
| CPU vendor setting. More... | |
| const struct setting cpumodel_setting | __setting (SETTING_HOST_EXTRA, cpumodel) |
| CPU model setting. More... | |
Variables | |
| static const struct settings_scope | cpuid_settings_scope |
| CPUID settings scope. More... | |
| static struct settings_operations | cpuid_settings_operations |
| CPUID settings operations. More... | |
| static struct settings | cpuid_settings |
| CPUID settings. More... | |
x86 CPUID settings
CPUID settings are numerically encoded as:
Bit 31 Extended function Bits 30-24 (bit 22 = 1) Subfunction number Bit 30 (bit 22 = 0) Hypervisor function Bits 29-24 (bit 22 = 0) Number of consecutive functions to call, minus one Bit 23 Return result as little-endian (used for strings) Bit 22 Interpret bits 30-24 as a subfunction number Bits 21-18 Unused Bits 17-16 Number of registers in register array, minus one Bits 15-8 Array of register indices. First entry in array is in bits 9-8. Indices are 0-eax, 1-ebx, 2-ecx, 3-edx. Bits 7-0 Starting function number (excluding "extended" bit)
This encoding scheme is designed to allow the common case of extracting a single register from a single function to be encoded using "cpuid/<register>.<function>", e.g. "cpuid/2.0x80000001" to retrieve the value of ecx from calling CPUID with eax=0x80000001.
A subfunction (i.e. an input value for ecx) may be specified using "cpuid/<subfunction>.0x40.<register>.<function>". This slightly cumbersome syntax is required in order to maintain backwards compatibility with older scripts.
Definition in file cpuid_settings.c.
| #define CPUID_TAG | ( | function, | |
| subfunction, | |||
| flags, | |||
| num_registers, | |||
| register1, | |||
| register2, | |||
| register3, | |||
| register4 | |||
| ) |
Construct CPUID setting tag.
| function | Starting function number |
| subfunction | Subfunction, or number of consecutive functions minus 1 |
| flags | Flags |
| num_registers | Number of registers in register array |
| register1 | First register in register array (or zero, if empty) |
| register2 | Second register in register array (or zero, if empty) |
| register3 | Third register in register array (or zero, if empty) |
| register4 | Fourth register in register array (or zero, if empty) |
| tag | Setting tag |
Definition at line 89 of file cpuid_settings.c.
Extract starting function number from CPUID setting tag.
| tag | Setting tag |
| function | Starting function number |
Definition at line 102 of file cpuid_settings.c.
Extract subfunction number from CPUID setting tag.
| tag | Setting tag |
| subfunction | Subfunction number |
Definition at line 110 of file cpuid_settings.c.
Extract number of consecutive functions from CPUID setting tag.
| tag | Setting tag |
| num_functions | Number of consecutive functions |
Definition at line 118 of file cpuid_settings.c.
Extract register array from CPUID setting tag.
| tag | Setting tag |
| registers | Register array |
Definition at line 126 of file cpuid_settings.c.
Extract number of registers from CPUID setting tag.
| tag | Setting tag |
| num_registers | Number of registers within register array |
Definition at line 134 of file cpuid_settings.c.
| enum cpuid_registers |
CPUID setting tag register indices.
| Enumerator | |
|---|---|
| CPUID_EAX | |
| CPUID_EBX | |
| CPUID_ECX | |
| CPUID_EDX | |
Definition at line 63 of file cpuid_settings.c.
| enum cpuid_flags |
CPUID setting tag flags.
| Enumerator | |
|---|---|
| CPUID_LITTLE_ENDIAN | |
| CPUID_USE_SUBFUNCTION | |
Definition at line 71 of file cpuid_settings.c.
| FILE_LICENCE | ( | GPL2_OR_LATER_OR_UBDL | ) |
|
static |
Check applicability of CPUID setting.
| settings | Settings block |
| setting | Setting |
| applies | Setting applies within this settings block |
Definition at line 146 of file cpuid_settings.c.
References cpuid_settings_scope, and setting::scope.
|
static |
Fetch value of CPUID setting.
| settings | Settings block |
| setting | Setting to fetch |
| data | Buffer to fill with setting data |
| len | Length of buffer |
| len | Length of setting data, or negative error |
Definition at line 161 of file cpuid_settings.c.
References cpu_to_be32, CPUID_EAX, CPUID_EBX, CPUID_ECX, CPUID_EDX, CPUID_FUNCTION, CPUID_HYPERVISOR, CPUID_LITTLE_ENDIAN, CPUID_NUM_FUNCTIONS, CPUID_NUM_REGISTERS, CPUID_REGISTERS, CPUID_SUBFUNCTION, cpuid_supported(), CPUID_USE_SUBFUNCTION, data, DBGC, len, memcpy(), rc, strerror(), subfunction, setting::tag, and setting::type.
|
static |
Initialise CPUID settings.
Definition at line 240 of file cpuid_settings.c.
References cpuid_settings, DBG, NULL, rc, register_settings(), and strerror().
| struct init_fn cpuid_settings_init_fn __init_fn | ( | INIT_NORMAL | ) |
CPUID settings initialiser.
| const struct setting cpuvendor_setting __setting | ( | SETTING_HOST_EXTRA | , |
| cpuvendor | |||
| ) |
CPU vendor setting.
| const struct setting cpumodel_setting __setting | ( | SETTING_HOST_EXTRA | , |
| cpumodel | |||
| ) |
CPU model setting.
|
static |
CPUID settings scope.
Definition at line 137 of file cpuid_settings.c.
Referenced by cpuid_settings_applies().
|
static |
CPUID settings operations.
Definition at line 225 of file cpuid_settings.c.
|
static |
CPUID settings.
Definition at line 231 of file cpuid_settings.c.
Referenced by cpuid_settings_init().
1.8.15