Module Name: src
Committed By: riastradh
Date: Sun Mar 9 19:16:47 UTC 2025
Modified Files:
src/sys/dev/nvmm/x86: nvmm_x86_svm.c nvmm_x86_vmx.c
Log Message:
nvmm(4): Add comments explaining unknown CPUID behaviour.
Sprinkle some more comments about the CPUID ranges too.
No functional change intended.
To generate a diff of this commit:
cvs rdiff -u -r1.85 -r1.86 src/sys/dev/nvmm/x86/nvmm_x86_svm.c
cvs rdiff -u -r1.86 -r1.87 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/nvmm/x86/nvmm_x86_svm.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.85 src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.86
--- src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.85 Thu Feb 23 02:54:02 2023
+++ src/sys/dev/nvmm/x86/nvmm_x86_svm.c Sun Mar 9 19:16:47 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm_x86_svm.c,v 1.85 2023/02/23 02:54:02 riastradh Exp $ */
+/* $NetBSD: nvmm_x86_svm.c,v 1.86 2025/03/09 19:16:47 riastradh Exp $ */
/*
* Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.85 2023/02/23 02:54:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.86 2025/03/09 19:16:47 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -862,17 +862,32 @@ svm_inkernel_handle_cpuid(struct nvmm_cp
struct svm_cpudata *cpudata = vcpu->cpudata;
uint64_t cr4;
- if (eax < 0x40000000) {
+
+ /*
+ * `If a value entered for CPUID.EAX is higher than the maximum
+ * input value for basic or extended function for that
+ * processor then the dtaa for the highest basic information
+ * leaf is returned.'
+ *
+ * --Intel 64 and IA-32 Architectures Software Developer's
+ * Manual, Vol. 2A, Order Number: 325383-077US, April 2022,
+ * Sec. 3.2 `Instructions (A-L)', CPUID--CPU Identification,
+ * pp. 3-214.
+ *
+ * We take the same to hold for the hypervisor range,
+ * 0x40000000-0x4fffffff.
+ */
+ if (eax < 0x40000000) { /* basic CPUID range */
if (__predict_false(eax > svm_cpuid_max_basic)) {
eax = svm_cpuid_max_basic;
svm_inkernel_exec_cpuid(cpudata, eax, ecx);
}
- } else if (eax < 0x80000000) {
+ } else if (eax < 0x80000000) { /* hypervisor CPUID range */
if (__predict_false(eax > SVM_CPUID_MAX_HYPERVISOR)) {
eax = svm_cpuid_max_basic;
svm_inkernel_exec_cpuid(cpudata, eax, ecx);
}
- } else {
+ } else { /* extended CPUID range */
if (__predict_false(eax > svm_cpuid_max_extended)) {
eax = svm_cpuid_max_basic;
svm_inkernel_exec_cpuid(cpudata, eax, ecx);
@@ -880,6 +895,10 @@ svm_inkernel_handle_cpuid(struct nvmm_cp
}
switch (eax) {
+
+ /*
+ * basic CPUID range
+ */
case 0x00000000:
cpudata->vmcb->state.rax = svm_cpuid_max_basic;
break;
@@ -970,6 +989,9 @@ svm_inkernel_handle_cpuid(struct nvmm_cp
}
break;
+ /*
+ * hypervisor CPUID range
+ */
case 0x40000000: /* Hypervisor Information */
cpudata->vmcb->state.rax = SVM_CPUID_MAX_HYPERVISOR;
cpudata->gprs[NVMM_X64_GPR_RBX] = 0;
@@ -980,6 +1002,9 @@ svm_inkernel_handle_cpuid(struct nvmm_cp
memcpy(&cpudata->gprs[NVMM_X64_GPR_RDX], " ___", 4);
break;
+ /*
+ * extended CPUID range
+ */
case 0x80000000:
cpudata->vmcb->state.rax = svm_cpuid_max_extended;
break;
Index: src/sys/dev/nvmm/x86/nvmm_x86_vmx.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.86 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.87
--- src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.86 Mon Nov 6 17:02:17 2023
+++ src/sys/dev/nvmm/x86/nvmm_x86_vmx.c Sun Mar 9 19:16:47 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm_x86_vmx.c,v 1.86 2023/11/06 17:02:17 rin Exp $ */
+/* $NetBSD: nvmm_x86_vmx.c,v 1.87 2025/03/09 19:16:47 riastradh Exp $ */
/*
* Copyright (c) 2018-2020 Maxime Villard, m00nbsd.net
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.86 2023/11/06 17:02:17 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.87 2025/03/09 19:16:47 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1245,17 +1245,31 @@ vmx_inkernel_handle_cpuid(struct nvmm_ma
unsigned int ncpus;
uint64_t cr4;
- if (eax < 0x40000000) {
+ /*
+ * `If a value entered for CPUID.EAX is higher than the maximum
+ * input value for basic or extended function for that
+ * processor then the dtaa for the highest basic information
+ * leaf is returned.'
+ *
+ * --Intel 64 and IA-32 Architectures Software Developer's
+ * Manual, Vol. 2A, Order Number: 325383-077US, April 2022,
+ * Sec. 3.2 `Instructions (A-L)', CPUID--CPU Identification,
+ * pp. 3-214.
+ *
+ * We take the same to hold for the hypervisor range,
+ * 0x40000000-0x4fffffff.
+ */
+ if (eax < 0x40000000) { /* basic CPUID range */
if (__predict_false(eax > vmx_cpuid_max_basic)) {
eax = vmx_cpuid_max_basic;
vmx_inkernel_exec_cpuid(cpudata, eax, ecx);
}
- } else if (eax < 0x80000000) {
+ } else if (eax < 0x80000000) { /* hypervisor CPUID range */
if (__predict_false(eax > VMX_CPUID_MAX_HYPERVISOR)) {
eax = vmx_cpuid_max_basic;
vmx_inkernel_exec_cpuid(cpudata, eax, ecx);
}
- } else {
+ } else { /* extended CPUID range */
if (__predict_false(eax > vmx_cpuid_max_extended)) {
eax = vmx_cpuid_max_basic;
vmx_inkernel_exec_cpuid(cpudata, eax, ecx);
@@ -1263,6 +1277,10 @@ vmx_inkernel_handle_cpuid(struct nvmm_ma
}
switch (eax) {
+
+ /*
+ * basic CPUID range
+ */
case 0x00000000:
cpudata->gprs[NVMM_X64_GPR_RAX] = vmx_cpuid_max_basic;
break;
@@ -1422,6 +1440,9 @@ vmx_inkernel_handle_cpuid(struct nvmm_ma
case 0x00000016: /* Processor Frequency Information */
break;
+ /*
+ * hypervisor CPUID range
+ */
case 0x40000000: /* Hypervisor Information */
cpudata->gprs[NVMM_X64_GPR_RAX] = VMX_CPUID_MAX_HYPERVISOR;
cpudata->gprs[NVMM_X64_GPR_RBX] = 0;
@@ -1432,6 +1453,9 @@ vmx_inkernel_handle_cpuid(struct nvmm_ma
memcpy(&cpudata->gprs[NVMM_X64_GPR_RDX], " ___", 4);
break;
+ /*
+ * extended CPUID range
+ */
case 0x80000000:
cpudata->gprs[NVMM_X64_GPR_RAX] = vmx_cpuid_max_extended;
break;