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.


_______________________________________________
freebsd-virtualization@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-virtualization
To unsubscribe, send any mail to 
"freebsd-virtualization-unsubscr...@freebsd.org"

Reply via email to