rdtscp support (was Re: bhyve guest illegal instruction)

Peter Grehan grehan at freebsd.org
Fri Jul 31 22:38:27 UTC 2020


Hi Chuck,

> 12              time1 = __builtin_ia32_rdtscp(&dummy);

  rdtscp shouldn't be used without checking that it's available via 
CPUID first, but as you mentioned the feature is available on the host, 
just hidden from the guest.

> This same program works on the FreeBSD 12-stable machine hosting the VM 
> as well as another bare-metal Linux host. Poking around in the vmm code, 
> I found
>                          /*
>                           * Hide rdtscp/ia32_tsc_aux until we know how
>                           * to deal with them.
>                           */
>                          regs[3] &= ~AMDID_RDTSCP;
>                          break;
> in sys/amd64/vmm/x86.c which I _think_ is relevant because lscpu doesn't 
> show the rdtscp flag. If this is the root cause, what would need to be 
> done to implement this?

  At a quick glance, if the feature is available on the host you'd need to
   - expose it via CPUID
   - save/restore the TSC_AUX MSR, but using the VMCS MSR h/w 
save/restore mechanism that will have to be resurrected. (this avoids 
any preemption issues,even at NMI level).
   - set the "enable RDTSCP" VM-execution control to one in the VMCS

  That being said, I've heard anecdotally that rdtscp results in 
VM-exits on other hypervisors so there may be reason to emulate it 
rather than allow a pass-thru. More investigation may be required.

later,

Peter.




More information about the freebsd-virtualization mailing list