From patchwork Mon Nov 21 04:58:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 697138 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 3tMc9s48L7z9t1F for ; Mon, 21 Nov 2016 16:10:25 +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="jxrFooFZ"; dkim-atps=neutral Received: from localhost ([::1]:47464 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c8gs2-0006ZQ-91 for incoming@patchwork.ozlabs.org; Mon, 21 Nov 2016 00:10:22 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34856) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c8ggu-0005zR-Pq for qemu-devel@nongnu.org; Sun, 20 Nov 2016 23:58:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c8ggs-0001ne-NU for qemu-devel@nongnu.org; Sun, 20 Nov 2016 23:58:52 -0500 Received: from ozlabs.org ([103.22.144.67]:35801) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c8ggs-0001me-3T; Sun, 20 Nov 2016 23:58:50 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 3tMbwL1R40z9t87; Mon, 21 Nov 2016 15:58:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1479704322; bh=F+Wl8RBpN8wAieC5VAr697OfvG5pPvDP1zxkaWN7dzc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jxrFooFZ/xrF/taT4iARKzebwkDG/NcX5/yskcnLCJC60cUOPtbopK4gar6XK7Gei j9QuvA8S/xmnrNx/n0//Pj8hrlHW2umr4vhE5T5GONoFA6FBF2vAlfaklgSXtPtd5I F4gteVq1C0Vz1MozB5xsZ9DVH660zk2tkkNiNQyU= From: David Gibson To: mdroth@linux.vnet.ibm.com, dgilbert@redhat.com Date: Mon, 21 Nov 2016 15:58:34 +1100 Message-Id: <1479704316-7589-4-git-send-email-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1479704316-7589-1-git-send-email-david@gibson.dropbear.id.au> References: <1479704316-7589-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] [fuzzy] X-Received-From: 103.22.144.67 Subject: [Qemu-devel] [PATCH 3/5] target-ppc: Allow eventual removal of old migration mistakes 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, aik@ozlabs.ru, agraf@suse.de, qemu-devel@nongnu.org, qemu-ppc@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Until very recently, the vmstate for ppc cpus included some poorly thought out VMSTATE_EQUAL() components, that can easily break migration compatibility, and did so between qemu-2.6 and later versions. A hack was recently added which fixes this migration breakage, but it leaves the unhelpful cruft of these fields in the migration stream. dThis patch adds a new cpu property allowing these fields to be removed from the stream entirely. This property is enabled by default for the pseries-2.8 machine type - which comes after the fix - and for all non-pseries machine types - which aren't mature enough to care about cross-version migration. The migration hack remains in place for pseries-2.7 and earlier machine types, allowing backwards and forwards migration with the older machine types. This restricts the migration compatibility cruft to older machine types, and at least opens the possibility of eventually deprecating and removing it entirely. Signed-off: David Gibson --- hw/ppc/spapr.c | 5 +++++ target-ppc/cpu.h | 3 ++- target-ppc/machine.c | 48 +++++++++++++++++++++++++++++---------------- target-ppc/translate_init.c | 6 ++++++ 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 54b88d3..775ad2e 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2767,6 +2767,11 @@ DEFINE_SPAPR_MACHINE(2_8, "2.8", true); .driver = TYPE_SPAPR_PCI_HOST_BRIDGE, \ .property = "mem64_win_size", \ .value = "0", \ + }, \ + { \ + .driver = TYPE_POWERPC_CPU, \ + .property = "pre-2.8-migration", \ + .value = "on", \ }, static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index, diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h index 7798b2e..2a50c43 100644 --- a/target-ppc/cpu.h +++ b/target-ppc/cpu.h @@ -1167,7 +1167,8 @@ struct PowerPCCPU { uint32_t max_compat; uint32_t cpu_version; - /* fields used only during migration for compatibility hacks */ + /* Fields related to migration compatibility hacks */ + bool pre_2_8_migration; target_ulong mig_msr_mask; uint64_t mig_insns_flags; uint64_t mig_insns_flags2; diff --git a/target-ppc/machine.c b/target-ppc/machine.c index 4e12e13..b8bda47 100644 --- a/target-ppc/machine.c +++ b/target-ppc/machine.c @@ -135,6 +135,13 @@ static const VMStateInfo vmstate_info_avr = { #define VMSTATE_AVR_ARRAY(_f, _s, _n) \ VMSTATE_AVR_ARRAY_V(_f, _s, _n, 0) +static bool cpu_pre_2_8_migration(void *opaque, int version_id) +{ + PowerPCCPU *cpu = opaque; + + return cpu->pre_2_8_migration; +} + static void cpu_pre_save(void *opaque) { PowerPCCPU *cpu = opaque; @@ -179,10 +186,12 @@ static void cpu_pre_save(void *opaque) } /* Hacks for migration compatibility between 2.6, 2.7 & 2.8 */ - cpu->mig_msr_mask = env->msr_mask; - cpu->mig_insns_flags = env->insns_flags & insns_compat_mask; - cpu->mig_insns_flags2 = env->insns_flags2 & insns_compat_mask2; - cpu->mig_nb_BATs = env->nb_BATs; + if (cpu->pre_2_8_migration) { + cpu->mig_msr_mask = env->msr_mask; + cpu->mig_insns_flags = env->insns_flags & insns_compat_mask; + cpu->mig_insns_flags2 = env->insns_flags2 & insns_compat_mask2; + cpu->mig_nb_BATs = env->nb_BATs; + } } static int cpu_post_load(void *opaque, int version_id) @@ -230,15 +239,19 @@ static int cpu_post_load(void *opaque, int version_id) hreg_compute_mem_idx(env); - if (cpu->mig_insns_flags != env->insns_flags) { - fprintf(stderr, "INSNS: Added 0x%" PRIx64 " removed 0x%" PRIx64 "\n", - env->insns_flags & ~cpu->mig_insns_flags, - cpu->mig_insns_flags & ~env->insns_flags); - } - if (cpu->mig_insns_flags2 != env->insns_flags2) { - fprintf(stderr, "INSNS2: Added 0x%" PRIx64 " removed 0x%" PRIx64 "\n", - env->insns_flags2 & ~cpu->mig_insns_flags2, - cpu->mig_insns_flags2 & ~env->insns_flags2); + if (cpu->pre_2_8_migration) { + if (cpu->mig_insns_flags != env->insns_flags) { + fprintf(stderr, + "INSNS: Added 0x%" PRIx64 " removed 0x%" PRIx64 "\n", + env->insns_flags & ~cpu->mig_insns_flags, + cpu->mig_insns_flags & ~env->insns_flags); + } + if (cpu->mig_insns_flags2 != env->insns_flags2) { + fprintf(stderr, + "INSNS2: Added 0x%" PRIx64 " removed 0x%" PRIx64 "\n", + env->insns_flags2 & ~cpu->mig_insns_flags2, + cpu->mig_insns_flags2 & ~env->insns_flags2); + } } return 0; @@ -594,10 +607,11 @@ const VMStateDescription vmstate_ppc_cpu = { /* FIXME: access_type? */ /* Sanity checking */ - VMSTATE_UINTTL(mig_msr_mask, PowerPCCPU), - VMSTATE_UINT64(mig_insns_flags, PowerPCCPU), - VMSTATE_UINT64(mig_insns_flags2, PowerPCCPU), - VMSTATE_UINT32(mig_nb_BATs, PowerPCCPU), + VMSTATE_UINTTL_TEST(mig_msr_mask, PowerPCCPU, cpu_pre_2_8_migration), + VMSTATE_UINT64_TEST(mig_insns_flags, PowerPCCPU, cpu_pre_2_8_migration), + VMSTATE_UINT64_TEST(mig_insns_flags2, PowerPCCPU, + cpu_pre_2_8_migration), + VMSTATE_UINT32_TEST(mig_nb_BATs, PowerPCCPU, cpu_pre_2_8_migration), VMSTATE_END_OF_LIST() }, .subsections = (const VMStateDescription*[]) { diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c index 208fa1e..626e031 100644 --- a/target-ppc/translate_init.c +++ b/target-ppc/translate_init.c @@ -10520,6 +10520,11 @@ static gchar *ppc_gdb_arch_name(CPUState *cs) #endif } +static Property ppc_cpu_properties[] = { + DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU, pre_2_8_migration, false), + DEFINE_PROP_END_OF_LIST(), +}; + static void ppc_cpu_class_init(ObjectClass *oc, void *data) { PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); @@ -10532,6 +10537,7 @@ static void ppc_cpu_class_init(ObjectClass *oc, void *data) pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_always; dc->realize = ppc_cpu_realizefn; dc->unrealize = ppc_cpu_unrealizefn; + dc->props = ppc_cpu_properties; pcc->parent_reset = cc->reset; cc->reset = ppc_cpu_reset;