[PATCH 00/11] KVM: x86: Clean up kvm_<reg>_{read,write}() mess

Sean Christopherson posted 11 patches 2 months, 1 week ago
There is a newer version of this series
arch/x86/kvm/cpuid.c          |  12 ++--
arch/x86/kvm/hyperv.c         |  24 +++----
arch/x86/kvm/hyperv.h         |   4 +-
arch/x86/kvm/kvm_cache_regs.h |  34 ---------
arch/x86/kvm/svm/nested.c     |   8 +--
arch/x86/kvm/svm/svm.c        |  17 ++---
arch/x86/kvm/vmx/nested.c     |   8 +--
arch/x86/kvm/vmx/sgx.c        |   4 +-
arch/x86/kvm/vmx/tdx.c        |  18 ++---
arch/x86/kvm/x86.c            | 125 +++++++++++++++++-----------------
arch/x86/kvm/x86.h            |  69 +++++++++++++++++--
arch/x86/kvm/xen.c            |  39 ++++++-----
12 files changed, 193 insertions(+), 169 deletions(-)
[PATCH 00/11] KVM: x86: Clean up kvm_<reg>_{read,write}() mess
Posted by Sean Christopherson 2 months, 1 week ago
Add proper, explicit "raw" versions of kvm_<reg>_{read,write}(), along
with "e" versions (for hardcoded 32-bit accesses), and convert the
existing kvm_<reg>_{read,write}() APIs into mode-aware variants.

This was prompted by commit 435741a4e766 ("KVM: SVM: Properly check RAX
on #GP intercept of SVM instructions"), where using kvm_rax_read() to
get EAX/RAX would have (*very* surprisingly) been wrong as it's actually
a "raw" variant that doesn't truncate accesses when the guest is in 32-bit
mode.

Aside from my dislike of inconsistent APIs, I really want to avoid carrying
code that's subtly relying on using kvm_register_read(...) when accessing a
hardcoded register.

Fix a handful of minor warts along the way.

Sean Christopherson (11):
  KVM: SVM: Truncate INVLPGA address in compatibility mode
  KVM: x86/xen: Bug the VM if 32-bit KVM observes a 64-bit mode
    hypercall
  KVM: x86/xen: Don't truncate RAX when handling hypercall from
    protected guest
  KVM: VMX: Read 32-bit GPR values for ENCLS instructions outside of
    64-bit mode
  KVM: x86: Trace hypercall register *after* truncating values for
    32-bit
  KVM: x86: Move kvm_<reg>_{read,write}() definitions to x86.h
  KVM: x86: Add mode-aware versions of kvm_<reg>_{read,write}() helpers
  KVM: x86: Drop non-raw kvm_<reg>_write() helpers
  KVM: nSVM: Use kvm_rax_read() now that it's mode-aware
  Revert "KVM: VMX: Read 32-bit GPR values for ENCLS instructions
    outside of 64-bit mode"
  KVM: x86: Harden is_64_bit_hypercall() against bugs on 32-bit kernels

 arch/x86/kvm/cpuid.c          |  12 ++--
 arch/x86/kvm/hyperv.c         |  24 +++----
 arch/x86/kvm/hyperv.h         |   4 +-
 arch/x86/kvm/kvm_cache_regs.h |  34 ---------
 arch/x86/kvm/svm/nested.c     |   8 +--
 arch/x86/kvm/svm/svm.c        |  17 ++---
 arch/x86/kvm/vmx/nested.c     |   8 +--
 arch/x86/kvm/vmx/sgx.c        |   4 +-
 arch/x86/kvm/vmx/tdx.c        |  18 ++---
 arch/x86/kvm/x86.c            | 125 +++++++++++++++++-----------------
 arch/x86/kvm/x86.h            |  69 +++++++++++++++++--
 arch/x86/kvm/xen.c            |  39 ++++++-----
 12 files changed, 193 insertions(+), 169 deletions(-)


base-commit: b89df297a47e641581ee67793592e5c6ae0428f4
-- 
2.53.0.1213.gd9a14994de-goog