get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/813109/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 813109,
    "url": "http://patchwork.ozlabs.org/api/patches/813109/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/150525510133.11068.18348168748736729990.stgit@bahia.lan/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<150525510133.11068.18348168748736729990.stgit@bahia.lan>",
    "list_archive_url": null,
    "date": "2017-09-12T22:25:01",
    "name": "[v2,2/2] spapr: preserve SDR1 during migration",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "3404c4b1732d333a62ce944c27e359db484fd640",
    "submitter": {
        "id": 69178,
        "url": "http://patchwork.ozlabs.org/api/people/69178/?format=api",
        "name": "Greg Kurz",
        "email": "groug@kaod.org"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/150525510133.11068.18348168748736729990.stgit@bahia.lan/mbox/",
    "series": [
        {
            "id": 2784,
            "url": "http://patchwork.ozlabs.org/api/series/2784/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=2784",
            "date": "2017-09-12T22:24:44",
            "name": "spapr: fix migration with nested KVM PR",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/2784/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/813109/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/813109/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)",
        "Received": [
            "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xsKDL6MZcz9t5V\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed, 13 Sep 2017 08:27:30 +1000 (AEST)",
            "from localhost ([::1]:38993 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1drteT-0004i8-2E\n\tfor incoming@patchwork.ozlabs.org; Tue, 12 Sep 2017 18:27:29 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:52242)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <groug@kaod.org>) id 1drtcD-0003DW-So\n\tfor qemu-devel@nongnu.org; Tue, 12 Sep 2017 18:25:11 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <groug@kaod.org>) id 1drtc8-0005hF-UD\n\tfor qemu-devel@nongnu.org; Tue, 12 Sep 2017 18:25:09 -0400",
            "from 1.mo2.mail-out.ovh.net ([46.105.63.121]:40812)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <groug@kaod.org>) id 1drtc8-0005gW-Nz\n\tfor qemu-devel@nongnu.org; Tue, 12 Sep 2017 18:25:04 -0400",
            "from player770.ha.ovh.net (b6.ovh.net [213.186.33.56])\n\tby mo2.mail-out.ovh.net (Postfix) with ESMTP id C4F9BAA9F7\n\tfor <qemu-devel@nongnu.org>; Wed, 13 Sep 2017 00:25:03 +0200 (CEST)",
            "from bahia.lan (gar31-1-82-66-74-139.fbx.proxad.net [82.66.74.139])\n\t(Authenticated sender: groug@kaod.org)\n\tby player770.ha.ovh.net (Postfix) with ESMTPA id 8A5153C006C;\n\tWed, 13 Sep 2017 00:25:01 +0200 (CEST)"
        ],
        "From": "Greg Kurz <groug@kaod.org>",
        "To": "qemu-devel@nongnu.org",
        "Date": "Wed, 13 Sep 2017 00:25:01 +0200",
        "Message-ID": "<150525510133.11068.18348168748736729990.stgit@bahia.lan>",
        "In-Reply-To": "<150525508489.11068.5231444460720976552.stgit@bahia.lan>",
        "References": "<150525508489.11068.5231444460720976552.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": "7bit",
        "X-Ovh-Tracer-Id": "6827175560286411091",
        "X-VR-SPAMSTATE": "OK",
        "X-VR-SPAMSCORE": "-100",
        "X-VR-SPAMCAUSE": "gggruggvucftvghtrhhoucdtuddrfeelledrgedvgdduieeiucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddm",
        "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]",
        "X-Received-From": "46.105.63.121",
        "Subject": "[Qemu-devel] [PATCH v2 2/2] spapr: preserve SDR1 during migration",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.21",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Cc": "qemu-ppc@nongnu.org, David Gibson <david@gibson.dropbear.id.au>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"
    },
    "content": "When running with KVM PR, a pseries machine needs to allocate an HPT\nin userspace and pass its address and size too KVM. This is done at\nmachine reset time by hijacking SDR1.\n\nIt is very likely that the destination QEMU will allocate the HPT at\na different address, ie, the SDR1 value we get from the migration\nstream is wrong and the guest ends up badly broken.\n\nLet's fix this by preserving the pre-load value of SDR1. Since this is\na spapr specific hack, this is achieved by extending the PPC virtual\nhypervisor interface.\n\nSigned-off-by: Greg Kurz <groug@kaod.org>\n---\n hw/ppc/spapr.c       |   30 ++++++++++++++++++++++++++++++\n target/ppc/cpu.h     |    5 +++++\n target/ppc/machine.c |   18 ++++++++++++++++++\n 3 files changed, 53 insertions(+)",
    "diff": "diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c\nindex 97f8afdbd7fe..aa280c9d767f 100644\n--- a/hw/ppc/spapr.c\n+++ b/hw/ppc/spapr.c\n@@ -1200,6 +1200,34 @@ static uint64_t spapr_get_patbe(PPCVirtualHypervisor *vhyp)\n     return spapr->patb_entry;\n }\n \n+static void spapr_cpu_pre_load(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu)\n+{\n+    sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);\n+\n+    /* This is a hack for KVM PR: SDR1 contains the address and size of the HPT\n+     * allocated by QEMU. We must preserve it.\n+     */\n+    if (kvm_enabled() && spapr->htab) {\n+        CPUPPCState *env = &cpu->env;\n+\n+        cpu->sdr1_kvm_pr = env->spr[SPR_SDR1];\n+    }\n+}\n+\n+static void spapr_cpu_post_load(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu)\n+{\n+    sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);\n+\n+    /* This is a hack for KVM PR: SDR1 contains the address and size of the HPT\n+     * allocated by QEMU. We must preserve it.\n+     */\n+    if (kvm_enabled() && spapr->htab) {\n+        CPUPPCState *env = &cpu->env;\n+\n+        env->spr[SPR_SDR1] = cpu->sdr1_kvm_pr;\n+    }\n+}\n+\n #define HPTE(_table, _i)   (void *)(((uint64_t *)(_table)) + ((_i) * 2))\n #define HPTE_VALID(_hpte)  (tswap64(*((uint64_t *)(_hpte))) & HPTE64_V_VALID)\n #define HPTE_DIRTY(_hpte)  (tswap64(*((uint64_t *)(_hpte))) & HPTE64_V_HPTE_DIRTY)\n@@ -3624,6 +3652,8 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)\n     vhc->unmap_hptes = spapr_unmap_hptes;\n     vhc->store_hpte = spapr_store_hpte;\n     vhc->get_patbe = spapr_get_patbe;\n+    vhc->cpu_pre_load = spapr_cpu_pre_load;\n+    vhc->cpu_post_load = spapr_cpu_post_load;\n     xic->ics_get = spapr_ics_get;\n     xic->ics_resend = spapr_ics_resend;\n     xic->icp_get = spapr_icp_get;\ndiff --git a/target/ppc/cpu.h b/target/ppc/cpu.h\nindex c9d3ffa89bcb..22ea2538d923 100644\n--- a/target/ppc/cpu.h\n+++ b/target/ppc/cpu.h\n@@ -1212,6 +1212,9 @@ struct PowerPCCPU {\n     uint64_t mig_insns_flags2;\n     uint32_t mig_nb_BATs;\n     bool pre_2_10_migration;\n+\n+    /* KVM PR hack to preserve SDR1 (HPT) */\n+    target_ulong sdr1_kvm_pr;\n };\n \n static inline PowerPCCPU *ppc_env_get_cpu(CPUPPCState *env)\n@@ -1243,6 +1246,8 @@ struct PPCVirtualHypervisorClass {\n     void (*store_hpte)(PPCVirtualHypervisor *vhyp, hwaddr ptex,\n                        uint64_t pte0, uint64_t pte1);\n     uint64_t (*get_patbe)(PPCVirtualHypervisor *vhyp);\n+    void (*cpu_pre_load)(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu);\n+    void (*cpu_post_load)(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu);\n };\n \n #define TYPE_PPC_VIRTUAL_HYPERVISOR \"ppc-virtual-hypervisor\"\ndiff --git a/target/ppc/machine.c b/target/ppc/machine.c\nindex e36b7100cb66..c4d32c886367 100644\n--- a/target/ppc/machine.c\n+++ b/target/ppc/machine.c\n@@ -218,6 +218,19 @@ static bool pvr_match(PowerPCCPU *cpu, uint32_t pvr)\n     return pcc->pvr_match(pcc, pvr);\n }\n \n+static int cpu_pre_load(void *opaque)\n+{\n+    PowerPCCPU *cpu = opaque;\n+\n+    if (cpu->vhyp) {\n+        PPCVirtualHypervisorClass *vhc =\n+            PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);\n+        vhc->cpu_pre_load(cpu->vhyp, cpu);\n+    }\n+\n+    return 0;\n+}\n+\n static int cpu_post_load(void *opaque, int version_id)\n {\n     PowerPCCPU *cpu = opaque;\n@@ -294,6 +307,10 @@ static int cpu_post_load(void *opaque, int version_id)\n \n     if (!cpu->vhyp) {\n         ppc_store_sdr1(env, env->spr[SPR_SDR1]);\n+    } else {\n+        PPCVirtualHypervisorClass *vhc =\n+            PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);\n+        vhc->cpu_post_load(cpu->vhyp, cpu);\n     }\n \n     /* Invalidate all msr bits except MSR_TGPR/MSR_HVB before restoring */\n@@ -650,6 +667,7 @@ const VMStateDescription vmstate_ppc_cpu = {\n     .minimum_version_id_old = 4,\n     .load_state_old = cpu_load_old,\n     .pre_save = cpu_pre_save,\n+    .pre_load = cpu_pre_load,\n     .post_load = cpu_post_load,\n     .fields = (VMStateField[]) {\n         VMSTATE_UNUSED(sizeof(target_ulong)), /* was _EQUAL(env.spr[SPR_PVR]) */\n",
    "prefixes": [
        "v2",
        "2/2"
    ]
}