2018-03-27 12:40 GMT+08:00 Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>: > On Mon, Mar 26, 2018 at 07:12:15PM -0700, Wanpeng Li wrote: >> From: Wanpeng Li <wanpengli@xxxxxxxxxxx> >> >> This patch introduces a Force Emulation Prefix (ud2a; .ascii "kvm") for >> "emulate the next instruction", the codes will be executed by emulator >> instead of processor, for testing purposes. > > Can you expand a bit ? Why do you want this in KVM in the first place? > Should this be controlled by a boolean parameter? >> >> A testcase here: >> >> #include <stdio.h> >> #include <string.h> >> >> #define HYPERVISOR_INFO 0x40000000 >> >> #define CPUID(idx, eax, ebx, ecx, edx)\ >> asm volatile (\ >> "ud2a; .ascii \"kvm\"; 1: cpuid" \ >> :"=b" (*ebx), "=a" (*eax),"=c" (*ecx), "=d" (*edx)\ >> :"0"(idx) ); >> >> void main() >> { >> unsigned int eax,ebx,ecx,edx; >> char string[13]; >> >> CPUID(HYPERVISOR_INFO, &eax, &ebx, &ecx, &edx); >> *(unsigned int *)(string+0) = ebx; >> *(unsigned int *)(string+4) = ecx; >> *(unsigned int *)(string+8) = edx; >> >> string[12] = 0; >> if (strncmp(string, "KVMKVMKVM\0\0\0",12) == 0) >> printf("kvm guest\n"); >> else >> printf("bare hardware\n"); >> } >> >> Suggested-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> >> Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> >> Cc: Radim Krčmář <rkrcmar@xxxxxxxxxx> >> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> >> Signed-off-by: Wanpeng Li <wanpengli@xxxxxxxxxxx> >> --- >> arch/x86/kvm/vmx.c | 18 +++++++++++++++++- >> 1 file changed, 17 insertions(+), 1 deletion(-) >> >> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c >> index 0f99833..90abed8 100644 >> --- a/arch/x86/kvm/vmx.c >> +++ b/arch/x86/kvm/vmx.c >> @@ -108,6 +108,9 @@ module_param_named(enable_shadow_vmcs, enable_shadow_vmcs, bool, S_IRUGO); >> static bool __read_mostly nested = 0; >> module_param(nested, bool, S_IRUGO); >> >> +static bool __read_mostly fep = 0; >> +module_param(fep, bool, S_IRUGO); >> + >> static u64 __read_mostly host_xss; >> >> static bool __read_mostly enable_pml = 1; >> @@ -6218,8 +6221,21 @@ static int handle_machine_check(struct kvm_vcpu *vcpu) >> static int handle_ud(struct kvm_vcpu *vcpu) >> { >> enum emulation_result er; >> + int emulation_type = EMULTYPE_TRAP_UD; >> + >> + if (fep) { >> + char sig[5]; /* ud2; .ascii "kvm" */ >> + struct x86_exception e; > > Don't you want to do = { }; > to memset it? sig buffer will be filled by insns which are fetched from guest memory, so I think not memset is fine. Regards, Wanpeng Li