Currently, OVMF is hard-coded to set up a maximum of 64 vCPUs on
startup.
There are efforts to support a maximum of 128 vCPUs, which would involve
bumping the OVMF constant from 64 to 128.
However, it would be more future-proof for OVMF to access the maximum
number of vCPUs for a domain and set itself up appropriately at
run-time.
GitLab ticket: https://gitlab.com/xen-project/xen/-/issues/191
For OVMF to access the maximum vCPU count, this patch has Xen expose
the maximum vCPU ID via cpuid on the HVM hypervisor leaf in edx.
Signed-off-by: Matthew Barnes <matthew.barnes@cloud.com>
---
Changes in v2:
- Tweak value from "maximum vcpu count" to "maximum vcpu id"
- Reword commit message to avoid "have to" wording
- Fix vpcus -> vcpus typo
---
xen/arch/x86/traps.c | 4 ++++
xen/include/public/arch-x86/cpuid.h | 3 +++
2 files changed, 7 insertions(+)
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index ee91fc56b125..f39b598e9bba 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -1169,6 +1169,10 @@ void cpuid_hypervisor_leaves(const struct vcpu *v, uint32_t leaf,
res->a |= XEN_HVM_CPUID_DOMID_PRESENT;
res->c = d->domain_id;
+ /* Indicate presence of max vcpu id and set it in edx */
+ res->a |= XEN_HVM_CPUID_MAX_VCPU_ID_PRESENT;
+ res->d = d->max_vcpus - 1;
+
/*
* Per-vCPU event channel upcalls are implemented and work
* correctly with PIRQs routed over event channels.
diff --git a/xen/include/public/arch-x86/cpuid.h b/xen/include/public/arch-x86/cpuid.h
index 3bb0dd249ff9..7673e285a9ec 100644
--- a/xen/include/public/arch-x86/cpuid.h
+++ b/xen/include/public/arch-x86/cpuid.h
@@ -87,6 +87,7 @@
* Sub-leaf 0: EAX: Features
* Sub-leaf 0: EBX: vcpu id (iff EAX has XEN_HVM_CPUID_VCPU_ID_PRESENT flag)
* Sub-leaf 0: ECX: domain id (iff EAX has XEN_HVM_CPUID_DOMID_PRESENT flag)
+ * Sub-leaf 0: EDX: max vcpu id (iff EAX has XEN_HVM_CPUID_MAX_VCPU_ID_PRESENT flag)
*/
#define XEN_HVM_CPUID_APIC_ACCESS_VIRT (1u << 0) /* Virtualized APIC registers */
#define XEN_HVM_CPUID_X2APIC_VIRT (1u << 1) /* Virtualized x2APIC accesses */
@@ -107,6 +108,8 @@
*/
#define XEN_HVM_CPUID_UPCALL_VECTOR (1u << 6)
+#define XEN_HVM_CPUID_MAX_VCPU_ID_PRESENT (1u << 7) /* max vcpu id is present in EDX */
+
/*
* Leaf 6 (0x40000x05)
* PV-specific parameters
--
2.34.1