• Kevin Tian's avatar
    kvm: x86: Disable interception for IA32_XFD on demand · b5274b1b
    Kevin Tian authored
    Always intercepting IA32_XFD causes non-negligible overhead when this
    register is updated frequently in the guest.
    
    Disable r/w emulation after intercepting the first WRMSR(IA32_XFD)
    with a non-zero value.
    
    Disable WRMSR emulation implies that IA32_XFD becomes out-of-sync
    with the software states in fpstate and the per-cpu xfd cache. This
    leads to two additional changes accordingly:
    
      - Call fpu_sync_guest_vmexit_xfd_state() after vm-exit to bring
        software states back in-sync with the MSR, before handle_exit_irqoff()
        is called.
    
      - Always trap #NM once write interception is disabled for IA32_XFD.
        The #NM exception is rare if the guest doesn't use dynamic
        features. Otherwise, there is at most one exception per guest
        task given a dynamic feature.
    
    p.s. We have confirmed that SDM is being revised to say that
    when setting IA32_XFD[18] the AMX register state is not guaranteed
    to be preserved. This clarification avoids adding mess for a creative
    guest which sets IA32_XFD[18]=1 before saving active AMX state to
    its own storage.
    Signed-off-by: default avatarKevin Tian <kevin.tian@intel.com>
    Signed-off-by: default avatarJing Liu <jing2.liu@intel.com>
    Signed-off-by: default avatarYang Zhong <yang.zhong@intel.com>
    Message-Id: <20220105123532.12586-22-yang.zhong@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    b5274b1b
x86.c 336 KB