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"