From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316695; cv=none; d=zohomail.com; s=zohoarc; b=Ev42L0/xaNOeOTBZ+z8J71utzMCAHmeA4JAkzx5boPRXJbWwaLNc3O8QwtpZR2zNPipWLXtvNHr3vdgxTPBY2w1EQ6b5Jg/BS5//rQa19q4jcvErZh7knX69VlE1HdblmryXcx4dHKwFApD/6tEnIan8MQvtH7qThRPZevNFGGs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316695; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=6AbFosTeO+22W6pzp7NhrRLKcRCIno0EsBShVb2QtOo=; b=J+dBQDX7rwWadT9fyrs9sIWJY7tCABe2HX5stuhPyPze+EcWNL+flsgVZaSHIXL8OeM+B2dJ8+fj1k98h43nIS/j+QQ8QNUP93K2e7D94ANP/MNdMyS36aXB8JpgMV15w+2ChyStji1xhekmzK6A+IIRsiXq+HctLGVv39QCHbQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316695137865.9858878110532; Sat, 28 Feb 2026 14:11:35 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUW-0002RM-Ps; Sat, 28 Feb 2026 17:08:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUV-0002QI-9l for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:51 -0500 Received: from qs-2004d-snip4-4.eps.apple.com ([57.103.84.37] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUR-0005lc-Km for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:50 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id 785BB18000BD; Sat, 28 Feb 2026 22:08:43 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id 2994918003A6; Sat, 28 Feb 2026 22:08:41 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316527; x=1774908527; bh=6AbFosTeO+22W6pzp7NhrRLKcRCIno0EsBShVb2QtOo=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=VdvZfPN8MAe9XWBofFtFSIKkEDsNXOO6t4oLIWw/SrLUx7Z/gjn6mn30pHZSQsaZ+mMD0PeloURDDqj3ayNAXDQwtbRqsbB8V1mnJ0tiDAXYUVqBqUgkxFXfF01GkR9CFwUhmqzAca+jpoLbSt/3/+8YRfMn/WxXbbnhw7CuB3xDdOEQ2oSZzNjk0a0m7dn3IDfVf8QrxdLYZPCGTFoV5plwnyHnFoJxIAoPqibB7D/6XSPFK2l+Yp9GOfycWUc7dCTGNLds/hUcOcEtFaaKf+9escxOK4aOuNOKOPPApSHCAj5iXxqoRT5u9naOTqVsqwOJGqkoIX7cMO/dgYD1JA== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 01/12] hw/intc: Add hvf vGIC interrupt controller support Date: Sat, 28 Feb 2026 23:08:26 +0100 Message-ID: <20260228220837.35275-2-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfX6TSxwNmrEeWv k2yUUz+kQPUzK8/ttEIstxjRbkHM7+tENvA24apjzrgaylqsdUjD+gfLIANxiTr8c2s0YEB0mH7 2l7zv21HU8R5/NCC6MaZJ6eLUkxDeNWV3rccS9VmKDBHlucPVdHDuex2I/EfvXJgRWojtZJj7nF TDlzDtzMc/nL+IvUs8colZJiJxeFw5RFo7En8RQCkZ10jeaoNraTytfU1cJPKXnWrsUTt6u0dcx H9Igt5YC/jGR8oh2W+0BEC2bBtvnZXqHZNIZ182dwh+vI/9+7b3weTM7zj74XIvbj4MuPs+F9Gy 1vH9pNuwTmcCozcQpFGYqqiK2Dn7cLFx889dX0tW/p0OYL0uNiSfDiIMiyvgJM= X-Authority-Info-Out: v=2.4 cv=WLByn3sR c=1 sm=1 tr=0 ts=69a3676d cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=D2JAlcJVxmvnjXxMMLIA:9 X-Proofpoint-GUID: LutWcSm6MLBKJmEUUWnMK7zK2JBaqajn X-Proofpoint-ORIG-GUID: LutWcSm6MLBKJmEUUWnMK7zK2JBaqajn X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1030 spamscore=0 mlxscore=0 mlxlogscore=999 lowpriorityscore=0 bulkscore=0 adultscore=0 suspectscore=0 malwarescore=0 phishscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABlh7iJw8PzasmVZdsKUBPYx8grmlRFSEQ7Nd8Z6JCGfko0zy7PZ46O0hoHA88eo6vySZFbtn5KGE0XTB2YFkOMEhwmrSdjcrQ9VLPzcgo0tv8CrTQkmWtR3DQYD2zf1vGi+X1MZNJjI2Gmx6w8eSxINn5NL1/yAicFUT97h+76xa44Lm5puzVWe7F4mxYcDeaDkHgfNDMDEZAnksjxe2lCURAA5PfwLEi8r5pXmgXf/j7foKt2bBb6rYoNyKAmLdsk1q3BYO8U4eCwsS4GxRe1TohgxFT+gB9Moat4oZru0x1H4Q2kglLsankeFH4QzaShxbdgiOjC6KwufVZpTWS2lIvKJH8Vr96ID/vTWvZD2P2/d/oQB979C8Cuzv/PBnioHEJIXlr6hfZGzfBQ+MzuBRVJrVQot+ryYw8CgFm2nV+0QNU58PnueHlwx21gsPHUZD1DoHosr7BlZyfZ7i5siJoMyVdVODoiWVadKgGzKqM0vhPSXw7YqSTJ/v2Ncx3kRWZ+w5pH3pz66h8OJ5IwwKg1ZcvEBDGxsepimK3WwP/hAdj+sgnuSJehr3N8WlzmX1etIewh6kvLsfFN+w7FZtju3OLstIyB7YOqerjZ81/9O+TeXeJ/+i7lJTIxOkYTfd4ZXazyqYXBnw43jzKF6Vj2qjqlCozS0Xhj58ky8alNnZUFA4oZvL/W5wzsfFFVIrfqqlh4cp2rhsD7LbVuB75UAd5SEmohLr13tgb Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.37; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316696166158500 Content-Type: text/plain; charset="utf-8" This opens up the door to nested virtualisation support. Signed-off-by: Mohamed Mediouni --- hw/intc/arm_gicv3_hvf.c | 735 +++++++++++++++++++++++++++++ hw/intc/meson.build | 1 + include/hw/intc/arm_gicv3_common.h | 1 + 3 files changed, 737 insertions(+) create mode 100644 hw/intc/arm_gicv3_hvf.c diff --git a/hw/intc/arm_gicv3_hvf.c b/hw/intc/arm_gicv3_hvf.c new file mode 100644 index 0000000000..d6a46b7d53 --- /dev/null +++ b/hw/intc/arm_gicv3_hvf.c @@ -0,0 +1,735 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * ARM Generic Interrupt Controller using HVF platform support + * + * Copyright (c) 2025 Mohamed Mediouni + * Based on vGICv3 KVM code by Pavel Fedin + * + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/intc/arm_gicv3_common.h" +#include "qemu/error-report.h" +#include "qemu/module.h" +#include "system/runstate.h" +#include "system/hvf.h" +#include "system/hvf_int.h" +#include "hvf_arm.h" +#include "gicv3_internal.h" +#include "vgic_common.h" +#include "qom/object.h" +#include "target/arm/cpregs.h" +#include + +struct HVFARMGICv3Class { + ARMGICv3CommonClass parent_class; + DeviceRealize parent_realize; + ResettablePhases parent_phases; +}; + +typedef struct HVFARMGICv3Class HVFARMGICv3Class; + +/* This is reusing the GICv3State typedef from ARM_GICV3_ITS_COMMON */ +DECLARE_OBJ_CHECKERS(GICv3State, HVFARMGICv3Class, + HVF_GICV3, TYPE_HVF_GICV3); + +/* + * Loop through each distributor IRQ related register; since bits + * corresponding to SPIs and PPIs are RAZ/WI when affinity routing + * is enabled, we skip those. + */ +#define for_each_dist_irq_reg(_irq, _max, _field_width) \ + for (_irq =3D GIC_INTERNAL; _irq < _max; _irq +=3D (32 / _field_width)) + +/* + * Wrap calls to the vGIC APIs to assert_hvf_ok() + * as a macro to keep the code clean. + */ +#define hv_gic_get_distributor_reg(offset, reg) \ + assert_hvf_ok(hv_gic_get_distributor_reg(offset, reg)) + +#define hv_gic_set_distributor_reg(offset, reg) \ + assert_hvf_ok(hv_gic_set_distributor_reg(offset, reg)) + +#define hv_gic_get_redistributor_reg(vcpu, reg, value) \ + assert_hvf_ok(hv_gic_get_redistributor_reg(vcpu, reg, value)) + +#define hv_gic_set_redistributor_reg(vcpu, reg, value) \ + assert_hvf_ok(hv_gic_set_redistributor_reg(vcpu, reg, value)) + +#define hv_gic_get_icc_reg(vcpu, reg, value) \ + assert_hvf_ok(hv_gic_get_icc_reg(vcpu, reg, value)) + +#define hv_gic_set_icc_reg(vcpu, reg, value) \ + assert_hvf_ok(hv_gic_set_icc_reg(vcpu, reg, value)) + +#define hv_gic_get_ich_reg(vcpu, reg, value) \ + assert_hvf_ok(hv_gic_get_ich_reg(vcpu, reg, value)) + +#define hv_gic_set_ich_reg(vcpu, reg, value) \ + assert_hvf_ok(hv_gic_set_ich_reg(vcpu, reg, value)) + +static void hvf_dist_get_priority(GICv3State *s, hv_gic_distributor_reg_t = offset + , uint8_t *bmp) +{ + uint64_t reg; + uint32_t *field; + int irq; + field =3D (uint32_t *)(bmp); + + for_each_dist_irq_reg(irq, s->num_irq, 8) { + hv_gic_get_distributor_reg(offset, ®); + *field =3D reg; + offset +=3D 4; + field++; + } +} + +static void hvf_dist_put_priority(GICv3State *s, hv_gic_distributor_reg_t = offset + , uint8_t *bmp) +{ + uint32_t reg, *field; + int irq; + field =3D (uint32_t *)(bmp); + + for_each_dist_irq_reg(irq, s->num_irq, 8) { + reg =3D *field; + hv_gic_set_distributor_reg(offset, reg); + offset +=3D 4; + field++; + } +} + +static void hvf_dist_get_edge_trigger(GICv3State *s, hv_gic_distributor_re= g_t offset, + uint32_t *bmp) +{ + uint64_t reg; + int irq; + + for_each_dist_irq_reg(irq, s->num_irq, 2) { + hv_gic_get_distributor_reg(offset, ®); + reg =3D half_unshuffle32(reg >> 1); + if (irq % 32 !=3D 0) { + reg =3D (reg << 16); + } + *gic_bmp_ptr32(bmp, irq) |=3D reg; + offset +=3D 4; + } +} + +static void hvf_dist_put_edge_trigger(GICv3State *s, hv_gic_distributor_re= g_t offset, + uint32_t *bmp) +{ + uint32_t reg; + int irq; + + for_each_dist_irq_reg(irq, s->num_irq, 2) { + reg =3D *gic_bmp_ptr32(bmp, irq); + if (irq % 32 !=3D 0) { + reg =3D (reg & 0xffff0000) >> 16; + } else { + reg =3D reg & 0xffff; + } + reg =3D half_shuffle32(reg) << 1; + hv_gic_set_distributor_reg(offset, reg); + offset +=3D 4; + } +} + +/* Read a bitmap register group from the kernel VGIC. */ +static void hvf_dist_getbmp(GICv3State *s, hv_gic_distributor_reg_t offset= , uint32_t *bmp) +{ + uint64_t reg; + int irq; + + for_each_dist_irq_reg(irq, s->num_irq, 1) { + + hv_gic_get_distributor_reg(offset, ®); + *gic_bmp_ptr32(bmp, irq) =3D reg; + offset +=3D 4; + } +} + +static void hvf_dist_putbmp(GICv3State *s, hv_gic_distributor_reg_t offset, + hv_gic_distributor_reg_t clroffset, uint32_t *= bmp) +{ + uint32_t reg; + int irq; + + for_each_dist_irq_reg(irq, s->num_irq, 1) { + /* + * If this bitmap is a set/clear register pair, first write to the + * clear-reg to clear all bits before using the set-reg to write + * the 1 bits. + */ + if (clroffset !=3D 0) { + reg =3D 0; + hv_gic_set_distributor_reg(clroffset, reg); + clroffset +=3D 4; + } + reg =3D *gic_bmp_ptr32(bmp, irq); + hv_gic_set_distributor_reg(offset, reg); + offset +=3D 4; + } +} + +static void hvf_gicv3_check(GICv3State *s) +{ + uint64_t reg; + uint32_t num_irq; + + /* Sanity checking s->num_irq */ + hv_gic_get_distributor_reg(HV_GIC_DISTRIBUTOR_REG_GICD_TYPER, ®); + num_irq =3D ((reg & 0x1f) + 1) * 32; + + if (num_irq < s->num_irq) { + error_report("Model requests %u IRQs, but HVF supports max %u", + s->num_irq, num_irq); + abort(); + } +} + +static void hvf_gicv3_put_cpu_el2(CPUState *cpu_state, run_on_cpu_data arg) +{ + int num_pri_bits; + + /* Redistributor state */ + GICv3CPUState *c =3D arg.host_ptr; + hv_vcpu_t vcpu =3D c->cpu->accel->fd; + + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_VMCR_EL2, c->ich_vmcr_el2); + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_HCR_EL2, c->ich_hcr_el2); + + for (int i =3D 0; i < GICV3_LR_MAX; i++) { + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_LR0_EL2, c->ich_lr_el2[i]); + } + + num_pri_bits =3D c->vpribits; + + switch (num_pri_bits) { + case 7: + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_AP0R0_EL2 + 3, + c->ich_apr[GICV3_G0][3]); + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_AP0R0_EL2 + 2, + c->ich_apr[GICV3_G0][2]); + /* fall through */ + case 6: + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_AP0R0_EL2 + 1, + c->ich_apr[GICV3_G0][1]); + /* fall through */ + default: + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_AP0R0_EL2, + c->ich_apr[GICV3_G0][0]); + } + + switch (num_pri_bits) { + case 7: + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_AP1R0_EL2 + 3, + c->ich_apr[GICV3_G1NS][3]); + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_AP1R0_EL2 + 2, + c->ich_apr[GICV3_G1NS][2]); + /* fall through */ + case 6: + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_AP1R0_EL2 + 1, + c->ich_apr[GICV3_G1NS][1]); + /* fall through */ + default: + hv_gic_set_ich_reg(vcpu, HV_GIC_ICH_REG_AP1R0_EL2, + c->ich_apr[GICV3_G1NS][0]); + } +} + +static void hvf_gicv3_put_cpu(CPUState *cpu_state, run_on_cpu_data arg) +{ + uint32_t reg; + uint64_t reg64; + int i, num_pri_bits; + + /* Redistributor state */ + GICv3CPUState *c =3D arg.host_ptr; + hv_vcpu_t vcpu =3D c->cpu->accel->fd; + + reg =3D c->gicr_waker; + hv_gic_set_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_IGROU= PR0, reg); + + reg =3D c->gicr_igroupr0; + hv_gic_set_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_IGROU= PR0, reg); + + reg =3D ~0; + hv_gic_set_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ICENA= BLER0, reg); + reg =3D c->gicr_ienabler0; + hv_gic_set_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ISENA= BLER0, reg); + + /* Restore config before pending so we treat level/edge correctly */ + reg =3D half_shuffle32(c->edge_trigger >> 16) << 1; + hv_gic_set_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ICFGR= 1, reg); + + reg =3D ~0; + hv_gic_set_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ICPEN= DR0, reg); + reg =3D c->gicr_ipendr0; + hv_gic_set_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ISPEN= DR0, reg); + + reg =3D ~0; + hv_gic_set_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ICACT= IVER0, reg); + reg =3D c->gicr_iactiver0; + hv_gic_set_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ISACT= IVER0, reg); + + for (i =3D 0; i < GIC_INTERNAL; i +=3D 4) { + reg =3D c->gicr_ipriorityr[i] | + (c->gicr_ipriorityr[i + 1] << 8) | + (c->gicr_ipriorityr[i + 2] << 16) | + (c->gicr_ipriorityr[i + 3] << 24); + hv_gic_set_redistributor_reg(vcpu, + HV_GIC_REDISTRIBUTOR_REG_GICR_IPRIORITYR0 + i, reg); + } + + /* CPU interface state */ + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_SRE_EL1, c->icc_sre_el1); + + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_CTLR_EL1, + c->icc_ctlr_el1[GICV3_NS]); + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_IGRPEN0_EL1, + c->icc_igrpen[GICV3_G0]); + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_IGRPEN1_EL1, + c->icc_igrpen[GICV3_G1NS]); + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_PMR_EL1, c->icc_pmr_el1); + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_BPR0_EL1, c->icc_bpr[GICV3_G0]= ); + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_BPR1_EL1, c->icc_bpr[GICV3_G1N= S]); + + num_pri_bits =3D ((c->icc_ctlr_el1[GICV3_NS] & + ICC_CTLR_EL1_PRIBITS_MASK) >> + ICC_CTLR_EL1_PRIBITS_SHIFT) + 1; + + switch (num_pri_bits) { + case 7: + reg64 =3D c->icc_apr[GICV3_G0][3]; + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_AP0R0_EL1 + 3, reg64); + reg64 =3D c->icc_apr[GICV3_G0][2]; + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_AP0R0_EL1 + 2, reg64); + /* fall through */ + case 6: + reg64 =3D c->icc_apr[GICV3_G0][1]; + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_AP0R0_EL1 + 1, reg64); + /* fall through */ + default: + reg64 =3D c->icc_apr[GICV3_G0][0]; + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_AP0R0_EL1, reg64); + } + + switch (num_pri_bits) { + case 7: + reg64 =3D c->icc_apr[GICV3_G1NS][3]; + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_AP1R0_EL1 + 3, reg64); + reg64 =3D c->icc_apr[GICV3_G1NS][2]; + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_AP1R0_EL1 + 2, reg64); + /* fall through */ + case 6: + reg64 =3D c->icc_apr[GICV3_G1NS][1]; + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_AP1R0_EL1 + 1, reg64); + /* fall through */ + default: + reg64 =3D c->icc_apr[GICV3_G1NS][0]; + hv_gic_set_icc_reg(vcpu, HV_GIC_ICC_REG_AP1R0_EL1, reg64); + } + + /* Registers beyond this point are with nested virt only */ + if (c->gic->maint_irq) { + hvf_gicv3_put_cpu_el2(cpu_state, arg); + } +} + +static void hvf_gicv3_put(GICv3State *s) +{ + uint32_t reg; + int ncpu, i; + + hvf_gicv3_check(s); + + reg =3D s->gicd_ctlr; + hv_gic_set_distributor_reg(HV_GIC_DISTRIBUTOR_REG_GICD_CTLR, reg); + + /* per-CPU state */ + + for (ncpu =3D 0; ncpu < s->num_cpu; ncpu++) { + run_on_cpu_data data; + data.host_ptr =3D &s->cpu[ncpu]; + run_on_cpu(s->cpu[ncpu].cpu, hvf_gicv3_put_cpu, data); + } + + /* s->enable bitmap -> GICD_ISENABLERn */ + hvf_dist_putbmp(s, HV_GIC_DISTRIBUTOR_REG_GICD_ISENABLER0 + , HV_GIC_DISTRIBUTOR_REG_GICD_ICENABLER0, s->enabled); + + /* s->group bitmap -> GICD_IGROUPRn */ + hvf_dist_putbmp(s, HV_GIC_DISTRIBUTOR_REG_GICD_IGROUPR0 + , 0, s->group); + + /* Restore targets before pending to ensure the pending state is set on + * the appropriate CPU interfaces in the kernel + */ + + /* s->gicd_irouter[irq] -> GICD_IROUTERn */ + for (i =3D GIC_INTERNAL; i < s->num_irq; i++) { + uint32_t offset =3D HV_GIC_DISTRIBUTOR_REG_GICD_IROUTER32 + (8 * i) + - (8 * GIC_INTERNAL); + hv_gic_set_distributor_reg(offset, s->gicd_irouter[i]); + } + + /* + * s->trigger bitmap -> GICD_ICFGRn + * (restore configuration registers before pending IRQs so we treat + * level/edge correctly) + */ + hvf_dist_put_edge_trigger(s, HV_GIC_DISTRIBUTOR_REG_GICD_ICFGR0, s->ed= ge_trigger); + + /* s->pending bitmap -> GICD_ISPENDRn */ + hvf_dist_putbmp(s, HV_GIC_DISTRIBUTOR_REG_GICD_ISPENDR0, + HV_GIC_DISTRIBUTOR_REG_GICD_ICPENDR0, s->pending); + + /* s->active bitmap -> GICD_ISACTIVERn */ + hvf_dist_putbmp(s, HV_GIC_DISTRIBUTOR_REG_GICD_ISACTIVER0, + HV_GIC_DISTRIBUTOR_REG_GICD_ICACTIVER0, s->active); + + /* s->gicd_ipriority[] -> GICD_IPRIORITYRn */ + hvf_dist_put_priority(s, HV_GIC_DISTRIBUTOR_REG_GICD_IPRIORITYR0, s->g= icd_ipriority); +} + +static void hvf_gicv3_get_cpu_el2(CPUState *cpu_state, run_on_cpu_data arg) +{ + int num_pri_bits; + + /* Redistributor state */ + GICv3CPUState *c =3D arg.host_ptr; + hv_vcpu_t vcpu =3D c->cpu->accel->fd; + + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_VMCR_EL2, &c->ich_vmcr_el2); + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_HCR_EL2, &c->ich_hcr_el2); + + for (int i =3D 0; i < GICV3_LR_MAX; i++) { + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_LR0_EL2, &c->ich_lr_el2[i]= ); + } + + num_pri_bits =3D c->vpribits; + + switch (num_pri_bits) { + case 7: + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_AP0R0_EL2 + 3, + &c->ich_apr[GICV3_G0][3]); + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_AP0R0_EL2 + 2, + &c->ich_apr[GICV3_G0][2]); + /* fall through */ + case 6: + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_AP0R0_EL2 + 1, + &c->ich_apr[GICV3_G0][1]); + /* fall through */ + default: + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_AP0R0_EL2, + &c->ich_apr[GICV3_G0][0]); + } + + switch (num_pri_bits) { + case 7: + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_AP1R0_EL2 + 3, + &c->ich_apr[GICV3_G1NS][3]); + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_AP1R0_EL2 + 2, + &c->ich_apr[GICV3_G1NS][2]); + /* fall through */ + case 6: + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_AP1R0_EL2 + 1, + &c->ich_apr[GICV3_G1NS][1]); + /* fall through */ + default: + hv_gic_get_ich_reg(vcpu, HV_GIC_ICH_REG_AP1R0_EL2, + &c->ich_apr[GICV3_G1NS][0]); + } +} + +static void hvf_gicv3_get_cpu(CPUState *cpu_state, run_on_cpu_data arg) +{ + uint64_t reg; + int i, num_pri_bits; + + /* Redistributor state */ + GICv3CPUState *c =3D arg.host_ptr; + hv_vcpu_t vcpu =3D c->cpu->accel->fd; + + hv_gic_get_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_IGROU= PR0, + ®); + c->gicr_igroupr0 =3D reg; + hv_gic_get_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ISENA= BLER0, + ®); + c->gicr_ienabler0 =3D reg; + hv_gic_get_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ICFGR= 1, + ®); + c->edge_trigger =3D half_unshuffle32(reg >> 1) << 16; + hv_gic_get_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ISPEN= DR0, + ®); + c->gicr_ipendr0 =3D reg; + hv_gic_get_redistributor_reg(vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_ISACT= IVER0, + ®); + c->gicr_iactiver0 =3D reg; + + for (i =3D 0; i < GIC_INTERNAL; i +=3D 4) { + hv_gic_get_redistributor_reg( + vcpu, HV_GIC_REDISTRIBUTOR_REG_GICR_IPRIORITYR0 + i, ®); + c->gicr_ipriorityr[i] =3D extract32(reg, 0, 8); + c->gicr_ipriorityr[i + 1] =3D extract32(reg, 8, 8); + c->gicr_ipriorityr[i + 2] =3D extract32(reg, 16, 8); + c->gicr_ipriorityr[i + 3] =3D extract32(reg, 24, 8); + } + + /* CPU interface */ + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_SRE_EL1, &c->icc_sre_el1); + + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_CTLR_EL1, + &c->icc_ctlr_el1[GICV3_NS]); + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_IGRPEN0_EL1, + &c->icc_igrpen[GICV3_G0]); + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_IGRPEN1_EL1, + &c->icc_igrpen[GICV3_G1NS]); + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_PMR_EL1, &c->icc_pmr_el1); + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_BPR0_EL1, &c->icc_bpr[GICV3_G0= ]); + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_BPR1_EL1, &c->icc_bpr[GICV3_G1= NS]); + num_pri_bits =3D ((c->icc_ctlr_el1[GICV3_NS] & ICC_CTLR_EL1_PRIBITS_MA= SK) >> + ICC_CTLR_EL1_PRIBITS_SHIFT) + + 1; + + switch (num_pri_bits) { + case 7: + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_AP0R0_EL1 + 3, + &c->icc_apr[GICV3_G0][3]); + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_AP0R0_EL1 + 2, + &c->icc_apr[GICV3_G0][2]); + /* fall through */ + case 6: + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_AP0R0_EL1 + 1, + &c->icc_apr[GICV3_G0][1]); + /* fall through */ + default: + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_AP0R0_EL1, + &c->icc_apr[GICV3_G0][0]); + } + + switch (num_pri_bits) { + case 7: + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_AP1R0_EL1 + 3, + &c->icc_apr[GICV3_G1NS][3]); + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_AP1R0_EL1 + 2, + &c->icc_apr[GICV3_G1NS][2]); + /* fall through */ + case 6: + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_AP1R0_EL1 + 1, + &c->icc_apr[GICV3_G1NS][1]); + /* fall through */ + default: + hv_gic_get_icc_reg(vcpu, HV_GIC_ICC_REG_AP1R0_EL1, + &c->icc_apr[GICV3_G1NS][0]); + } + + /* Registers beyond this point are with nested virt only */ + if (c->gic->maint_irq) { + hvf_gicv3_get_cpu_el2(cpu_state, arg); + } +} + +static void hvf_gicv3_get(GICv3State *s) +{ + uint64_t reg; + int ncpu, i; + + hvf_gicv3_check(s); + + hv_gic_get_distributor_reg(HV_GIC_DISTRIBUTOR_REG_GICD_CTLR, ®); + s->gicd_ctlr =3D reg; + + /* Redistributor state (one per CPU) */ + + for (ncpu =3D 0; ncpu < s->num_cpu; ncpu++) { + run_on_cpu_data data; + data.host_ptr =3D &s->cpu[ncpu]; + run_on_cpu(s->cpu[ncpu].cpu, hvf_gicv3_get_cpu, data); + } + + /* GICD_IGROUPRn -> s->group bitmap */ + hvf_dist_getbmp(s, HV_GIC_DISTRIBUTOR_REG_GICD_IGROUPR0, s->group); + + /* GICD_ISENABLERn -> s->enabled bitmap */ + hvf_dist_getbmp(s, HV_GIC_DISTRIBUTOR_REG_GICD_ISENABLER0, s->enabled); + + /* GICD_ISPENDRn -> s->pending bitmap */ + hvf_dist_getbmp(s, HV_GIC_DISTRIBUTOR_REG_GICD_ISPENDR0, s->pending); + + /* GICD_ISACTIVERn -> s->active bitmap */ + hvf_dist_getbmp(s, HV_GIC_DISTRIBUTOR_REG_GICD_ISACTIVER0, s->active); + + /* GICD_ICFGRn -> s->trigger bitmap */ + hvf_dist_get_edge_trigger(s, HV_GIC_DISTRIBUTOR_REG_GICD_ICFGR0 + , s->edge_trigger); + + /* GICD_IPRIORITYRn -> s->gicd_ipriority[] */ + hvf_dist_get_priority(s, HV_GIC_DISTRIBUTOR_REG_GICD_IPRIORITYR0 + , s->gicd_ipriority); + + /* GICD_IROUTERn -> s->gicd_irouter[irq] */ + for (i =3D GIC_INTERNAL; i < s->num_irq; i++) { + uint32_t offset =3D HV_GIC_DISTRIBUTOR_REG_GICD_IROUTER32 + + (8 * i) - (8 * GIC_INTERNAL); + hv_gic_get_distributor_reg(offset, &s->gicd_irouter[i]); + } +} + +static void hvf_gicv3_set_irq(void *opaque, int irq, int level) +{ + GICv3State *s =3D opaque; + if (irq > s->num_irq) { + return; + } + hv_gic_set_spi(GIC_INTERNAL + irq, !!level); +} + +static void hvf_gicv3_icc_reset(CPUARMState *env, const ARMCPRegInfo *ri) +{ + GICv3CPUState *c; + + c =3D env->gicv3state; + c->icc_pmr_el1 =3D 0; + /* + * Architecturally the reset value of the ICC_BPR registers + * is UNKNOWN. We set them all to 0 here; when the kernel + * uses these values to program the ICH_VMCR_EL2 fields that + * determine the guest-visible ICC_BPR register values, the + * hardware's "writing a value less than the minimum sets + * the field to the minimum value" behaviour will result in + * them effectively resetting to the correct minimum value + * for the host GIC. + */ + c->icc_bpr[GICV3_G0] =3D 0; + c->icc_bpr[GICV3_G1] =3D 0; + c->icc_bpr[GICV3_G1NS] =3D 0; + + c->icc_sre_el1 =3D 0x7; + memset(c->icc_apr, 0, sizeof(c->icc_apr)); + memset(c->icc_igrpen, 0, sizeof(c->icc_igrpen)); +} + +static void hvf_gicv3_reset_hold(Object *obj, ResetType type) +{ + GICv3State *s =3D ARM_GICV3_COMMON(obj); + HVFARMGICv3Class *kgc =3D HVF_GICV3_GET_CLASS(s); + + if (kgc->parent_phases.hold) { + kgc->parent_phases.hold(obj, type); + } + + hvf_gicv3_put(s); +} + + +/* + * CPU interface registers of GIC needs to be reset on CPU reset. + * For the calling arm_gicv3_icc_reset() on CPU reset, we register + * below ARMCPRegInfo. As we reset the whole cpu interface under single + * register reset, we define only one register of CPU interface instead + * of defining all the registers. + */ +static const ARMCPRegInfo gicv3_cpuif_reginfo[] =3D { + { .name =3D "ICC_CTLR_EL1", .state =3D ARM_CP_STATE_BOTH, + .opc0 =3D 3, .opc1 =3D 0, .crn =3D 12, .crm =3D 12, .opc2 =3D 4, + /* + * If ARM_CP_NOP is used, resetfn is not called, + * So ARM_CP_NO_RAW is appropriate type. + */ + .type =3D ARM_CP_NO_RAW, + .access =3D PL1_RW, + .readfn =3D arm_cp_read_zero, + .writefn =3D arm_cp_write_ignore, + /* + * We hang the whole cpu interface reset routine off here + * rather than parcelling it out into one little function + * per register + */ + .resetfn =3D hvf_gicv3_icc_reset, + }, +}; + +static void hvf_gicv3_realize(DeviceState *dev, Error **errp) +{ + ERRP_GUARD(); + GICv3State *s =3D HVF_GICV3(dev); + HVFARMGICv3Class *kgc =3D HVF_GICV3_GET_CLASS(s); + int i; + + kgc->parent_realize(dev, errp); + if (*errp) { + return; + } + + if (s->revision !=3D 3) { + error_setg(errp, "unsupported GIC revision %d for platform GIC", + s->revision); + } + + if (s->security_extn) { + error_setg(errp, "the platform vGICv3 does not implement the " + "security extensions"); + return; + } + + if (s->nmi_support) { + error_setg(errp, "NMI is not supported with the platform GIC"); + return; + } + + if (s->nb_redist_regions > 1) { + error_setg(errp, "Multiple VGICv3 redistributor regions are not " + "supported by HVF"); + error_append_hint(errp, "A maximum of %d VCPUs can be used", + s->redist_region_count[0]); + return; + } + + gicv3_init_irqs_and_mmio(s, hvf_gicv3_set_irq, NULL); + + for (i =3D 0; i < s->num_cpu; i++) { + ARMCPU *cpu =3D ARM_CPU(qemu_get_cpu(i)); + + define_arm_cp_regs(cpu, gicv3_cpuif_reginfo); + } + + if (s->maint_irq && s->maint_irq !=3D HV_GIC_INT_MAINTENANCE) { + error_setg(errp, "vGIC maintenance IRQ mismatch with the hardcoded= one in HVF."); + return; + } +} + +static void hvf_gicv3_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + ARMGICv3CommonClass *agcc =3D ARM_GICV3_COMMON_CLASS(klass); + HVFARMGICv3Class *kgc =3D HVF_GICV3_CLASS(klass); + + agcc->pre_save =3D hvf_gicv3_get; + agcc->post_load =3D hvf_gicv3_put; + + device_class_set_parent_realize(dc, hvf_gicv3_realize, + &kgc->parent_realize); + resettable_class_set_parent_phases(rc, NULL, hvf_gicv3_reset_hold, NUL= L, + &kgc->parent_phases); +} + +static const TypeInfo hvf_arm_gicv3_info =3D { + .name =3D TYPE_HVF_GICV3, + .parent =3D TYPE_ARM_GICV3_COMMON, + .instance_size =3D sizeof(GICv3State), + .class_init =3D hvf_gicv3_class_init, + .class_size =3D sizeof(HVFARMGICv3Class), +}; + +static void hvf_gicv3_register_types(void) +{ + type_register_static(&hvf_arm_gicv3_info); +} + +type_init(hvf_gicv3_register_types) diff --git a/hw/intc/meson.build b/hw/intc/meson.build index 96742df090..b7baf8a0f6 100644 --- a/hw/intc/meson.build +++ b/hw/intc/meson.build @@ -42,6 +42,7 @@ arm_common_ss.add(when: 'CONFIG_ARM_GIC', if_true: files(= 'arm_gicv3_cpuif_common arm_common_ss.add(when: 'CONFIG_ARM_GICV3', if_true: files('arm_gicv3_cpui= f.c')) specific_ss.add(when: 'CONFIG_ARM_GIC_KVM', if_true: files('arm_gic_kvm.c'= )) specific_ss.add(when: ['CONFIG_WHPX', 'TARGET_AARCH64'], if_true: files('a= rm_gicv3_whpx.c')) +specific_ss.add(when: ['CONFIG_HVF', 'CONFIG_ARM_GICV3'], if_true: files('= arm_gicv3_hvf.c')) specific_ss.add(when: ['CONFIG_ARM_GIC_KVM', 'TARGET_AARCH64'], if_true: f= iles('arm_gicv3_kvm.c', 'arm_gicv3_its_kvm.c')) arm_common_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('armv7m_nvic.c')) specific_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_irqmp.c')) diff --git a/include/hw/intc/arm_gicv3_common.h b/include/hw/intc/arm_gicv3= _common.h index c55cf18120..9adcab0a0c 100644 --- a/include/hw/intc/arm_gicv3_common.h +++ b/include/hw/intc/arm_gicv3_common.h @@ -315,6 +315,7 @@ DECLARE_OBJ_CHECKERS(GICv3State, ARMGICv3CommonClass, =20 /* Types for GICv3 kernel-irqchip */ #define TYPE_WHPX_GICV3 "whpx-arm-gicv3" +#define TYPE_HVF_GICV3 "hvf-arm-gicv3" =20 struct ARMGICv3CommonClass { /*< private >*/ --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316574; cv=none; d=zohomail.com; s=zohoarc; b=Pii4PBOtbC4v090F2f9HOjBb75jOUgPH/jnykqwGSTw5DylDERUFPoNaQ7ELLRHDKVcfNZsW+oJwQZyGekroAvAnbUFYWSDW9YSEshnubDH8EYXE3C3R7rtAShlMi/DjYJVyMdH4G2eOEg+Ej3Rgb6a/APVA1lDbJBDPHZ6MIww= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316574; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=izH9lrNBnEl4+eMMqh+pt5o1uIIbvD3xlWlBNyKuZ7U=; b=ZSKi2OuAGLLdNbD751MRw1nStA582pLFnSOFNfBOUd8JCRQa9VICv0cn1E05mZNMxxWwzYFwmDXiWk18wlU2W2CZg/7J2tf/Xfmxs9JJXjFMcCICgeTT70UlBJ1iGmGdW78YKclOb8K/ku/8edxDeCwJeQGtKu8WyegE9uYpa7Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17723165741901012.1916719832104; Sat, 28 Feb 2026 14:09:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUZ-0002Ta-TD; Sat, 28 Feb 2026 17:08:55 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUU-0002Pd-7F for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:50 -0500 Received: from qs-2004j-snip4-4.eps.apple.com ([57.103.84.97] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUR-0005lk-Uz for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:49 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id CABB8180011F; Sat, 28 Feb 2026 22:08:44 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id C78D41800394; Sat, 28 Feb 2026 22:08:42 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316527; x=1774908527; bh=izH9lrNBnEl4+eMMqh+pt5o1uIIbvD3xlWlBNyKuZ7U=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=dns5V9X/yZbpNbb47NuntTIfFTNeflybT/EYKubC58uqDGVIyKOR0zCWmuSbPR0zvWh8VJigDiK+e/3aFKEoGjiFDuuOalXbMYOG/lmsn5cnpeaBWTUwQkRtO+7U93c1m1de4mPxuVDBcxo/f+2VZ5xJxSL8SiGwSGdWlIaBzpXaMzyU8x1/WWS70kg1zZp56oYmBk3KbyPeL5Ls8NgowPEihJUtrAUPY00oyKUwhNmvhwKSqXZ9j4JvjwBxzWjmJ0IP/DCHQAmG6h1M/+SUh399ajnLx5QqfY3aAsdGBI4sPIeX1GvXFWdyrXZbgu5fa2fTtqNQe7+UkYEvTsP7bQ== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 02/12] hw/intc: arm_gicv3_hvf: save/restore Apple GIC state Date: Sat, 28 Feb 2026 23:08:27 +0100 Message-ID: <20260228220837.35275-3-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: OXNWirqzRYJu1kRGPGsJwdrtPPwhRyPE X-Proofpoint-GUID: OXNWirqzRYJu1kRGPGsJwdrtPPwhRyPE X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfX/RBOea7OE9p1 YvTjmiB69Ks6GQMPeki2l/dt4zxSBJaIuS9pMP6m0qnTBV3KjkL8+62RcuH2HO5l5fp/F/kjhiX GDYganvxq6FlF3xmuHFegafGVWEBAufn4L2iQ9TdhHDHY3mYy2AV+2Mqtmq9GsrMji/x8OkmoqE Dj8c3k3aNJfnyOXvuhaPlgJtM9GIWCORFew6qsp0X3cMM4Qdpj4mNiKs2nKJcAp2FlpQHgGbe6x m7xyzsdS7JbRl6rKL1tOuJ/2uKUwCEIyXMgptnnHnOYPGeOJo76wA2yhrK5u/UnMh9VL1/vdL5s JN7hTx8+o3HA6IAOiLXODsBHStCtk6yQZludE2/bsWun9tRpLsvDfVSO43p0N8= X-Authority-Info-Out: v=2.4 cv=Z8Dh3XRA c=1 sm=1 tr=0 ts=69a3676d cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=kNOF8fv34t_zTB2Y_VIA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 bulkscore=0 mlxlogscore=999 lowpriorityscore=0 adultscore=0 suspectscore=0 mlxscore=0 spamscore=0 clxscore=1030 malwarescore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABVkzMdu8lIAYDuYZqa4oY6IOVd33wj005BKhcgi+gLC0rWBCdfjUWy5FFpSchcjhHbsptBSSLr9vLF8o4jwd9zdTyviBAzocQ0p5WTCE6hapo/k0SyiHVpkeqjufx8JSd00vKAcFoVUBYAxtPXjtokXKZWiz1b3soG82vT52lRuWPU9ZplePUs625Ek8cWZh8hUYMQk2Wx0x0UFDvjniVgFa3REEp4Yal2BbPQg9jl0gDIHg462n9aWMDsIiz1u7BKCuVhw5pKjcxdgvVCFBrgGj4K4eYAjBJRJhuPMJwRLHIxP11VB7Na4JhWoVWTHhsyyhUyNECbzmf/MZxn7KjzuhGW7SRDDMrMotR+7RqH3plmaS38hSzwH6ZfgQTItk6VC0MhC6wLKYpTF3qH41W8R7k2cNvN9gDQRIfX71/OVrOIVPNGdiSolBx3xjNGtqmRtwTpbQKCg1p63TjLkOdudu8AMptrtlTMjTifaBSVeUlZo6FrqvkX1cdyq5Av1RB7fHdLGkS6guYkRQmVqTHcQoBIMZMH9k1Q6vY9kXb8Ojo28VrSoFSnqlzRfCpEKWtJyyg84GuTGUvSAEd+bPVBRrEqvVAEJq5f+DbvumyJDxHZMFeX6ATAEjk2Rb0SRytRYAspc5dbGO06v8dCXy3p3Dbky/b6G1JfEaqgssKhoMJ/nJRX1lkL3SP4r4O57QN/rBNm6CKeiIGolMpckjLKg1eTrpzB+lrWyL813ByByTlHweUJI3FboCMPUkMzRe6O5JdglcwuQjfJ7s= Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.97; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316576130158500 Content-Type: text/plain; charset="utf-8" On HVF, some of the GIC state is in an opaque Apple-provided structure. Save/restore that state to be able to save/restore VMs that use the hardwar= e GIC. Signed-off-by: Mohamed Mediouni --- hw/intc/arm_gicv3_common.c | 1 + hw/intc/arm_gicv3_hvf.c | 95 ++++++++++++++++++++++++++++-- hw/intc/arm_gicv3_hvf_stub.c | 25 ++++++++ hw/intc/meson.build | 1 + include/hw/intc/arm_gicv3_common.h | 3 + 5 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 hw/intc/arm_gicv3_hvf_stub.c diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c index 9200671c7a..9c3fb2f4bf 100644 --- a/hw/intc/arm_gicv3_common.c +++ b/hw/intc/arm_gicv3_common.c @@ -305,6 +305,7 @@ static const VMStateDescription vmstate_gicv3 =3D { .subsections =3D (const VMStateDescription * const []) { &vmstate_gicv3_gicd_no_migration_shift_bug, &vmstate_gicv3_gicd_nmi, + &vmstate_gicv3_hvf, NULL } }; diff --git a/hw/intc/arm_gicv3_hvf.c b/hw/intc/arm_gicv3_hvf.c index d6a46b7d53..f2249a7e7c 100644 --- a/hw/intc/arm_gicv3_hvf.c +++ b/hw/intc/arm_gicv3_hvf.c @@ -13,6 +13,7 @@ #include "qemu/error-report.h" #include "qemu/module.h" #include "system/runstate.h" +#include "migration/vmstate.h" #include "system/hvf.h" #include "system/hvf_int.h" #include "hvf_arm.h" @@ -30,8 +31,13 @@ struct HVFARMGICv3Class { =20 typedef struct HVFARMGICv3Class HVFARMGICv3Class; =20 -/* This is reusing the GICv3State typedef from ARM_GICV3_ITS_COMMON */ -DECLARE_OBJ_CHECKERS(GICv3State, HVFARMGICv3Class, +typedef struct HVFGICv3State { + GICv3State gicv3_state; + uint32_t size; + void *state; +} HVFGICv3State; + +DECLARE_OBJ_CHECKERS(HVFGICv3State, HVFARMGICv3Class, HVF_GICV3, TYPE_HVF_GICV3); =20 /* @@ -656,7 +662,7 @@ static const ARMCPRegInfo gicv3_cpuif_reginfo[] =3D { static void hvf_gicv3_realize(DeviceState *dev, Error **errp) { ERRP_GUARD(); - GICv3State *s =3D HVF_GICV3(dev); + GICv3State *s =3D (GICv3State *)HVF_GICV3(dev); HVFARMGICv3Class *kgc =3D HVF_GICV3_GET_CLASS(s); int i; =20 @@ -703,6 +709,87 @@ static void hvf_gicv3_realize(DeviceState *dev, Error = **errp) } } =20 +/* + * HVF doesn't have a way to save the RDIST pending tables + * to guest memory, only to an opaque data structure. + */ +static bool gicv3_is_hvf(void *opaque) +{ + return hvf_enabled() && hvf_irqchip_in_kernel(); +} + +static int hvf_gic_opaque_state_save(void* opaque) +{ + HVFGICv3State* gic =3D opaque; + hv_gic_state_t gic_state; + hv_return_t err; + size_t size; + + gic_state =3D hv_gic_state_create(); + if (gic_state =3D=3D NULL) { + error_report("hvf: vgic: failed to create hv_gic_state_create."); + return 1; + } + err =3D hv_gic_state_get_size(gic_state, &size); + gic->size =3D size; + if (err !=3D HV_SUCCESS) { + error_report("hvf: vgic: failed to get GIC state size."); + os_release(gic_state); + return 1; + } + gic->state =3D g_malloc(gic->size); + err =3D hv_gic_state_get_data(gic_state, gic->state); + if (err !=3D HV_SUCCESS) { + error_report("hvf: vgic: failed to get GIC state."); + os_release(gic_state); + return 1; + } + + os_release(gic_state); + return 0; +} + +static int hvf_gic_opaque_state_free(void* opaque) +{ + HVFGICv3State* gic =3D opaque; + free(gic->state); + return 0; +} + +static int hvf_gic_opaque_state_restore(void* opaque, int version_id) +{ + HVFGICv3State* gic =3D opaque; + hv_return_t err; + if (!gic->size) { + return 0; + } + err =3D hv_gic_set_state(gic->state, gic->size); + if (err !=3D HV_SUCCESS) { + error_report("hvf: vgic: failed to restore GIC state."); + return 1; + } + return 0; +} + +const VMStateDescription vmstate_gicv3_hvf =3D { + .name =3D "arm_gicv3/hvf_gic_state", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D gicv3_is_hvf, + .pre_save =3D hvf_gic_opaque_state_save, + .post_save =3D hvf_gic_opaque_state_free, + .post_load =3D hvf_gic_opaque_state_restore, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_UINT32(size, HVFGICv3State), + VMSTATE_VBUFFER_ALLOC_UINT32(state, + HVFGICv3State, 0, 0, + size), + VMSTATE_END_OF_LIST() + }, +}; + static void hvf_gicv3_class_init(ObjectClass *klass, const void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -722,7 +809,7 @@ static void hvf_gicv3_class_init(ObjectClass *klass, co= nst void *data) static const TypeInfo hvf_arm_gicv3_info =3D { .name =3D TYPE_HVF_GICV3, .parent =3D TYPE_ARM_GICV3_COMMON, - .instance_size =3D sizeof(GICv3State), + .instance_size =3D sizeof(HVFGICv3State), .class_init =3D hvf_gicv3_class_init, .class_size =3D sizeof(HVFARMGICv3Class), }; diff --git a/hw/intc/arm_gicv3_hvf_stub.c b/hw/intc/arm_gicv3_hvf_stub.c new file mode 100644 index 0000000000..a587332c7c --- /dev/null +++ b/hw/intc/arm_gicv3_hvf_stub.c @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * ARM Generic Interrupt Controller using HVF platform support stub + * + * Copyright (c) 2026 Mohamed Mediouni + * + */ +#include "qemu/osdep.h" +#include "hw/intc/arm_gicv3_common.h" +#include "migration/vmstate.h" +#include "qemu/typedefs.h" + +static bool needed_never(void *opaque) +{ + return false; +} + +const VMStateDescription vmstate_gicv3_hvf =3D { + .name =3D "arm_gicv3/hvf_gic_state", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D needed_never, + .version_id =3D 1, + .minimum_version_id =3D 1, +}; diff --git a/hw/intc/meson.build b/hw/intc/meson.build index b7baf8a0f6..c6de2d9d00 100644 --- a/hw/intc/meson.build +++ b/hw/intc/meson.build @@ -43,6 +43,7 @@ arm_common_ss.add(when: 'CONFIG_ARM_GICV3', if_true: file= s('arm_gicv3_cpuif.c')) specific_ss.add(when: 'CONFIG_ARM_GIC_KVM', if_true: files('arm_gic_kvm.c'= )) specific_ss.add(when: ['CONFIG_WHPX', 'TARGET_AARCH64'], if_true: files('a= rm_gicv3_whpx.c')) specific_ss.add(when: ['CONFIG_HVF', 'CONFIG_ARM_GICV3'], if_true: files('= arm_gicv3_hvf.c')) +specific_ss.add(when: ['CONFIG_HVF', 'CONFIG_ARM_GICV3'], if_false: files(= 'arm_gicv3_hvf_stub.c')) specific_ss.add(when: ['CONFIG_ARM_GIC_KVM', 'TARGET_AARCH64'], if_true: f= iles('arm_gicv3_kvm.c', 'arm_gicv3_its_kvm.c')) arm_common_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('armv7m_nvic.c')) specific_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_irqmp.c')) diff --git a/include/hw/intc/arm_gicv3_common.h b/include/hw/intc/arm_gicv3= _common.h index 9adcab0a0c..03ab3e8f2f 100644 --- a/include/hw/intc/arm_gicv3_common.h +++ b/include/hw/intc/arm_gicv3_common.h @@ -339,4 +339,7 @@ void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_h= andler handler, */ const char *gicv3_class_name(void); =20 +/* HVF vGIC-specific state: stubbed out on a build with HVF disabled */ +extern const VMStateDescription vmstate_gicv3_hvf; + #endif --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316586; cv=none; d=zohomail.com; s=zohoarc; b=fSlEOczSf/HC3jrgcm++B9lH5HhnqaNWhotyz7M02cNiv4n44RiXlwE0b4dURlyQa5bJ+1wgpnR7rIO/ggCRofaYNPJPdyXQnUIMBNTDhnFQ9pgxLwwpsmWiv1ezz6+GxT94t8TdIShsmgkylmyZDaxb4R5VU2A3VtvA5OJQxiE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316586; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yU7J0uqM6sRIZcVN5B3+x/ofAMix31Z4QeYnMclqMMU=; b=ePtHkPBZiKrhpBT4ppmbhqadBCWrBOTYZ20y91UlDeUgl4ni6P6Dos94lAfYHToaNa5aiG4cgBWZNWjTD0A1jPbpeXTNgr9LB9omCcLNst23MVV1CvEO++V1GgabwWCiebuXHqcX08NN0U3PfV2DTH3FAKaPtmpN9q3VdNXPLdc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316586784146.58994635240992; Sat, 28 Feb 2026 14:09:46 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUY-0002Sr-NT; Sat, 28 Feb 2026 17:08:54 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUW-0002RX-Q1 for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:52 -0500 Received: from qs-2004h-snip4-5.eps.apple.com ([57.103.84.78] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUU-0005mU-V4 for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:52 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id B499B180038A; Sat, 28 Feb 2026 22:08:46 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id 620E218000AF; Sat, 28 Feb 2026 22:08:44 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316529; x=1774908529; bh=yU7J0uqM6sRIZcVN5B3+x/ofAMix31Z4QeYnMclqMMU=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=J4SuB0HLbBzzRI+b5sekMpfEc1ik34yI+pl3Ax+elgfERnkgWnB9aHyqc+3P391y0XeHk9aVb2aVhLZmgt1qbQ/dAKo6ImLwk5btZiPnH0UvXklARk9p7Or0EnOtVye/3wncpyw/VmUYjCl4fEjQEj2jDksw81m2QmV8/51I5ZgmmSqI4+0q8BUcmudQjLOdW2X3sgw/rxIdCtB9Jx8NS9+/+B+LVJ5EWeDpyHmkcFvAI1NxEw6zqMPdKpQkqbc7CszmEXdc7Lc6O2adHIEjsc8xQ7Q9CPdvLyYRCV7lIIBoWHwfN8mIvt1OIFATyzWTsWdJ+7o4x/66BpVIYnvb3w== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 03/12] accel, hw/arm, include/system/hvf: infrastructure changes for HVF vGIC Date: Sat, 28 Feb 2026 23:08:28 +0100 Message-ID: <20260228220837.35275-4-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Info-Out: v=2.4 cv=KtlAGGWN c=1 sm=1 tr=0 ts=69a36770 cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=n4FVybPFTm1vobq06wUA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfXymN/zVyhPBKQ Kl8vS0bOR4X1oEy9IqOU+gzMrzJl2P6/EvapWoLGeHgbDOK9gAi0WZoTyxhIjGF5UGX6VKTstqZ 6utus4NbMSeGT+1Yt3YENZhYKcBGPUnMEq5XhgQzrZ9offnfkrcHROefCqq5AO2IW4nxsZv/QJr Kk0YMHMcJI7LSTV6fJO7tiZaJSDeDE+Yeib0DBk5lDA1jCc0a/OpyuIXsC0DHcezI+r+7MbYKFl MwGYS91A0Pj8rZ0djSYb2r7mAzF4wZ/IcunZd5J5coS4/ZB/zz8RamRpXXHJ/C2vI4bx7jGXFHg Ze+B5cpxknRj0lPa5JcWHwa9fNZ0wpkTR+tk9e1P3LKKuHX0cPN4fpTB4NA6is= X-Proofpoint-GUID: 8xuCikze7IHV7uqjUXHr4LYXN26xyG2F X-Proofpoint-ORIG-GUID: 8xuCikze7IHV7uqjUXHr4LYXN26xyG2F X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 bulkscore=0 suspectscore=0 lowpriorityscore=0 spamscore=0 mlxlogscore=999 clxscore=1030 malwarescore=0 phishscore=0 adultscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABTSWE9bqCSNTojzyQ9RstwEns4tDUh/4xk9yDQ57Gx/truYkhB1XxyWdKT0mHe2Y761uu1co3f/OkqjjGpq36KLqiG6NpPCzPSCr+hES19vQyot7nyjkYSckhrZA3ZNndNZs9gypu9becw0+z0OhWu1d2Og7CwLjzQs9jjP3y+YFOPtUpeFSMJ+0aVtewVT3QQwfVflZCUvnRt2T7vF8SRDUpqAVdg8C7x1/kppd8E2L93oWAWiM2pdnSLCusfEkQYGI2x9II9ulYbMa4yjUbtJ3gdWOK0UqepTRZPHKNyU78kgHdM/RlsjFCIYujqB/vrB7RfyVDuxIHkX//072v0CqZ9HX7efyOLZIj61pG0LhB/sQgyaGveEHclMS+Sm5Du34R5q0SQ3eyh7pseLx9XIkzsoL44tdk9AvxlQMn44ywmWwJeREc5/OP/86mmNM1msnjYgu5ZSBjZD8LJ3sAckd5GfD4CHIRCyckjgy+AMr3bNGUkSdXzcmu9fC7vp9BuspiicTpLFRqRWHtEoEQvMmN/wqmGnZik9yEaePSKtwYa1mkvybIij73miLBen+i/4OTz89ys1r0I73AbTLlrCXScuxpV0A0eN1EqNMFmblRCPkWPS78RcbQ28fOZ+595uR0nYK9jUCYsva7+gDoLv4Z0ILbRMFuSwNt4XfwewkHKRASjMwcQG6FUn2/xL/EpK37hYsPi8CITFiufhSVQ433IURpDM+nfd9A7RMxzFk/ItJbUA== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.78; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316589384158500 Content-Type: text/plain; charset="utf-8" Misc changes needed for HVF vGIC enablement. Note: x86_64 macOS exposes interrupt controller virtualisation since macOS = 12. Keeping an #ifdef here in case we end up supporting that... However, given that x86_64 macOS is on its way out, it'll probably (?) not = be supported in Qemu. Signed-off-by: Mohamed Mediouni --- accel/hvf/hvf-all.c | 50 ++++++++++++++++++++++++++++++++++++++ accel/stubs/hvf-stub.c | 1 + hw/arm/virt.c | 23 +++++++++++++++--- hw/intc/arm_gicv3_common.c | 3 +++ include/system/hvf.h | 3 +++ system/vl.c | 2 ++ 6 files changed, 78 insertions(+), 4 deletions(-) diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c index 033c677b6f..929f53fd37 100644 --- a/accel/hvf/hvf-all.c +++ b/accel/hvf/hvf-all.c @@ -10,6 +10,8 @@ =20 #include "qemu/osdep.h" #include "qemu/error-report.h" +#include "qapi/error.h" +#include "qapi/qapi-visit-common.h" #include "accel/accel-ops.h" #include "exec/cpu-common.h" #include "system/address-spaces.h" @@ -22,6 +24,7 @@ #include "trace.h" =20 bool hvf_allowed; +bool hvf_kernel_irqchip; =20 const char *hvf_return_string(hv_return_t ret) { @@ -217,6 +220,43 @@ static int hvf_gdbstub_sstep_flags(AccelState *as) return SSTEP_ENABLE | SSTEP_NOIRQ; } =20 +static void hvf_set_kernel_irqchip(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + OnOffSplit mode; + if (!visit_type_OnOffSplit(v, name, &mode, errp)) { + return; + } + + switch (mode) { + case ON_OFF_SPLIT_ON: +#ifdef HOST_X86_64 + /* macOS 12 onwards exposes an HVF virtual APIC. */ + error_setg(errp, "HVF: kernel irqchip is not currently implemented= for x86."); + break; +#else + hvf_kernel_irqchip =3D true; + break; +#endif + + case ON_OFF_SPLIT_OFF: + hvf_kernel_irqchip =3D false; + break; + + case ON_OFF_SPLIT_SPLIT: + error_setg(errp, "HVF: split irqchip is not supported on HVF."); + break; + + default: + /* + * The value was checked in visit_type_OnOffSplit() above. If + * we get here, then something is wrong in QEMU. + */ + abort(); + } +} + static void hvf_accel_class_init(ObjectClass *oc, const void *data) { AccelClass *ac =3D ACCEL_CLASS(oc); @@ -224,6 +264,16 @@ static void hvf_accel_class_init(ObjectClass *oc, cons= t void *data) ac->init_machine =3D hvf_accel_init; ac->allowed =3D &hvf_allowed; ac->gdbstub_supported_sstep_flags =3D hvf_gdbstub_sstep_flags; +#ifdef HOST_X86_64 + hvf_kernel_irqchip =3D false; +#else + hvf_kernel_irqchip =3D true; +#endif + object_class_property_add(oc, "kernel-irqchip", "on|off|split", + NULL, hvf_set_kernel_irqchip, + NULL, NULL); + object_class_property_set_description(oc, "kernel-irqchip", + "Configure HVF irqchip"); } =20 static const TypeInfo hvf_accel_type =3D { diff --git a/accel/stubs/hvf-stub.c b/accel/stubs/hvf-stub.c index 42eadc5ca9..6bd08759ba 100644 --- a/accel/stubs/hvf-stub.c +++ b/accel/stubs/hvf-stub.c @@ -10,3 +10,4 @@ #include "system/hvf.h" =20 bool hvf_allowed; +bool hvf_kernel_irqchip; diff --git a/hw/arm/virt.c b/hw/arm/virt.c index cab2e21e8a..8db5611f7f 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -838,7 +838,7 @@ static void create_gic(VirtMachineState *vms, MemoryReg= ion *mem) * interrupts; there are always 32 of the former (mandated by GIC spec= ). */ qdev_prop_set_uint32(vms->gic, "num-irq", NUM_IRQS + 32); - if (!kvm_irqchip_in_kernel()) { + if (!kvm_irqchip_in_kernel() && !hvf_irqchip_in_kernel()) { qdev_prop_set_bit(vms->gic, "has-security-extensions", vms->secure= ); } =20 @@ -861,7 +861,8 @@ static void create_gic(VirtMachineState *vms, MemoryReg= ion *mem) qdev_prop_set_array(vms->gic, "redist-region-count", redist_region_count); =20 - if (!kvm_irqchip_in_kernel()) { + if (!kvm_irqchip_in_kernel() && + !(hvf_enabled() && hvf_irqchip_in_kernel())) { if (vms->tcg_its) { object_property_set_link(OBJECT(vms->gic), "sysmem", OBJECT(mem), &error_fatal); @@ -872,7 +873,7 @@ static void create_gic(VirtMachineState *vms, MemoryReg= ion *mem) ARCH_GIC_MAINT_IRQ); } } else { - if (!kvm_irqchip_in_kernel()) { + if (!kvm_irqchip_in_kernel() && !hvf_irqchip_in_kernel()) { qdev_prop_set_bit(vms->gic, "has-virtualization-extensions", vms->virt); } @@ -2119,7 +2120,15 @@ static void finalize_gic_version(VirtMachineState *v= ms) accel_name =3D "KVM with kernel-irqchip=3Doff"; } else if (whpx_enabled()) { gics_supported |=3D VIRT_GIC_VERSION_3_MASK; - } else if (tcg_enabled() || hvf_enabled() || qtest_enabled()) { + } else if (hvf_enabled()) { + if (!hvf_irqchip_in_kernel()) { + gics_supported |=3D VIRT_GIC_VERSION_2_MASK; + } + /* Hypervisor.framework doesn't expose EL2<->1 transition notifier= s */ + if (!(!hvf_irqchip_in_kernel() && vms->virt)) { + gics_supported |=3D VIRT_GIC_VERSION_3_MASK; + } + } else if (tcg_enabled() || qtest_enabled()) { gics_supported |=3D VIRT_GIC_VERSION_2_MASK; if (module_object_class_by_name("arm-gicv3")) { gics_supported |=3D VIRT_GIC_VERSION_3_MASK; @@ -2161,6 +2170,8 @@ static void finalize_msi_controller(VirtMachineState = *vms) vms->msi_controller =3D VIRT_MSI_CTRL_GICV2M; } else if (whpx_enabled()) { vms->msi_controller =3D VIRT_MSI_CTRL_GICV2M; + } else if (hvf_enabled() && hvf_irqchip_in_kernel()) { + vms->msi_controller =3D VIRT_MSI_CTRL_GICV2M; } else { vms->msi_controller =3D VIRT_MSI_CTRL_ITS; } @@ -2180,6 +2191,10 @@ static void finalize_msi_controller(VirtMachineState= *vms) error_report("ITS not supported on WHPX."); exit(1); } + if (hvf_enabled() && hvf_irqchip_in_kernel()) { + error_report("ITS not supported on HVF when using the hardware= vGIC."); + exit(1); + } } =20 assert(vms->msi_controller !=3D VIRT_MSI_CTRL_AUTO); diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c index 9c3fb2f4bf..f7ba74e6d5 100644 --- a/hw/intc/arm_gicv3_common.c +++ b/hw/intc/arm_gicv3_common.c @@ -33,6 +33,7 @@ #include "hw/arm/linux-boot-if.h" #include "system/kvm.h" #include "system/whpx.h" +#include "system/hvf.h" =20 =20 static void gicv3_gicd_no_migration_shift_bug_post_load(GICv3State *cs) @@ -659,6 +660,8 @@ const char *gicv3_class_name(void) return "kvm-arm-gicv3"; } else if (whpx_enabled()) { return TYPE_WHPX_GICV3; + } else if (hvf_enabled() && hvf_irqchip_in_kernel()) { + return TYPE_HVF_GICV3; } else { if (kvm_enabled()) { error_report("Userspace GICv3 is not supported with KVM"); diff --git a/include/system/hvf.h b/include/system/hvf.h index d3dcf088b3..dc8da85979 100644 --- a/include/system/hvf.h +++ b/include/system/hvf.h @@ -26,8 +26,11 @@ #ifdef CONFIG_HVF_IS_POSSIBLE extern bool hvf_allowed; #define hvf_enabled() (hvf_allowed) +extern bool hvf_kernel_irqchip; +#define hvf_irqchip_in_kernel() (hvf_kernel_irqchip) #else /* !CONFIG_HVF_IS_POSSIBLE */ #define hvf_enabled() 0 +#define hvf_irqchip_in_kernel() 0 #endif /* !CONFIG_HVF_IS_POSSIBLE */ =20 #define TYPE_HVF_ACCEL ACCEL_CLASS_NAME("hvf") diff --git a/system/vl.c b/system/vl.c index 3e341142a0..7a3db97ee6 100644 --- a/system/vl.c +++ b/system/vl.c @@ -1778,6 +1778,8 @@ static void qemu_apply_legacy_machine_options(QDict *= qdict) false); object_register_sugar_prop(ACCEL_CLASS_NAME("whpx"), "kernel-irqch= ip", value, false); + object_register_sugar_prop(ACCEL_CLASS_NAME("hvf"), "kernel-irqchi= p", value, + false); qdict_del(qdict, "kernel-irqchip"); } =20 --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316586; cv=none; d=zohomail.com; s=zohoarc; b=avYfHcDIr4dzhhrIWdtaHszncKzlyC/zyV3+AGOP23Rq3OUcDE8d4P6Vlf5Oy+SJGzvNmfJAxU6am3QeJwjXFJ0zPCFF/XXPThZUoe8R8MstaWutmO23KsM+QGOoSkcROK5kIFwOcOPr0+pPWBPRiD0YsED3Z2MV3+W4ojB3hLQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316586; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=jEliWNbG5rK2neC0IONI5zdAOP0QxrLReQSeKNzFrQA=; b=kro9cWeOICX0bxyEUnKgLTMq5O+Z5V38fqWZbx2q8AbEfm/f0RPXOdygundxPfa23g6/QfDPpYtvgeUoK6xwgZukT2/uFi6wyRrV4xqptqm3L7l4JJ7TaGYl2pWPlpP/Ag2NK/t+QzWiUr48qEa99gj4gMSnqsKBVKaFhmi7NcA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316586072769.0075880001858; Sat, 28 Feb 2026 14:09:46 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUY-0002S7-0l; Sat, 28 Feb 2026 17:08:54 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUV-0002QL-C7 for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:51 -0500 Received: from qs-2004f-snip4-10.eps.apple.com ([57.103.84.62] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUT-0005mD-5L for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:51 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id 9EDA6180012B; Sat, 28 Feb 2026 22:08:47 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id ECFD01800396; Sat, 28 Feb 2026 22:08:45 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316528; x=1774908528; bh=jEliWNbG5rK2neC0IONI5zdAOP0QxrLReQSeKNzFrQA=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=IVLuC4tMT5w+c6O8mYRvN1g4hB2bheB2bi4LcLsjgRxFuKbQQEeRqayyRTy8pdXX0nvGrrBvtsi4QmdipSpjPJBx4RIpP+QnSF8OTJMk/D83fSrcwnsSKAQN7aBBhSmbBtv7SYSvDgGynElnn2bvr2gOhfmfEuRN5j1xhyPKUYInJG39hoFDoB1GYz1ANVqXWV10R2CfmAQi6LO1mFET8FTsPA981q7XPm7OZAdCuc1rfU/Lp7UFPzOL1GEXUsTQQadluZcz8WdxjYZ8SIUcvT0LyIcQ6LwQFwct551gU0U3d/mbq0qHlw4cBjSrMZUkW+GVnJw7DY9xh2rVJk2ZxA== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 04/12] target/arm: hvf: instantiate GIC early Date: Sat, 28 Feb 2026 23:08:29 +0100 Message-ID: <20260228220837.35275-5-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: oTjzJtN-G1k3tv86Xg1oOdYsA-v16yc4 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfX1dpMKtMG8XU4 WaFD8C9yzttyR+pEclrz8ubmzlDhb7jY3ejdNfmvxEeqMJCncBUOV035Xr7uXPUKPFlcjcUhUp8 PCLGtFVyTe6HneGdirGtX9kCNre1y5QejrySjluDJ7thnNnmkPw9G6xMpISlAG+D6mZoZ03BPac m3W4qn6eq5x9sWnf5fah0kyNKQgxW/NWWgeaDPObzB187pQRazMI7cuUahKKrEU/g3ZTmp0qbL2 F248ADkEoSskrFMYqQxb4h3XrP7r/xaSclg6+uYmzVNyiiHyx3L5Xf4zbtJXXhMobNMJ7Pzvwuk GPaCJLhqW5yTxeiBLPBcGhDdAkLDwSOLORWrRpDYjI+ViHr4meYDOTmYwxT4f4= X-Authority-Info-Out: v=2.4 cv=fPw0HJae c=1 sm=1 tr=0 ts=69a3676f cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=iW0rYzIOeSeTUJq9hTUA:9 X-Proofpoint-ORIG-GUID: oTjzJtN-G1k3tv86Xg1oOdYsA-v16yc4 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 spamscore=0 lowpriorityscore=0 phishscore=0 malwarescore=0 clxscore=1030 suspectscore=0 mlxlogscore=691 adultscore=0 mlxscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABZZmGKhP2kCqh5aDFIL8suc/QT99FmcT90SgYXVGaeht6z8kr7Um8knO08Xkk/jNj7r1QU33/7sil8RoOLd8WRE3xhnjcYBIIyOEYlTSybFrpGtO4P22X7sqVU3cU3onQpNOJxpGuu7vnlOt5qAR9W22H5nTK3SyOmsOiIcTnSX+8546EsI1lnJSdjkWlopV51Mlwy4dXqM69R4wrBaa1Dvx5aVZnByKcAeZiu6NO++PELDZAQ/Nm8dkZP8zI8lAHciC4Nfem/59f77HE1lynz3tq/954T8XMtf6SyZQmcP62ZxhS6ExqQlRo/2qLZNKwmz5KPcx0ZUOUoF0WrH9b0EaFt2owFizDA3oepOWC2UGtV/CELZpSx/UpuxiyAfnlfKjR+PscdLprnAYp94uwjtNvhdNp4vm03MeH1Q00/Lxvc40pALAOb1uTfY0fKMPGtevF1bPkGnkFyPY3KcdXJuCfGyVyE39k6rLi1tvWlBob6QPucLnzTqzrWWs3Ts1cH3eM4xFXsOFL4ZENpKTWu+xzdeBUDny2myXSZ5w1u3BfubdKqJhTmGS/PBqnoEb2Pxar3OLTIgILG05/xodnVDMsGXvvtaJzWFiGlKbbH6CCaSh9e2KtT6YDS4QriUUR5AQncUnZKuXPM7yg1rCDqHDMD8UUUzBo9HAnBAD3DWVp1gxCBhzRnqUYO+c7Yr9PM4RD Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.62; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316587457158500 Content-Type: text/plain; charset="utf-8" While figuring out a better spot for it, put it in hv_arch_vm_create(). After hv_vcpu_create is documented as too late, and deferring vCPU initialization isn't enough either. Signed-off-by: Mohamed Mediouni --- target/arm/hvf/hvf.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index d79469ca27..a22b544afe 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -961,6 +961,22 @@ hv_return_t hvf_arch_vm_create(MachineState *ms, uint3= 2_t pa_range) chosen_ipa_bit_size =3D pa_range; =20 ret =3D hv_vm_create(config); + if (hvf_irqchip_in_kernel()) { + /* + * Instantiate GIC. + * This must be done prior to the creation of any vCPU + * but past hv_vm_create() + */ + hv_gic_config_t cfg =3D hv_gic_config_create(); + hv_gic_config_set_distributor_base(cfg, 0x08000000); + hv_gic_config_set_redistributor_base(cfg, 0x080A0000); + hv_return_t err =3D hv_gic_create(cfg); + if (err !=3D HV_SUCCESS) { + error_report("error creating platform VGIC"); + goto cleanup; + } + os_release(cfg); + } =20 cleanup: os_release(config); --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316574; cv=none; d=zohomail.com; s=zohoarc; b=aCXdQuZsXcRMVK5Y4/I0vQovCIAqWtHogK3bbUiAeR70t+U5ZbvSF4JZVpELXjboRCe1EluB65qrbdZKSwoy/vSN44X8gx9/Shjo5W/Pxxrj4P9aDE0BQMZGewx0371QRDG7/sjfMFaI5m0HrJQVehoaZ3AH7NQgJ5OE6Fb+mXA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316574; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=xOhk+UpBTuUEo2kxPpkLtZpzA8dOZaP9D9fzqCaqzkM=; b=R3m7kNLJS/5p8eSGucm0qjlPaZ1cbZWDVk2BxLkd3OrsFUOjDaXNDcWakPG4OqBPgw6VqbykCn3TKwqbw+fv0MLBZnH+ulC4DPqT1IjypsRZgHdROHnFc/wdJDbUfJG18jXBk8/JKTTVRavv0mWxKT6Z4ehTKKFuUjrth+Onyn4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316574068361.4408913561632; Sat, 28 Feb 2026 14:09:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUY-0002Ss-RN; Sat, 28 Feb 2026 17:08:54 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUW-0002RO-Nb for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:52 -0500 Received: from qs-2004d-snip4-11.eps.apple.com ([57.103.84.43] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUU-0005me-Ku for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:52 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id 14EB41800396; Sat, 28 Feb 2026 22:08:49 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id 8373718000A4; Sat, 28 Feb 2026 22:08:47 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316530; x=1774908530; bh=xOhk+UpBTuUEo2kxPpkLtZpzA8dOZaP9D9fzqCaqzkM=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=XYLEauuduxDX3SgJsgBlR26rbJeNvrHdm6Rn984xIhka7/5uc5C6e71VYZzINFCM0wY8HfwXZFjX04bJV+vJnM9JyVJRlY1ubo37xZQXJMO6P+pOxNUFcXPj9VNWQ3SaX0/MHfcvX76JzUh0k9/PCzOBLo4HdvF5s1+S1sH9/USmHcg6f/Nq8oNRZcTERxyeQkclnlY63VkqJTb11djHacuKX9+zk3Egmo+42+awepEGB+Krn40wwnc7h74rDyMmXRS0CtT8GKaGmdaxwaMPLllhqUxAuMR3Owszt4aFx9unItdr/4m0bXLiIqQ5+wUtGqSa5hGJKp7phG6GaeddWQ== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 05/12] hw/arm, target/arm: nested virtualisation on HVF Date: Sat, 28 Feb 2026 23:08:30 +0100 Message-ID: <20260228220837.35275-6-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Info-Out: v=2.4 cv=MKZtWcZl c=1 sm=1 tr=0 ts=69a36771 cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=YLAFOksV-_wk3IE7wuMA:9 X-Proofpoint-GUID: JNh9e8lxXOVhoXiDNR3dMnvVdAIwegQ8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfXzL03nXpUDUqM tpd5FuiN50vLBKR41J8iK294gAXnXbBwmr4AsVJSMl8+rBsXmAa7zpYEowxq/ZI3N1Bla3x97BB 27VaUbCwYr7PG8udKjFSWG4pEvliKPd7iYxQnTI+onRNjG7g6LEilCVHIvrMo0KgJYGs4C+elHo r1lgo8Y3JS0jEmP1VC7oIatIkH44BEiFGLfWsqLKv7QOG5YDRc+ZyiOtWMlmilkyDHc1z2uro5i k1YngUbPWLm6V5/H5ymgip7yvL2L33dS5ccgwkQ8+zg9NA1vxLz+hY4kY+C4tIefWkoBtXVPuEz heHwFLqvTW1q5SDP3yI7KkKpz403s3i9vNDBiaruY3zuBwd8Q7nOGfkf3y4uf0= X-Proofpoint-ORIG-GUID: JNh9e8lxXOVhoXiDNR3dMnvVdAIwegQ8 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=831 malwarescore=0 lowpriorityscore=0 suspectscore=0 spamscore=0 adultscore=0 mlxscore=0 clxscore=1030 bulkscore=0 phishscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABa96Vuw+x15HbOTdCEZwS7U5G6T27r0xhq9Kl3YCU9ZoMrhQ0ECo0dkhj0zaMZ2LFxdyQDBxhKaFwa8wekYjX0CCzKvmxJaHG4WCytqgh58uWdmVL5P7gHm6BRqYAF9Sh8EPruBb6KMK/TEv2rtiuarqH4aO0aumyTtX3UsC/fp/TZC9GBfcbWsrd8qsiPNCT02ZHqOZeJExJc8mV7eT+LtCqwNT5iVq6gMjuZyYlBvuxAtab/sF9I9VWUVzx4rf/Eujwh7wOXMZkLqZZ/SPgGlprGK+CU2I6KrVJaBCyfqsLH8x1qXwMaYbUfUOWHfVWcKbywwsZ3sxDojrlFoojgamDcAng5sl25PYwHuyC+xcdBH0L8Sv2Fj5AeRMN4/EakI0gHGDGWHdc48XH4xDQZsttgpRcw4EFSEO9ZqLvNeiZmTsTIx7acid9QphFYqAAJynwYwfXgnpKify6wMzDMQJ9ILTHJGVaCFRoGCaPdqjyARVv9XzKFSwRMDhAPTT2SgLaAXMel6xTqWJxHyP/S3mgS9FH8HP721HVdeCthbKYxTAYLpM/5IOQcqVBEJJY+1Pi+70xJC3cPe7IF49yjvEpdz50fmXadwGbfZ9RFuLB7sKwYfdn/jlw2hIzTPFJNpQ24NmgatVS2wUX3RMfs/MNQWei0ZHDJSR4lGkiK9eJVFkFkHfHjHMhJc+0wjRxXCgV3VnZbPpbXg== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.43; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316576093158500 Content-Type: text/plain; charset="utf-8" Signed-off-by: Mohamed Mediouni --- accel/hvf/hvf-all.c | 1 + accel/stubs/hvf-stub.c | 1 + hw/arm/virt.c | 5 +++++ include/system/hvf.h | 5 +++++ target/arm/hvf/hvf.c | 36 ++++++++++++++++++++++++++++++++++-- 5 files changed, 46 insertions(+), 2 deletions(-) diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c index 929f53fd37..88f6d5accb 100644 --- a/accel/hvf/hvf-all.c +++ b/accel/hvf/hvf-all.c @@ -25,6 +25,7 @@ =20 bool hvf_allowed; bool hvf_kernel_irqchip; +bool hvf_nested_virt; =20 const char *hvf_return_string(hv_return_t ret) { diff --git a/accel/stubs/hvf-stub.c b/accel/stubs/hvf-stub.c index 6bd08759ba..cec1cbb056 100644 --- a/accel/stubs/hvf-stub.c +++ b/accel/stubs/hvf-stub.c @@ -11,3 +11,4 @@ =20 bool hvf_allowed; bool hvf_kernel_irqchip; +bool hvf_nested_virt; diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 8db5611f7f..3fa4f41821 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -2662,6 +2662,11 @@ static void virt_set_virt(Object *obj, bool value, E= rror **errp) VirtMachineState *vms =3D VIRT_MACHINE(obj); =20 vms->virt =3D value; + /* + * At this point, HVF is not initialised yet. + * However, it needs to know if nested virt is enabled at init time. + */ + hvf_nested_virt_enable(value); } =20 static bool virt_get_highmem(Object *obj, Error **errp) diff --git a/include/system/hvf.h b/include/system/hvf.h index dc8da85979..0f0632f7ae 100644 --- a/include/system/hvf.h +++ b/include/system/hvf.h @@ -28,9 +28,14 @@ extern bool hvf_allowed; #define hvf_enabled() (hvf_allowed) extern bool hvf_kernel_irqchip; #define hvf_irqchip_in_kernel() (hvf_kernel_irqchip) +extern bool hvf_nested_virt; +#define hvf_nested_virt_enabled() (hvf_nested_virt) +#define hvf_nested_virt_enable(enable) hvf_nested_virt =3D enable #else /* !CONFIG_HVF_IS_POSSIBLE */ #define hvf_enabled() 0 #define hvf_irqchip_in_kernel() 0 +#define hvf_nested_virt_enabled() 0 +#define hvf_nested_virt_enable(enable) 0 #endif /* !CONFIG_HVF_IS_POSSIBLE */ =20 #define TYPE_HVF_ACCEL ACCEL_CLASS_NAME("hvf") diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index a22b544afe..a80c5f8384 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -27,6 +27,7 @@ #include "system/memory.h" #include "hw/core/boards.h" #include "hw/core/irq.h" +#include "hw/arm/virt.h" #include "qemu/main-loop.h" #include "system/cpus.h" #include "arm-powerctl.h" @@ -842,6 +843,10 @@ static bool hvf_arm_get_host_cpu_features(ARMHostCPUFe= atures *ahcf) (1ULL << ARM_FEATURE_PMU) | (1ULL << ARM_FEATURE_GENERIC_TIMER); =20 + if (hvf_nested_virt_enabled()) { + ahcf->features |=3D 1ULL << ARM_FEATURE_EL2; + } + for (i =3D 0; i < ARRAY_SIZE(regs); i++) { r |=3D hv_vcpu_config_get_feature_reg(config, regs[i].reg, &host_isar.idregs[regs[i].inde= x]); @@ -949,6 +954,15 @@ void hvf_arch_vcpu_destroy(CPUState *cpu) assert_hvf_ok(ret); } =20 +static bool hvf_arm_el2_supported(void) +{ + bool is_nested_virt_supported; + hv_return_t ret =3D hv_vm_config_get_el2_supported(&is_nested_virt_sup= ported); + assert_hvf_ok(ret); + return is_nested_virt_supported; +} + + hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range) { hv_return_t ret; @@ -960,6 +974,18 @@ hv_return_t hvf_arch_vm_create(MachineState *ms, uint3= 2_t pa_range) } chosen_ipa_bit_size =3D pa_range; =20 + if (hvf_nested_virt_enabled()) { + if (!hvf_arm_el2_supported()) { + error_report("Nested virtualization not supported on this syst= em."); + goto cleanup; + } + ret =3D hv_vm_config_set_el2_enabled(config, true); + if (ret !=3D HV_SUCCESS) { + error_report("Failed to enable nested virtualization."); + goto cleanup; + } + } + ret =3D hv_vm_create(config); if (hvf_irqchip_in_kernel()) { /* @@ -1110,6 +1136,13 @@ static void hvf_psci_cpu_off(ARMCPU *arm_cpu) assert(ret =3D=3D QEMU_ARM_POWERCTL_RET_SUCCESS); } =20 +static int hvf_psci_get_target_el(void) +{ + if (hvf_nested_virt_enabled()) { + return 2; + } + return 1; +} /* * Handle a PSCI call. * @@ -1131,7 +1164,6 @@ static bool hvf_handle_psci_call(CPUState *cpu, int *= excp_ret) CPUState *target_cpu_state; ARMCPU *target_cpu; target_ulong entry; - int target_el =3D 1; int32_t ret =3D 0; =20 trace_arm_psci_call(param[0], param[1], param[2], param[3], @@ -1185,7 +1217,7 @@ static bool hvf_handle_psci_call(CPUState *cpu, int *= excp_ret) entry =3D param[2]; context_id =3D param[3]; ret =3D arm_set_cpu_on(mpidr, entry, context_id, - target_el, target_aarch64); + hvf_psci_get_target_el(), target_aarch64); break; case QEMU_PSCI_0_1_FN_CPU_OFF: case QEMU_PSCI_0_2_FN_CPU_OFF: --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316574; cv=none; d=zohomail.com; s=zohoarc; b=kh5R9nH5CxT/2oEXFXDQRrfVcCdbgSu70VqlxovTjCjW5y1LaCskF5wpSIP4aCVf0gMUFiUBAPITsg34Qzsb2mkKu8YfO9GJARGOatRrM8PzYQBhnJnDntIphz/xY0bXDstOSypBcIgyvvMjww6c9XMTpuN0FcY3aE8ySDY+MLk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316574; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Ey38obQgB/4OZtOjl/rhIH61RioqpiOULYFmJqpqNgs=; b=SzuhkqrMKihca8LnoK3vAXmRWQ93aGiDooZ2QsbVyaAh9r0SPpzLeNjFjEb+7V07svTQJLILgtXH9EYDZKY9KRmRJJBT6w3Bw54QNPu51bhjyRY8D8/jGMCFOe6mYhWRDLKCu4DZqvYju6YC8aGNSiV8ve+GLCpEkq2IjSerkus= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316574081317.05172653602085; Sat, 28 Feb 2026 14:09:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUb-0002VQ-K1; Sat, 28 Feb 2026 17:08:57 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUa-0002UC-7c for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:56 -0500 Received: from qs-2004c-snip4-11.eps.apple.com ([57.103.84.33] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUY-0005ni-1D for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:55 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id B8632180011E; Sat, 28 Feb 2026 22:08:50 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id EE50F1800385; Sat, 28 Feb 2026 22:08:48 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316533; x=1774908533; bh=Ey38obQgB/4OZtOjl/rhIH61RioqpiOULYFmJqpqNgs=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=a57dWPgAcMR7b585XLGCCELI3/oUqq1vOlW5L3Hj0LmCIk+nP8+a8AzUCno/KUJFBQPNT9iJPYhkuxIaF1kucreSHZn5j931/pA7t9krjHax4YgnoRVwYBbSEyFgqvAXWQIwzbihbMRM4TPdLDgeM2j/lHp62VahKdz6VLtvyd/8jVs5tguaeYPWgbGWZAza5DwD42Ibd7Nb7R/HQxv4wvAmWKzxwRLEs33kXdehIcfLAqZh3j+mrUEf+RqunWNGoJMBqqJnTld9bt3u9H0fy6byl+c1eCBwkjIOLi0vNuIZ3mYa3k+jRlvgegSpFUiGo5Tu0HpoKt4rnpOjBe4udg== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 06/12] hvf: only call hvf_sync_vtimer() when running without the platform vGIC Date: Sat, 28 Feb 2026 23:08:31 +0100 Message-ID: <20260228220837.35275-7-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Info-Out: v=2.4 cv=MKZtWcZl c=1 sm=1 tr=0 ts=69a36773 cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=PzQS8Z__MZ2uSZov3vkA:9 X-Proofpoint-GUID: UGeJW5jBQj5s7_wykjPGQQptlZDtERhe X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfX8SSUcE/N/td/ OtmijG7/Olk3sJM72V8cZT62VovMu38reF0YcvRsJz9YdBC7PjuRJViQKvrLcrYyez7JblrXwe+ fUZr/SRgpqN/5zXf5Faz1mPnWFxt3q+WColbFk4AGJuOX/JSNPIl8L0A5uCRHCQ3+bBuskwkEXi Kfz4bqBnFsmyO3/buqkikAMso3D7rkK5tkK6nL8H5eSpbGBkTduoa/vKWREKeo7QczzcA4/S0cP HjFR9ljuk5Uy+WEMd3E6KbIONmF3WYi55QdSkJsesw0LyeCHgczQWOZSlop911EQS1FBCXLGZr5 PIwCjiKnSj+Bo61j0Y2tecuRyj2EMNmhJA2zbAlWntk4rQFAkr3b3w7b3Q/wHY= X-Proofpoint-ORIG-GUID: UGeJW5jBQj5s7_wykjPGQQptlZDtERhe X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=875 malwarescore=0 lowpriorityscore=0 suspectscore=0 spamscore=0 adultscore=0 mlxscore=0 clxscore=1030 bulkscore=0 phishscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABlRIcIlsQ8OqYKsGTo6K+96yIfi1T7Re4Lcs3Fx6GaOaFlYzCbGkAL2rLRMrXSP0D2OCJDrvARDxrgBEotR7DR2sNn7FAqEaoT4hfrJBAatGoN//9ZbmcY2cWD+8XJOS7oD7HNhTsLsGXDLajTEbPKZurhV7OHQ1Xiy8kXFZjh8L6GO2xVNsy4qsbIW5LKQtsZlQL+5NTQtrA47vSXFRrgxEhCw6JawvvHFVEI3c7OXzVYVgO9ZNL/hYoq27ElKESeRd45ofYyuSgnr2v6Vcx/7Tp4SH81fSSREAQTcMNHT2bxHQd1fvjsJne5UHPKWoDaqnyFB7NHFUzkEKRdJloSbQzhM0p8vcVc0yI+6bWulXCdEp3Gpu7fRKj8OakJS1RWq3K15zmmEpflCEpTsuTVBMLlWvhcuSDkIjXWmp4ljl9OQvBEjmmWrg/p5FZiS0iBki0LDMngmPjP9CuEUgSklEYlY0jdqDjik97A8KE14AXjKBK2oJxwNPVxBEMtK4yE8LrfzZN6lMfxEizN2cyzOQFDeCtain8M4G1POPtE9yoQApeq1tlB7L5UYto790AoJ5kqPi+tfQu3dZu7G4RRFafVZljwhCr3gMfY+xcD98mmYGSbEV7ZfEWQmWBm42rlwatXWpalXuPbvvoV0e2KhIsoqzM7dodfkzZfB0oQHyeMpQ370Mv+KBJCvIMGENwFdEPAeSY7UixWGCtifpqMBcO2JEz Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.33; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316576031158500 Content-Type: text/plain; charset="utf-8" When running with the Apple vGIC, the EL1 vtimer is handled by the platform. Signed-off-by: Mohamed Mediouni Reviewed-by: Mads Ynddal --- target/arm/hvf/hvf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index a80c5f8384..e0a51faf28 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -2052,7 +2052,9 @@ static int hvf_handle_vmexit(CPUState *cpu, hv_vcpu_e= xit_t *exit) =20 switch (exit->reason) { case HV_EXIT_REASON_EXCEPTION: - hvf_sync_vtimer(cpu); + if (!hvf_irqchip_in_kernel()) { + hvf_sync_vtimer(cpu); + } ret =3D hvf_handle_exception(cpu, &exit->exception); break; case HV_EXIT_REASON_VTIMER_ACTIVATED: --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316669; cv=none; d=zohomail.com; s=zohoarc; b=fcPTGnVlcqUp2CJpBoN3dU/Fa7dxoNOnBk4r1Y/M7Iw/XJZ/wqbp6BnNyimwNfheJTIg4Yz7uEodGBlUDvRQMboeCm9gRuqq6Jjw2glMTv9qYi6K8SYJ07U4YsIDtu7Zeg1QZXujcAIlJvKuHyFf0/wZSE8swUwIEMSsbyTaCZk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316669; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ZobmyIudfu7P7uUuPB0BU6gBIwq7faUFJCiyh8v9O8Q=; b=PPzLrqglQD+Xis/U3j68KjQ5IWP+/TwtxuM6KzhQh4+q87COY58MEQeeW1c9v14wroLls6GewYVvVelIECpi8MgZoJHdO+je7fksPJb7eS9DDous4MlEL9zNc+v0LCxwafoV/ccAd7I+RxjZ0+IqEZ6B33xSLIO6AYQo0pXPcjs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316669889435.5014064231849; Sat, 28 Feb 2026 14:11:09 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUe-0002X7-Fi; Sat, 28 Feb 2026 17:09:00 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUb-0002VA-Cz for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:57 -0500 Received: from qs-2004g-snip4-1.eps.apple.com ([57.103.84.64] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUZ-0005o2-Hp for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:57 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id 424CA1800394; Sat, 28 Feb 2026 22:08:52 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id 4AB6818000A4; Sat, 28 Feb 2026 22:08:50 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316534; x=1774908534; bh=ZobmyIudfu7P7uUuPB0BU6gBIwq7faUFJCiyh8v9O8Q=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:x-icloud-hme; b=DEEuF50qZr7o72gSyai+vXWWxOKL8xNg5wkWqvV6LWVo7tR7Gyt6z3hU68p4nwrLWJLfQuN5eIX4jAMe/7eYfwwtNeBd+P3v3lcpps6Pzdk3IYGr1VzVdtLNRMPwsu0+Q1IJ732UsKABywkXp03BTBXXpvIqPyNfmXOEBZIf/D4qznzO4RkyhUcoRYH7h6eGv0OxeKARJU9zAFyZEAtLV0SquWe+Dot+ALA9H+R/HBWrolI2U0J9BcdZ8Ideb6D+4SzJp8RznLcgI9qjk2f8Ij6jFsnT9y9AxIzPsv514+jVsjLmQID5lHHz0SuwUH23zF2ChfG/ZmmrpeHt4MzHGg== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v11 07/12] hvf: gate ARM_FEATURE_PMU register emulation behind not being at EL2 Date: Sat, 28 Feb 2026 23:08:32 +0100 Message-ID: <20260228220837.35275-8-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Authority-Info-Out: v=2.4 cv=b6K/I9Gx c=1 sm=1 tr=0 ts=69a36775 cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=KKAkSRfTAAAA:8 a=lOv7bB1OiAV5i3s2B4UA:9 a=NqO74GWdXPXpGKcKHaDJD/ajO6k=:19 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfXx4tl1eVnxX43 BfJaXYGKuGO5qoDIye1m6dmN2QuFXi4TFqDkDf5kscOxgljdmofyO8ndQ6gcBtColQD545v7T1h H9OPq1WAGKJNLpEMOqueUY7BKZod/SLsDBIdQYmAH30nu8jwloWcRdqGW79aapX0hUYNUM/G/uK vKiHl+Yj1ub8OUeNdOKwFZa3gkXcQzYQhq/wNPOnoXprP/jJ3jyedrtlNjaQ6rWyDRR23wvNTT4 VYoz9k1UZ1oFRS3JP2EvZ050d7O1rngT60Z2KEvW7idLMuE3eY8DxNGWVK438ZstnqJY2rFxB/g r/nlPq/t8iWsgcb6BGndcVwO3fcnF/5mV+VKGauIuHAE4niOAfqp/dZ8b3wJU0= X-Proofpoint-GUID: iGuvJBzpgvc235Rl_V9qHp_N8_2RV3-a X-Proofpoint-ORIG-GUID: iGuvJBzpgvc235Rl_V9qHp_N8_2RV3-a X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 lowpriorityscore=0 bulkscore=0 suspectscore=0 adultscore=0 clxscore=1030 malwarescore=0 mlxscore=0 spamscore=0 mlxlogscore=786 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABYxFkrOGdY18Y8CMDfVKWgJr9GLT7fBpuzIVPWChzAu+Hf03M1iYGSOBAa3PLaVOY4cddzR5EsaqOBDlRjkKgcQoZhfJ5GbwSlyqphK0/J1fHqsvZjrW41FI5GXxuTpTcl9uskBONy++2CVezhSVZ326So76mmgmNNbCJo3xOLWmECnFI44I13Kw79ObN54CwIZbVIeFYWcP+ORlg+gU5W8xar/RxxUCrdtanZwOnLVqgkTiUuwHkLMWSaa56F3HlH0u0C63QAvQeYEin5Nf6dwbAiPSz0dfp9vS3BUmsy51+KKW/ccp2kubB0cdsjTorqMe58Fz7qdWDb+0QI+eZVuum2Mdy9zdWMtcI2/vDONxOqDkSn6t0zYJNG4HdyBPgDTFXOB/UR2/4wjf7FA6wmoAciOD1w2vPuF4xD9AuPpTSEvQPx7mxMKTg58gNdpuURkQTAODp0NgJ2632omCg9EOnxTiYSMTMISv/EttpS2jOhkU4UkWQojzD+pRatELg+NIFxKy/APHUCvDgU/imTBYY9ybeLlUFqvHkp3pQNBCsVV6ig7wDTs8l+x5s7Oe2By5Qz05sWBwiXcQ+gwPFUPVYfmyx30g6oGvfKnE5uFu5M0vouCho/38a0vfjMVx+0jYDRPYM/3hom9BVwL7HWV3h45JNrY+B/Mt9NXEiRk6EvQSaqe3sAgRdb2+sWCeOILRj01lXN+HdYcULpHAcsnPeWV0VM98= Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.64; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316671765158500 From Apple documentation: > When EL2 is disabled, PMU register accesses trigger "Trapped MSR, MRS, or > System Instruction" exceptions. When this happens, hv_vcpu_run()=E2=80=AF= returns, and the > =E2=80=AFhv_vcpu_exit_t=E2=80=AFobject contains the information about thi= s exception. > When EL2 is enabled, the handling of PMU register accesses is determined = by the PMUVer > field of ID_AA64DFR0_EL1=E2=80=AFregister. > If the PMUVer=E2=80=AFfield value is zero or is invalid, PMU register acc= esses generate "Undefined" > exceptions, which are sent to the guest. > If the PMUVer=E2=80=AFfield value is non-zero and valid, PMU register acc= esses are emulated by the framework. > The ID_AA64DFR0_EL1=E2=80=AFregister can be modified via hv_vcpu_set_sys_= reg=E2=80=AFAPI. Signed-off-by: Mohamed Mediouni Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 --- target/arm/hvf/hvf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index e0a51faf28..be1ff93e0e 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -1285,7 +1285,7 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t re= g, uint64_t *val) ARMCPU *arm_cpu =3D ARM_CPU(cpu); CPUARMState *env =3D &arm_cpu->env; =20 - if (arm_feature(env, ARM_FEATURE_PMU)) { + if (!hvf_nested_virt_enabled() && arm_feature(env, ARM_FEATURE_PMU)) { switch (reg) { case SYSREG_PMCR_EL0: *val =3D env->cp15.c9_pmcr; @@ -1546,7 +1546,7 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t r= eg, uint64_t val) SYSREG_OP2(reg), val); =20 - if (arm_feature(env, ARM_FEATURE_PMU)) { + if (!hvf_nested_virt_enabled() && arm_feature(env, ARM_FEATURE_PMU)) { switch (reg) { case SYSREG_PMCCNTR_EL0: pmu_op_start(env); --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316627; cv=none; d=zohomail.com; s=zohoarc; b=GfALQgf2oBJHc7Zcpukk+FmpXoxNS5HB+ANLXmPWGpPOfOqZouJJ8+gTZ9sLKOd+NKeI7asmcBzj0Fg2GOqj/GFAoFLjU+LtKSfuuSHX73tEjYImgt2OgA6+Bg3xPTnk4KK2NiIq4Q/aPDSyfeYSeyqZYxe1Egx0JFP1KBnCFSc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316627; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=fXwYscBvvtHt1b3c45aaMrtykZ4/ZWPzlwZ5Y4HBqO4=; b=na/l9h4Tg2a7WlrudZHkBbTMRfRmjH3ndg2yIdh7IuOe7V1OA0fYVkECv/WElENQzskn/NkI4te6jAHGUzZp1tOcqg4cBgdAUBJzIhrDn6OCgF6zyA9bwkZcF2c7fbmo0uIq2tvdTM2unnTqFda/OpoLn2jB7emDwYgjHJElWh0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316627275485.46109325013595; Sat, 28 Feb 2026 14:10:27 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUd-0002Wf-TB; Sat, 28 Feb 2026 17:08:59 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUa-0002UT-Co for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:56 -0500 Received: from qs-2004l-snip4-1.eps.apple.com ([57.103.84.114] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUZ-0005ns-1l for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:56 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id 61DF11800385; Sat, 28 Feb 2026 22:08:53 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id CBC1718000A2; Sat, 28 Feb 2026 22:08:51 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316534; x=1774908534; bh=fXwYscBvvtHt1b3c45aaMrtykZ4/ZWPzlwZ5Y4HBqO4=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=B/SH/YzMbEFSBW2OH6rYgqc0mSVB6IBZhYU6ags34Xtr/T1VeuXzSM/s2iC2qZrRb4RzR/yryhknCtefaNHJFNoUV5kKiicRQWpV0U+qL0JstSSQwVDxyZi0+3HGzYvKUXTsAsaJTvkcFzav7G9j+fEetGhtjjp77ZhaUsU22R8dln3U7ulk2erW27hm7EAiBmxNH/ZzKb5dvOTE1vLgOA/qgAJ2SZszBjRRzIQnLKi6rVt4sDElIWTvxHtLTnHzl1vN/3wcB87LnFzXNKBSjVS+z7CxsozOQBWp0sxcPWxVI5ozYFY1l8q+bPwsmbFaNri5bMtF/kNHvZB8kzEAwg== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 08/12] hvf: arm: allow exposing minimal PMU when running with nested virt on Date: Sat, 28 Feb 2026 23:08:33 +0100 Message-ID: <20260228220837.35275-9-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: 7P18IvlC9nFEvwFcF1ZFtLAoh7f0oxFW X-Proofpoint-GUID: 7P18IvlC9nFEvwFcF1ZFtLAoh7f0oxFW X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfX2dSCV3lLx46t h2F55vEdWtCws9KcpPfcGK4Bv/OUEW/Y8XI1BxFmTGDGLmtvyHetotBXX+DP0bcL6JdwFbkMiei Km0EGc2e321hSBlLgrtx4KCuvvTXU9t0CQernJPTV6EI1TvUS1nV8TATDxCemET3V5EQzQgixJF +fpE9CKqGKpWYMaF38t43AbKfSZTHnhk7I3fEpnBvi0QkWfevsUhhIi/fbhikHe0gnjwvm0Xm6t Q2N+QBPkV1I3FA3lkdGKjzLLt4IxQ3rcaW/y56KH4ONYC1RGDnKON8Qu/03KlvXlpxFzdbDkUEt Q72zEj/iLqWibpcWIttk0X2wDfypYEJTwODgLsjQJBYDQk1kun/8eNE9ZnssG4= X-Authority-Info-Out: v=2.4 cv=Vpkuwu2n c=1 sm=1 tr=0 ts=69a36775 cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=z0ix_qRbhGH81XwssrYA:9 a=NqO74GWdXPXpGKcKHaDJD/ajO6k=:19 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 adultscore=0 phishscore=0 bulkscore=0 mlxscore=0 clxscore=1030 mlxlogscore=660 suspectscore=0 malwarescore=0 lowpriorityscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAAB1uY+4np86Dqz9E9mo8eK/1a+sKnhL8jXTuEBRpHD5d52rCrisEEmawhU22jX17DohBMtWv26JEDt5pdbAeEqxCjg8tiRWtckyDfIjQVAzFADahK3D0x9BiMFw/zpmHrE1wgfGSf0wQizaLeUKyyySaGerxR3CyOAD6T1WuY/LbbCdsXOh5h3FicFDaDGBK2xxxYfZRBDI+M0UQyw7GN2geqmk72UH9djBG8hrqNh8t3gqHrqLHM3vHazTtK5ltVJGjGRU5xI4IUh7b5c3r6B6wD94E7IeEqBJzjPkozfSrDK2jplHyYw1WF5E1MNh3J3oRH94qh8uhV1/S4uH94OOU++xGDJ7AU3BQFkrT78CEV+hIIChNYHEWEzvfhlh/H21I6+3DINwxdupliwzpGybgbMPe3+g7713vUlNQ5C1SGe6p/72R/Jx8VAMbueZ97gMXaPLWTw+PTmq3bqlim1/C+IpN08FpXmVFllZNZygJpMzE+uiNUi4oYpqQOogmM/T9R/hN8QlZSKqtdA/hUDYia6vZuMHRT9XxKfq4UiGbNYc3/Hh2sQzkp0WeaA2/1x0tdQ8Kk++wjqWuoIXIxJjElFevi/wdPnJKDTpykPoCdb7Ti3IiYCzat7IZ1Vx3r6NyhIjqxN7eJ6YE0lgvkBldFsTBBqcbJehpBlPHpV4jTcAoCu1fJWNdq5POKIS6DDJjZkyfk/Sv3nvf2+VvqeEDuGSeQ= Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.114; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316627430158500 Content-Type: text/plain; charset="utf-8" When running with nested virt on, a minimum PMU is exposed by Hypervisor.fr= amework if a valid PMUVer register value is set. That PMU isn't exposed otherwise. Signed-off-by: Mohamed Mediouni --- target/arm/hvf/hvf.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index be1ff93e0e..0f45e22221 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -879,6 +879,10 @@ static bool hvf_arm_get_host_cpu_features(ARMHostCPUFe= atures *ahcf) SET_IDREG(&host_isar, ID_AA64PFR1, GET_IDREG(&host_isar, ID_AA64PFR1) & ~R_ID_AA64PFR1_SME_MASK= ); =20 + if (hvf_nested_virt_enabled()) { + FIELD_DP64_IDREG(&host_isar, ID_AA64DFR0, PMUVER, 0x1); + } + ahcf->isar =3D host_isar; =20 /* --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316641; cv=none; d=zohomail.com; s=zohoarc; b=T9dDfk3cQNE6VhkenZAS075eI0mZo6iuv1TR2hqjXkmsUNPbn3chzgDI4uUB+O9n/IL7fZ8VhLSzW/wBALkyaxA4Y1dL2AJ+V2PTsWj5gd6cnLx3Xx/pIWsvleUZXlCgvZ8/1umNbYugmULUdjXd5YuFy3y21pO6Bb/+9FM1FyA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316641; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=1uKhzDlSbas1IjPvaDDAfrSs4GAL5M/GoOUNIoCOEjg=; b=kH1YnC+4CBn4l9hVaziB1ZYaYwTq7WUhah79CvOKtdUMBielGMkL5tHNZkFVo6xZf4CKneD44fs7irlQcOKto/HNALkB8AofeIeUP0+X4olS4I5o2SeywVt0D/Juecnx4M9zKI8JAtImeIdmoY3AJ551ikOUk3ieTCwcOOIjZNM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316641914796.0939915938691; Sat, 28 Feb 2026 14:10:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUe-0002Wh-0H; Sat, 28 Feb 2026 17:09:00 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUb-0002VX-Pe for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:57 -0500 Received: from qs-2004k-snip4-4.eps.apple.com ([57.103.84.107] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUa-0005oN-Cu for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:08:57 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id D302918003A9; Sat, 28 Feb 2026 22:08:54 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id 4A1B218003A3; Sat, 28 Feb 2026 22:08:53 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316535; x=1774908535; bh=1uKhzDlSbas1IjPvaDDAfrSs4GAL5M/GoOUNIoCOEjg=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=KhQoUASWzyCoJaQaEX4ucxNwsrDPgZZIMOaHV2/Zxtvkp5K4o0Ez1QMLswccPG3HXg2J7rqrVilw7OAKCOz9cfijPA8PSEeHqxj88ENKSDkMPhSLbCQ0g5JBB9O/DKjI0ed/gehikjtWdRBO9+Mnq/BD/91HSu3F6iE3F3AOnODzRXavtt3Osu4SObRPVaht5U414KqlCMDOS8CeL/JGYSS2OtOZj0WWAmzG6gYa1AC0ZEDU12BEXFZ3ZL3wTgVXJ0qD6DXo/hfH7NJP4bsxt/Qz0b/mUUwA3yWOyfIDIKIeXMXQdvp6nHrfNoUw8Xu11pjFKUa61TH+WGemSNkVng== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 09/12] target/arm: hvf: add asserts for code paths not leveraged when using the vGIC Date: Sat, 28 Feb 2026 23:08:34 +0100 Message-ID: <20260228220837.35275-10-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfXw+EI7f+p9QTU FZrkGUEyTjrmGuicgYFP+DIfVXNX5XxivQCkTOLFb1Nx5SHLylyQtGOZt4cPJut/sO/BG+WrbAZ x/LDV1IIUM42v44uU/cCp6OORW/RGPFtVBh3DAprKHP+ZItq12QlDlOJA4IxTg/IT3aYO7i9QZv NLXczhy+EjuADP+wGrGCX/HccIl6SYhYJfBBngzhfc3MVGLbfEzZ5oyBxsqmN3mwDJ3TB1XqIRv cltJthlKRLvnFX8LRCiDe3CbN/HhgH7T1YnmxUtXoRgAfpwwctiEal8GxKrL+Vp9NP3jWM2lGUU XpHI7m/7+XncSHJfuDBA7rBkfDWw2HvvAAb3wcLAvypGIQv7EGyIcwffnoSRIA= X-Authority-Info-Out: v=2.4 cv=bu1BxUai c=1 sm=1 tr=0 ts=69a36777 cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=vbFX7M0ab_H1AmF9bzsA:9 X-Proofpoint-GUID: Jl9xv1oSduLh_sYY-VklKA88RAQxf1IL X-Proofpoint-ORIG-GUID: Jl9xv1oSduLh_sYY-VklKA88RAQxf1IL X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 suspectscore=0 phishscore=0 adultscore=0 mlxlogscore=507 spamscore=0 malwarescore=0 clxscore=1030 mlxscore=0 lowpriorityscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABRQe/FeNm1cm0XN5jHI3FhFCFJ+pUNFBwvAJps+j17gkojDUB50zBAgcrY/ZGM9wAYJlY4fFljXbZOjchr0MuzbtG3ZR4Fzhz+WN2wncXLgABLWzbiuzDeog7vPt3qQFb6LlbDaQus83KMUtTUxOHVyCem7z6IvDAzvL8T/ewdggp11wWc4HoZgyKpefkaMCl+QNuwADv3qazonw3T2n1bY1hR99VlbP91EvmzJ/biO035j4H0G/uRMBvNuTaXQ/w94GOfJRKKZtKKXHDsUb7Xjam8kDyOIvtghxqWF6MPoRXdr+AHbrS+T+bzNHJkaQHhpJepZM3Z5cnqK4PTAwtOh216NpCjnQC22H1uwRNDwpnBBCTqsyYrzg+86MdkLCIVXSWkI/L1h3NOvJ99I7ZOfDDob5LaEJy9PuOMDEMB9L1QDPDHLxxSpnL/qYqivIsjq15p5y/XSLb8zyXTK6+TwF77VIgXuyXPKvCBdUY1yQ6vCwf+9vkQu1mf2HW2BDASbn6iLI0wt+RP13VmA8lElwI8kSDTK4af6HD44PiNSAPsii+Df+a759QB6v+aLKBMROvFVB3dth9A9pKfQ9Fbq1kOjplOg8ntob1BezDmPer1anZzGAtG+vxa3uyT4gMPRXHEeqkL/pnRa7LG4gTFd46AIUJK2/Zf+ahKosKutQs0mRRGWNR29pePsDB3KNreHS+AJp8YoE2VkMrxQ== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.107; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316643905158500 Content-Type: text/plain; charset="utf-8" When using the vGIC, timers are directly handled by the platform. No vmexits ought to happen in that case. Abort if reaching those code paths. Signed-off-by: Mohamed Mediouni Reviewed-by: Mads Ynddal --- target/arm/hvf/hvf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index 0f45e22221..0aae421ba6 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -1365,6 +1365,7 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t re= g, uint64_t *val) case SYSREG_ICC_SGI1R_EL1: case SYSREG_ICC_SRE_EL1: case SYSREG_ICC_CTLR_EL1: + assert(!hvf_irqchip_in_kernel()); /* Call the TCG sysreg handler. This is only safe for GICv3 regs. = */ if (hvf_sysreg_read_cp(cpu, "GICv3", reg, val)) { return 0; @@ -1655,6 +1656,7 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t r= eg, uint64_t val) case SYSREG_ICC_SGI0R_EL1: case SYSREG_ICC_SGI1R_EL1: case SYSREG_ICC_SRE_EL1: + assert(!hvf_irqchip_in_kernel()); /* Call the TCG sysreg handler. This is only safe for GICv3 regs. = */ if (hvf_sysreg_write_cp(cpu, "GICv3", reg, val)) { return 0; @@ -2062,6 +2064,7 @@ static int hvf_handle_vmexit(CPUState *cpu, hv_vcpu_e= xit_t *exit) ret =3D hvf_handle_exception(cpu, &exit->exception); break; case HV_EXIT_REASON_VTIMER_ACTIVATED: + assert(!hvf_irqchip_in_kernel()); qemu_set_irq(arm_cpu->gt_timer_outputs[GTIMER_VIRT], 1); cpu->accel->vtimer_masked =3D true; break; --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316607; cv=none; d=zohomail.com; s=zohoarc; b=Gj8DVVEOd1IZyTyiVv6Jz0Z7WC9FjjNZ5JNLSQJeth1cXdJO7U6BVAV3MqumqTg3oAqacZyo05QGeIb8kjmYX36jPp/Azym0FPbfex34L3wF+8hs8k5WF5SIibfm3uDOV+gtJ4qzDRBAco71C6HdazWx2vkbAOjAgs59e/Fshc4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316607; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=pEB1q+UBDvl45MTUrB6NLPUSLe0c6C6gSYXpXiwgtxo=; b=eWFcxx3WGQDA17jDEpBsKooP0jenG4BJomDXuW8+l9+Y9Ej0/pjVCo0HwxO/QfSo0RqaFAwv488KbOmY+j5RDrvvKuchiK0DD2mEBirF1Gs/EamJht0yuvy1u8Cp/j6cQd8eP0TkWwDGJJBVr56pxTGNFxognO5jQFwvGZIS1GQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316607708642.2281055670112; Sat, 28 Feb 2026 14:10:07 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUh-0002ZB-R0; Sat, 28 Feb 2026 17:09:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUg-0002YV-HJ for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:09:02 -0500 Received: from qs-2004l-snip4-8.eps.apple.com ([57.103.84.121] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUd-0005pI-Q5 for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:09:02 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id 95C7B180038B; Sat, 28 Feb 2026 22:08:56 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id B25E118003A6; Sat, 28 Feb 2026 22:08:54 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316539; x=1774908539; bh=pEB1q+UBDvl45MTUrB6NLPUSLe0c6C6gSYXpXiwgtxo=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=YZi6azaQVTta9i+X5ZyVMj/seXYXY/hv6n2N9m7tjBa9DRILkSpk5V+C4aeTFmZ7YKNYTlKNGCpsuGdEz/Ou2PNxBe3xi3/6GChgsWQTkx5mN6FnBu4TgihlgiHxhQmiCOMZrTCLGqBrzXayIimXVf7ubGLUykqAXVpwR7/IlNxpvz7tWubuMVrVvXh4Epd4tHmvp8jNwR2VPH+aBaUvyYo91APEMQKrSzGm73YDacNGm378iI/tvYQmpoXIsOt2pyIKHBUw0SL8m0asTUvp8wjBw/+8knBiEqJrKPZLCTtchTN89kNoqeoLrKdOJsYNSgm3/oztITpgxhaK9C3m9w== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 10/12] hvf: sync registers used at EL2 Date: Sat, 28 Feb 2026 23:08:35 +0100 Message-ID: <20260228220837.35275-11-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Info-Out: v=2.4 cv=Oa2VzxTY c=1 sm=1 tr=0 ts=69a36779 cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=rrAUKWPZoPk1NO14nDIA:9 X-Proofpoint-ORIG-GUID: wV82LRq8nvHQ-qaUbjfT9Hqw_6bq1fMl X-Proofpoint-GUID: wV82LRq8nvHQ-qaUbjfT9Hqw_6bq1fMl X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfX7X3ztpNbjm0L LRATxgUkdhIeCHTci+zGk7dsGnfeA6/sz/Aweep9jzIaH6ba/LSPRTn7gOPv+PdcEXiEiVCNEAh RWWkSGgyuEXF5JKYrocDb5EHXqcKHnq23X6DVTJ6d4C3ztGB56Aq2ZZrmlEXYLWpoKCyGFYN9ce Qf0CiWiO1E1j/pa/YGk6AIBmUSeY2Uyc2JtVGbQxp65gYVlw+VapogYwXrt8kn7SaBu31gb7fHI nxt5+/dQ8yYxd2a2WBNVQTUhz1+zhN0E9m9fNI4czGe03Y+e7eJAKzXB4ZM3yYjxU2Ljq24eOcx s4RQVU5jKAVrZ4kO2GkhHewqZzuIb7RhRVLWhsTEDEDqDxhwkjaqhl0meKK2f8= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 bulkscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 clxscore=1030 mlxlogscore=999 spamscore=0 mlxscore=0 malwarescore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAAB1MEuHofmJxH3oo+QArSdrL68NhWGQHjeu2DdlurHV17/0E9D7vYgZ+BjKmAHLPUh9MLpN9X9wotoi54ebB1xZXc0Y7nxYPHa0VJPn69wOOuOOXNVG65Wvv3tkwC10k+fj+1s3OYhXhs+0Nz3Rof784W2KfDiep1ax/qaCytTSpNraXgOXWjodtZ9OUBhTP1QF8Tzk1d0wqabyRMYVcRqmGkk94EHVHamZpJr+HJdcg9pLRhTa1oy6XI9H1r6WK05Wp2JAOKnvGxzCuff46+jOZJlNO1GT7Ef+AKbJe7/UNcz+gHw5MfWu8bB+Y/fZv7M0E+qzugB4kIDCQy1afpvYb4EFwll2BPIYPsXplzPH0mRap7IExtkVewKgyjhexqKQWbVlotw5uEhHNKJWQ3iZie3xvFlTZXrfy1RWG7f2ZVfsZnZBG5ISCb6GE/5Zf74ywQdWyI6Y9WQGiPVi+s1vV2E+En+OJTtfM+J1sOgAw7AjIUlsSizK0c1t/ltComlN5j6PZ+5cBOHPADPw9L/vMh9ckp2azIv+c4OE3K4ioIZH1+awrV411rE1O49Z3NqNwu2/DUPqKeLYN7SS1GAQc83UMx3STiTfSnSgun2JbfKmcvtTtwQ1WeU6eSoT/q9dreQqgNXwzXrx96qr10A21xj52I0e7G389KHb71TDfftEVl1Eu7JsH2DjavcIMQwrg== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.121; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316609821158500 Content-Type: text/plain; charset="utf-8" When starting up the VM at EL2, more sysregs are available. Sync the state = of those. In addition, sync the state of the EL1 physical timer when the vGIC is used= , even if running at EL1. However, no OS running at EL1 is expected to use those r= egisters. Signed-off-by: Mohamed Mediouni --- target/arm/hvf/hvf.c | 37 ++++++++++++++++++++++++++---- target/arm/hvf/sysreg.c.inc | 45 +++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index 0aae421ba6..f286e6a014 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -412,13 +412,34 @@ static const struct hvf_reg_match hvf_fpreg_match[] = =3D { #define DEF_SYSREG(HVF_ID, ...) \ QEMU_BUILD_BUG_ON(HVF_ID !=3D KVMID_TO_HVF(KVMID_AA64_SYS_REG64(__VA_ARG= S__))); =20 +#define DEF_SYSREG_EL2(HVF_ID, ...) \ + QEMU_BUILD_BUG_ON(HVF_ID !=3D KVMID_TO_HVF(KVMID_AA64_SYS_REG64(__VA_ARG= S__))); + +#define DEF_SYSREG_VGIC(HVF_ID, ...) \ + QEMU_BUILD_BUG_ON(HVF_ID !=3D KVMID_TO_HVF(KVMID_AA64_SYS_REG64(__VA_ARG= S__))); + +#define DEF_SYSREG_VGIC_EL2(HVF_ID, ...) \ + QEMU_BUILD_BUG_ON(HVF_ID !=3D KVMID_TO_HVF(KVMID_AA64_SYS_REG64(__VA_ARG= S__))); + #include "sysreg.c.inc" =20 #undef DEF_SYSREG +#undef DEF_SYSREG_EL2 +#undef DEF_SYSREG_VGIC +#undef DEF_SYSREG_VGIC_EL2 + +#define DEF_SYSREG(HVF_ID, op0, op1, crn, crm, op2) {HVF_ID}, +#define DEF_SYSREG_EL2(HVF_ID, op0, op1, crn, crm, op2) {HVF_ID, .el2 =3D= true}, +#define DEF_SYSREG_VGIC(HVF_ID, op0, op1, crn, crm, op2) {HVF_ID, .vgic = =3D true}, +#define DEF_SYSREG_VGIC_EL2(HVF_ID, op0, op1, crn, crm, op2) {HVF_ID, tru= e, true}, + +struct hvf_sreg { + hv_sys_reg_t sreg; + bool vgic; + bool el2; +}; =20 -#define DEF_SYSREG(HVF_ID, op0, op1, crn, crm, op2) HVF_ID, - -static const hv_sys_reg_t hvf_sreg_list[] =3D { +static struct hvf_sreg hvf_sreg_list[] =3D { #include "sysreg.c.inc" }; =20 @@ -1052,11 +1073,19 @@ int hvf_arch_init_vcpu(CPUState *cpu) =20 /* Populate cp list for all known sysregs */ for (i =3D 0; i < sregs_match_len; i++) { - hv_sys_reg_t hvf_id =3D hvf_sreg_list[i]; + hv_sys_reg_t hvf_id =3D hvf_sreg_list[i].sreg; uint64_t kvm_id =3D HVF_TO_KVMID(hvf_id); uint32_t key =3D kvm_to_cpreg_id(kvm_id); const ARMCPRegInfo *ri =3D get_arm_cp_reginfo(arm_cpu->cp_regs, ke= y); =20 + if (hvf_sreg_list[i].vgic && !hvf_irqchip_in_kernel()) { + continue; + } + + if (hvf_sreg_list[i].el2 && !hvf_nested_virt_enabled()) { + continue; + } + if (ri) { assert(!(ri->type & ARM_CP_NO_RAW)); arm_cpu->cpreg_indexes[sregs_cnt++] =3D kvm_id; diff --git a/target/arm/hvf/sysreg.c.inc b/target/arm/hvf/sysreg.c.inc index 067a8603fa..bda35afbd0 100644 --- a/target/arm/hvf/sysreg.c.inc +++ b/target/arm/hvf/sysreg.c.inc @@ -145,3 +145,48 @@ DEF_SYSREG(HV_SYS_REG_TPIDRRO_EL0, 3, 3, 13, 0, 3) DEF_SYSREG(HV_SYS_REG_CNTV_CTL_EL0, 3, 3, 14, 3, 1) DEF_SYSREG(HV_SYS_REG_CNTV_CVAL_EL0, 3, 3, 14, 3, 2) DEF_SYSREG(HV_SYS_REG_SP_EL1, 3, 4, 4, 1, 0) + +/* + * Block these because of the same issue as virtual counters in + * that caused the revert in 28b0ed32b32c7e5094cf2f1ec9c0645c65fad2aa + * + * DEF_SYSREG_VGIC(HV_SYS_REG_CNTP_CTL_EL0, 3, 3, 14, 2, 1) + * DEF_SYSREG_VGIC(HV_SYS_REG_CNTP_CVAL_EL0, 3, 3, 14, 2, 2) + */ +#ifdef SYNC_NO_RAW_REGS +DEF_SYSREG_VGIC(HV_SYS_REG_CNTP_TVAL_EL0, 3, 3, 14, 2, 0) +#endif + +/* + * Also block these because of the same issue as virtual counters in + * that caused the revert in 28b0ed32b32c7e5094cf2f1ec9c0645c65fad2aa + * + * DEF_SYSREG_VGIC_EL2(HV_SYS_REG_CNTHP_CVAL_EL2, 3, 4, 14, 2, 2) + * DEF_SYSREG_VGIC_EL2(HV_SYS_REG_CNTHP_CTL_EL2, 3, 4, 14, 2, 1) + */ +DEF_SYSREG_VGIC_EL2(HV_SYS_REG_CNTHCTL_EL2, 3, 4, 14, 1, 0); +#ifdef SYNC_NO_RAW_REGS +DEF_SYSREG_VGIC_EL2(HV_SYS_REG_CNTHP_TVAL_EL2, 3, 4, 14, 2, 0) +#endif +DEF_SYSREG_VGIC_EL2(HV_SYS_REG_CNTVOFF_EL2, 3, 4, 14, 0, 3) + +DEF_SYSREG_EL2(HV_SYS_REG_CPTR_EL2, 3, 4, 1, 1, 2) +DEF_SYSREG_EL2(HV_SYS_REG_ELR_EL2, 3, 4, 4, 0, 1) +DEF_SYSREG_EL2(HV_SYS_REG_ESR_EL2, 3, 4, 5, 2, 0) +DEF_SYSREG_EL2(HV_SYS_REG_FAR_EL2, 3, 4, 6, 0, 0) +DEF_SYSREG_EL2(HV_SYS_REG_HCR_EL2, 3, 4, 1, 1, 0) +DEF_SYSREG_EL2(HV_SYS_REG_HPFAR_EL2, 3, 4, 6, 0, 4) +DEF_SYSREG_EL2(HV_SYS_REG_MAIR_EL2, 3, 4, 10, 2, 0) +DEF_SYSREG_EL2(HV_SYS_REG_MDCR_EL2, 3, 4, 1, 1, 1) +DEF_SYSREG_EL2(HV_SYS_REG_SCTLR_EL2, 3, 4, 1, 0, 0) +DEF_SYSREG_EL2(HV_SYS_REG_SPSR_EL2, 3, 4, 4, 0, 0) +DEF_SYSREG_EL2(HV_SYS_REG_SP_EL2, 3, 6, 4, 1, 0) +DEF_SYSREG_EL2(HV_SYS_REG_TCR_EL2, 3, 4, 2, 0, 2) +DEF_SYSREG_EL2(HV_SYS_REG_TPIDR_EL2, 3, 4, 13, 0, 2) +DEF_SYSREG_EL2(HV_SYS_REG_TTBR0_EL2, 3, 4, 2, 0, 0) +DEF_SYSREG_EL2(HV_SYS_REG_TTBR1_EL2, 3, 4, 2, 0, 1) +DEF_SYSREG_EL2(HV_SYS_REG_VBAR_EL2, 3, 4, 12, 0, 0) +DEF_SYSREG_EL2(HV_SYS_REG_VMPIDR_EL2, 3, 4, 0, 0, 5) +DEF_SYSREG_EL2(HV_SYS_REG_VPIDR_EL2, 3, 4, 0, 0, 0) +DEF_SYSREG_EL2(HV_SYS_REG_VTCR_EL2, 3, 4, 2, 1, 2) +DEF_SYSREG_EL2(HV_SYS_REG_VTTBR_EL2, 3, 4, 2, 1, 0) --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316572; cv=none; d=zohomail.com; s=zohoarc; b=CZSqTNT+SnmQosu6Cs3yKlHNKcjMvEeF41OspMnKAAYY8JLjt4hJP3j8KaB/PanzoQ4pXCDL6eWOUqc6mp+QW6panKCttX5bjHvQxvC8+/kHx3PWdUuByXeOYxfXFqGf03TW7VJHJ9KaiuvrRSvxbtbXziCrPbMNxqSnkcu6j0Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316572; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Y6XyA1f2arTOnceFjb8L6hyLWH6tKlG/yXeOWw4vtXA=; b=SjAPBOMnnJVVaK30IBGGzmV1JcOJidCmehFXm+kkYTosg2iOhPCN/EWcu0p3245uZ3L1N8g8b1vf4Bm/ja9yrsXImi4ML+xVzGrSOaB83CVoEJTsG6ga/Nj546wdrx6+WxIhe6ye2FJOdFyHbzKWyXawZYwhPCJEKAw2LO6Ga2s= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316572908451.4358158450459; Sat, 28 Feb 2026 14:09:32 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUg-0002Ys-RA; Sat, 28 Feb 2026 17:09:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUf-0002XQ-3K for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:09:01 -0500 Received: from qs-2004j-snip4-4.eps.apple.com ([57.103.84.97] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUd-0005pM-NR for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:09:00 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id D76DF18000BB; Sat, 28 Feb 2026 22:08:57 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id 2E4D6180013A; Sat, 28 Feb 2026 22:08:56 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316539; x=1774908539; bh=Y6XyA1f2arTOnceFjb8L6hyLWH6tKlG/yXeOWw4vtXA=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:x-icloud-hme; b=AK51YNkiswPcqm0R073U3/mWtepRuDUiNLy+OiUX7iAEzzZWJcCRv0v3EGPxlHL1g7O2X2laEIQ+RpZ/LPL7blU526NqIY/Et8WMC39RbaiC1wA0zJWsZOdGMGRGmxY7xPmLGM4ILrgI3Gre7QHfC5xdybNPJYZnoBmfrBhz1EfoyiFz9PczmhACMcl7d04Qw9AdsJV3Sh5vvXe50EDjP+J7ksTcUB54LKzsA6rHW3WCfOOX+tIDYBLKW1WQKlDCBa+99efEWQZo8tBPEfT0e1rWIYCLQm7BZvflOXayEASwQvLs5hgfNYvW9CczgVhxqMkHkoNuU5U5lAp1v2UpMA== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v11 11/12] target/arm: hvf: pass through CNTHCTL_EL2 and MDCCINT_EL1 Date: Sat, 28 Feb 2026 23:08:36 +0100 Message-ID: <20260228220837.35275-12-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Authority-Info-Out: v=2.4 cv=MMttWcZl c=1 sm=1 tr=0 ts=69a3677a cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=KKAkSRfTAAAA:8 a=L1bH-B2CdzmaWMF7168A:9 a=NqO74GWdXPXpGKcKHaDJD/ajO6k=:19 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-GUID: D-Os1W74FdizXDcUohL04NgqcuLjZJv7 X-Proofpoint-ORIG-GUID: D-Os1W74FdizXDcUohL04NgqcuLjZJv7 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfX6FvFBP/SrP5r PzxuJg4/eoFukrow90qbUJxXCq/v+IRorQ3zlJyZRIwDHlmssfaCf+DopvMZFpnYgQ6USnDT4No xe0wB9MMzJRd6lddB1AbZJAFGxyzdBLp4kw4Lp98jel3WKbkOrYB0iYiun7DzIxkJNCMP6FUzjN YqghDNbiOyJ84o54zs42GGVZieyjLkaJuBIDaT4bLC/R0R67RzJRwU2ak9RuptuDArUDufhB/43 OLSxOxGyPB43fEi4KvlM8HV0PSuRH85EXfnDZGncwtx8Bq3B+mX0S9jGCe7Lzjd3nPvxv2ngX9X MYWfI+DP9CvOgU8lIUyStwBz9W1OKA13wZax/D6m1Q9LtNEetmPiY/9bUWIAfM= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxlogscore=680 mlxscore=0 bulkscore=0 spamscore=0 lowpriorityscore=0 adultscore=0 malwarescore=0 clxscore=1030 phishscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABO1U+7hH3nVf4X0oNKjBfbXU+d6cQ1zjpfJfdz+V7ZXTRakBjEyj1WCHF6FB44LXlxcOVZK+64iRewhu2Ag9mgmtYqjLmL+dBbNcueOxNXznXVsngAYqUdLDpuR7R3Yfcr9avVQeMHMPOQUTqYSyWgdqdnmL2prSVKf55eyJuRy2FxF/njmxREQUt7HJS21Crh7C7W99KhLlU5EjGv9c0qZPl00Kr6Y18UL9tuJYWcJpf2K0nk9k8djQPUkHmn4Rk2HD84F285CViXKMtqjDmKeHxbiLj5i9zrqsw9iSSnclDfcA80vdJ/jeAGrag5DOt6KLa3a8KSUcQz7W6FVf+95wWPA1zN2rpxSUgfdueIE9+bBAmuI/HKDBrGjYKt2aWzKQ2fnQU7lPwINKqnmzvLPeODyr5GjiikqnwiZGVdTLd6HL0nyb9Ars0kPZNowq+f4LkfEUyNIpxN9iQ/cAMCUIlX3gMS5F33adLa5f2mZp0ZO0iKBtHMJrb0zKZLLbz5EDOnqZnV6MDNVhYsYmPAt8OIoChW0SWoTqsx7xs+Fp69UZMGUdqagsJFi1BXjqVwxnrID66+jfYJV9dY/1iQ25xW7xUm3l12tcas/FVb6yXmmOAThV+R03FibLQSeIHU1MCT4LgDMI0nGIEHdpiPkjVldn3CtuyyThhgTVIRg2FJwNG3rrNhHQREBuC3mBpqJf7EHtH+PgCww0dCchqi/EH/cxnIDOFS2LQ Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.97; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316576024158500 HVF traps accesses to CNTHCTL_EL2. For nested guests, HVF traps accesses to= MDCCINT_EL1. Pass through those accesses to the Hypervisor.framework library. Signed-off-by: Mohamed Mediouni Reviewed-by: Philippe Mathieu-Daud=C3=A9 Tested-by: Philippe Mathieu-Daud=C3=A9 --- target/arm/hvf/hvf.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index f286e6a014..8d537b6201 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -296,6 +296,10 @@ void hvf_arm_init_debug(void) #define SYSREG_DBGWVR15_EL1 SYSREG(2, 0, 0, 15, 6) #define SYSREG_DBGWCR15_EL1 SYSREG(2, 0, 0, 15, 7) =20 +/* EL2 registers */ +#define SYSREG_CNTHCTL_EL2 SYSREG(3, 4, 14, 1, 0) +#define SYSREG_MDCCINT_EL1 SYSREG(2, 0, 0, 2, 0) + #define WFX_IS_WFE (1 << 0) =20 #define TMR_CTL_ENABLE (1 << 0) @@ -1368,6 +1372,14 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t r= eg, uint64_t *val) case SYSREG_OSDLR_EL1: /* Dummy register */ return 0; + case SYSREG_CNTHCTL_EL2: + if (__builtin_available(macOS 15.0, *)) { + assert_hvf_ok(hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_C= NTHCTL_EL2, val)); + } + return 0; + case SYSREG_MDCCINT_EL1: + assert_hvf_ok(hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_MDCCI= NT_EL1, val)); + return 0; case SYSREG_ICC_AP0R0_EL1: case SYSREG_ICC_AP0R1_EL1: case SYSREG_ICC_AP0R2_EL1: @@ -1656,6 +1668,14 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t = reg, uint64_t val) case SYSREG_OSDLR_EL1: /* Dummy register */ return 0; + case SYSREG_CNTHCTL_EL2: + if (__builtin_available(macOS 15.0, *)) { + assert_hvf_ok(hv_vcpu_set_sys_reg(cpu->accel->fd, HV_SYS_REG_C= NTHCTL_EL2, val)); + } + return 0; + case SYSREG_MDCCINT_EL1: + assert_hvf_ok(hv_vcpu_set_sys_reg(cpu->accel->fd, HV_SYS_REG_MDCCI= NT_EL1, val)); + return 0; case SYSREG_LORC_EL1: /* Dummy register */ return 0; --=20 2.50.1 (Apple Git-155) From nobody Mon Mar 2 08:45:02 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1772316602; cv=none; d=zohomail.com; s=zohoarc; b=nvMzfw/wrccdTZhJxO6PYJxxdbYdmOWliwElc229V9AgATQXMGQPc6c7DB/4tK3UD0RRyJY9AKVxFJcjciOLUw/lX2M6h4cqd0kyFEh+zfxFEgFxCXj7x0IxtIYvFbYn1K3BySnO42u5lvYyweGGBb95O3UJNHtWGxAdeaqZIjo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772316602; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=noRRGPyIxt6k8TuB+IhP3+kP/Xn5iPl83TtkVUKS/A4=; b=QklC+gCRXKFwZiXTdSDfiFQHIGCKVpbZ5OhkDSFk+Yq6qLLoTXlMjsEnI3WBTHpMtUyZ9o9cH5DcGPmGlYNVDCGBZ2VhnDhd3hpduLmQPyuDlyvzEpBBoqFUOdtqTjZuKyroA94M3KQIBEjfS3xpTcf3eIa+HWIQjB4sJ08Tw7k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772316602777416.09965548289415; Sat, 28 Feb 2026 14:10:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwSUj-0002aD-DR; Sat, 28 Feb 2026 17:09:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUi-0002ZP-0g for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:09:04 -0500 Received: from qs-2004j-snip4-8.eps.apple.com ([57.103.84.101] helo=outbound.qs.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwSUg-0005pz-Lz for qemu-devel@nongnu.org; Sat, 28 Feb 2026 17:09:03 -0500 Received: from outbound.qs.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPS id 94043180012D; Sat, 28 Feb 2026 22:08:59 +0000 (UTC) Received: from localhost.localdomain (unknown [17.57.155.37]) by p00-icloudmta-asmtp-us-east-2d-100-percent-9 (Postfix) with ESMTPSA id B148618000AF; Sat, 28 Feb 2026 22:08:57 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1772316542; x=1774908542; bh=noRRGPyIxt6k8TuB+IhP3+kP/Xn5iPl83TtkVUKS/A4=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=N0Y3tiXC+MFt7U0AMbUdeUhKpjIoKOV9JhzLhIw7eTmI08eRmd82uybSDTmlE8GQtguffa+qNm7yEXpR0MiCfCfRa0o5nzrQmJ4g1hl9QCx5p0wOE4gfTaUWKfo7cjQUDuZC7qAA4xmGBrcpp4FRxPkZHPoorVkwQmOZOA9qGvXS+WMciPHX3fBkM7tFzx/Hl2flPIdDnD2dIybxzF9BSWaH4cc9Vbrj/5hSpAiLMalkjah5g5LjVs1zym9bFVjf5r1MMvP4S2JQ8+ZmKClOJGAErqqz086a5H9r2JBpluNjDiwAQ13TUt+GZCHDq3pWBl56ptsVnyFo4vMORdi+JQ== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Peter Maydell , Phil Dennis-Jordan , Paolo Bonzini , Alexander Graf , Mads Ynddal , Cameron Esfahani , qemu-arm@nongnu.org, Roman Bolshakov , Mohamed Mediouni Subject: [PATCH v11 12/12] hvf: enable nested virtualisation support Date: Sat, 28 Feb 2026 23:08:37 +0100 Message-ID: <20260228220837.35275-13-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228220837.35275-1-mohamed@unpredictable.fr> References: <20260228220837.35275-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: XKudXIwO3cqAeosVPEqqUbJa1WUlu03H X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI4MDIwNyBTYWx0ZWRfX8Ujd1VUzaCJh uTo5jMB+pVJ80wbPI63zux4wR45nb2DwFd2mgfdifGVOCOivFPj6v0oCgEkKl75AQDu2ptPU57A 6Nuav6WIr/TOR5jPbCT60463ljS0S669zCBpY/z672rEXyds4Yi3esZZgzoBjkfa85ogwfdk8va /QZt1zkKub9HP8at9RzfEVNPz/fRP4cfY4kqqw6Tdhznz5VpBnfbNmC8DthRtwXfFmdklCHOf3k aUdZvKOmDLiDQ6k1uUnUiN9QSYDhNZmakUAsZyFKQBfp7367nEpHF9D187DolJMzKx48lVpeefP tWZsU6VMcjUpwoJUiNouAlMIL2T2xrhrMD2A6lYDWDn2Cv1+zznl76iiOVmfh0= X-Authority-Info-Out: v=2.4 cv=fPw0HJae c=1 sm=1 tr=0 ts=69a3677c cx=c_apl:c_apl_out:c_pps a=bsP7O+dXZ5uKcj+dsLqiMw==:117 a=bsP7O+dXZ5uKcj+dsLqiMw==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=cdDYXil7g4BivNFjHqQA:9 X-Proofpoint-ORIG-GUID: XKudXIwO3cqAeosVPEqqUbJa1WUlu03H X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-28_07,2026-02-27_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 spamscore=0 lowpriorityscore=0 phishscore=0 malwarescore=0 clxscore=1030 suspectscore=0 mlxlogscore=957 adultscore=0 mlxscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602280207 X-JNJ: AAAAAAABC7bHZ8h9Fl0Eoth43obTZFSqdFjzEfN0i233Ac+W1ZxxTCFKbu6xgLTXR0gFHXovfyw3Q00dxudUNjgtN1yFQDgqcIjRrFF1/bKE+COe4+NrYe2c3F7OXgGhe+2WyxhSnZKs34lRPsncYMGoHuyQB7I4SoLd1eux5WftFGv8u0nyfkyyFVFlyTaHNICjkZNU9WgdCbRjjnB51gzoCVKWTYv5mVsFLS7F8/FTPl4SRbapHN86fpflU0iYsxtHP0kf4YsQlR9UeK62ignlERSs/t0oj14ZpmvMRBc3M5xB0yfUVCk313txDhrGR96flYWlP1OWtY+v9wwwMV8ODnKLlUVpJAO3H6QswgtiWRyxchAfo6jZii8CqSsAPDG8KCHv6CBC5ykdz4jmC2SjmvG0k4ryEPj+uzmTI8B8LO+OopM1u3egpi29uknvMRr/fNbPB8U1753H/Xx02Zp2VwGOw1mPRpxsxaBeEgYaQA4lOU426Fey9GCgvewc4hlTyTcjkOIdQr/xhYPapMHku0pr59UqnAa4rkYjTHOxtnFmxwyy5K35IVwqbxCIikozj8jgBSLdqlCFbQRkAX63Y406DAwyG+svnJFGvgcXyLVoSnNOeUsLeNJfekXi38JKzzLCWouc3bT2fxZrp5h/dr7hUx8NHYS8oA2KiRXCm3vEro8P0diAsUX/zglAmqueXhi78lesoUh5r370oIoUeCs= Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.84.101; envelope-from=mohamed@unpredictable.fr; helo=outbound.qs.icloud.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.966, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.722, SPF_HELO_PASS=-0.001, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1772316603847158500 Content-Type: text/plain; charset="utf-8" Signed-off-by: Mohamed Mediouni --- hw/arm/virt.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 3fa4f41821..731ada5d28 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -2394,13 +2394,20 @@ static void machvirt_init(MachineState *machine) exit(1); } =20 - if (vms->virt && !kvm_enabled() && !tcg_enabled() && !qtest_enabled())= { + if (vms->virt && !kvm_enabled() && !tcg_enabled() + && !hvf_enabled() && !qtest_enabled()) { error_report("mach-virt: %s does not support providing " "Virtualization extensions to the guest CPU", current_accel_name()); exit(1); } =20 + if (vms->virt && hvf_enabled() && !hvf_irqchip_in_kernel()) { + error_report("mach-virt: For HVF and Virtualization extensions " + "only kernel-irqchip=3Don is currently supported"); + exit(1); + } + if (vms->mte && hvf_enabled()) { error_report("mach-virt: %s does not support providing " "MTE to the guest CPU", --=20 2.50.1 (Apple Git-155)