On Wed, Oct 02, 2019 at 12:56:30PM -0700, Jim Mattson wrote: > On Thu, Sep 26, 2019 at 7:17 PM Yang Weijiang <weijiang.yang@xxxxxxxxx> wrote: > > > > From: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > > > /* > > * Read or write a bunch of msrs. All parameters are kernel addresses. > > * > > @@ -3009,11 +3017,23 @@ static int __msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs *msrs, > > int (*do_msr)(struct kvm_vcpu *vcpu, > > unsigned index, u64 *data)) > > { > > + bool fpu_loaded = false; > > int i; > > + const u64 cet_bits = XFEATURE_MASK_CET_USER | XFEATURE_MASK_CET_KERNEL; > > + bool cet_xss = kvm_x86_ops->xsaves_supported() && > > + (kvm_supported_xss() & cet_bits); > > It seems like I've seen a lot of checks like this. Can this be > simplified (throughout this series) by sinking the > kvm_x86_ops->xsaves_supported() check into kvm_supported_xss()? That > is, shouldn't kvm_supported_xss() return 0 if > kvm_x86_ops->xsaves_supported() is false? > OK, let me add this check, thank you! > > - for (i = 0; i < msrs->nmsrs; ++i) > > + for (i = 0; i < msrs->nmsrs; ++i) { > > + if (!fpu_loaded && cet_xss && > > + is_xsaves_msr(entries[i].index)) { > > + kvm_load_guest_fpu(vcpu); > > + fpu_loaded = true; > > + } > > if (do_msr(vcpu, entries[i].index, &entries[i].data)) > > break; > > + } > > + if (fpu_loaded) > > + kvm_put_guest_fpu(vcpu); > > > > return i; > > } > > -- > > 2.17.2 > >