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;

Reply via email to