0028-KVM-x86-SVM-use-smram-structs.patch 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. From 0e0e4df8502c00f60955187c3e98e50653b15008 Mon Sep 17 00:00:00 2001
  2. From: Maxim Levitsky <[email protected]>
  3. Date: Tue, 25 Oct 2022 15:47:39 +0300
  4. Subject: [PATCH] KVM: x86: SVM: use smram structs
  5. Use SMM structs in the SVM code as well, which removes the last user of
  6. put_smstate/GET_SMSTATE so remove these macros as well.
  7. Signed-off-by: Maxim Levitsky <[email protected]>
  8. ---
  9. arch/x86/kvm/smm.h | 6 ------
  10. arch/x86/kvm/svm/svm.c | 21 +++++++--------------
  11. 2 files changed, 7 insertions(+), 20 deletions(-)
  12. diff --git a/arch/x86/kvm/smm.h b/arch/x86/kvm/smm.h
  13. index bf5c7ffeb11e..8d96bff3f4d5 100644
  14. --- a/arch/x86/kvm/smm.h
  15. +++ b/arch/x86/kvm/smm.h
  16. @@ -4,12 +4,6 @@
  17. #include <linux/build_bug.h>
  18. -#define GET_SMSTATE(type, buf, offset) \
  19. - (*(type *)((buf) + (offset) - 0x7e00))
  20. -
  21. -#define PUT_SMSTATE(type, buf, offset, val) \
  22. - *(type *)((buf) + (offset) - 0x7e00) = val
  23. -
  24. #ifdef CONFIG_KVM_SMM
  25. diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
  26. index 74f390077a1e..44d6a2240e9e 100644
  27. --- a/arch/x86/kvm/svm/svm.c
  28. +++ b/arch/x86/kvm/svm/svm.c
  29. @@ -4443,15 +4443,11 @@ static int svm_enter_smm(struct kvm_vcpu *vcpu, union kvm_smram *smram)
  30. struct kvm_host_map map_save;
  31. int ret;
  32. - char *smstate = (char *)smram;
  33. -
  34. if (!is_guest_mode(vcpu))
  35. return 0;
  36. - /* FED8h - SVM Guest */
  37. - PUT_SMSTATE(u64, smstate, 0x7ed8, 1);
  38. - /* FEE0h - SVM Guest VMCB Physical Address */
  39. - PUT_SMSTATE(u64, smstate, 0x7ee0, svm->nested.vmcb12_gpa);
  40. + smram->smram64.svm_guest_flag = 1;
  41. + smram->smram64.svm_guest_vmcb_gpa = svm->nested.vmcb12_gpa;
  42. svm->vmcb->save.rax = vcpu->arch.regs[VCPU_REGS_RAX];
  43. svm->vmcb->save.rsp = vcpu->arch.regs[VCPU_REGS_RSP];
  44. @@ -4489,28 +4485,25 @@ static int svm_leave_smm(struct kvm_vcpu *vcpu, const union kvm_smram *smram)
  45. {
  46. struct vcpu_svm *svm = to_svm(vcpu);
  47. struct kvm_host_map map, map_save;
  48. - u64 saved_efer, vmcb12_gpa;
  49. struct vmcb *vmcb12;
  50. int ret;
  51. - const char *smstate = (const char *)smram;
  52. + const struct kvm_smram_state_64 *smram64 = &smram->smram64;
  53. if (!guest_cpuid_has(vcpu, X86_FEATURE_LM))
  54. return 0;
  55. /* Non-zero if SMI arrived while vCPU was in guest mode. */
  56. - if (!GET_SMSTATE(u64, smstate, 0x7ed8))
  57. + if (!smram64->svm_guest_flag)
  58. return 0;
  59. if (!guest_cpuid_has(vcpu, X86_FEATURE_SVM))
  60. return 1;
  61. - saved_efer = GET_SMSTATE(u64, smstate, 0x7ed0);
  62. - if (!(saved_efer & EFER_SVME))
  63. + if (!(smram64->efer & EFER_SVME))
  64. return 1;
  65. - vmcb12_gpa = GET_SMSTATE(u64, smstate, 0x7ee0);
  66. - if (kvm_vcpu_map(vcpu, gpa_to_gfn(vmcb12_gpa), &map))
  67. + if (kvm_vcpu_map(vcpu, gpa_to_gfn(smram64->svm_guest_vmcb_gpa), &map))
  68. return 1;
  69. ret = 1;
  70. @@ -4536,7 +4529,7 @@ static int svm_leave_smm(struct kvm_vcpu *vcpu, const union kvm_smram *smram)
  71. vmcb12 = map.hva;
  72. nested_copy_vmcb_control_to_cache(svm, &vmcb12->control);
  73. nested_copy_vmcb_save_to_cache(svm, &vmcb12->save);
  74. - ret = enter_svm_guest_mode(vcpu, vmcb12_gpa, vmcb12, false);
  75. + ret = enter_svm_guest_mode(vcpu, smram64->svm_guest_vmcb_gpa, vmcb12, false);
  76. if (ret)
  77. goto unmap_save;
  78. --
  79. 2.38.1