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().