From patchwork Sun Oct 30 11:12:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 688901 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org 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 3t6Fgj22rQz9t1P for ; Sun, 30 Oct 2016 22:31:28 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b=pCXeGLqH; dkim-atps=neutral Received: from localhost ([::1]:57957 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c0oKj-0000vs-Gf for incoming@patchwork.ozlabs.org; Sun, 30 Oct 2016 07:31:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41520) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c0o2P-0000OF-Pp for qemu-devel@nongnu.org; Sun, 30 Oct 2016 07:12:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c0o2O-00038T-6e for qemu-devel@nongnu.org; Sun, 30 Oct 2016 07:12:29 -0400 Received: from ozlabs.org ([103.22.144.67]:52127) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c0o2N-00036f-RL; Sun, 30 Oct 2016 07:12:28 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3t6FFZ1zL7z9tB1; Sun, 30 Oct 2016 22:12:17 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1477825938; bh=No/Re3wMjQQN56I5mH0yt0HUolG4fETRJVyQ0cA4irs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pCXeGLqHa16HnwvwhS5RYuiog8//ewMtnixfF6AypsIFttDT7M2SxauRGOJ7zash2 xymg8dTb0ll/jQ/qr+P8yLCAFOH/aKBVFovVSsVRKl74f8F7OgbvbRNhBOIQ1zpLRQ WgZ3IOT5sciFvDY46j+E3AVeAKJIkWmABUwBcnR8= From: David Gibson To: nikunj@linux.vnet.ibm.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com Date: Sun, 30 Oct 2016 22:12:03 +1100 Message-Id: <1477825928-10803-13-git-send-email-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1477825928-10803-1-git-send-email-david@gibson.dropbear.id.au> References: <1477825928-10803-1-git-send-email-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 103.22.144.67 Subject: [Qemu-devel] [RFC 12/17] ppc: Migrate compatibility mode 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: lvivier@redhat.com, thuth@redhat.com, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Server-class POWER CPUs can be put into several compatibility modes. These can be specified on the command line, or negotiated by the guest during boot. Currently we don't migrate the compatibility mode, which means after a migration the guest will revert to running with whatever compatibility mode (or none) specified on the command line. With the limited range of CPUs currently used, this doesn't usually cause a problem, but it could. Fix this by adding the compatibility mode (if set) to the migration stream. Signed-off-by: David Gibson --- target-ppc/machine.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/target-ppc/machine.c b/target-ppc/machine.c index 4820f22..5d87ff6 100644 --- a/target-ppc/machine.c +++ b/target-ppc/machine.c @@ -9,6 +9,7 @@ #include "mmu-hash64.h" #include "migration/cpu.h" #include "exec/exec-all.h" +#include "qapi/error.h" static int cpu_load_old(QEMUFile *f, void *opaque, int version_id) { @@ -176,6 +177,20 @@ static int cpu_post_load(void *opaque, int version_id) * software has to take care of running QEMU in a compatible mode. */ env->spr[SPR_PVR] = env->spr_cb[SPR_PVR].default_value; + +#if defined(TARGET_PPC64) + if (cpu->compat_pvr) { + Error *local_err = NULL; + + ppc_set_compat(cpu, cpu->compat_pvr, &local_err); + if (local_err) { + error_report_err(local_err); + error_free(local_err); + return -1; + } + } +#endif + env->lr = env->spr[SPR_LR]; env->ctr = env->spr[SPR_CTR]; cpu_write_xer(env, env->spr[SPR_XER]); @@ -528,6 +543,24 @@ static const VMStateDescription vmstate_tlbmas = { } }; +static bool compat_needed(void *opaque) +{ + PowerPCCPU *cpu = opaque; + + return cpu->compat_pvr != 0; +} + +static const VMStateDescription vmstate_compat = { + .name = "cpu/compat", + .version_id = 1, + .minimum_version_id = 1, + .needed = compat_needed, + .fields = (VMStateField[]) { + VMSTATE_UINT32(compat_pvr, PowerPCCPU), + VMSTATE_END_OF_LIST() + } +}; + const VMStateDescription vmstate_ppc_cpu = { .name = "cpu", .version_id = 5, @@ -580,6 +613,7 @@ const VMStateDescription vmstate_ppc_cpu = { &vmstate_tlb6xx, &vmstate_tlbemb, &vmstate_tlbmas, + &vmstate_compat, NULL } };