From patchwork Tue Aug 1 16:17:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 796332 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ZC/p3Mq3"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xMMDw1pk7z9tWR for ; Wed, 2 Aug 2017 02:28:00 +1000 (AEST) Received: from localhost ([::1]:43631 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dca1W-0004jR-2K for incoming@patchwork.ozlabs.org; Tue, 01 Aug 2017 12:27:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35378) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dcZzM-0003FK-A7 for qemu-devel@nongnu.org; Tue, 01 Aug 2017 12:25:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dcZzI-0004HN-V7 for qemu-devel@nongnu.org; Tue, 01 Aug 2017 12:25:44 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:35081) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dcZzI-0004GQ-ML for qemu-devel@nongnu.org; Tue, 01 Aug 2017 12:25:40 -0400 Received: by mail-wm0-x241.google.com with SMTP id r77so3808820wmd.2 for ; Tue, 01 Aug 2017 09:25:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=2qxCinGnt7la5b2e6fvF3+VgtWa79W8K3b79XPpvA2k=; b=ZC/p3Mq3rksVZJqSPkMEPpsd3L+UmDZPDQ5//nZx1QHFNfZaRqCo3jI1ReEvM4wktE UVt+Vm1PdeFSwHdo/XlpYyyTYrdYbJObxVrvwFaruGMSjyxSV3lFAl52e35EikyH8a26 O1LHDiFO07I3qg9cwZ3Aq8cTrlt6J/KRIFcalbnB7tGXVgui4QxGnpB6v1KWipxm4LLA /P3gO8KTPMmwGIlj919oI9y0jxc3lnHNRZ/dOONF0017F0gcxnQuWpHgjET28NFiArQu X0zsLsBMnlbGeZ8ALeY1Z0zkAYskdAhBFW157g2z5hqQSBrYKVCay9XATRrv3qD0+w/f LvAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=2qxCinGnt7la5b2e6fvF3+VgtWa79W8K3b79XPpvA2k=; b=NS+ohGU7JB3Zc52flwLr31p2VLC3m7n3Qn2180hkBFcuKGjorSjrLlPtzPTgT6eHNo mIpmei1qCvGBybUW1fGqu043R6Zn1EekuGbL2+g9k6QgL6PzY3K7J0TFk1Wo6vFVi0DA dz+ZLazvqVtT2lIn1I2wxZU4T5Hl8syeKKEx0gsRsuOED5u4RJdtyu1DtH8x/D99J2yR VFw66NfFrNmhUhnYFiFeLqoP879tRlOAH/9bpQbrH1sSmQbZX3PVbnmoK6xm5NanXHSZ 0giofQP0hQ5hikknl7PqdCISEepQXLj70AcF+m1JZTzWRkE0s2gjeFcxrQO6Nd7+vDWz doCw== X-Gm-Message-State: AIVw112rva62krXbvHvEv4N3IfHtxBxBMUvlX7P9+ms63CchWry+T5h7 Ay/odmM+/+m0yBo+2fA= X-Received: by 10.28.87.193 with SMTP id l184mr1750152wmb.121.1501604258158; Tue, 01 Aug 2017 09:17:38 -0700 (PDT) Received: from 640k.lan (94-39-192-75.adsl-ull.clienti.tiscali.it. [94.39.192.75]) by smtp.gmail.com with ESMTPSA id u187sm1724160wmd.26.2017.08.01.09.17.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Aug 2017 09:17:37 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 1 Aug 2017 18:17:15 +0200 Message-Id: <1501604245-33460-8-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1501604245-33460-1-git-send-email-pbonzini@redhat.com> References: <1501604245-33460-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PULL 07/17] target-i386: kvm_get/put_vcpu_events don't handle sipi_vector X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peng Hao Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Peng Hao qemu call kvm_get_vcpu_events, and kernel return sipi_vector always 0, never valid when reporting to user space. But when qemu calls kvm_put_vcpu_events will make sipi_vector in kernel be 0. This will accidently modify sipi_vector when sipi_vector in kernel is not 0. Signed-off-by: Peng Hao Reviewed-by: Liu Yi Message-Id: <1500047256-8911-1-git-send-email-peng.hao2@zte.com.cn> Signed-off-by: Paolo Bonzini --- target/i386/kvm.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/target/i386/kvm.c b/target/i386/kvm.c index a6613e1..6db7783 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -2444,8 +2444,10 @@ static int kvm_put_vcpu_events(X86CPU *cpu, int level) } if (level >= KVM_PUT_RESET_STATE) { - events.flags |= - KVM_VCPUEVENT_VALID_NMI_PENDING | KVM_VCPUEVENT_VALID_SIPI_VECTOR; + events.flags |= KVM_VCPUEVENT_VALID_NMI_PENDING; + if (env->mp_state == KVM_MP_STATE_SIPI_RECEIVED) { + events.flags |= KVM_VCPUEVENT_VALID_SIPI_VECTOR; + } } return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_VCPU_EVENTS, &events); @@ -2633,6 +2635,10 @@ int kvm_arch_put_registers(CPUState *cpu, int level) if (ret < 0) { return ret; } + ret = kvm_put_vcpu_events(x86_cpu, level); + if (ret < 0) { + return ret; + } if (level >= KVM_PUT_RESET_STATE) { ret = kvm_put_mp_state(x86_cpu); if (ret < 0) { @@ -2644,11 +2650,6 @@ int kvm_arch_put_registers(CPUState *cpu, int level) if (ret < 0) { return ret; } - - ret = kvm_put_vcpu_events(x86_cpu, level); - if (ret < 0) { - return ret; - } ret = kvm_put_debugregs(x86_cpu); if (ret < 0) { return ret; @@ -2668,35 +2669,39 @@ int kvm_arch_get_registers(CPUState *cs) assert(cpu_is_stopped(cs) || qemu_cpu_is_self(cs)); - ret = kvm_getput_regs(cpu, 0); + ret = kvm_get_vcpu_events(cpu); if (ret < 0) { goto out; } - ret = kvm_get_xsave(cpu); + /* + * KVM_GET_MPSTATE can modify CS and RIP, call it before + * KVM_GET_REGS and KVM_GET_SREGS. + */ + ret = kvm_get_mp_state(cpu); if (ret < 0) { goto out; } - ret = kvm_get_xcrs(cpu); + ret = kvm_getput_regs(cpu, 0); if (ret < 0) { goto out; } - ret = kvm_get_sregs(cpu); + ret = kvm_get_xsave(cpu); if (ret < 0) { goto out; } - ret = kvm_get_msrs(cpu); + ret = kvm_get_xcrs(cpu); if (ret < 0) { goto out; } - ret = kvm_get_mp_state(cpu); + ret = kvm_get_sregs(cpu); if (ret < 0) { goto out; } - ret = kvm_get_apic(cpu); + ret = kvm_get_msrs(cpu); if (ret < 0) { goto out; } - ret = kvm_get_vcpu_events(cpu); + ret = kvm_get_apic(cpu); if (ret < 0) { goto out; }