Received: by 10.213.65.68 with SMTP id h4csp1320980imn; Mon, 26 Mar 2018 05:26:37 -0700 (PDT) X-Google-Smtp-Source: AG47ELsFA5WiAMNU+j3GpNDOWfGtBBrEFDXc55wnotpCwoYmKpBgsriC+ILj1+eCXd/bSBPhqXAh X-Received: by 10.98.189.24 with SMTP id a24mr33221254pff.125.1522067197320; Mon, 26 Mar 2018 05:26:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522067197; cv=none; d=google.com; s=arc-20160816; b=BZMK5jsKwHDlUfOpNjOXaYrbUXG0h3zX7G5gY6tcJHd9SN+52GG2LDFn3EV8XZwGRj 4hWSsK8v6QXvHhuAk7R3Z0UdbItCIRBuNQ+d810pz8Blfs9NrEmR+hl2MlHxkkuegeBf VRVY7Zz2n45vb8Eo/KCuAk8ah5VyvrUZZYWGTn8SKZq66u9eVv07Ld9+ffA8c1KgXJvv tJhplt9ALienLZo3b9SKk5dof/nBYX2uDRvVMbyu5Q94Ebkm/Mbjm48CHVWhkje23oOM Kz++rNWHcMb/V/6lfO4pzHdX5l26RAjJOhiSpvXJ6ns8436wXsROmACuuy5MutixB5vy 3ANg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=Kq35z8s914DucbpBqD14LDyC9DmE7Lp8z9Q2F5MWJbc=; b=suuMwUe9dYScmwDTKrwJFPTSXW0QwuiNmR1aFGbpVNuVgFBhHYrH7vwQinBstquxQc WviAaCZrogFwbA/KfHwfHH7Mbg/ZZzXhJ5sh4WSWVkd/XkTK7GjKaDzuTg13YBmf0Ebx qSIaaXHlVxnF6TEuuA4cl4jxId4hCODiaISqvLluu1Pes8QQnBexSQQTeXvv3RR/LBNK znQNCkt12EDAEzBoJOuvxMlpswm/seq0Emps3OhGhE5cdcJGW/whDPU0vuLd+DrZoF1j LAENJyOX2bM3+Ibut9J5H0PY7UdRFrinBhzgN51ZICRN8mLh/7tZgnJaZmCgJFWjhzju sIbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=fEOYUyEz; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m16si10152320pgn.416.2018.03.26.05.26.21; Mon, 26 Mar 2018 05:26:37 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=fEOYUyEz; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751730AbeCZMZY (ORCPT + 99 others); Mon, 26 Mar 2018 08:25:24 -0400 Received: from mail-oi0-f68.google.com ([209.85.218.68]:37902 "EHLO mail-oi0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751024AbeCZMZW (ORCPT ); Mon, 26 Mar 2018 08:25:22 -0400 Received: by mail-oi0-f68.google.com with SMTP id c3-v6so15848373oib.5; Mon, 26 Mar 2018 05:25:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=Kq35z8s914DucbpBqD14LDyC9DmE7Lp8z9Q2F5MWJbc=; b=fEOYUyEzLPUcFO+qHvaACfv9w80AHiIBLLGzdq0nRVw05/m/Gus0qWn+PdjeMisatw zp5JVqYVEBcMo6HsC7Wog2vQEPi4ze+kobLsKxA373LxSJLrR56mnhJszSJIbFH7WSNy b2ci4e9qM3QBUscOAgbYd1EXpLbRR5rCzQmvxcV6XA7uxdZlqLq72F5+NNRQYc1S8bg0 djdB3kH3q6Cfw1k+Z6vEY33m8Kadh5cwf+DUk36hwBoXL0UGIHYIpxlBtodNdyEHkRoR KQb4+OwuI07yNCOsV2CqohFlSuZY0P0WjrQs2zHDMjobPesPHuE1ndfuO+d6OwQFpPtS M5LA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Kq35z8s914DucbpBqD14LDyC9DmE7Lp8z9Q2F5MWJbc=; b=GRXiRgAmMpDXSqV/ueQT4W6eaGgAZK/lcrAHJJvA6sYHec5tvQ8cGVi7rfGOto7uk9 B8FFtC6RnoBZYmYTK5wsu2/gkThsEdfVyEK2CeJMZ2qBWcWj5Vq7yttGMdfaKq8wg2yk 5GnKxHdlvDMg2vKnS3Zg1MzmhWAZVHWsSRUG5KvYC+xRMoKqFQQxFwperK3Gz7Uz06YB nD48qWh77uL3uTX3lAA561z93ONvRueKw5aSyI0imvAiX+ireGwDzb4XQBb3oDfokM5S +s8ns0RLNfJrYhOL5A2z/Z4B1WeA/VtViXyb4ti7vF9Y1CJXpny/kUHU1F4mr6Ki9kTO CCgQ== X-Gm-Message-State: AElRT7GILC2/+PILfuGWr49Sj3bl/fnEBu3kvwC30nO/oEy1xJ9CMven Bt76X462B486a9B1iv/eWZW2PKs9AvpLBLfMe3w= X-Received: by 10.202.87.18 with SMTP id l18mr14797494oib.186.1522067121920; Mon, 26 Mar 2018 05:25:21 -0700 (PDT) MIME-Version: 1.0 Received: by 10.74.210.78 with HTTP; Mon, 26 Mar 2018 05:25:21 -0700 (PDT) In-Reply-To: <46ef9359-a87c-224c-53e0-c948b79314a8@redhat.com> References: <1521707651-9375-1-git-send-email-wanpengli@tencent.com> <49454fe4-16e2-4d8b-7ad5-9e488afc786e@citrix.com> <9bd82cb0-d88f-4891-a111-3704802e1d4e@redhat.com> <94bbfac5-2022-ab92-0b9a-1c3cd2275054@citrix.com> <46ef9359-a87c-224c-53e0-c948b79314a8@redhat.com> From: Wanpeng Li Date: Mon, 26 Mar 2018 20:25:21 +0800 Message-ID: Subject: Re: [PATCH] KVM: X86: Fix the decoding of segment overrides in 64bit mode To: Paolo Bonzini Cc: Andrew Cooper , LKML , kvm , =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2018-03-23 23:04 GMT+08:00 Paolo Bonzini : > On 23/03/2018 15:27, Wanpeng Li wrote: >> 2018-03-22 21:53 GMT+08:00 Andrew Cooper : >>> On 22/03/18 13:39, Wanpeng Li wrote: >>>> 2018-03-22 20:38 GMT+08:00 Paolo Bonzini : >>>>> On 22/03/2018 12:04, Andrew Cooper wrote: >>>>>> We've got a Force Emulation Prefix (ud2a; .ascii "xen") for doing >>>>>> magic. Originally, this was used for PV guests to explicitly request an >>>>>> emulated CPUID, but I extended it to HVM guests for "emulate the next >>>>>> instruction", after we had some guest user => guest kernel privilege >>>>>> escalations because of incorrect emulation. >>>>> Wanpeng, why don't you add it behind a new kvm module parameter? :) >>>> Great point! I will have a try. Thanks Paolo and Andrew. :) >>> >>> Using the force emulation prefix requires intercepting #UD, which is in >>> general a BadThing(tm) for security. Therefore, we have a build time >> >> Yeah, however kvm intercepts and emulates #UD by default, should we >> add a new kvm module parameter to enable it and disable by default? > > No, the module parameter should only be about the force-emulation prefix. How about something like this? (Add EmulateOnUD to cpuid, the testcase will use it) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index dd88158..80da5c6 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -4772,7 +4772,7 @@ static const struct opcode twobyte_table[256] = { X16(D(ByteOp | DstMem | SrcNone | ModRM| Mov)), /* 0xA0 - 0xA7 */ I(Stack | Src2FS, em_push_sreg), I(Stack | Src2FS, em_pop_sreg), - II(ImplicitOps, em_cpuid, cpuid), + II(EmulateOnUD | ImplicitOps, em_cpuid, cpuid), F(DstMem | SrcReg | ModRM | BitOp | NoWrite, em_bt), F(DstMem | SrcReg | Src2ImmByte | ModRM, em_shld), F(DstMem | SrcReg | Src2CL | ModRM, em_shld), N, N, diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 9bc05f5..1825b45 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; @@ -6215,6 +6218,27 @@ static int handle_machine_check(struct kvm_vcpu *vcpu) return 1; } +static int handle_ud(struct kvm_vcpu *vcpu) +{ + enum emulation_result er; + + if (fep) { + 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) + kvm_rip_write(vcpu, kvm_rip_read(vcpu) + sizeof(sig)); + } + er = emulate_instruction(vcpu, EMULTYPE_TRAP_UD); + if (er == EMULATE_USER_EXIT) + return 0; + if (er != EMULATE_DONE) + kvm_queue_exception(vcpu, UD_VECTOR); + return 1; +} + static int handle_exception(struct kvm_vcpu *vcpu) { struct vcpu_vmx *vmx = to_vmx(vcpu); @@ -6233,14 +6257,8 @@ static int handle_exception(struct kvm_vcpu *vcpu) if (is_nmi(intr_info)) return 1; /* already handled by vmx_vcpu_run() */ - if (is_invalid_opcode(intr_info)) { - er = emulate_instruction(vcpu, EMULTYPE_TRAP_UD); - if (er == EMULATE_USER_EXIT) - return 0; - if (er != EMULATE_DONE) - kvm_queue_exception(vcpu, UD_VECTOR); - return 1; - } + if (is_invalid_opcode(intr_info)) + return handle_ud(vcpu); error_code = 0; if (intr_info & INTR_INFO_DELIVER_CODE_MASK) The testcase: #include #include #define HYPERVISOR_INFO 0x40000000 #define CPUID(idx, eax, ebx, ecx, edx)\ asm volatile (\ "test %1,%1;jz 1f; 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"); } Regards, Wanpeng Li