lkml.org 
[lkml]   [2021]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 14/23] kvm: x86: Emulate IA32_XFD_ERR for guest
    Date
    Emulate read/write to IA32_XFD_ERR MSR.

    Only the saved value in the guest_fpu container is touched in the
    emulation handler. Actual MSR update is handled right before entering
    the guest (with preemption disabled)

    Signed-off-by: Zeng Guang <guang.zeng@intel.com>
    Signed-off-by: Wei Wang <wei.w.wang@intel.com>
    Signed-off-by: Jing Liu <jing2.liu@intel.com>
    ---
    arch/x86/kvm/x86.c | 21 ++++++++++++++++++++-
    1 file changed, 20 insertions(+), 1 deletion(-)

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index e528085030b3..15b093c58b3d 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -1358,7 +1358,7 @@ static const u32 msrs_to_save_all[] = {
    MSR_F15H_PERF_CTL3, MSR_F15H_PERF_CTL4, MSR_F15H_PERF_CTL5,
    MSR_F15H_PERF_CTR0, MSR_F15H_PERF_CTR1, MSR_F15H_PERF_CTR2,
    MSR_F15H_PERF_CTR3, MSR_F15H_PERF_CTR4, MSR_F15H_PERF_CTR5,
    - MSR_IA32_XFD,
    + MSR_IA32_XFD, MSR_IA32_XFD_ERR,
    };

    static u32 msrs_to_save[ARRAY_SIZE(msrs_to_save_all)];
    @@ -3681,6 +3681,17 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)

    fpu_update_guest_xfd(&vcpu->arch.guest_fpu, data);
    break;
    + case MSR_IA32_XFD_ERR:
    + if (!msr_info->host_initiated &&
    + !guest_cpuid_has(vcpu, X86_FEATURE_XFD))
    + return 1;
    +
    + if (data & ~(XFEATURE_MASK_USER_DYNAMIC &
    + vcpu->arch.guest_supported_xcr0))
    + return 1;
    +
    + vcpu->arch.guest_fpu.xfd_err = data;
    + break;
    #endif
    default:
    if (kvm_pmu_is_valid_msr(vcpu, msr))
    @@ -4010,6 +4021,13 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)

    msr_info->data = vcpu->arch.guest_fpu.fpstate->xfd;
    break;
    + case MSR_IA32_XFD_ERR:
    + if (!msr_info->host_initiated &&
    + !guest_cpuid_has(vcpu, X86_FEATURE_XFD))
    + return 1;
    +
    + msr_info->data = vcpu->arch.guest_fpu.xfd_err;
    + break;
    #endif
    default:
    if (kvm_pmu_is_valid_msr(vcpu, msr_info->index))
    @@ -6445,6 +6463,7 @@ static void kvm_init_msr_list(void)
    continue;
    break;
    case MSR_IA32_XFD:
    + case MSR_IA32_XFD_ERR:
    if (!kvm_cpu_cap_has(X86_FEATURE_XFD))
    continue;
    break;
    --
    2.27.0
    \
     
     \ /
      Last update: 2021-12-17 16:31    [W:2.434 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site