89 #define CPUID_TAG( function, subfunction, flags, num_registers, \ 90 register1, register2, register3, register4 ) \ 91 ( (function) | ( (subfunction) << 24 ) | (flags) | \ 92 ( ( (num_registers) - 1 ) << 16 ) | \ 93 ( (register1) << 8 ) | ( (register2) << 10 ) | \ 94 ( (register3) << 12 ) | ( (register4) << 14 ) ) 102 #define CPUID_FUNCTION( tag ) ( (tag) & 0xc00000ffUL ) 110 #define CPUID_SUBFUNCTION( tag ) ( ( (tag) >> 24 ) & 0x7f ) 118 #define CPUID_NUM_FUNCTIONS( tag ) ( ( ( (tag) >> 24 ) & 0x3f ) + 1 ) 126 #define CPUID_REGISTERS( tag ) ( ( (tag) >> 8 ) & 0xff ) 134 #define CPUID_NUM_REGISTERS( tag ) ( ( ( (tag) >> 16 ) & 0x3 ) + 1 ) 172 size_t result_len = 0;
185 for ( ; num_functions-- ;
function++ ) {
197 DBGC (
settings,
"CPUID %#08x:%x => %#08x:%#08x:%#08x:%#08x\n",
198 function,
subfunction, buf[0], buf[1], buf[2], buf[3] );
203 for ( ; num_registers-- ; registers >>= 2 ) {
204 output = buf[ registers & 0x3 ];
207 frag_len =
sizeof (
output );
208 if ( frag_len >
len )
213 result_len +=
sizeof (
output );
245 DBG (
"CPUID could not register settings: %s\n",
260 .description =
"CPU vendor",
263 .type = &setting_type_string,
271 .description =
"CPU model",
274 .type = &setting_type_string,
int cpuid_supported(uint32_t function)
Check whether or not CPUID function is supported.
struct arbelprm_rc_send_wqe rc
#define CPUID_HYPERVISOR
CPUID hypervisor function.
static int cpuid_settings_applies(struct settings *settings __unused, const struct setting *setting)
Check applicability of CPUID setting.
static int cpuid_settings_fetch(struct settings *settings, struct setting *setting, void *data, size_t len)
Fetch value of CPUID setting.
#define CPUID_FUNCTION(tag)
Extract starting function number from CPUID setting tag.
#define CPUID_SUBFUNCTION(tag)
Extract subfunction number from CPUID setting tag.
#define CPUID_VENDOR_ID
Get vendor ID and largest standard function.
#define SETTING_HOST_EXTRA
Host identity additional settings.
#define CPUID_MODEL
Get CPU model.
static uint32_t subfunction
uint64_t tag
Setting tag, if applicable.
#define INIT_NORMAL
Normal initialisation.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
An initialisation function.
static const struct settings_scope cpuid_settings_scope
CPUID settings scope.
#define CPUID_REGISTERS(tag)
Extract register array from CPUID setting tag.
static struct settings_operations cpuid_settings_operations
CPUID settings operations.
#define __unused
Declare a variable or data structure as unused.
#define CPUID_NUM_REGISTERS(tag)
Extract number of registers from CPUID setting tag.
#define CPUID_TAG(function, subfunction, flags, num_registers, register1, register2, register3, register4)
Construct CPUID setting tag.
const struct setting_type * type
Setting type.
char * strerror(int errno)
Retrieve string representation of error number.
x86 CPU feature detection
Settings block operations.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
struct init_fn cpuid_settings_init_fn __init_fn(INIT_NORMAL)
CPUID settings initialiser.
struct list_head siblings
Sibling settings blocks.
#define cpu_to_be32(value)
const struct setting cpuvendor_setting __setting(SETTING_HOST_EXTRA, cpuvendor)
CPU vendor setting.
static void cpuid_settings_init(void)
Initialise CPUID settings.
uint8_t data[48]
Additional event data.
int(* applies)(struct settings *settings, const struct setting *setting)
Check applicability of setting.
struct list_head children
Child settings blocks.
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
#define DBG(...)
Print a debugging message.
#define LIST_HEAD_INIT(list)
Initialise a static list head.
const struct settings_scope * scope
Setting scope (or NULL)
static struct settings cpuid_settings
CPUID settings.
cpuid_flags
CPUID setting tag flags.
#define NULL
NULL pointer (VOID *)
cpuid_registers
CPUID setting tag register indices.
struct refcnt * refcnt
Reference counter.
#define CPUID_NUM_FUNCTIONS(tag)
Extract number of consecutive functions from CPUID setting tag.