Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 17 May 2020 11:09:38 +0000 (UTC)
From:      Peter Grehan <grehan@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r361131 - stable/12/sys/amd64/vmm
Message-ID:  <202005171109.04HB9ckh023048@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: grehan
Date: Sun May 17 11:09:38 2020
New Revision: 361131
URL: https://svnweb.freebsd.org/changeset/base/361131

Log:
  MFC r361064
      Hide host CPUID 0x15 TSC/Crystal ratio/freq info from guest
  
      In recent Linux (5.3+) and OpenBSD (6.6+) kernels, and with hosts that
      support CPUID 0x15, the local APIC frequency is determined directly
      from the reported crystal clock to avoid calibration against the 8254
      timer.
  
      However, the local APIC frequency implemented by bhyve is 128MHz, where
      most h/w systems report frequencies around 25MHz. This shows up on
      OpenBSD guests as repeated keystrokes on the emulated PS2 keyboard
      when using VNC, since the kernel's timers are now much shorter.
  
      Fix by reporting all-zeroes for CPUID 0x15. This allows guests to fall
      back to using the 8254 to calibrate the local APIC frequency.
  
      Future work could be to compute values returned for 0x15 that would
      match the host TSC and bhyve local APIC frequency, though all dependencies
      on this would need to be examined (for example, Linux will start using
      0x16 for some hosts).
  
      PR:		246321
      Reported by:	Jason Tubnor (and tested)
  
  Approved by:	bz (mentor)

Modified:
  stable/12/sys/amd64/vmm/x86.c
  stable/12/sys/amd64/vmm/x86.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/amd64/vmm/x86.c
==============================================================================
--- stable/12/sys/amd64/vmm/x86.c	Sun May 17 09:34:29 2020	(r361130)
+++ stable/12/sys/amd64/vmm/x86.c	Sun May 17 11:09:38 2020	(r361131)
@@ -559,6 +559,18 @@ x86_emulate_cpuid(struct vm *vm, int vcpu_id,
 			}
 			break;
 
+		case CPUID_0000_0015:
+			/*
+			 * Don't report CPU TSC/Crystal ratio and clock
+			 * values since guests may use these to derive the
+			 * local APIC frequency..
+			 */
+			regs[0] = 0;
+			regs[1] = 0;
+			regs[2] = 0;
+			regs[3] = 0;
+			break;
+
 		case 0x40000000:
 			regs[0] = CPUID_VM_HIGH;
 			bcopy(bhyve_id, &regs[1], 4);

Modified: stable/12/sys/amd64/vmm/x86.h
==============================================================================
--- stable/12/sys/amd64/vmm/x86.h	Sun May 17 09:34:29 2020	(r361130)
+++ stable/12/sys/amd64/vmm/x86.h	Sun May 17 11:09:38 2020	(r361131)
@@ -41,6 +41,7 @@
 #define	CPUID_0000_000A	(0xA)
 #define	CPUID_0000_000B	(0xB)
 #define	CPUID_0000_000D	(0xD)
+#define	CPUID_0000_0015	(0x15)
 #define CPUID_8000_0000	(0x80000000)
 #define CPUID_8000_0001	(0x80000001)
 #define CPUID_8000_0002	(0x80000002)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202005171109.04HB9ckh023048>