git: a27328ea3927 - main - bhyve: Suppress unimplemented MSR related warnings

From: Warner Losh <imp_at_FreeBSD.org>
Date: Mon, 24 Mar 2025 17:03:38 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=a27328ea392714f2bc106f138191fd465157aafb

commit a27328ea392714f2bc106f138191fd465157aafb
Author:     brendabrandy <sogun3@gmail.com>
AuthorDate: 2025-03-11 23:19:58 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2025-03-24 17:02:30 +0000

    bhyve: Suppress unimplemented MSR related warnings
    
    When using bhyve on x86, rdmsr and wrmsr can emit many warnings when
    dealing with unimplemented MSRs. An option x86.verbosemsr is created to
    control these warnings. By default, the MSR related warnings are
    suppressed to avoid spamming the console.
    
    Sponsored by: Netflix
    Reviewed by: imp, jhb
    Pull Request: https://github.com/freebsd/freebsd-src/pull/1611
---
 usr.sbin/bhyve/amd64/bhyverun_machdep.c |  1 +
 usr.sbin/bhyve/amd64/vmexit.c           | 14 ++++++++++----
 usr.sbin/bhyve/bhyve_config.5           |  5 +++++
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/usr.sbin/bhyve/amd64/bhyverun_machdep.c b/usr.sbin/bhyve/amd64/bhyverun_machdep.c
index d51ad3a5fc05..85af124b5536 100644
--- a/usr.sbin/bhyve/amd64/bhyverun_machdep.c
+++ b/usr.sbin/bhyve/amd64/bhyverun_machdep.c
@@ -63,6 +63,7 @@ bhyve_init_config(void)
 	set_config_bool("acpi_tables_in_memory", true);
 	set_config_value("memory.size", "256M");
 	set_config_bool("x86.strictmsr", true);
+	set_config_bool("x86.verbosemsr", false);
 	set_config_value("lpc.fwcfg", "bhyve");
 }
 
diff --git a/usr.sbin/bhyve/amd64/vmexit.c b/usr.sbin/bhyve/amd64/vmexit.c
index e0b9aec2d17a..944f5de34645 100644
--- a/usr.sbin/bhyve/amd64/vmexit.c
+++ b/usr.sbin/bhyve/amd64/vmexit.c
@@ -107,8 +107,11 @@ vmexit_rdmsr(struct vmctx *ctx __unused, struct vcpu *vcpu,
 	val = 0;
 	error = emulate_rdmsr(vcpu, vme->u.msr.code, &val);
 	if (error != 0) {
-		EPRINTLN("rdmsr to register %#x on vcpu %d",
-		    vme->u.msr.code, vcpu_id(vcpu));
+		if (get_config_bool("x86.strictmsr") ||
+		    get_config_bool("x86.verbosemsr")) {
+			EPRINTLN("rdmsr to register %#x on vcpu %d",
+			    vme->u.msr.code, vcpu_id(vcpu));
+		}
 		if (get_config_bool("x86.strictmsr")) {
 			vm_inject_gp(vcpu);
 			return (VMEXIT_CONTINUE);
@@ -137,8 +140,11 @@ vmexit_wrmsr(struct vmctx *ctx __unused, struct vcpu *vcpu,
 
 	error = emulate_wrmsr(vcpu, vme->u.msr.code, vme->u.msr.wval);
 	if (error != 0) {
-		EPRINTLN("wrmsr to register %#x(%#lx) on vcpu %d",
-		    vme->u.msr.code, vme->u.msr.wval, vcpu_id(vcpu));
+		if (get_config_bool("x86.strictmsr") ||
+		    get_config_bool("x86.verbosemsr")) {
+			EPRINTLN("wrmsr to register %#x(%#lx) on vcpu %d",
+			    vme->u.msr.code, vme->u.msr.wval, vcpu_id(vcpu));
+		}
 		if (get_config_bool("x86.strictmsr")) {
 			vm_inject_gp(vcpu);
 			return (VMEXIT_CONTINUE);
diff --git a/usr.sbin/bhyve/bhyve_config.5 b/usr.sbin/bhyve/bhyve_config.5
index 3f9d9130787b..3dd24ca5fe69 100644
--- a/usr.sbin/bhyve/bhyve_config.5
+++ b/usr.sbin/bhyve/bhyve_config.5
@@ -240,6 +240,11 @@ By default, writes are ignored and reads return all bits set.
 Inject a general protection fault if a guest accesses a Model Specific
 Register (MSR) that is not emulated.
 If this is false, writes are ignored and reads return zero.
+.It Va x86.verbosemsr Ta bool Ta false Ta
+Enable verbose MSR print out. When this option is true,
+messages related to reading from (rdmsr) and writing to (wrmsr)
+MSRs on virtual CPUs will be printed out. This can be useful for
+debugging purposes.
 .It Va x86.vmexit_on_hlt Ta bool Ta false Ta
 Force a VM exit when a guest CPU executes the
 .Dv HLT