]> git.baikalelectronics.ru Git - kernel.git/commit
KVM: x86: fix MSR_IA32_TSC read for nested migration
authorMaxim Levitsky <mlevitsk@redhat.com>
Mon, 21 Sep 2020 10:38:05 +0000 (13:38 +0300)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 24 Sep 2020 17:35:07 +0000 (13:35 -0400)
commit5a3f2c1a99cf9c254592ed8de17c1f03189018fb
tree573530d8d44b5c9a4a49fafdc6ab547e9cd307a4
parent9bbb01b74357b387931f1f6a7580d2d636202134
KVM: x86: fix MSR_IA32_TSC read for nested migration

MSR reads/writes should always access the L1 state, since the (nested)
hypervisor should intercept all the msrs it wants to adjust, and these
that it doesn't should be read by the guest as if the host had read it.

However IA32_TSC is an exception. Even when not intercepted, guest still
reads the value + TSC offset.
The write however does not take any TSC offset into account.

This is documented in Intel's SDM and seems also to happen on AMD as well.

This creates a problem when userspace wants to read the IA32_TSC value and then
write it. (e.g for migration)

In this case it reads L2 value but write is interpreted as an L1 value.
To fix this make the userspace initiated reads of IA32_TSC return L1 value
as well.

Huge thanks to Dave Gilbert for helping me understand this very confusing
semantic of MSR writes.

Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Message-Id: <20200921103805.9102-2-mlevitsk@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/x86.c