Skip to content

Commit

Permalink
tools/x86/kcpuid: Dump the CPUID function in detailed view
Browse files Browse the repository at this point in the history
Sometimes it is useful to know which CPUID leaf contains the fields so
add it to -d output so that it looks like this:

  CPUID_0x8000001e_ECX[0x0]:
           extended_apic_id       : 0x8           - Extended APIC ID
           core_id                : 0x4           - Identifies the logical core ID
           threads_per_core       : 0x1           - The number of threads per core is threads_per_core + 1
           node_id                : 0x0           - Node ID
           nodes_per_processor    : 0x0           - Nodes per processor { 0: 1 node, else reserved }

  CPUID_0x8000001f_ECX[0x0]:
           sme                 -  Secure Memory Encryption

...

Signed-off-by: Borislav Petkov (AMD) <[email protected]>
Signed-off-by: Terry Bowman <[email protected]>
Reviewed-by: Feng Tang <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
  • Loading branch information
bp3tk0v committed Mar 7, 2023
1 parent ce22e43 commit cd3ad66
Showing 1 changed file with 25 additions and 7 deletions.
32 changes: 25 additions & 7 deletions tools/arch/x86/kcpuid/kcpuid.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,18 @@ struct reg_desc {
struct bits_desc descs[32];
};

enum {
enum cpuid_reg {
R_EAX = 0,
R_EBX,
R_ECX,
R_EDX,
NR_REGS
};

static const char * const reg_names[] = {
"EAX", "EBX", "ECX", "EDX",
};

struct subleaf {
u32 index;
u32 sub;
Expand Down Expand Up @@ -428,12 +432,18 @@ static void parse_text(void)


/* Decode every eax/ebx/ecx/edx */
static void decode_bits(u32 value, struct reg_desc *rdesc)
static void decode_bits(u32 value, struct reg_desc *rdesc, enum cpuid_reg reg)
{
struct bits_desc *bdesc;
int start, end, i;
u32 mask;

if (!rdesc->nr) {
if (show_details)
printf("\t %s: 0x%08x\n", reg_names[reg], value);
return;
}

for (i = 0; i < rdesc->nr; i++) {
bdesc = &rdesc->descs[i];

Expand Down Expand Up @@ -468,13 +478,21 @@ static void show_leaf(struct subleaf *leaf)
if (!leaf)
return;

if (show_raw)
if (show_raw) {
leaf_print_raw(leaf);
} else {
if (show_details)
printf("CPUID_0x%x_ECX[0x%x]:\n",
leaf->index, leaf->sub);
}

decode_bits(leaf->eax, &leaf->info[R_EAX], R_EAX);
decode_bits(leaf->ebx, &leaf->info[R_EBX], R_EBX);
decode_bits(leaf->ecx, &leaf->info[R_ECX], R_ECX);
decode_bits(leaf->edx, &leaf->info[R_EDX], R_EDX);

decode_bits(leaf->eax, &leaf->info[R_EAX]);
decode_bits(leaf->ebx, &leaf->info[R_EBX]);
decode_bits(leaf->ecx, &leaf->info[R_ECX]);
decode_bits(leaf->edx, &leaf->info[R_EDX]);
if (!show_raw && show_details)
printf("\n");
}

static void show_func(struct cpuid_func *func)
Expand Down

0 comments on commit cd3ad66

Please sign in to comment.