{"id":2232156,"url":"http://patchwork.ozlabs.org/api/patches/2232156/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260503073541.790215-12-eric.auger@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","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":"<20260503073541.790215-12-eric.auger@redhat.com>","list_archive_url":null,"date":"2026-05-03T07:33:31","name":"[v4,11/17] arm/kvm: write back modified ID regs to KVM","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"f65d48ab434639eb33f84bb6dfeb5cbb88bd3cd9","submitter":{"id":69187,"url":"http://patchwork.ozlabs.org/api/people/69187/?format=json","name":"Eric Auger","email":"eric.auger@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260503073541.790215-12-eric.auger@redhat.com/mbox/","series":[{"id":502569,"url":"http://patchwork.ozlabs.org/api/series/502569/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=502569","date":"2026-05-03T07:33:20","name":"kvm/arm: Introduce a customizable aarch64 KVM host model","version":4,"mbox":"http://patchwork.ozlabs.org/series/502569/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2232156/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2232156/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@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=NcrkPv+v;\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 4g7c7g4f4Zz1yJV\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 03 May 2026 17:37:51 +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 1wJROI-0000N9-OO; Sun, 03 May 2026 03:37:26 -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 <eric.auger@redhat.com>)\n id 1wJRNx-0008Sl-Dl\n for qemu-devel@nongnu.org; Sun, 03 May 2026 03:37:10 -0400","from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <eric.auger@redhat.com>)\n id 1wJRNv-0003h0-Rd\n for qemu-devel@nongnu.org; Sun, 03 May 2026 03:37:05 -0400","from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-675-jw1-1R8VOLaBWuXaExnpog-1; Sun,\n 03 May 2026 03:36:59 -0400","from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 1CFAC1956046; Sun,  3 May 2026 07:36:56 +0000 (UTC)","from laptop.redhat.com (unknown [10.44.48.25])\n by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 3A79B1800345; Sun,  3 May 2026 07:36:50 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777793822;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=lW1RxLjyBAHEYglWJkPrIno8W4NRQgIUmy0VBomca+0=;\n b=NcrkPv+vYMi7MyT+8XmyOFdavKzzBt4ShK6G5/+2oou8rFdCSB/S27vVqqK5v3eUpWwqXZ\n kbWzTeNhXN0G7/tquYxTO/J/8W8rddXqzrHgZ/AG9vu3DBiVij0S1/n15nHZtzGMIG/Fkn\n VOyi/k3wm/sceNdpqkixQRzGYWiYWy8=","X-MC-Unique":"jw1-1R8VOLaBWuXaExnpog-1","X-Mimecast-MFC-AGG-ID":"jw1-1R8VOLaBWuXaExnpog_1777793816","From":"Eric Auger <eric.auger@redhat.com>","To":"eric.auger.pro@gmail.com, eric.auger@redhat.com, qemu-devel@nongnu.org,\n qemu-arm@nongnu.org, 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 armbru@redhat.com, berrange@redhat.com, abologna@redhat.com,\n jdenemar@redhat.com","Subject":"[PATCH v4 11/17] arm/kvm: write back modified ID regs to KVM","Date":"Sun,  3 May 2026 09:33:31 +0200","Message-ID":"<20260503073541.790215-12-eric.auger@redhat.com>","In-Reply-To":"<20260503073541.790215-1-eric.auger@redhat.com>","References":"<20260503073541.790215-1-eric.auger@redhat.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.93","Received-SPF":"pass client-ip=170.10.129.124;\n envelope-from=eric.auger@redhat.com; helo=us-smtp-delivery-124.mimecast.com","X-Spam_score_int":"12","X-Spam_score":"1.2","X-Spam_bar":"+","X-Spam_report":"(1.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001,\n SPF_PASS=-0.001 autolearn=no 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":"We want to give a chance to override the value of host ID regs.\nIn a previous patch we made sure all their values could be fetched\nthrough kvm_get_one_reg() calls before their modification. After\ntheir potential modification we need to make sure we write back\nthe values through kvm_set_one_reg() calls.\n\nMake sure the cpreg_list is modified with updated values and\ntransfer those values back to kvm.\n\nSigned-off-by: Eric Auger <eric.auger@redhat.com>\nSigned-off-by: Cornelia Huck <cohuck@redhat.com>\n---\n target/arm/kvm.c        | 59 ++++++++++++++++++++++++++++++++++++++++-\n target/arm/trace-events |  1 +\n 2 files changed, 59 insertions(+), 1 deletion(-)","diff":"diff --git a/target/arm/kvm.c b/target/arm/kvm.c\nindex 1a9b91bf8a..ca9a7d9439 100644\n--- a/target/arm/kvm.c\n+++ b/target/arm/kvm.c\n@@ -275,6 +275,21 @@ static uint32_t kvm_arm_sve_get_vls(int fd)\n     return vls[0] & MAKE_64BIT_MASK(0, ARM_MAX_VQ);\n }\n \n+static int kvm_feature_idx_to_idregs_idx(int kidx)\n+{\n+    int op1, crm, op2;\n+    ARMSysRegs sysreg;\n+\n+    op1 = kidx / 64;\n+    if (op1 == 2) {\n+        op1 = 3;\n+    }\n+    crm = (kidx % 64) / 8;\n+    op2 = kidx % 8;\n+    sysreg = ENCODE_ID_REG(3, op1, 0, crm, op2);\n+    return get_sysreg_idx(sysreg);\n+}\n+\n static int idregs_idx_to_kvm_feature_idx(ARMIDRegisterIdx idx)\n {\n     ARMSysRegs sysreg = id_register_sysreg[idx];\n@@ -1197,6 +1212,39 @@ bool kvm_arm_cpu_post_load(ARMCPU *cpu)\n     return true;\n }\n \n+static void kvm_arm_writable_idregs_to_cpreg_list(ARMCPU *cpu)\n+{\n+    if (!cpu->writable_map) {\n+        return;\n+    }\n+    for (int i = 0; i < NR_ID_REG_MASKS; i++) {\n+        uint64_t writable_mask = cpu->writable_map->regs[i];\n+        uint64_t *cpreg;\n+\n+        if (writable_mask) {\n+            uint64_t previous, new;\n+            int idx = kvm_feature_idx_to_idregs_idx(i);\n+            ARM64SysReg *sysregdesc;\n+            uint32_t sysreg;\n+\n+            if (idx == -1) {\n+                /* sysreg writable, but we don't know it */\n+                continue;\n+            }\n+            sysregdesc = &arm64_id_regs[idx];\n+            sysreg = sysregdesc->sysreg;\n+            cpreg = kvm_arm_get_cpreg_ptr(cpu, idregs_sysreg_to_kvm_reg(sysreg));\n+            previous = *cpreg;\n+            new = cpu->isar.idregs[idx];\n+            if (previous != new) {\n+                *cpreg = new;\n+                trace_kvm_arm_writable_idregs_to_cpreg_list(sysregdesc->name,\n+                                                            previous, new);\n+            }\n+        }\n+    }\n+}\n+\n void kvm_arm_reset_vcpu(ARMCPU *cpu)\n {\n     int ret;\n@@ -2148,7 +2196,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+    /* overwrite writable ID regs with their updated property values */\n+    kvm_arm_writable_idregs_to_cpreg_list(cpu);\n+\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 8c7faf57c7..c25d2a1191 100644\n--- a/target/arm/trace-events\n+++ b/target/arm/trace-events\n@@ -14,6 +14,7 @@ arm_gt_update_irq(int timer, int irqstate) \"gt_update_irq: timer %d irqstate %d\"\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 get_host_cpu_idregs(const char *name, uint64_t value) \"scratch vcpu host value for %s is 0x%\"PRIx64\n+kvm_arm_writable_idregs_to_cpreg_list(const char *name, uint64_t previous, uint64_t new) \"%s overwrite default 0x%\"PRIx64\" with 0x%\"PRIx64\n \n # cpu.c\n arm_cpu_reset(uint64_t mp_aff) \"cpu %\" PRIu64\n","prefixes":["v4","11/17"]}