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