Commit dd5045fe authored by Maxim Levitsky's avatar Maxim Levitsky Committed by Paolo Bonzini
Browse files

KVM: x86: SVM: use smram structs



Use SMM structs in the SVM code as well, which removes the last user of
put_smstate/GET_SMSTATE so remove these macros as well.

Signed-off-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
Message-Id: <20221025124741.228045-22-mlevitsk@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent e6a82199
Loading
Loading
Loading
Loading
+0 −6
Original line number Original line Diff line number Diff line
@@ -4,12 +4,6 @@


#include <linux/build_bug.h>
#include <linux/build_bug.h>


#define GET_SMSTATE(type, buf, offset)		\
	(*(type *)((buf) + (offset) - 0x7e00))

#define PUT_SMSTATE(type, buf, offset, val)                      \
	*(type *)((buf) + (offset) - 0x7e00) = val

#ifdef CONFIG_KVM_SMM
#ifdef CONFIG_KVM_SMM




+7 −14
Original line number Original line Diff line number Diff line
@@ -4407,15 +4407,11 @@ static int svm_enter_smm(struct kvm_vcpu *vcpu, union kvm_smram *smram)
	struct kvm_host_map map_save;
	struct kvm_host_map map_save;
	int ret;
	int ret;


	char *smstate = (char *)smram;

	if (!is_guest_mode(vcpu))
	if (!is_guest_mode(vcpu))
		return 0;
		return 0;


	/* FED8h - SVM Guest */
	smram->smram64.svm_guest_flag = 1;
	PUT_SMSTATE(u64, smstate, 0x7ed8, 1);
	smram->smram64.svm_guest_vmcb_gpa = svm->nested.vmcb12_gpa;
	/* FEE0h - SVM Guest VMCB Physical Address */
	PUT_SMSTATE(u64, smstate, 0x7ee0, svm->nested.vmcb12_gpa);


	svm->vmcb->save.rax = vcpu->arch.regs[VCPU_REGS_RAX];
	svm->vmcb->save.rax = vcpu->arch.regs[VCPU_REGS_RAX];
	svm->vmcb->save.rsp = vcpu->arch.regs[VCPU_REGS_RSP];
	svm->vmcb->save.rsp = vcpu->arch.regs[VCPU_REGS_RSP];
@@ -4453,28 +4449,25 @@ static int svm_leave_smm(struct kvm_vcpu *vcpu, const union kvm_smram *smram)
{
{
	struct vcpu_svm *svm = to_svm(vcpu);
	struct vcpu_svm *svm = to_svm(vcpu);
	struct kvm_host_map map, map_save;
	struct kvm_host_map map, map_save;
	u64 saved_efer, vmcb12_gpa;
	struct vmcb *vmcb12;
	struct vmcb *vmcb12;
	int ret;
	int ret;


	const char *smstate = (const char *)smram;
	const struct kvm_smram_state_64 *smram64 = &smram->smram64;


	if (!guest_cpuid_has(vcpu, X86_FEATURE_LM))
	if (!guest_cpuid_has(vcpu, X86_FEATURE_LM))
		return 0;
		return 0;


	/* Non-zero if SMI arrived while vCPU was in guest mode. */
	/* Non-zero if SMI arrived while vCPU was in guest mode. */
	if (!GET_SMSTATE(u64, smstate, 0x7ed8))
	if (!smram64->svm_guest_flag)
		return 0;
		return 0;


	if (!guest_cpuid_has(vcpu, X86_FEATURE_SVM))
	if (!guest_cpuid_has(vcpu, X86_FEATURE_SVM))
		return 1;
		return 1;


	saved_efer = GET_SMSTATE(u64, smstate, 0x7ed0);
	if (!(smram64->efer & EFER_SVME))
	if (!(saved_efer & EFER_SVME))
		return 1;
		return 1;


	vmcb12_gpa = GET_SMSTATE(u64, smstate, 0x7ee0);
	if (kvm_vcpu_map(vcpu, gpa_to_gfn(smram64->svm_guest_vmcb_gpa), &map))
	if (kvm_vcpu_map(vcpu, gpa_to_gfn(vmcb12_gpa), &map))
		return 1;
		return 1;


	ret = 1;
	ret = 1;
@@ -4500,7 +4493,7 @@ static int svm_leave_smm(struct kvm_vcpu *vcpu, const union kvm_smram *smram)
	vmcb12 = map.hva;
	vmcb12 = map.hva;
	nested_copy_vmcb_control_to_cache(svm, &vmcb12->control);
	nested_copy_vmcb_control_to_cache(svm, &vmcb12->control);
	nested_copy_vmcb_save_to_cache(svm, &vmcb12->save);
	nested_copy_vmcb_save_to_cache(svm, &vmcb12->save);
	ret = enter_svm_guest_mode(vcpu, vmcb12_gpa, vmcb12, false);
	ret = enter_svm_guest_mode(vcpu, smram64->svm_guest_vmcb_gpa, vmcb12, false);


	if (ret)
	if (ret)
		goto unmap_save;
		goto unmap_save;