From nobody Wed Feb 11 01:00:01 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 150456189221748.01084271806906; Mon, 4 Sep 2017 14:51:32 -0700 (PDT) Received: from localhost ([::1]:55821 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dozHF-0006wZ-Cv for importer@patchew.org; Mon, 04 Sep 2017 17:51:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47313) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dozDT-00040q-2d for qemu-devel@nongnu.org; Mon, 04 Sep 2017 17:47:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dozDO-0003DF-9U for qemu-devel@nongnu.org; Mon, 04 Sep 2017 17:47:35 -0400 Received: from 3.mo178.mail-out.ovh.net ([46.105.44.197]:59569) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dozDO-0003C9-3L for qemu-devel@nongnu.org; Mon, 04 Sep 2017 17:47:30 -0400 Received: from player728.ha.ovh.net (b6.ovh.net [213.186.33.56]) by mo178.mail-out.ovh.net (Postfix) with ESMTP id BE85A512D6 for ; Mon, 4 Sep 2017 23:47:28 +0200 (CEST) Received: from bahia.lan (gar31-1-82-66-74-139.fbx.proxad.net [82.66.74.139]) (Authenticated sender: groug@kaod.org) by player728.ha.ovh.net (Postfix) with ESMTPA id 77275540079; Mon, 4 Sep 2017 23:47:24 +0200 (CEST) From: Greg Kurz To: qemu-devel@nongnu.org Date: Mon, 04 Sep 2017 23:47:24 +0200 Message-ID: <150456164425.17000.14656319266821117631.stgit@bahia.lan> In-Reply-To: <150456160452.17000.3290192176290246589.stgit@bahia.lan> References: <150456160452.17000.3290192176290246589.stgit@bahia.lan> User-Agent: StGit/0.17.1-46-g6855-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Ovh-Tracer-Id: 14551130398363523378 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeelledrvdejgddtjecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.105.44.197 Subject: [Qemu-devel] [PATCH 4/4] ppc: kvm: update HPT pointer in KVM PR after migration 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: Thomas Huth , qemu-ppc@nongnu.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 When running with KVM PR, a pseries machine needs to allocate an HPT in userspace and pass its address to KVM. This is done by hijacking the SDR1 slot. It is very likely that the destination QEMU will allocate the HPT at a different address, ie, the SDR1 value we get from the migration stream is wrong and the guest ends up badly broken. Let's fix this by re-computing the appropriate value for SDR1 and pushing it to KVM at CPU post load. This is achieved by extending the PPC virtual hypervisor interface. Signed-off-by: Greg Kurz --- hw/ppc/spapr.c | 6 ++++++ target/ppc/cpu.h | 1 + target/ppc/machine.c | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index bf24c26b756d..11c65563bb6e 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1299,6 +1299,11 @@ target_ulong spapr_get_hpt_pointer(sPAPRMachineState= *spapr) return (target_ulong)(uintptr_t)spapr->htab | (spapr->htab_shift - 18); } =20 +static target_ulong get_spapr_hpt_pointer(PPCVirtualHypervisor *vhyp) +{ + return spapr_get_hpt_pointer(SPAPR_MACHINE(vhyp)); +} + int spapr_hpt_shift_for_ramsize(uint64_t ramsize) { int shift; @@ -3613,6 +3618,7 @@ static void spapr_machine_class_init(ObjectClass *oc,= void *data) vhc->unmap_hptes =3D spapr_unmap_hptes; vhc->store_hpte =3D spapr_store_hpte; vhc->get_patbe =3D spapr_get_patbe; + vhc->get_hpt_pointer =3D get_spapr_hpt_pointer; xic->ics_get =3D spapr_ics_get; xic->ics_resend =3D spapr_ics_resend; xic->icp_get =3D spapr_icp_get; diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index c9d3ffa89bcb..bb1d61c9358c 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1243,6 +1243,7 @@ struct PPCVirtualHypervisorClass { void (*store_hpte)(PPCVirtualHypervisor *vhyp, hwaddr ptex, uint64_t pte0, uint64_t pte1); uint64_t (*get_patbe)(PPCVirtualHypervisor *vhyp); + target_ulong (*get_hpt_pointer)(PPCVirtualHypervisor *vhyp); }; =20 #define TYPE_PPC_VIRTUAL_HYPERVISOR "ppc-virtual-hypervisor" diff --git a/target/ppc/machine.c b/target/ppc/machine.c index e36b7100cb66..6ec4b3214a2d 100644 --- a/target/ppc/machine.c +++ b/target/ppc/machine.c @@ -294,6 +294,13 @@ static int cpu_post_load(void *opaque, int version_id) =20 if (!cpu->vhyp) { ppc_store_sdr1(env, env->spr[SPR_SDR1]); + } else if (kvm_enabled()) { + PPCVirtualHypervisorClass *vhc =3D + PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp); + target_ulong sdr1 =3D vhc->get_hpt_pointer(cpu->vhyp); + if (sdr1) { + kvmppc_update_sdr1(cpu, sdr1); + } } =20 /* Invalidate all msr bits except MSR_TGPR/MSR_HVB before restoring */