Bug 246321 - Key press timing/repeat issue on UEFI VNC console for OpenBSD => 6.6 guest
Summary: Key press timing/repeat issue on UEFI VNC console for OpenBSD => 6.6 guest
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: bhyve (show other bugs)
Version: Unspecified
Hardware: amd64 Any
: --- Affects Some People
Assignee: freebsd-virtualization (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-05-09 06:05 UTC by Jason Tubnor
Modified: 2020-05-19 04:00 UTC (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jason Tubnor 2020-05-09 06:05:39 UTC
When using the UEFI terminal console for an OpenBSD 6.6 or later guest, there appears to be some sort of timing issue with the emulated VNC keyboard. After booting the installer or and installed 6.6/6.7 operating system, a key press can exhibit shorter than usual delay before repeat, therefor echoing more characters than desired into the console as well as an increase in the character repeat per second.

Another side affect is the login delay time. This is usually set to 300 seconds on a a default install.  If you try logging into the console, this delay time reduces to 58 seconds.

How to reproduce (this was tested on a variety of hardware including Xeon and Atom based hosts):

Using 11.3 to 13-HEAD, configure a bhyve guest and install from miniroot66.fs or miniroot67.fs

https://openbsd.cs.toronto.edu/pub/OpenBSD/6.6/amd64/miniroot66.fs
https://openbsd.cs.toronto.edu/pub/OpenBSD/snapshots/amd64/miniroot67.fs

Once at the Install/Upgrade prompt, select Shell.  Start typing a sentence as you normally do to see the issue.

To replicate the shortened timeout issue on the login prompt, either try to get the install down with the key press issue, install using miniroot65.fs[1] and then perform a syspatch/sysupgrade to bring it up to 6.6 or install via UEFI-serial and at the OpenBSD boot loader, issue 'set tty com0' to install via the bhyve serial console.  Once installed, type root and the incorrect password.  Start a timing device to see the difference between the reported 300 seconds of timeout and the actual time elapsed.

[1] An archive of an older, unsupported OpenBSD 6.5 release can be found here:  https://mirror.cdn.ar18.org/pub/archive/OpenBSD/6.5/amd64/miniroot65.fs
Comment 1 Peter Grehan freebsd_committer freebsd_triage 2020-05-09 07:53:35 UTC
Which VNC clients/versions (and host o/s's) ?
Comment 2 Jason Tubnor 2020-05-10 05:30:42 UTC
(In reply to Peter Grehan from comment #1)

FreeBSD 11.3, 12.1 and 13-HEAD (r360181 20200422)

UltraVNC and Tight VNC
Comment 3 Jason Tubnor 2020-05-14 06:15:58 UTC
Currently under review:

https://reviews.freebsd.org/D24837

'Hide host CPUID 0x15 TSC/Crystal ratio/freq info from guest'
Comment 4 commit-hook freebsd_committer freebsd_triage 2020-05-14 22:18:57 UTC
A commit references this bug:

Author: grehan
Date: Thu May 14 22:18:12 UTC 2020
New revision: 361064
URL: https://svnweb.freebsd.org/changeset/base/361064

Log:
  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)
  Reviewed by:	jhb
  Approved by:	jhb, bz (mentor)
  MFC after:	3 days
  Differential Revision:	https://reviews.freebsd.org/D24837

Changes:
  head/sys/amd64/vmm/x86.c
  head/sys/amd64/vmm/x86.h
Comment 5 commit-hook freebsd_committer freebsd_triage 2020-05-17 11:10:07 UTC
A commit references this bug:

Author: grehan
Date: Sun May 17 11:09:38 UTC 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)

Changes:
_U  stable/12/
  stable/12/sys/amd64/vmm/x86.c
  stable/12/sys/amd64/vmm/x86.h
Comment 6 commit-hook freebsd_committer freebsd_triage 2020-05-17 11:14:11 UTC
A commit references this bug:

Author: grehan
Date: Sun May 17 11:13:13 UTC 2020
New revision: 361132
URL: https://svnweb.freebsd.org/changeset/base/361132

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)

Changes:
_U  stable/11/
  stable/11/sys/amd64/vmm/x86.c
  stable/11/sys/amd64/vmm/x86.h
Comment 7 Jason Tubnor 2020-05-19 04:00:11 UTC
The commits below and applicable testing verify that this issue has been remediated.