aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2024-07-31 16:35:31 +0100
committerMichael Brown <mcb30@ipxe.org>2024-08-01 12:49:48 +0100
commit121d96b903b221e2c63fa0fc5a8901dc24645a47 (patch)
tree78a922651fadcc5c70218b7fd89ced8934c6452d
parentc117e6a4811efa057dc70426d58a8dab75245862 (diff)
downloadipxe-121d96b903b221e2c63fa0fc5a8901dc24645a47.zip
ipxe-121d96b903b221e2c63fa0fc5a8901dc24645a47.tar.gz
ipxe-121d96b903b221e2c63fa0fc5a8901dc24645a47.tar.bz2
[cpuid] Allow reading hypervisor CPUID leaves
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 <mcb30@ipxe.org>
-rw-r--r--src/arch/x86/core/cpuid.c4
-rw-r--r--src/arch/x86/include/ipxe/cpuid.h3
2 files changed, 5 insertions, 2 deletions
diff --git a/src/arch/x86/core/cpuid.c b/src/arch/x86/core/cpuid.c
index 1a7c93e..b7d9fb6 100644
--- a/src/arch/x86/core/cpuid.c
+++ b/src/arch/x86/core/cpuid.c
@@ -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
diff --git a/src/arch/x86/include/ipxe/cpuid.h b/src/arch/x86/include/ipxe/cpuid.h
index 90d1bf0..99b91c5 100644
--- a/src/arch/x86/include/ipxe/cpuid.h
+++ b/src/arch/x86/include/ipxe/cpuid.h
@@ -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