On Thu, Dec 10, 2020 at 12:05 PM Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote: > > On 10/12/20 18:59, Oliver Upton wrote: > > However, I don't believe we can assume the guest's TSCs to be synchronized, > > even if sane guests will never touch them. In this case, I think a per-vCPU > > ioctl is still warranted, allowing userspace to get at the guest CPU adjust > > component of Thomas' equation below (paraphrased): > > > > TSC guest CPU = host tsc base + guest base offset + guest CPU adjust > > Right now that would be: > > - KVM_GET_TSC_STATE (vm) returns host tsc base + guest base offset (plus > the associated time) > > - KVM_GET_MSR *without* KVM_X86_QUIRK_TSC_HOST_ACCESS for guest CPU adjust > > and the corresponding SET ioctls. What am *I* missing? > > > Alternatively, a write from userspace to the guest's IA32_TSC_ADJUST with > > KVM_X86_QUIRK_TSC_HOST_ACCESS could have the same effect, but that seems to be > > problematic for a couple reasons. First, depending on the guest's CPUID the > > TSC_ADJUST MSR may not even be available, meaning that the guest could've used > > IA32_TSC to adjust the TSC (eww). > > Indeed, the host should always be able to read/write IA32_TSC and > IA32_TSC_ADJUST. So long as it is guaranteed that guest manipulations of IA32_TSC are reflected in IA32_TSC_ADJUST even if it isn't in the guest's CPUID, then this seems OK. I think having clear documentation on this subject is also necessary, as we're going to rely on the combination of KVM_{GET,SET}_TSC_STATE, disabling KVM_X86_QUIRK_TSC_HOST_ACCESS, and userspace reading/writing a possibly hidden MSR to pull this off right. -- Thanks, Oliver > Thanks, > > Paolo > > > Second, userspace replaying writes to IA32_TSC > > (in the case IA32_TSC_ADJUST doesn't exist for the guest) seems_very_ > > unlikely to work given all the magic handling that KVM does for > > writes to it. > > > > Is this roughly where we are or have I entirely missed the mark?:-) >