mbox series

[v3,0/9] Add support for XSAVES to AMD and unify it with Intel

Message ID 20191021233027.21566-1-aaronlewis@google.com (mailing list archive)
Headers show
Series Add support for XSAVES to AMD and unify it with Intel | expand

Message

Aaron Lewis Oct. 21, 2019, 11:30 p.m. UTC
Unify AMD's and Intel's approach for supporting XSAVES.  To do this
change Intel's approach from using the MSR-load areas to writing
the guest/host values to IA32_XSS on a VM-enter/VM-exit.  Switching to
this strategy allows for a common approach between both AMD and Intel.
Additionally, define svm_xsaves_supported() based on AMD's feedback, and add
vcpu->arch.xsaves_enabled to track whether XSAVES is enabled in the guest.

This change sets up IA32_XSS to be a non-zero value in the future, which
may happen sooner than later with support for guest CET feature being
added.

v2 -> v3:
 - Remove guest_xcr0_loaded from kvm_vcpu.
 - Add vcpu->arch.xsaves_enabled.
 - Add staged rollout to load the hardware IA32_XSS MSR with guest/host
   values on VM-entry and VM-exit:
     1) Introduce vcpu->arch->xsaves_enabled.
     2) Add svm implementation for switching between guest and host IA32_XSS.
     3) Add vmx implementation for switching between guest and host IA32_XSS.
     4) Remove svm and vmx implementation and add it to common code.

v1 -> v2:
 - Add the flag xsaves_enabled to kvm_vcpu_arch to track when XSAVES is
   enabled in the guest, whether or not XSAVES is enumerated in the
   guest CPUID.
 - Remove code that sets the X86_FEATURE_XSAVES bit in the guest CPUID
   which was added in patch "Enumerate XSAVES in guest CPUID when it is
   available to the guest".  As a result we no longer need that patch.
 - Added a comment to kvm_set_msr_common to describe how to save/restore
   PT MSRS without using XSAVES/XRSTORS.
 - Added more comments to the "Add support for XSAVES on AMD" patch.
 - Replaced vcpu_set_msr_expect_result() with _vcpu_set_msr() in the
   test library.

Aaron Lewis (9):
  KVM: x86: Introduce vcpu->arch.xsaves_enabled
  KVM: VMX: Fix conditions for guest IA32_XSS support
  KVM: x86: Remove unneeded kvm_vcpu variable, guest_xcr0_loaded
  KVM: SVM: Use wrmsr for switching between guest and host IA32_XSS on AMD
  KVM: VMX: Use wrmsr for switching between guest and host IA32_XSS on Intel
  KVM: x86: Move IA32_XSS-swapping on VM-entry/VM-exit to common x86 code
  kvm: x86: Move IA32_XSS to kvm_{get,set}_msr_common
  kvm: svm: Update svm_xsaves_supported
  kvm: tests: Add test to verify MSR_IA32_XSS

 arch/x86/include/asm/kvm_host.h               |  1 +
 arch/x86/kvm/svm.c                            |  9 ++-
 arch/x86/kvm/vmx/vmx.c                        | 41 ++--------
 arch/x86/kvm/x86.c                            | 52 ++++++++++---
 arch/x86/kvm/x86.h                            |  4 +-
 include/linux/kvm_host.h                      |  1 -
 tools/testing/selftests/kvm/.gitignore        |  1 +
 tools/testing/selftests/kvm/Makefile          |  1 +
 .../selftests/kvm/include/x86_64/processor.h  |  7 +-
 .../selftests/kvm/lib/x86_64/processor.c      | 72 +++++++++++++++---
 .../selftests/kvm/x86_64/xss_msr_test.c       | 76 +++++++++++++++++++
 11 files changed, 205 insertions(+), 60 deletions(-)
 create mode 100644 tools/testing/selftests/kvm/x86_64/xss_msr_test.c

Comments

Paolo Bonzini Oct. 22, 2019, 1:48 p.m. UTC | #1
On 22/10/19 01:30, Aaron Lewis wrote:
> Unify AMD's and Intel's approach for supporting XSAVES.  To do this
> change Intel's approach from using the MSR-load areas to writing
> the guest/host values to IA32_XSS on a VM-enter/VM-exit.  Switching to
> this strategy allows for a common approach between both AMD and Intel.
> Additionally, define svm_xsaves_supported() based on AMD's feedback, and add
> vcpu->arch.xsaves_enabled to track whether XSAVES is enabled in the guest.
> 
> This change sets up IA32_XSS to be a non-zero value in the future, which
> may happen sooner than later with support for guest CET feature being
> added.
> 
> v2 -> v3:
>  - Remove guest_xcr0_loaded from kvm_vcpu.
>  - Add vcpu->arch.xsaves_enabled.
>  - Add staged rollout to load the hardware IA32_XSS MSR with guest/host
>    values on VM-entry and VM-exit:
>      1) Introduce vcpu->arch->xsaves_enabled.
>      2) Add svm implementation for switching between guest and host IA32_XSS.
>      3) Add vmx implementation for switching between guest and host IA32_XSS.
>      4) Remove svm and vmx implementation and add it to common code.
> 
> v1 -> v2:
>  - Add the flag xsaves_enabled to kvm_vcpu_arch to track when XSAVES is
>    enabled in the guest, whether or not XSAVES is enumerated in the
>    guest CPUID.
>  - Remove code that sets the X86_FEATURE_XSAVES bit in the guest CPUID
>    which was added in patch "Enumerate XSAVES in guest CPUID when it is
>    available to the guest".  As a result we no longer need that patch.
>  - Added a comment to kvm_set_msr_common to describe how to save/restore
>    PT MSRS without using XSAVES/XRSTORS.
>  - Added more comments to the "Add support for XSAVES on AMD" patch.
>  - Replaced vcpu_set_msr_expect_result() with _vcpu_set_msr() in the
>    test library.
> 
> Aaron Lewis (9):
>   KVM: x86: Introduce vcpu->arch.xsaves_enabled
>   KVM: VMX: Fix conditions for guest IA32_XSS support
>   KVM: x86: Remove unneeded kvm_vcpu variable, guest_xcr0_loaded
>   KVM: SVM: Use wrmsr for switching between guest and host IA32_XSS on AMD
>   KVM: VMX: Use wrmsr for switching between guest and host IA32_XSS on Intel
>   KVM: x86: Move IA32_XSS-swapping on VM-entry/VM-exit to common x86 code
>   kvm: x86: Move IA32_XSS to kvm_{get,set}_msr_common
>   kvm: svm: Update svm_xsaves_supported
>   kvm: tests: Add test to verify MSR_IA32_XSS
> 
>  arch/x86/include/asm/kvm_host.h               |  1 +
>  arch/x86/kvm/svm.c                            |  9 ++-
>  arch/x86/kvm/vmx/vmx.c                        | 41 ++--------
>  arch/x86/kvm/x86.c                            | 52 ++++++++++---
>  arch/x86/kvm/x86.h                            |  4 +-
>  include/linux/kvm_host.h                      |  1 -
>  tools/testing/selftests/kvm/.gitignore        |  1 +
>  tools/testing/selftests/kvm/Makefile          |  1 +
>  .../selftests/kvm/include/x86_64/processor.h  |  7 +-
>  .../selftests/kvm/lib/x86_64/processor.c      | 72 +++++++++++++++---
>  .../selftests/kvm/x86_64/xss_msr_test.c       | 76 +++++++++++++++++++
>  11 files changed, 205 insertions(+), 60 deletions(-)
>  create mode 100644 tools/testing/selftests/kvm/x86_64/xss_msr_test.c
> 

Queued, thanks.

Paolo