mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 12:35:52 +02:00
KVM: SVM: Move RESET emulation to svm_vcpu_reset()
Move RESET emulation for SVM vCPUs to svm_vcpu_reset(), and drop an extra init_vmcb() from svm_create_vcpu() in the process. Hopefully KVM will someday expose a dedicated RESET ioctl(), and in the meantime separating "create" from "RESET" is a nice cleanup. Keep the call to svm_switch_vmcb() so that misuse of svm->vmcb at worst breaks the guest, e.g. premature accesses doesn't cause a NULL pointer dereference. Cc: Reiji Watanabe <reijiw@google.com> Signed-off-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20210921000303.400537-10-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
06692e4b80
commit
9ebe530b9f
|
|
@ -2631,11 +2631,11 @@ void sev_es_init_vmcb(struct vcpu_svm *svm)
|
|||
set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP, 1, 1);
|
||||
}
|
||||
|
||||
void sev_es_create_vcpu(struct vcpu_svm *svm)
|
||||
void sev_es_vcpu_reset(struct vcpu_svm *svm)
|
||||
{
|
||||
/*
|
||||
* Set the GHCB MSR value as per the GHCB specification when creating
|
||||
* a vCPU for an SEV-ES guest.
|
||||
* Set the GHCB MSR value as per the GHCB specification when emulating
|
||||
* vCPU RESET for an SEV-ES guest.
|
||||
*/
|
||||
set_ghcb_msr(svm, GHCB_MSR_SEV_INFO(GHCB_VERSION_MAX,
|
||||
GHCB_VERSION_MIN,
|
||||
|
|
|
|||
|
|
@ -1303,6 +1303,19 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
|
|||
|
||||
}
|
||||
|
||||
static void __svm_vcpu_reset(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
|
||||
svm_vcpu_init_msrpm(vcpu, svm->msrpm);
|
||||
|
||||
svm_init_osvw(vcpu);
|
||||
vcpu->arch.microcode_version = 0x01000065;
|
||||
|
||||
if (sev_es_guest(vcpu->kvm))
|
||||
sev_es_vcpu_reset(svm);
|
||||
}
|
||||
|
||||
static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
|
||||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
|
|
@ -1311,6 +1324,9 @@ static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
|
|||
svm->virt_spec_ctrl = 0;
|
||||
|
||||
init_vmcb(vcpu);
|
||||
|
||||
if (!init_event)
|
||||
__svm_vcpu_reset(vcpu);
|
||||
}
|
||||
|
||||
void svm_switch_vmcb(struct vcpu_svm *svm, struct kvm_vmcb_info *target_vmcb)
|
||||
|
|
@ -1370,24 +1386,13 @@ static int svm_create_vcpu(struct kvm_vcpu *vcpu)
|
|||
|
||||
svm->vmcb01.ptr = page_address(vmcb01_page);
|
||||
svm->vmcb01.pa = __sme_set(page_to_pfn(vmcb01_page) << PAGE_SHIFT);
|
||||
svm_switch_vmcb(svm, &svm->vmcb01);
|
||||
|
||||
if (vmsa_page)
|
||||
svm->vmsa = page_address(vmsa_page);
|
||||
|
||||
svm->guest_state_loaded = false;
|
||||
|
||||
svm_switch_vmcb(svm, &svm->vmcb01);
|
||||
init_vmcb(vcpu);
|
||||
|
||||
svm_vcpu_init_msrpm(vcpu, svm->msrpm);
|
||||
|
||||
svm_init_osvw(vcpu);
|
||||
vcpu->arch.microcode_version = 0x01000065;
|
||||
|
||||
if (sev_es_guest(vcpu->kvm))
|
||||
/* Perform SEV-ES specific VMCB creation updates */
|
||||
sev_es_create_vcpu(svm);
|
||||
|
||||
return 0;
|
||||
|
||||
error_free_vmsa_page:
|
||||
|
|
|
|||
|
|
@ -562,7 +562,7 @@ void sev_free_vcpu(struct kvm_vcpu *vcpu);
|
|||
int sev_handle_vmgexit(struct kvm_vcpu *vcpu);
|
||||
int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in);
|
||||
void sev_es_init_vmcb(struct vcpu_svm *svm);
|
||||
void sev_es_create_vcpu(struct vcpu_svm *svm);
|
||||
void sev_es_vcpu_reset(struct vcpu_svm *svm);
|
||||
void sev_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector);
|
||||
void sev_es_prepare_guest_switch(struct vcpu_svm *svm, unsigned int cpu);
|
||||
void sev_es_unmap_ghcb(struct vcpu_svm *svm);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user