Message ID | 1522141616-9825-3-git-send-email-wanpengli@tencent.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Wanpeng,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on kvm/linux-next]
[also build test WARNING on next-20180327]
[cannot apply to v4.16-rc7]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Wanpeng-Li/KVM-X86-Add-Force-Emulation-Prefix-for-emulate-the-next-instruction/20180328-025804
base: https://git.kernel.org/pub/scm/virt/kvm/kvm.git linux-next
reproduce:
# apt-get install sparse
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__
sparse warnings: (new ones prefixed by >>)
>> arch/x86/kvm/x86.c:149:20: sparse: symbol 'force_emulation_prefix' was not declared. Should it be static?
arch/x86/kvm/x86.c:2196:38: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] <asn:1>*<noident> @@ got d const [noderef] <asn:1>*<noident> @@
arch/x86/kvm/x86.c:2196:38: expected void const [noderef] <asn:1>*<noident>
arch/x86/kvm/x86.c:2196:38: got unsigned char [usertype] *
arch/x86/kvm/x86.c:7911:5: sparse: symbol 'kvm_valid_sregs' was not declared. Should it be static?
arch/x86/kvm/x86.c:8786:16: sparse: incompatible types in comparison expression (different address spaces)
arch/x86/include/asm/paravirt.h:783:9: sparse: context imbalance in 'vcpu_enter_guest' - unexpected unlock
Please review and possibly fold the followup patch.
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
2018-03-28 5:15 GMT+08:00 kbuild test robot <lkp@intel.com>: > Hi Wanpeng, > > Thank you for the patch! Perhaps something to improve: > > [auto build test WARNING on kvm/linux-next] > [also build test WARNING on next-20180327] > [cannot apply to v4.16-rc7] > [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] > > url: https://github.com/0day-ci/linux/commits/Wanpeng-Li/KVM-X86-Add-Force-Emulation-Prefix-for-emulate-the-next-instruction/20180328-025804 > base: https://git.kernel.org/pub/scm/virt/kvm/kvm.git linux-next > reproduce: > # apt-get install sparse > make ARCH=x86_64 allmodconfig > make C=1 CF=-D__CHECK_ENDIAN__ > > > sparse warnings: (new ones prefixed by >>) > >>> arch/x86/kvm/x86.c:149:20: sparse: symbol 'force_emulation_prefix' was not declared. Should it be static? > arch/x86/kvm/x86.c:2196:38: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const [noderef] <asn:1>*<noident> @@ got d const [noderef] <asn:1>*<noident> @@ > arch/x86/kvm/x86.c:2196:38: expected void const [noderef] <asn:1>*<noident> > arch/x86/kvm/x86.c:2196:38: got unsigned char [usertype] * > arch/x86/kvm/x86.c:7911:5: sparse: symbol 'kvm_valid_sregs' was not declared. Should it be static? > arch/x86/kvm/x86.c:8786:16: sparse: incompatible types in comparison expression (different address spaces) > arch/x86/include/asm/paravirt.h:783:9: sparse: context imbalance in 'vcpu_enter_guest' - unexpected unlock > > Please review and possibly fold the followup patch. Thanks for the report, I will fix it in the next version. Regards, Wanpeng Li
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index e3a60ab..40e2f78 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -146,6 +146,9 @@ bool __read_mostly enable_vmware_backdoor = false; module_param(enable_vmware_backdoor, bool, S_IRUGO); EXPORT_SYMBOL_GPL(enable_vmware_backdoor); +bool __read_mostly force_emulation_prefix = false; +module_param(force_emulation_prefix, bool, S_IRUGO); + #define KVM_NR_SHARED_MSRS 16 struct kvm_shared_msrs_global { @@ -4843,8 +4846,21 @@ EXPORT_SYMBOL_GPL(kvm_write_guest_virt_system); int handle_ud(struct kvm_vcpu *vcpu) { enum emulation_result er; + int emulation_type = EMULTYPE_TRAP_UD; + + if (force_emulation_prefix) { + char sig[5]; /* ud2; .ascii "kvm" */ + struct x86_exception e; + + kvm_read_guest_virt(&vcpu->arch.emulate_ctxt, + kvm_get_linear_rip(vcpu), sig, sizeof(sig), &e); + if (memcmp(sig, "\xf\xbkvm", sizeof(sig)) == 0) { + emulation_type = 0; + kvm_rip_write(vcpu, kvm_rip_read(vcpu) + sizeof(sig)); + } + } - er = emulate_instruction(vcpu, EMULTYPE_TRAP_UD); + er = emulate_instruction(vcpu, emulation_type); if (er == EMULATE_USER_EXIT) return 0; if (er != EMULATE_DONE)