Skip to content
This repository has been archived by the owner on Aug 29, 2024. It is now read-only.

Commit

Permalink
[cpuid] Allow reading hypervisor CPUID leaves
Browse files Browse the repository at this point in the history
Hypervisors typically intercept CPUID leaves in the range 0x40000000
to 0x400000ff, with leaf 0x40000000 returning the maximum supported
function within this range in register %eax.

iPXE currently masks off bit 30 from the requested CPUID leaf when
checking to see if a function is supported, which causes this check to
read from leaf 0x00000000 instead of 0x40000000.

Fix by including bit 30 within the mask.

Signed-off-by: Michael Brown <[email protected]>
  • Loading branch information
mcb30 committed Aug 1, 2024
1 parent c117e6a commit 121d96b
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/arch/x86/core/cpuid.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ int cpuid_supported ( uint32_t function ) {
return rc;

/* Find highest supported function number within this family */
cpuid ( ( function & CPUID_EXTENDED ), 0, &max_function, &discard_b,
&discard_c, &discard_d );
cpuid ( ( function & ( CPUID_EXTENDED | CPUID_HYPERVISOR ) ), 0,
&max_function, &discard_b, &discard_c, &discard_d );

/* Fail if maximum function number is meaningless (e.g. if we
* are attempting to call an extended function on a CPU which
Expand Down
3 changes: 3 additions & 0 deletions src/arch/x86/include/ipxe/cpuid.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ struct x86_features {
/** CPUID extended function */
#define CPUID_EXTENDED 0x80000000UL

/** CPUID hypervisor function */
#define CPUID_HYPERVISOR 0x40000000UL

/** Get vendor ID and largest standard function */
#define CPUID_VENDOR_ID 0x00000000UL

Expand Down

0 comments on commit 121d96b

Please sign in to comment.