]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commit
KVM: x86: Update emulator context mode if SYSENTER xfers to 64-bit mode
authorSean Christopherson <seanjc@google.com>
Tue, 2 Feb 2021 16:55:46 +0000 (08:55 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 2 Feb 2021 17:03:54 +0000 (12:03 -0500)
commit943dea8af21bd896e0d6c30ea221203fb3cd3265
tree49a968d74703012a1514d9ce6b4191dbdf26bc90
parent4683d758f48e6ae87d3d3493ffa00aceb955ee16
KVM: x86: Update emulator context mode if SYSENTER xfers to 64-bit mode

Set the emulator context to PROT64 if SYSENTER transitions from 32-bit
userspace (compat mode) to a 64-bit kernel, otherwise the RIP update at
the end of x86_emulate_insn() will incorrectly truncate the new RIP.

Note, this bug is mostly limited to running an Intel virtual CPU model on
an AMD physical CPU, as other combinations of virtual and physical CPUs
do not trigger full emulation.  On Intel CPUs, SYSENTER in compatibility
mode is legal, and unconditionally transitions to 64-bit mode.  On AMD
CPUs, SYSENTER is illegal in compatibility mode and #UDs.  If the vCPU is
AMD, KVM injects a #UD on SYSENTER in compat mode.  If the pCPU is Intel,
SYSENTER will execute natively and not trigger #UD->VM-Exit (ignoring
guest TLB shenanigans).

Fixes: fede8076aab4 ("KVM: x86: handle wrap around 32-bit address space")
Cc: stable@vger.kernel.org
Signed-off-by: Jonny Barker <jonny@jonnybarker.com>
[sean: wrote changelog]
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20210202165546.2390296-1-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/emulate.c