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;