From patchwork Tue Jan 24 07:17:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Dovgalyuk X-Patchwork-Id: 9534115 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A13606042D for ; Tue, 24 Jan 2017 07:17:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 92E4122B1F for ; Tue, 24 Jan 2017 07:17:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 878F823F88; Tue, 24 Jan 2017 07:17:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id F20AC22B1F for ; Tue, 24 Jan 2017 07:17:29 +0000 (UTC) Received: from localhost ([::1]:46369 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cVvM9-0005zN-1t for patchwork-qemu-devel@patchwork.kernel.org; Tue, 24 Jan 2017 02:17:29 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35153) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cVvLi-0005yK-Kb for qemu-devel@nongnu.org; Tue, 24 Jan 2017 02:17:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cVvLh-0005jx-7p for qemu-devel@nongnu.org; Tue, 24 Jan 2017 02:17:02 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38504) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cVvLh-0005jp-15 for qemu-devel@nongnu.org; Tue, 24 Jan 2017 02:17:01 -0500 Received: from [10.10.150.107] (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 5A38D54006D; Tue, 24 Jan 2017 10:17:00 +0300 (MSK) To: qemu-devel@nongnu.org From: Pavel Dovgalyuk Date: Tue, 24 Jan 2017 10:17:02 +0300 Message-ID: <20170124071702.4572.17294.stgit@PASHA-ISP> In-Reply-To: <20170124071654.4572.41407.stgit@PASHA-ISP> References: <20170124071654.4572.41407.stgit@PASHA-ISP> User-Agent: StGit/0.16 MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v7 01/14] icount: update instruction counter on apic patching 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: kwolf@redhat.com, peter.maydell@linaro.org, quintela@redhat.com, jasowang@redhat.com, mst@redhat.com, dovgaluk@ispras.ru, kraxel@redhat.com, pbonzini@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP kvmvapic patches the code when some instructions are executed. E.g. mov 0xff, 0xfffe0080 is interpreted as push 0xff/call ... This patching is also followed by some side effects (changing apic and guest memory state). Therefore deterministic execution should take this operation into account. This patch decreases icount when original mov instruction is trying to execute. Therefore patching becomes deterministic and can be replayed correctly. Signed-off-by: Pavel Dovgalyuk --- hw/i386/kvmvapic.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c index b30d1b9..146d47c 100644 --- a/hw/i386/kvmvapic.c +++ b/hw/i386/kvmvapic.c @@ -412,6 +412,12 @@ static void patch_instruction(VAPICROMState *s, X86CPU *cpu, target_ulong ip) if (!kvm_enabled()) { cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, ¤t_flags); + /* Account this instruction, because we will exit the tb. + This is the first instruction in the block. Therefore + there is no need in restoring CPU state. */ + if (use_icount) { + --cs->icount_decr.u16.low; + } } pause_all_vcpus();