get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2237938,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2237938/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260513163356.3033159-13-shaju.abraham@nutanix.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.1/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": ""
    },
    "msgid": "<20260513163356.3033159-13-shaju.abraham@nutanix.com>",
    "date": "2026-05-13T16:33:55",
    "name": "[RFC,v1,12/13] target/arm: named_cpu_model: writeback modified ID registers to KVM",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "d5f61bb2b0b94ee02ebc9ced8eab7d6592d34447",
    "submitter": {
        "id": 77003,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/77003/?format=api",
        "name": "Shaju Abraham",
        "email": "shaju.abraham@nutanix.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260513163356.3033159-13-shaju.abraham@nutanix.com/mbox/",
    "series": [
        {
            "id": 504187,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/504187/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=504187",
            "date": "2026-05-13T16:33:48",
            "name": "named CPU models for ARM64 on KVM",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/504187/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2237938/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2237938/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=nutanix.com header.i=@nutanix.com header.a=rsa-sha256\n header.s=proofpoint20171006 header.b=Ea0M0Ndi;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=nutanix.com header.i=@nutanix.com header.a=rsa-sha256\n header.s=selector1 header.b=XdYqZlzT;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4gFzbr30pdz1y5L\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 14 May 2026 02:35:52 +1000 (AEST)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wNCY5-0003Oj-LI; Wed, 13 May 2026 12:35:05 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <shaju.abraham@nutanix.com>)\n id 1wNCXl-0003L6-HV; Wed, 13 May 2026 12:34:46 -0400",
            "from mx0b-002c1b01.pphosted.com ([148.163.155.12])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <shaju.abraham@nutanix.com>)\n id 1wNCXj-0000kL-Ba; Wed, 13 May 2026 12:34:45 -0400",
            "from pps.filterd (m0127842.ppops.net [127.0.0.1])\n by mx0b-002c1b01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 64DGKgAr2442897; Wed, 13 May 2026 09:34:32 -0700",
            "from sa9pr02cu001.outbound.protection.outlook.com\n (mail-southcentralusazon11023118.outbound.protection.outlook.com\n [40.93.196.118])\n by mx0b-002c1b01.pphosted.com (PPS) with ESMTPS id 4e3nv6x90v-1\n (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT);\n Wed, 13 May 2026 09:34:31 -0700 (PDT)",
            "from PH7PR02MB10160.namprd02.prod.outlook.com\n (2603:10b6:510:2e7::19) by SJ0PR02MB8813.namprd02.prod.outlook.com\n (2603:10b6:a03:3d6::9) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9913.11; Wed, 13 May\n 2026 16:34:30 +0000",
            "from PH7PR02MB10160.namprd02.prod.outlook.com\n ([fe80::4ed7:5c74:48e0:ff23]) by PH7PR02MB10160.namprd02.prod.outlook.com\n ([fe80::4ed7:5c74:48e0:ff23%7]) with mapi id 15.20.9891.021; Wed, 13 May 2026\n 16:34:30 +0000"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; h=\n cc:content-transfer-encoding:content-type:date:from:in-reply-to\n :message-id:mime-version:references:subject:to; s=\n proofpoint20171006; bh=eSWNtzO2D9cGJylkx4I3O/eG73/2+KCOKxV/h7JoR\n fo=; b=Ea0M0NdiGUH4G2a/mXZ2nggYhpUfZPwVZ0Kl6JRZ+lF+HC3uWnXRZ7X6h\n 5Ud1vVCf/tLroAdiR/INnxEwdMZAoASvA6S+NOGkcES7i01XiqDrOIpUwAekuML5\n Ba6tpuE7bKcRk344ZKFNhvQ57k1nTRTeR6LvtD6G2rrVfRp7nfKyAAoTviJeAaS0\n yuVoPliosZIIA0GXvdCpv37bq0p+RwK+pfr+bgnvH3JKpNMU0Z3X4zpDU3Ab9h/U\n tm08K2QoWgetB+jw2AtCozlEjsPyE8tKGhZ1wOFKw/5jCYf0o+/sGvDLYtnS2YHZ\n FIPPgu9xkHr2qncqxjQlgvCOOw44w==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=eSWNtzO2D9cGJylkx4I3O/eG73/2+KCOKxV/h7JoRfo=;\n b=XdYqZlzTSEWDnUIugwCaOmmZJ2+jpYbgCxB8JHjQuNbvAW00dCMZHaA0eqpKOmjQwgzjfGTNapV01tAkZ2Nu12sjNmZIfIZUVQe/DfOlF+0q0sjxh43FaSNm1wEN69hxkVBK8iDn18WztkRmaZcnCdtZkJY3a2B9+hbtmVasrk/DZaMkrOySd5sQVqX1wndg26i29lpYGJnNkHMJjk5AAp0LPMSqqI+J/XNhTx4SL95dhlnVT1JSzjkZS7zWwHCDjxMkYuvC2zzUgcSPnjXTy7jx6SU4GzOETU6j6RX9ojYkyJbLjwBYA2GIf2jWukFw4kZjQEqiamHoobANdOLF7w=="
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=KY+bC0/KSH5EDvlF3U3d2IDJlzt0cb+Lgpri5rb7p3DxGRKgrRiNu4d5WE6OxCPLiLBQ/CvI9rcf8Ab61kxVjNp87Lour5wAXzamSKAzpfbRhIfGMFMcIQ3j+f7dfLh5BximKoTmhJg1sn5YxiA/vPuTjCxQUquphW1dY3soxkP5gFfOmccYJKQBhCHDeQQvoT7IT6BJFUj6OJU9OtKt4+NdLMnJQJCbKPpkdRp3Yn7DIzTxQZfYh6HnOYiX63cj1d87WmjMT0VBl5CDvq1neiNlT19kJidWqUJ4BUJIWYr3TtVUlgXVR5eqmQmAF+K9JX8rQkOEkCUnC3sogxRptw==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=eSWNtzO2D9cGJylkx4I3O/eG73/2+KCOKxV/h7JoRfo=;\n b=SQKkjaTUJaCuD6T9yzmGyNoFldcOqnNNazR4bAtXkdZeKEF0JYeLQkhK5ai/EDhha6e26HCxqzolbtWRhAqlcZWvLkr7QjtzLwQfEyIPy6C4xTGS+o4qk4C8KvQ+GhSvauzGvVDJuv3JgiHrAXBkALgyB0+QtL6rPWtNDI108N/x/QMth91qTI/hI9G4FVQjcjWcAS7S+U5YzbJTSDST7e9H2utZhkeYW2STmyMXM9eEHHbRmxk6BFchpD5YY08ZEgY2tk5tGywrIYE4rbmoKT8EJ9IpacKjm6boskB26dIkiTO67V1FgOUDXAKV04sOMp2wnQOC6BJTk0QtmAzaFA==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=nutanix.com; dmarc=pass action=none header.from=nutanix.com;\n dkim=pass header.d=nutanix.com; arc=none",
        "From": "Shaju Abraham <shaju.abraham@nutanix.com>",
        "To": "eric.auger@redhat.com, qemu-devel@nongnu.org, qemu-arm@nongnu.org,\n kvmarm@lists.linux.dev, peter.maydell@linaro.org,\n richard.henderson@linaro.org, cohuck@redhat.com, sebott@redhat.com,\n skolothumtho@nvidia.com, philmd@linaro.org",
        "Cc": "maz@kernel.org, oliver.upton@linux.dev, pbonzini@redhat.com,\n prerna.saxena@nutanix.com, jon@nutanix.com, jond@nutanix.com,\n Shaju Abraham <shaju.abraham@nutanix.com>,\n Khushit Shah <khushit.shah@nutanix.com>",
        "Subject": "[RFC PATCH v1 12/13] target/arm: named_cpu_model: writeback modified\n ID registers to KVM",
        "Date": "Wed, 13 May 2026 16:33:55 +0000",
        "Message-ID": "<20260513163356.3033159-13-shaju.abraham@nutanix.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20260513163356.3033159-1-shaju.abraham@nutanix.com>",
        "References": "<20260513163356.3033159-1-shaju.abraham@nutanix.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "CY5PR10CA0003.namprd10.prod.outlook.com\n (2603:10b6:930:1c::30) To PH7PR02MB10160.namprd02.prod.outlook.com\n (2603:10b6:510:2e7::19)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "PH7PR02MB10160:EE_|SJ0PR02MB8813:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "6e6f80a3-60f4-4718-5b85-08deb10d8177",
        "x-proofpoint-crosstenant": "true",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230040|7416014|376014|366016|1800799024|921020|18002099003|22082099003|56012099003|3023799003;",
        "X-Microsoft-Antispam-Message-Info": "\n jrongxhVcKjd96sOirH+zFeh+tiJyIr8I/iHM1XB3BzM8PmeltEqn6i1MzqgwL+pyIbBuf1ljcm4G5N4+xbxHUp4+i0j8BO5UE1+k1fgHL8Eg0lPm9cJ3JcsD17GbQ31ksCHf1pzJydySsOffm/BRqeoaK5qlyMxqUtiHFZ1PPsH0tBagUJx7VirDJTgK3/IaX2ES5cR3Ypv3rHHZxCwU9z/V0edRTHn4K5DjgXEzOmbwYrT+8V3Ln/NLPwvu6XsXl+fJKlCvX4ZjqUdUelBn/eqwiGwAGmSjlm6c9dJkJtUl2+M0X74ZARdhM7zwAZcPCIdBQ2BxzNcgYJmRdLzYJDUObre5Hia1NGx9yInEJqwAiWSGLPypSUFZjqLZiW8mld1pMzzCbBG7OkaGD120l2vE0HvOlNGdxNZvXkoF80AThNxjjSWlGh3zI7kRDTqO1QbLLPUZMU0+VgNOA1Txf1ku4NiQ3mL1O5Veo4PHlhueUvJPjRlrVGrq1zsqC3TqZ9WW8K3Dj+V3vgrIqzGnF2EuyIphOnnw9Wrlbf2x4IsIGQrLW+FcOXQZu7WIkmyh0LW6fZJsklqul/gQcCOnSTCFLrY0eHzoMgGGndCTeXPLmmWOXJoV0JVMekRb1/Yi0LkDwH0NECtJgi9/qUPrg1l1nlHWlDxqNz7FUtTn4zGA1k2cv8CSV7MBYvHA9IlhVyhBIEReLNKJUCsfp98y1BJ5+k+zX9PxOCH9BaoP0o=",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:PH7PR02MB10160.namprd02.prod.outlook.com; PTR:;\n CAT:NONE;\n SFS:(13230040)(7416014)(376014)(366016)(1800799024)(921020)(18002099003)(22082099003)(56012099003)(3023799003);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n 0cxTidyhwtXqliShdIrk2cY5AscdFXI2FhQlHmev1X1vOj1vBmbGUFjuYN8BRnN5Jr8tTNoSgQbrn1/rUjIGS883/EOVgrffrRDTEjukdefUfTUJ6B9vwDPfCRhlZGT5uyXa5yQFIGE/F0Mn0EcSBLAkOo0b3262fj3GWm56pkPdwEC6XjRT3sGOVRYQB1gfsnPmVglyXlZxTCaHhF7RVG/f9/+QdycAmPmRJLRwYraPjUgLxe+Qq/+6W5MfhFeaWUvWSEfgtph0d/Ia4bqxKUXUbTFIksg8mM5xFO0Go5W9n2OIL4/+CPDWw84TdR3R+crAeQjuZ86b+Ze6wnsWTk4wPLHjepGyZVw24T+e2zFNCFyaqCNvpwS3Q0sIPg2VgkT5iqr0O2/cIvltiDWoQXWfzvKTiTqaiNsFUHRfAEwoCuLR2cw0fG19LC0Sz3pGfwc9bQ77lycOqLg04bRmkG0pJfnaKG6TlHN1V71FUdgdZF6tkZf1RmznCIMEr3Q7e0GiiPMY+KEs7uxwkROrskhJwlithD8983+5egU3dsG2adyYbcmQ68KPoNUYEe7w91pZa3SZUD+nASbC/tTh4weduX9mnkAFMopEZ7Rpp+JPknxSiM6LB9ptSe2nGK4STWj9WzM7g6ac+wSCpjZEyYHKdC8cFLlmN9QuTiZGBLHHBvtARa7rAM7MLIyDK6E/KWoluY92pRaMi5Q74G63n0tQvk1pJNU1fb2Y1cdeKQsezpzlOA954RnLTZ+8vhfER4OBIADsPS+VarzjazBn6pTvmRX7P92eqA2TkpThzlESqwhhiwAvh+eywXqkGCaUxZ4iCxbsGLWameVq0A5Fi/AcujKbZo1gtSC63NBSaCiZTe+/Sax0aZlLSKWvjNiY+EahWo9eFY28Gh4vmjftaBNgMXwOWQRTWf8xJwz6FM4DrV5xHteyFikLsN/OvHYnTTcnGX+epqEePWO92t+SJ2mTP8jnLARnhhYWEp7jx0OCB4RSfjqEmm5b8xxRQHMW5ubhtRumjdzEWJ6dmbppDF7cx/Z+yAsJGHztrEXm/rVqRczFwpc/1RLTb+uKtneHt+s+ylYawjLL2RejrgKmuLeBRkSZdqRGGYPxf6xA+4je2cIaYv4XTgUGcvJI2RLEfLcVmnNzAddOJe9//BsW+QH3LyPtSNw1tIVgRPkkY2WFIEFknRpK/ge7qiUqWojlhGdjY1gXlF8sUmXCVt/LguCeR9SskWan4pQ5wchOKznSHL2VuFiIZu+VsvPVO6xv0kf4ofkLRWsL7HjvRp7uHtD6/AtRlbKX+E+QDEGbE7psFBzlX3cX5dEkg25H0mOZm8/Gmzb/Ghl82keMou9r28b2LcbOBasJT6Tl+/+5TyMUViLuOM/3cZqR8MtAlip0Zr1SKFK6PzAYlnYNxSvJhjtKvwZo5PAFFvMbDs4m58NzKvjGT0FL2G2NLed4245Z+i8N6AJ1KUYgXBYFVBv9jFy8+lStag2kT21etBzdYTfIXIja46dQ/9vfNkqEf7VkcaR3lBUo/6ywNQJ1oKX5C2mNwllCD2X4xVjeOIuzcJcxJOiIJnJOIP2tCDPj6ymQviU2WINt1EORY7u0+1eyNrAUBRoHGCMf2ntWMn61RNGyb0PwBnXGROLbO/sfo75GR92hdv6WwRWG9Gisjnz3FrLe2xKao/UEEZKPvcCIIpf1AFlK2daglaTlpErsSEbxi9Y1m4z9BeF25I8D8C0MBgyLlESj1vLJDnm3hhFbGNI=",
        "X-Exchange-RoutingPolicyChecked": "\n pOnHTBAnFN/NIgj41oMAsuEIdDROtINsZhq5EuujmlsGf/Ir1gMgtvKbQ84HPMvVEjER91stLUDrcPYmUl0EoojiD+ztsP/j6hOwBr375xYCc05TwWFXkDfD4HQWARXp9PVlJ/KJTCqwSRYv9em7UaxhpTEVRybtUC+eXFBl8KpPhYwIZ51n68Ps7em4AcL/byhj0TLd99AWmNkextA41tAtH7duxS0XK1RehNR+mlB3swBSH09a+totpjlPKZZK2CrxQYAUeT4HF3l27VR/b7buxb7as/1yFP7m3anFeMkUS/VFCMu5VUXNkb4xWFxYAIiZohU8We9hy42vPaWWuw==",
        "X-OriginatorOrg": "nutanix.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 6e6f80a3-60f4-4718-5b85-08deb10d8177",
        "X-MS-Exchange-CrossTenant-AuthSource": "PH7PR02MB10160.namprd02.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "13 May 2026 16:34:29.9664 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "bb047546-786f-4de1-bd75-24e5b6f79043",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n t+tvee2HEnhfQfPfKQPMBCQQcpt+8g4CMPrGX84Kv4Vt9UT0IKnXMiG8hxrZKaJ/5XMfR9Y8WkjxB18B7lizcfIx4L0OCNdtP0SbLsozGGk=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SJ0PR02MB8813",
        "X-Proofpoint-ORIG-GUID": "yR7C-Ljm3IiRAysimQ9kY0Vcr8amwbE6",
        "X-Authority-Analysis": "v=2.4 cv=P7QKQCAu c=1 sm=1 tr=0 ts=6a04a817 cx=c_pps\n a=emGy3M2YSyErp0/4l4UmgA==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19\n a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19\n a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=0kUYKlekyDsA:10\n a=VkNPw1HP01LnGYTKEx00:22 a=VofLwUrZ8Iiv6rRUPXIb:22 a=VUi8bpU7OL1Oj2-RSIOF:22\n a=64Cc0HZtAAAA:8 a=0aVVV3pfCXYwIWacCPYA:9",
        "X-Proofpoint-GUID": "yR7C-Ljm3IiRAysimQ9kY0Vcr8amwbE6",
        "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNTEzMDE2OCBTYWx0ZWRfX4a+c+EvUwUuE\n gDQTE2Gu3zsS65qRnTvUKyz/HlkT6pHGCiwCnmlhP+/YIr8s8uA3dsjD6zfz9kmL6EUcsC0dG0s\n LERW8TMFAlUADBuMjZ/ZWqCcrMppQhtdlSIga5BZBBZKVjkmnlKFtzUyncE+NhGiPRZh7kwfRss\n wmr+lCVjkIXMAxtTpxT1uxbtlj99D+WGXsJ4A5Rm+pBAY8Ea0An2HOPBB5WuLwJT20JpXwivCKB\n MbDHel+iPtziUkw10so/lu2xB3wiwj14g/DO3CeHiynCJtLtbqdeAQzzWONkJVoUjvWyyb8GPeV\n PrJK4swrJ2sdU4T3xsGAFmPNYRLpX+zMMijellq3+rFk/upLnbBgfJGh6LqpcjdDOrq+XHWEMpU\n wDnacrVo0g0IETT1Hf6vv3E60RN6JUaATcapnhQ+g9SOmhgKCeYEIdayxr7YO6s/uooMPi0YTe5\n lzNfTXTMPnVS4t/eRhw==",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-05-13_01,2026-05-13_01,2025-10-01_01",
        "X-Proofpoint-Spam-Reason": "safe",
        "Received-SPF": "pass client-ip=148.163.155.12;\n envelope-from=shaju.abraham@nutanix.com; helo=mx0b-002c1b01.pphosted.com",
        "X-Spam_score_int": "-31",
        "X-Spam_score": "-3.2",
        "X-Spam_bar": "---",
        "X-Spam_report": "(-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no",
        "X-Spam_action": "no action",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "qemu development <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://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 <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "Writeback modified cpu->isar.idregs[] to KVM after the model is realized.\nWarn if modified bits are not writable by KVM. To facilitate this,\nadd writable_mask to ArmIdReg struct and populate it from\nKVM_ARM_GET_REG_WRITABLE_MASKS during scratch VM creation.\n\nCo-authored-by: Khushit Shah <khushit.shah@nutanix.com>\nSigned-off-by: Shaju Abraham <shaju.abraham@nutanix.com>\n---\n target/arm/cpu-idregs.c |   1 +\n target/arm/cpu-idregs.h |   1 +\n target/arm/kvm.c        | 160 +++++++++++++++++++++++++++++++++++++++-\n target/arm/trace-events |   1 +\n 4 files changed, 162 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/target/arm/cpu-idregs.c b/target/arm/cpu-idregs.c\nindex 5ffdeb5f21..e8988b7392 100644\n--- a/target/arm/cpu-idregs.c\n+++ b/target/arm/cpu-idregs.c\n@@ -68,6 +68,7 @@\n         .name = #reg, \\\n         .fields = reg##_fields, \\\n         .fields_count = ARRAY_SIZE(reg##_fields), \\\n+        .writable_mask = 0, \\\n     },\n \n ArmIdReg arm_idregs[NUM_ID_IDX] = {\ndiff --git a/target/arm/cpu-idregs.h b/target/arm/cpu-idregs.h\nindex 0127bc0a95..eb0d8a1280 100644\n--- a/target/arm/cpu-idregs.h\n+++ b/target/arm/cpu-idregs.h\n@@ -37,6 +37,7 @@ typedef struct ArmIdReg {\n     const char *name;\n     struct ArmIdRegField *fields;\n     uint32_t fields_count;\n+    uint64_t writable_mask;\n } ArmIdReg;\n \n /* Map short register names to canonical _EL1/_EL0 IDX values */\ndiff --git a/target/arm/kvm.c b/target/arm/kvm.c\nindex 7d194ea112..dc64cfbeb6 100644\n--- a/target/arm/kvm.c\n+++ b/target/arm/kvm.c\n@@ -28,6 +28,7 @@\n #include \"kvm_arm.h\"\n #include \"cpu.h\"\n #include \"cpu-sysregs.h\"\n+#include \"cpu-idregs.h\"\n #include \"trace.h\"\n #include \"internals.h\"\n #include \"hw/pci/pci.h\"\n@@ -66,6 +67,12 @@ typedef struct ARMHostCPUFeatures {\n \n static ARMHostCPUFeatures arm_host_cpu_features;\n \n+#define DEF(NAME, OP0, OP1, CRN, CRM, OP2) [NAME##_IDX] = #NAME,\n+const char * const sysreg_names[NUM_ID_IDX] = {\n+#include \"cpu-sysregs.h.inc\"\n+};\n+#undef DEF\n+\n /**\n  * kvm_arm_vcpu_init:\n  * @cpu: ARMCPU\n@@ -244,6 +251,63 @@ static int get_host_cpu_reg(int fd, ARMHostCPUFeatures *ahcf,\n     return ret;\n }\n \n+static int get_host_cpu_idregs_all(int fd, ARMHostCPUFeatures *ahcf)\n+{\n+    int err = 0, i;\n+    for (i = 0; i < NUM_ID_IDX; i++) {\n+        /* Skip registers whose plumbing is not yet added. */\n+        if (!arm_idregs[i].name) {\n+            continue;\n+        }\n+\n+        err |= get_host_cpu_reg(fd, ahcf, i);\n+    }\n+    return err;\n+}\n+\n+static int idregs_idx_to_kvm_idx(ARMIDRegisterIdx idx)\n+{\n+    ARMSysRegs sysreg = id_register_sysreg[idx];\n+\n+    return KVM_ARM_FEATURE_ID_RANGE_IDX(\n+        (sysreg >> CP_REG_ARM64_SYSREG_OP0_SHIFT) & 0x3,\n+        (sysreg >> CP_REG_ARM64_SYSREG_OP1_SHIFT) & 0x7,\n+        (sysreg >> CP_REG_ARM64_SYSREG_CRN_SHIFT) & 0xf,\n+        (sysreg >> CP_REG_ARM64_SYSREG_CRM_SHIFT) & 0xf,\n+        (sysreg >> CP_REG_ARM64_SYSREG_OP2_SHIFT) & 0x7);\n+}\n+\n+static int get_writable_id_regs(int vmfd)\n+{\n+    int cap, ret, i;\n+    uint64_t regs[KVM_ARM_FEATURE_ID_RANGE_SIZE] = { 0 };\n+    struct reg_mask_range range = {\n+        .addr  = (uint64_t)(uintptr_t)regs,\n+        .range = KVM_ARM_FEATURE_ID_RANGE,\n+    };\n+\n+    cap = ioctl(vmfd, KVM_CHECK_EXTENSION,\n+                KVM_CAP_ARM_SUPPORTED_REG_MASK_RANGES);\n+    if (cap <= 0 || !(cap & (1 << KVM_ARM_FEATURE_ID_RANGE))) {\n+        return -ENOSYS;\n+    }\n+\n+    ret = ioctl(vmfd, KVM_ARM_GET_REG_WRITABLE_MASKS, &range);\n+    if (ret) {\n+        return -errno;\n+    }\n+\n+    for (i = 0; i < NUM_ID_IDX; i++) {\n+        int kidx = idregs_idx_to_kvm_idx(i);\n+\n+        if (kidx < 0 || kidx >= KVM_ARM_FEATURE_ID_RANGE_SIZE) {\n+            continue;\n+        }\n+        arm_idregs[i].writable_mask = regs[kidx];\n+    }\n+    return 0;\n+}\n+\n static uint32_t kvm_arm_sve_get_vls(int fd)\n {\n     uint64_t vls[KVM_ARM64_SVE_VLS_WORDS];\n@@ -455,6 +519,22 @@ static void kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)\n             arm_host_cpu_features.sve_vq_supported = kvm_arm_sve_get_vls(fd);\n         }\n     }\n+    /*\n+     * Try to read all the ID registers. KVM does not yet support it\n+     * for all registers, hence ignore the errors.\n+     */\n+    get_host_cpu_idregs_all(fd, ahcf);\n+\n+    {\n+        int wret = get_writable_id_regs(fdarray[1]);\n+        if (wret) {\n+            warn_report(\"KVM_ARM_GET_REG_WRITABLE_MASKS\"\n+                        \"%s: %s\",\n+                        wret == -ENOSYS ? \" unsupported\"\n+                                        : \" failed\",\n+                        strerror(-wret));\n+        }\n+    }\n \n     kvm_arm_destroy_scratch_host_vcpu(fdarray);\n \n@@ -1080,6 +1160,71 @@ void kvm_arm_cpu_pre_save(ARMCPU *cpu)\n     }\n }\n \n+/* same as kvm_arm_get_cpreg_ptr() but can return NULL. */\n+static uint64_t *kvm_arm_find_cpreg_ptr(ARMCPU *cpu, uint64_t regidx)\n+{\n+    uint64_t *res;\n+\n+    res = bsearch(&regidx, cpu->cpreg_indexes, cpu->cpreg_array_len,\n+                  sizeof(uint64_t), compare_u64);\n+    if (!res) {\n+        return NULL;\n+    }\n+    return &cpu->cpreg_values[res - cpu->cpreg_indexes];\n+}\n+\n+static void kvm_arm_writeback_idregs(ARMCPU *cpu)\n+{\n+    for (int i = 0; i < NUM_ID_IDX; i++) {\n+        uint64_t kvm_reg = idregs_sysreg_to_kvm_reg(id_register_sysreg[i]);\n+        uint64_t *cpreg = kvm_arm_find_cpreg_ptr(cpu, kvm_reg);\n+        const char *name = arm_idregs[i].name;\n+        uint64_t writable_mask, previous, desired, diff;\n+\n+        if (!cpreg) {\n+            warn_report(\"KVM does not expose ID register slot %d \"\n+                        \"(kvm_reg=0x%\" PRIx64 \"), %s; skipping writeback\",\n+                        i, kvm_reg, sysreg_names[i]);\n+            continue;\n+        }\n+\n+        if (!name) {\n+            /* No field table, don't push back. */\n+            warn_report(\"ID register slot %d \"\n+                        \"(kvm_reg=0x%\" PRIx64 \"), %s: \"\n+                        \"no field table in cpu-idregs.inc.h\",\n+                        i, kvm_reg, sysreg_names[i]);\n+            continue;\n+        }\n+\n+        writable_mask = arm_idregs[i].writable_mask;\n+        previous = *cpreg;\n+        desired = cpu->isar.idregs[i];\n+        diff = previous ^ desired;\n+\n+        if (!diff) {\n+            continue;\n+        }\n+\n+        if (diff & ~writable_mask) {\n+            warn_report(\"%s: non-writable bits differ: \"\n+                        \"kvm=0x%016\" PRIx64\n+                        \" desired=0x%016\" PRIx64\n+                        \" diff=0x%016\" PRIx64\n+                        \" writable=0x%016\" PRIx64,\n+                        name, previous, desired,\n+                        diff & ~writable_mask,\n+                        writable_mask);\n+        }\n+\n+        if (diff & writable_mask) {\n+            *cpreg = (previous & ~writable_mask) |\n+                     (desired & writable_mask);\n+            trace_kvm_arm_writeback_idreg(name, previous, *cpreg);\n+        }\n+    }\n+}\n+\n bool kvm_arm_cpu_post_load(ARMCPU *cpu)\n {\n     if (!write_list_to_kvmstate(cpu, KVM_PUT_FULL_STATE)) {\n@@ -1116,6 +1261,10 @@ void kvm_arm_reset_vcpu(ARMCPU *cpu)\n         fprintf(stderr, \"write_kvmstate_to_list failed\\n\");\n         abort();\n     }\n+\n+    /* Re-apply named-model ID register overrides after KVM_ARM_VCPU_INIT. */\n+    kvm_arm_writeback_idregs(cpu);\n+\n     /*\n      * Sync the reset values also into the CPUState. This is necessary\n      * because the next thing we do will be a kvm_arch_put_registers()\n@@ -2051,7 +2200,16 @@ int kvm_arch_init_vcpu(CPUState *cs)\n     }\n     cpu->mp_affinity = mpidr & ARM64_AFFINITY_MASK;\n \n-    return kvm_arm_init_cpreg_list(cpu);\n+    ret = kvm_arm_init_cpreg_list(cpu);\n+    if (ret) {\n+        return ret;\n+    }\n+\n+    /* Apply named-model ID register overrides on top of KVM's defaults. */\n+    kvm_arm_writeback_idregs(cpu);\n+    write_list_to_kvmstate(cpu, KVM_PUT_FULL_STATE);\n+\n+    return 0;\n }\n \n int kvm_arch_destroy_vcpu(CPUState *cs)\ndiff --git a/target/arm/trace-events b/target/arm/trace-events\nindex 8502fb3265..975236b24f 100644\n--- a/target/arm/trace-events\n+++ b/target/arm/trace-events\n@@ -13,6 +13,7 @@ arm_gt_update_irq(int timer, int irqstate) \"gt_update_irq: timer %d irqstate %d\"\n \n # kvm.c\n kvm_arm_fixup_msi_route(uint64_t iova, uint64_t gpa) \"MSI iova = 0x%\"PRIx64\" is translated into 0x%\"PRIx64\n+kvm_arm_writeback_idreg(const char *name, uint64_t previous, uint64_t desired) \"%s overwrite 0x%\"PRIx64\" with 0x%\"PRIx64\n \n # cpu.c\n arm_cpu_reset(uint64_t mp_aff) \"cpu %\" PRIu64\n",
    "prefixes": [
        "RFC",
        "v1",
        "12/13"
    ]
}