>> __kvm_set_xcr function does the CPL check when set xcr. __kvm_set_xcr >> is called in two flows, one is invoked by guest, call stack shown as >> below, handle_xsetbv(or xsetbv_interception) >> kvm_set_xcr >> __kvm_set_xcr >> the other one is invoked by host(QEMU), call stack shown as below, >> kvm_arch_vcpu_ioctl >> kvm_vcpu_ioctl_x86_set_xcrs >> __kvm_set_xcr >> >> The former does need the CPL check, but the latter does not. >> >> Signed-off-by: Zhang Haoyu <haoyu.zhang@xxxxxxxxxx> >> --- >> arch/x86/kvm/x86.c | 5 +- >> 1 file changed, 2 insertions(+), 3 deletions(-) >> >> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index >> 094b5d9..16ff44e 100644 >> --- a/arch/x86/kvm/x86.c >> +++ b/arch/x86/kvm/x86.c >> @@ -582,8 +582,6 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) >> if (index != XCR_XFEATURE_ENABLED_MASK) >> return 1; >> xcr0 = xcr; >> - if (kvm_x86_ops->get_cpl(vcpu) != 0) >> - return 1; >> if (!(xcr0 & XSTATE_FP)) >> return 1; >> if ((xcr0 & XSTATE_YMM) && !(xcr0 & XSTATE_SSE)) @@ -597,7 +595,8 >> @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) >> >> int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) { >> - if (__kvm_set_xcr(vcpu, index, xcr)) { >> + if ((kvm_x86_ops->get_cpl(vcpu) != 0) || >> + __kvm_set_xcr(vcpu, index, xcr)) { >> kvm_inject_gp(vcpu, 0); >> return 1; >> } >> 1.7.3.1.msysgit.0 >> > >Applied to master, but check your setup because I had to do so manually. > Your patch has 2 tabs + 1 space for each indentation level (??), the file only has one tab. > >This time the patch was pretty simple and may even be worth having in 3.9, but next time I'd ask you to resubmit. > >Can you write a testcase for kvm-unit-tests? > >Paolo So sorry for above bad format patch, this time the format is OK, but I'm not sure could the format be changed in transmission? Signed-off-by: Zhang Haoyu <haoyu.zhang@xxxxxxxxxx> --- arch/x86/kvm/x86.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 094b5d9..aa7bda1 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -582,8 +582,6 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) if (index != XCR_XFEATURE_ENABLED_MASK) return 1; xcr0 = xcr; - if (kvm_x86_ops->get_cpl(vcpu) != 0) - return 1; if (!(xcr0 & XSTATE_FP)) return 1; if ((xcr0 & XSTATE_YMM) && !(xcr0 & XSTATE_SSE)) @@ -597,7 +595,8 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) { - if (__kvm_set_xcr(vcpu, index, xcr)) { + if ((kvm_x86_ops->get_cpl(vcpu) != 0) || + __kvm_set_xcr(vcpu, index, xcr)) { kvm_inject_gp(vcpu, 0); return 1; } -- 1.7.3.1.msysgit.0 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html