From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441066; cv=none; d=zohomail.com; s=zohoarc; b=JQCiIVYxflmMkPiwqaRduSoojTSN4uELAQYn68Fi9WAroeTQb6Ovj++dqaVrLLTLSOwVZdcJBt9uIXCslEYSsH45XqD1gWl9NaaiSa5j8lhDkreM/jm9xJvC7GZP8YzSMXMuvqhRCl3g/Blo+Lkvfc3PhS5sSf3PMJzt0J4IDXQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441066; 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=q5qZgLNKA9poYeTAUmYdiWdVUJItW4x3tAQyKyP+eAk=; b=nyDtSFzaFYnKLPYRHOHomNf5/HkkEn+0hL4E3/PexHcSbhPBfUBUdLWtGh2hRI7XsVTIqZ3+y44XIL1mnSK7zGn9plJCQFmOSoCxb94Dk0aJlXDiGpYoK7Xy7K0VxjXpol65eOFZKrXtV4ITaA/EZLrF4hD1+BJt8l/dfJDRe0A= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441066128891.4148837238904; Mon, 2 Mar 2026 00:44:26 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwysi-0001ST-Uk; Mon, 02 Mar 2026 03:44: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 1vwysY-0001Oz-PF for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:43:52 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwysV-0001Tq-I2 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:43:50 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-145-esP3egdwOjaYCOObQTIlRQ-1; Mon, 02 Mar 2026 03:43:45 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4836cc0b38eso46174165e9.2 for ; Mon, 02 Mar 2026 00:43:45 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b4175fd2sm9780766f8f.14.2026.03.02.00.43.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:43:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441026; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=q5qZgLNKA9poYeTAUmYdiWdVUJItW4x3tAQyKyP+eAk=; b=KwE50Ukw8Fslm4F/ag2wAPP2SAbBVbkBIZgUc0JKXNUD58v2QHoT0Tjywa8n/3OC7OvoWj u6lR9cMWU9id/kziedVJrEK4Lg1ywOx1Q2xLREjgcY9h/0JKWXT7+poBQsF5Z6GYB5T15/ YZePI6IEVm/nqxRugkGny13TjS3pxiM= X-MC-Unique: esP3egdwOjaYCOObQTIlRQ-1 X-Mimecast-MFC-AGG-ID: esP3egdwOjaYCOObQTIlRQ_1772441024 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441023; x=1773045823; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=q5qZgLNKA9poYeTAUmYdiWdVUJItW4x3tAQyKyP+eAk=; b=GPdKkRMyDJLSnR6Cp/wXb4/CExpSd9qdV6N6gmO62rlZQTuAkW8Jp8r59ycKBJ95VU 6lcwVM9KL+m/EDYgiaJfFNwydxjQI+gvYsQ1A8zni2UubSC+ZIiqTCad4zBfSw1J4cxT AxKaZyhYoaiI/REGSNJi8fteCyrVtURYGsWqhFQtGAEI/mXE7MBprLSQxqZH3l/sCnLi sDY7iVw4SuESa5nD1UaoVdl/3M94AKpEvIY0/bykI4vmxvppbbGNIXXJsikahGxia3xj nhbT41KK7wL8+1L9GlnupxH3p5yhZbpAYlWVo/r25B0HkGG5Vln7UCMex72c2GWcPI/c gxdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441023; x=1773045823; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=q5qZgLNKA9poYeTAUmYdiWdVUJItW4x3tAQyKyP+eAk=; b=Oyd4fUiwyMa63ZPbESIt2na2CFmY4tgvKPRvuPZSzjV3fOQr9xQkCBEuWKnvwHl5Yl nFm5V5W1LGwZeemFccfWU/BJ85XdrOHDCqndU9RZjaaeWVBpj1m4xTybpJg+6zBkKM6C zTn2tJzwr4gjkZZgHqnvVqaLyXJ7sbCaLcImJYpBaNaAB9d1bVr+jB89wEYxws35cjwX 6HzzicWL7KviUu+np4P7tfdPlqTYmWCVDRn1Vwbgw+/wQtTpW7dHtnjsml63LdkKNQeE ORpFBmzqjQZu3JaXXhRvkyk3yEWDQISYsuZNMBwG4Grz2GaLqp2Nedl+X2kCUg+Wp8pC tOSA== X-Gm-Message-State: AOJu0YxzxAI4Hc9Qm+FN6WQWunQ5BudRtR0a8e7AKvMiRcaowC+57Edr KR11ZhsTKAh+r9pRQKjIy1RO1w3Y2tX7HG/RFKQfTNwy9bkJFurvDtJVq3sqOylJUTza54A17fq hW0ZOAUpuI67xE8hTakdEFmoL/OE+GkVfMl7c3d6krJrjCR0AWBCKFx+N2FuWA4kUmarke32b0x UyA+PJ1wSaWroSmSnrAp4VEj/Jc3MMmEeGptF1v/Hp X-Gm-Gg: ATEYQzw85Ahs9LPmrvkR0L2SdZG+PAI9+2IPEKnGToNAuISdArRz169bSfA4En49Pn/ Nt8ReY02M2ucMnhDsKWp0c4Be+N6tbK5gu1Uum6y1H67miyuc/AVpOHzF6WdSmWnKzqE67z9uKJ jiXrObMNr6Q73dzpkyRJCPFf1Xmvgx0/E1s2Fnng35uOnQqOTRPuJ7bGklF1I5aWsLnh7mTgPJn XDKg+MRIsjJbkcVMdNjmMxxtuxB99hLEZyIGDwLK16GEGL4Fh6hJbN9tOt5bPnzYuLeQ6thW0F7 a0hYJU45o1T5071AIFKoQ5j1nAxQF4sjxnRmJFrkRF61VKl9Fjo6t8VMLZ7Znhkpk3hSbxiPVCq be6C1Hjab83GTm2YgaSftd4kdo12aJB0rrZpUac3pp5GqSlnOcLI87sUMFAIXyGNXjtHDSm42+q 4MSWdInquYD9/ueDwZGP0mVtp4f7o= X-Received: by 2002:a05:600c:699a:b0:471:700:f281 with SMTP id 5b1f17b1804b1-483c9bf44e8mr182307385e9.25.1772441023233; Mon, 02 Mar 2026 00:43:43 -0800 (PST) X-Received: by 2002:a05:600c:699a:b0:471:700:f281 with SMTP id 5b1f17b1804b1-483c9bf44e8mr182307005e9.25.1772441022669; Mon, 02 Mar 2026 00:43:42 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Josh Poimboeuf , Justin Forbes , Alexey Makhalov , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-stable@nongnu.org Subject: [PULL 001/102] hw/i386/vmmouse: Fix hypercall clobbers Date: Mon, 2 Mar 2026 09:41:56 +0100 Message-ID: <20260302084338.473368-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441069814158500 From: Josh Poimboeuf Fedora QA reported the following kernel panic: BUG: unable to handle page fault for address: 0000000040003e54 #PF: supervisor write access in kernel mode #PF: error_code(0x0002) - not-present page PGD 1082ec067 P4D 0 Oops: Oops: 0002 [#1] SMP NOPTI CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.19.0-0.rc4.260108gf0b9= d8eb98df.34.fc43.x86_64 #1 PREEMPT(lazy) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS edk2-20251119-3.= fc43 11/19/2025 RIP: 0010:vmware_hypercall4.constprop.0+0x52/0x90 Code: 48 83 c4 20 5b e9 69 f0 fc fe 8b 05 a0 c1 b2 01 85 c0 74 23 b8 68 5= 8 4d 56 b9 27 00 00 00 31 d2 bb 04 00 00 00 66 ba 58 56 ed <89> 1f 89 0e 41= 89 10 5b e9 3c f0 fc fe 6a 00 49 89 f9 45 31 c0 31 RSP: 0018:ff5eeb3240003e40 EFLAGS: 00010046 RAX: 0000000000000000 RBX: 000000000000ffca RCX: 000000000000ffac RDX: 0000000000000000 RSI: 0000000040003e58 RDI: 0000000040003e54 RBP: ff1e05f3c1204800 R08: ff5eeb3240003e5c R09: 000000009d899c41 R10: 000000000000003d R11: ff5eeb3240003ff8 R12: 0000000000000000 R13: 00000000000000ff R14: ff1e05f3c02f9e00 R15: 000000000000000c FS: 0000000000000000(0000) GS:ff1e05f489e40000(0000) knlGS:0000000000000= 000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000040003e54 CR3: 000000010841d002 CR4: 0000000000771ef0 PKRU: 55555554 Call Trace: vmmouse_report_events+0x13e/0x1b0 psmouse_handle_byte+0x15/0x60 ps2_interrupt+0x8a/0xd0 ... It was triggered by dereferencing a bad pointer (RDI) immediately after a VMware hypercall for VMWARE_CMD_ABSPOINTER_DATA in the vmmouse driver: ffffffff82135070 : ... ffffffff821350ac: b8 68 58 4d 56 mov $0x564d5868,%eax ffffffff821350b1: b9 27 00 00 00 mov $0x27,%ecx ffffffff821350b6: 31 d2 xor %edx,%edx ffffffff821350b8: bb 04 00 00 00 mov $0x4,%ebx ffffffff821350bd: 66 ba 58 56 mov $0x5658,%dx ffffffff821350c1: ed in (%dx),%eax <-- hyp= ercall ffffffff821350c2: 89 1f mov %ebx,(%rdi) <-- cr= ash Reading the kernel disassembly shows that RDI should contain the value of a valid kernel stack address here (0xff5eeb3240003e54). Instead it contains 0x40003e54, suggesting the hypervisor cleared the upper 32 bits. And indeed, Alexey discovered that QEMU's vmmouse_get_data() and vmmouse_set_data() are only saving/restoring the lower 32 bits, while clearing the upper 32. Fix that by changing the type of the saved data array from uint32_t to uint64_t. Fixes: 548df2acc6fc ("VMMouse Emulation, by Anthony Liguori.") Reported-by: Justin Forbes Debugged-by: Alexey Makhalov Signed-off-by: Josh Poimboeuf Link: https://lore.kernel.org/r/c508fc1d4a4ccd8c9fb1e51b71df089e31115a53.17= 70309998.git.jpoimboe@kernel.org Reviewed-by: Philippe Mathieu-Daud=C3=A9 Resolves: https://gitlab.com/qemu-project/qemu/-/issues/3293 Cc: qemu-stable@nongnu.org Signed-off-by: Paolo Bonzini --- hw/i386/vmmouse.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hw/i386/vmmouse.c b/hw/i386/vmmouse.c index 2ae7f3a242e..c1aeeca0c9a 100644 --- a/hw/i386/vmmouse.c +++ b/hw/i386/vmmouse.c @@ -72,7 +72,7 @@ struct VMMouseState { ISAKBDState *i8042; }; =20 -static void vmmouse_get_data(uint32_t *data) +static void vmmouse_get_data(uint64_t *data) { X86CPU *cpu =3D X86_CPU(current_cpu); CPUX86State *env =3D &cpu->env; @@ -82,7 +82,7 @@ static void vmmouse_get_data(uint32_t *data) data[4] =3D env->regs[R_ESI]; data[5] =3D env->regs[R_EDI]; } =20 -static void vmmouse_set_data(const uint32_t *data) +static void vmmouse_set_data(const uint64_t *data) { X86CPU *cpu =3D X86_CPU(current_cpu); CPUX86State *env =3D &cpu->env; @@ -197,7 +197,7 @@ static void vmmouse_disable(VMMouseState *s) vmmouse_remove_handler(s); } =20 -static void vmmouse_data(VMMouseState *s, uint32_t *data, uint32_t size) +static void vmmouse_data(VMMouseState *s, uint64_t *data, uint32_t size) { int i; =20 @@ -221,7 +221,7 @@ static void vmmouse_data(VMMouseState *s, uint32_t *dat= a, uint32_t size) static uint32_t vmmouse_ioport_read(void *opaque, uint32_t addr) { VMMouseState *s =3D opaque; - uint32_t data[6]; + uint64_t data[6]; uint16_t command; =20 vmmouse_get_data(data); @@ -247,7 +247,7 @@ static uint32_t vmmouse_ioport_read(void *opaque, uint3= 2_t addr) vmmouse_request_absolute(s); break; default: - printf("vmmouse: unknown command %x\n", data[1]); + printf("vmmouse: unknown command %" PRIx64 "\n", data[1]); break; } break; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441495; cv=none; d=zohomail.com; s=zohoarc; b=S2aLdwEGe47kxKG1alk0x5CqRM1NcMqT+ZpjFOgTLLTRfOCpNOUlK8aMqPdfKpX/SLB5QNlSlvFQ9fAwR9QsauWb1xG9Y95epKsf6LbkqslR/l7VH6ht0Xv6e8uSHzhTiKm8z5KUPE8tRFuF4Ms58RrpsAwMKJbu4aaXhrGvzLU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441495; 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=NFdOiQyPFU/kDzvSVAYPu91w9k4cEkStFxsLh/0Nhto=; b=DJk7LE2qKRfvTbk7ipMiIkO38UMRf1UPoE8agg7q4wZ54Tb+o48pc4Iiq1HjrJsJ0+q/eR9Yla5nhBwDGOwQJhfGstHX5I494C1rgPb+Y3CYh7xVWhoL2ayX7EUieIlcBq6U2BONX/7fsCSxq6afUhQx9oo+y894XDTs0bJJLdU= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441495220105.5943671285678; Mon, 2 Mar 2026 00:51:35 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwysn-0001U3-4A; Mon, 02 Mar 2026 03:44: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 1vwysb-0001PP-Hl for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:43:54 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwysa-0001Uc-1f for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:43:53 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-363-_ZF9f2faMTqqBWDpmQZAbA-1; Mon, 02 Mar 2026 03:43:49 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4836cc0b38eso46174725e9.2 for ; Mon, 02 Mar 2026 00:43:49 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b84023sm273157845e9.12.2026.03.02.00.43.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:43:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441031; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NFdOiQyPFU/kDzvSVAYPu91w9k4cEkStFxsLh/0Nhto=; b=HRD5YBoL8bE1Goh6GDu7KEcFs3zEGwS3Ur0yMe0QUAy3f+lWA2QVGCNFBgmFxPQqJ32KhR egVEAc/Wycx2lvH9frkkcUY4Y27WBCg9ZQVyPWDxbfRWXpIJhMEx49VvJLFP1kJDoijvOT 6SDKrP/LcEurxmZtX3FYygH4W/3UgPA= X-MC-Unique: _ZF9f2faMTqqBWDpmQZAbA-1 X-Mimecast-MFC-AGG-ID: _ZF9f2faMTqqBWDpmQZAbA_1772441029 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441027; x=1773045827; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NFdOiQyPFU/kDzvSVAYPu91w9k4cEkStFxsLh/0Nhto=; b=KzJKL6WZYSc8mjfYPp5lmCjMGZpDhaqljCa7gYOhbfyY4bKG8vmrwU71dnM41vbYaz ZIW1NmYnfrym+CpSjn1XI5+ChtNV9xkhByWuBf8amAq6noyDz3Mc/XhXl613Jai4w6yb USUZWyTkClIRdob+8yz+R+eMhm5OzWRhJOB/hzpM2tJucp98dEyYJdOWURMo5ueVr5xP Gkkzchq7o94+UkIzrPEE0X8xIt9P7sno0KW5InWCTv16tnUyiPZDjlpLVZGzNRhlZjNm LsRvSr3wgP6fZIdQl4NGXYidqlMVbxdYx9/cVtJBDYFhRDYL4UXqbwE0+0dfw80s8X7g 0clQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441027; x=1773045827; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=NFdOiQyPFU/kDzvSVAYPu91w9k4cEkStFxsLh/0Nhto=; b=vbFVI5nPyDTdUIwyO6ASh6LCUk0OBKrpVWWLMGC/v0XwaJp6XTyv/AM5CJoeTfR+aC yMkU7eA6cQ5cJczxJpD+RwEbrBZ+555basKLregZA4gZI7jlAPwAb8u8u7OXE1DTw4bw 7BEbg41ifEPbJbLGO3aIDedrxS4wuIPIDTUMm8xz7I/H7q5nVrWY1PK5zU6FBuMo+L7f HiEZiNMfRI0Q/3KZFHMdQFi456ZstJeLbkmSpt9E3t/1flR8e/SzXWYynl6De2mJPBGE skOzQHJfgcBMVi4sZOnpjljE3/H4Max2Jv85sk2DQlTZI7YTfdiMotQnJrRq0zge5MfM ezYg== X-Gm-Message-State: AOJu0YwjJhRoCJ7J4Sxu6ip8Y7JkijYI87n5gw1BrO9Cz3RBEh1Oidp4 C6FSorWQS1Du38ar745D3xAR1FPb0KJf7ZcBpf76qRTet9KBfDvalTJkpECBQQPdUcwIQ7OrTMu UONSIDmAwGbZTUNScaV37DhT/XnlbzECPi574a5dOunaBahd8/Z9ul84Xl+CWUd39wOQO0WEYjc hKSEjz4BTpMLfWrt+En295dBFXKS3ILB9iKtMDczN3 X-Gm-Gg: ATEYQzwQjV4EsuMfEeGNE4O9owxiDZ+D7HQKPwLUvyG1z4xUa1cdci1IKofMFhW73yg 0/9Axe8bccZE9y3N5sw3Py/MU2Ag4BRyVpHH+m6bA9cmTDEFI3ZJTT4RCgwlqpXEhyHixAyQM7i cOJprXXU8VJwgYvrapzrS7+lHXEv0HFWgGMgmHclkCexy827dRHkZSBPL4TppI9prY1iaN3FLZ0 /kgB34icZ5ul3XeD0ZivqEVi/Cn7/+M23C6IxddMFM27wtYjUj5l1ZQS+ayV/RIsgYkRrDWCyh0 y7yJ8VaAwxbF1Bp6HzJImdIw0aIvmaFRf8/7NhO4PkPAZfAmdn7TyEkESOYJuKlZZN8RXtYnMUH 6973znOQZi54kVjo/oGiYSB7rAc2vOS9sXdiTz7CTWJ4zobSTlHhWWBL15I3hQROZQir9iE2Ykm nQ48PkQikTDBZg4xgJAb2fpPYsmgs= X-Received: by 2002:a05:600c:c059:20b0:483:709e:f239 with SMTP id 5b1f17b1804b1-483c9beacf1mr137761465e9.22.1772441026993; Mon, 02 Mar 2026 00:43:46 -0800 (PST) X-Received: by 2002:a05:600c:c059:20b0:483:709e:f239 with SMTP id 5b1f17b1804b1-483c9beacf1mr137761215e9.22.1772441026512; Mon, 02 Mar 2026 00:43:46 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Bernhard Beschow , Mohamed Mediouni , "Wei Liu (Microsoft)" Subject: [PULL 002/102] target/i386/emulate/x86_decode: Fix compiler warning Date: Mon, 2 Mar 2026 09:41:57 +0100 Message-ID: <20260302084338.473368-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441497381158500 Content-Type: text/plain; charset="utf-8" From: Bernhard Beschow When compiling for i386-softmmu under MSYS2, GCC emits the following warnin= g: In function 'get_reg_val', inlined from 'calc_modrm_operand64' at ../src/target/i386/emulate/x86= _decode.c:1796:15: ../src/target/i386/emulate/x86_decode.c:1703:5: error: 'memcpy' forming o= ffset [4, 7] is out of the bounds [0, 4] of object 'val' with type 'target_= ulong' {aka 'unsigned int'} [-Werror=3Darray-bounds=3D] 1703 | memcpy(&val, | ^~~~~~~~~~~~ 1704 | get_reg_ref(env, reg, rex_present, is_extended, size), | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | size); | ~~~~~ ../src/target/i386/emulate/x86_decode.c: In function 'calc_modrm_operand6= 4': ../src/target/i386/emulate/x86_decode.c:1702:18: note: 'val' declared here 1702 | target_ulong val =3D 0; | ^~~ In the calc_modrm_operand64() case the compiler sees size =3D=3D 8 to be me= m-copied to a target_ulong variable which is only 4 bytes wide in case of i386-softm= mu. Note that when size !=3D 1, get_reg_ref() always returns a pointer to an 8 = byte register, regardless of the target_ulong size. Fix the compiler warning by always providing 8 bytes of storage by means of uint64_t. Fixes: 77a2dba45cc9 ("target/i386/emulate: stop overloading decode->op[N].p= tr") cc: qemu-stable Signed-off-by: Bernhard Beschow Reviewed-by: Mohamed Mediouni Reviewed-by: Wei Liu (Microsoft) Link: https://lore.kernel.org/r/20260223233950.96076-2-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_decode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/i386/emulate/x86_decode.c b/target/i386/emulate/x86_dec= ode.c index d037ed11420..6ad03b71b07 100644 --- a/target/i386/emulate/x86_decode.c +++ b/target/i386/emulate/x86_decode.c @@ -1699,7 +1699,7 @@ void *get_reg_ref(CPUX86State *env, int reg, int rex_= present, target_ulong get_reg_val(CPUX86State *env, int reg, int rex_present, int is_extended, int size) { - target_ulong val =3D 0; + uint64_t val =3D 0; memcpy(&val, get_reg_ref(env, reg, rex_present, is_extended, size), size); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441099; cv=none; d=zohomail.com; s=zohoarc; b=HbP8kRKWw8NUTm7e6M4rx597g7zNtc/Tl/4DD4lW+um/G7n6dchSJLKrRqIY5Tr4CCMyV2Tw0izxz7VekJDFdALlf7JmfFyl4WSJTex/kCEMoAERE8F18Ijg7cT/EriCSGOg43GuazhSjJe2eNE+6vtKowgmp8FI9+OP6o44OI8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441099; 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=u5XVQye+19ruydFJSwvWvInX5SHaYM971FB7J2eYwf0=; b=HSE6fY5TRzJHHA/RMOc5P0l3mML1VCM6VyKVAeDtkSPziRWZ4gbzBNHBVLJlG5992BN2DuVbCZD38aKdxyTTyvJqAq6kDrAsEKN9+WUgSvTD89ctq70OrKyRSzmT6PzY4pMXy5zjjdvLoGyNRhBmObGdh8BL2f8HEQ5O4wyN2Ig= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441099538727.0064343603837; Mon, 2 Mar 2026 00:44:59 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyso-0001V3-OD; Mon, 02 Mar 2026 03:44:06 -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 1vwysf-0001Qb-J9 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:43:58 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyse-0001Uz-0b for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:43:57 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-509-Q9OllKekNSSDqeFn6Z_OZA-1; Mon, 02 Mar 2026 03:43:54 -0500 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-439b3b408f9so945651f8f.0 for ; Mon, 02 Mar 2026 00:43:53 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439bb686a32sm1967191f8f.13.2026.03.02.00.43.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:43:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441035; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=u5XVQye+19ruydFJSwvWvInX5SHaYM971FB7J2eYwf0=; b=HMO9qGY1PVcEr7j2k+xf55JF6VxqB8qQ4Zl4m+ZvuM/oV8vBcnxKGNq3VYA5QHSSdJPtPX wdb2WeSeRb5clReMlZD3ZLvnH+WAhRIUYVjNN6K1NQMAznWAT70iRCseXsq4+gp+BNQ7lm NemUI4qdx6Yl+oQSr5gDgQ5S2R3a8KE= X-MC-Unique: Q9OllKekNSSDqeFn6Z_OZA-1 X-Mimecast-MFC-AGG-ID: Q9OllKekNSSDqeFn6Z_OZA_1772441033 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441032; x=1773045832; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=u5XVQye+19ruydFJSwvWvInX5SHaYM971FB7J2eYwf0=; b=sU2Ji0w7X8uiPiRex5zFXwBASEZjuGZKNtRRsCnTPPjSWKpwrABu3+/xhXImidk0IR z5YlPZcuL6lsaRVLjTDElDIZh/hBjYdlW8K+Lzit83IS43W0ZTvAJNEBczt02jHjxt/Z YeWCJxNuXPH8lbMr3nLW0AAZkN/my0884ZI1uCtQSoySh92PSC4bip3gJiViNECbZ5l1 3MCAFGAfyc9E5zb0gPS8sHwm8/1pdQ/qouDaPl2Frj1pfq27DkA1Rc0TVwE5keTMnHOW B0ATaB2IxLVfmuI6X5jpPeVxfTjLe9syNQ15LMP7IPRuLdWy2vcTWg0bAkFzLz1I/ZR1 RJpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441032; x=1773045832; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=u5XVQye+19ruydFJSwvWvInX5SHaYM971FB7J2eYwf0=; b=BJfb90dTWp3gdvi94SpVzRgTDNdOz6087hSs5HprjCEE75DZG8Tumix8ch4AeGdbpR tAoFUsJbezt34Rb6KX+ot3/4Bw8HGy4irq9qGdqJqqRwzOP0x/AIVQ+kQLjOsP9cxaSm k3DwmbX8IlFbXK8tFfmVCYXUOeGPrM7RamjY2jvEByr7bjtWky0HiAe+h0McN1Mtyr1+ OGQHbugbVOzNag7oZAPzsXJARfQaWYuK1bAkg3AWWh2DAhDip9Mk9WT0t6NKUqP2sA4z Xt/Koe4Bb2UMQMhOMFv/9vymc86QP0A3X3/LBykpCXdeH8Qw1Q3di20eG+uMV1Pr1l5R 6Dpg== X-Gm-Message-State: AOJu0Yx4lODOU2dV3uDaHsHeO98NG4rgvsivjQoRfoZ9kj3kmY7+Sk25 n7gXOgCMzI5unpnl+Ik0jLm7OCSICdiBw5AYxK2Zkq72vBRL8wD+/XLjerx0hv7d6oYrFvZKW9f PAWmHc4TtprQA8FAChdlAs27gzYDQ6X+szWXNnieMtOjp1eT1mnwburfZSc/i6+o5yUF8Abdk+t WbmYJvJwFjzoYZRBrKtVm4PYcGvlzcyVOv+Wr5qGk5 X-Gm-Gg: ATEYQzyw+e25nKmVlmcIfdHMQoK1/gBMNl3MHCjAt0hrYNRQf4QMVJrMF7AhdU0Gfyn RmYAuDCtYlZ1kVFL2/D0dLHPYe3vQ0V97sh9n3Oa1J8zTCWnRxDnVQjoxFktKVjMqebpDwxfriO h/wzWIbZqyrb4RZSerUZUbp8EoJkDJH3wvF3R2hr1pwcFw2Qea96GM/dIE1xgvGsZjUbAXXLBZ9 q3ETSF1yCfTcphqUTU3cbAXBmnEhiByWPnLtNdwKXJYYczF1UsWqYi09qkrasLsn9p0aKq07zxQ mqd8zNRdJfg49pWSQ49vkFnMxXAhH4n+XQgR5i/u3gDez+0yig1y2UJwP9wzs6gRW9OlGHknPGD tjbgT8CDlp73FSq8CTnoH1rbcfBEIcuVGm4fDLxsinxKxTBBV9M/EVFZSoOQe2ZkvEvQT9z3u8F mVQRCz7aVYbYLh07Q2iDwthjR1UOM= X-Received: by 2002:a05:6000:bcf:b0:439:aa1d:be10 with SMTP id ffacd0b85a97d-439aa1dbeaamr8602768f8f.40.1772441031884; Mon, 02 Mar 2026 00:43:51 -0800 (PST) X-Received: by 2002:a05:6000:bcf:b0:439:aa1d:be10 with SMTP id ffacd0b85a97d-439aa1dbeaamr8602715f8f.40.1772441031356; Mon, 02 Mar 2026 00:43:51 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Bernhard Beschow , Mohamed Mediouni , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , "Wei Liu (Microsoft)" Subject: [PULL 003/102] target/i386/hvf/x86_mmu: Fix compiler warning Date: Mon, 2 Mar 2026 09:41:58 +0100 Message-ID: <20260302084338.473368-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441101791158500 From: Bernhard Beschow When reusing the code in WHPX, GCC emits the following warning when compili= ng for i386-softmmu under MSYS2: In file included from ../src/target/i386/emulate/x86_mmu.c:20: ../src/target/i386/emulate/x86_mmu.c: In function 'vmx_write_mem': ../src/target/i386/emulate/x86_mmu.c:251:25: error: format '%llx' expects= argument of type 'long long unsigned int', but argument 3 has type 'target= _ulong' {aka 'unsigned int'} [-Werror=3Dformat=3D] 251 | VM_PANIC_EX("%s: mmu_gva_to_gpa %llx failed\n", __fun= c__, gva); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ = ~~~ | = | | = target_ulong {aka unsigned int} ../src/target/i386/emulate/panic.h:34:12: note: in definition of macro 'V= M_PANIC_EX' 34 | printf(__VA_ARGS__); \ | ^~~~~~~~~~~ ../src/target/i386/emulate/x86_mmu.c:251:48: note: format string is defin= ed here 251 | VM_PANIC_EX("%s: mmu_gva_to_gpa %llx failed\n", __fun= c__, gva); | ~~~^ | | | long long unsigned= int | %x Fix the warning by reusing the target-specific macro TARGET_FMT_lx which ex= ists for this exact purpose. Fixes: c97d6d2cdf97 ("i386: hvf: add code base from Google's QEMU repositor= y") cc: qemu-stable Signed-off-by: Bernhard Beschow Reviewed-by: Mohamed Mediouni Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Wei Liu (Microsoft) Link: https://lore.kernel.org/r/20260223233950.96076-3-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/hvf/x86_mmu.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/target/i386/hvf/x86_mmu.c b/target/i386/hvf/x86_mmu.c index afc5c17d5d5..fe44d2edf4a 100644 --- a/target/i386/hvf/x86_mmu.c +++ b/target/i386/hvf/x86_mmu.c @@ -244,7 +244,8 @@ void vmx_write_mem(CPUState *cpu, target_ulong gva, voi= d *data, int bytes) int copy =3D MIN(bytes, 0x1000 - (gva & 0xfff)); =20 if (!mmu_gva_to_gpa(cpu, gva, &gpa)) { - VM_PANIC_EX("%s: mmu_gva_to_gpa %llx failed\n", __func__, gva); + VM_PANIC_EX("%s: mmu_gva_to_gpa " TARGET_FMT_lx " failed\n", + __func__, gva); } else { address_space_write(&address_space_memory, gpa, MEMTXATTRS_UNSPECIFIED, data, copy); @@ -265,7 +266,8 @@ void vmx_read_mem(CPUState *cpu, void *data, target_ulo= ng gva, int bytes) int copy =3D MIN(bytes, 0x1000 - (gva & 0xfff)); =20 if (!mmu_gva_to_gpa(cpu, gva, &gpa)) { - VM_PANIC_EX("%s: mmu_gva_to_gpa %llx failed\n", __func__, gva); + VM_PANIC_EX("%s: mmu_gva_to_gpa " TARGET_FMT_lx " failed\n", + __func__, gva); } address_space_read(&address_space_memory, gpa, MEMTXATTRS_UNSPECIF= IED, data, copy); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441064; cv=none; d=zohomail.com; s=zohoarc; b=Sfa4rz4V721/gA/Pktw62yilq8EiXd151MuLM/n47pEQhdH/Lu91qq4wR6NToVMvKlqu1pK2n8loniol/w+F/IA8AZRJvMOPWAI0z6fYmNKwO1xmtzHtwgzfBxNMOr01YjQ7lGfMjtdvl7aCkvEyq41ly1zdglXVFxDPj6ctNB0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441064; 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=a8PTQ2BRM/m3YVXHv+WYxXuCIrKW0fl7sZurT0v5FJ0=; b=iQH1gfUuF7kjoMXVTqeLbV8S3Y/wcOJEdulJvllVRHZHkmjiZy8grDJ4gHENG+kkZ373+v2Nhfw9J+owtrvxjoESUJ+3O+iWzRvAxWH+reQqbZ/R2ahWZujF/aZzZ7H4VhZwkoW8QZlXGArpC7GnR1GbvJVlOWY0ja5CBckD/vk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441064811349.27275933326496; Mon, 2 Mar 2026 00:44:24 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyso-0001Ut-2h; Mon, 02 Mar 2026 03:44:06 -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 1vwysk-0001Ss-U8 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:04 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwysi-0001VM-6H for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:01 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-150-WUSxqJdIMGCV97DxI-i9ew-1; Mon, 02 Mar 2026 03:43:57 -0500 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-439b484ee04so482086f8f.1 for ; Mon, 02 Mar 2026 00:43:57 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c75a523sm25581437f8f.19.2026.03.02.00.43.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:43:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441038; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=a8PTQ2BRM/m3YVXHv+WYxXuCIrKW0fl7sZurT0v5FJ0=; b=gCaP7boVgBhkF2ELol3es5DecnpUng+HBSGeOb9FVt7E2tMRt8i/g1LZd+QMqfgjxCr8v3 lEvPjI82V6kHNcl+/F6DAmNqcQJpDn+qW10KxMzPGI8vrP++Bapm2hwpMpGDgUYI/VzYFh S6Eu+B9xk51VDuOLnTrflbjH7olfNww= X-MC-Unique: WUSxqJdIMGCV97DxI-i9ew-1 X-Mimecast-MFC-AGG-ID: WUSxqJdIMGCV97DxI-i9ew_1772441036 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441034; x=1773045834; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=a8PTQ2BRM/m3YVXHv+WYxXuCIrKW0fl7sZurT0v5FJ0=; b=A1OXzx/WIFT2y6WgaVEd3FuiPurIbLjl2+fzmeokalr9pxlbEuBCglkCfK3zJUSQHY /TPWlLzSpfXW2TFXve2rol2magvkA0LK1rZYdo59lrLhxc4+/7OLExvI+ZoqEZdbQuNn 4IEGwNVtQqQ16et3/Tm8rrCTBMtcDppKuRAgjhxhuBwrzJwWBc3dwRw1zc/NN5c20PYY ZHvY8n5wqM9cjD/rgihydYViMlGi+Vr8dYLGa2a4nY8Ss6tup4EV/IUTlkTPQHhCbRv4 ZITywyvOeAiF9xVudJqYv+rK7AydS1SqptbcsH1NRWzgDk8HFVsQn1zzNJG50RsHd+SK hrWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441034; x=1773045834; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=a8PTQ2BRM/m3YVXHv+WYxXuCIrKW0fl7sZurT0v5FJ0=; b=CbzkxcUmB5wTnQLmhjOqiwAWvJGgR/PefdguuIrtEs95y5clGrcNCjipv0HbT+4BqI Fkf4kxExVrM1HgyBfrMPVMYfcZW1hNuVOeftnRVte5Qbn69LqLKqLSGe9cHKZ16+IAGf zHK/phh6a8gSK9Uy78PNzCJAFqFTGFA5WcD6ZPPcM+1hKKUofQXuJHlX+grzG0WC+WZm m/qAdUjnINgd13Y2xMuSloxqM7jhpbXnucC5Fwr8tcQLAEJRwen32jepfSfA6TZ6moZB aULQ/AnHGx9Rew4n9S4THzJRjKbBq0OndcQaLcJaWLG9BZBkPYtvGUYqXr3i6M3hIY3m FrZA== X-Gm-Message-State: AOJu0YybzQS55nfiKVLCWXukIB7cAgOcZpKPc/+UpFtMD3qX2pcN+T2f JAJlt0AqkR4t1xPi3NAvTphYpcWheqR0mCfEraASa+vRndNFhsly672Os3unZ0PCMriXLI15For i1KKTznom24R2CDwILw0heZTaFwpqaErAUTZW82u2Unhe73IdeMLOH00AnD/H0feqzR6refDjS2 DUVM7uOiPFV/nnSTqSjN8YdRInW6k5jdWW9HCQ14iB X-Gm-Gg: ATEYQzwrtyizTkdReuQf/IMkx8GjTSF3ta/O9I7JZJQB7IzDP9GZcMdxjMvttQ2vFo+ DdE4hFvYKXzcsIllOxdovXU5KnJz0NUi8gDzDd/9lapTySTTK7lXB9hasCtGUNNooy5P5UzkaI/ fF2Ewy4y4wvXVqqAna17DuJrd0+BNwp6dLAqwlQdROf3egqBpvibB0+FFecVR4U4kOyRKlQXWTJ LDix+9X0DejEKDyDxvyu+xAYo9A60JCMG5Q4yH/9MPM+2w3m1pjpGzjeZJ1jcvNnBO/k6ASZ6LV Ny5uL2woZrb+4HGUngHf6oXmcXVFMmLatZp3D4tHlfqPL5qqICpUCskSQi/DXXgoZDV1uFVk+wN jPairFaHbVf/0Qyc6er+VxkVe87jSrVqa6GbjJXOjn5oToxXtTBy2UKMoISwwbl2VH1BGJKR8ow P1OfzitgbggpH4uN1we2byHdlKfyc= X-Received: by 2002:a05:6000:400a:b0:439:ac16:bc6 with SMTP id ffacd0b85a97d-439ac160e0cmr10011957f8f.18.1772441034543; Mon, 02 Mar 2026 00:43:54 -0800 (PST) X-Received: by 2002:a05:6000:400a:b0:439:ac16:bc6 with SMTP id ffacd0b85a97d-439ac160e0cmr10011904f8f.18.1772441033945; Mon, 02 Mar 2026 00:43:53 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Bernhard Beschow , Mohamed Mediouni , "Wei Liu (Microsoft)" , Magnus Kulke Subject: [PULL 004/102] target/i386/emulate/x86_decode: Actually use stream in decode_instruction_stream() Date: Mon, 2 Mar 2026 09:41:59 +0100 Message-ID: <20260302084338.473368-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441068060158500 Content-Type: text/plain; charset="utf-8" From: Bernhard Beschow Compared to decode_instruction(), decode_instruction_stream() has an additi= onal stream parameter which avoids some guest memory accesses during instruction decoding. Both functions defer the actual work to decode_opcode() which wou= ld set the stream pointer to zero such that decode_instruction_stream() essent= ially behaved like decode_instruction(). Given that all callers of decode_instruction_stream() properly zero-initialize the decode parameter, = the memset() call can be moved into decode_instruction() which is the only other user of decode_opcode(). This preserves the non-zero stream pointer which avoids extra guest memory accesses. Fixes: 1e25327b244a ("target/i386/emulate: Allow instruction decoding from = stream") cc: qemu-stable Signed-off-by: Bernhard Beschow Reviewed-by: Mohamed Mediouni Reviewed-by: Wei Liu (Microsoft) Tested-by: Magnus Kulke Link: https://lore.kernel.org/r/20260223233950.96076-4-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_decode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/i386/emulate/x86_decode.c b/target/i386/emulate/x86_dec= ode.c index 6ad03b71b07..7bbcd2a9a2a 100644 --- a/target/i386/emulate/x86_decode.c +++ b/target/i386/emulate/x86_decode.c @@ -2088,8 +2088,6 @@ static void decode_opcodes(CPUX86State *env, struct x= 86_decode *decode) =20 static uint32_t decode_opcode(CPUX86State *env, struct x86_decode *decode) { - memset(decode, 0, sizeof(*decode)); - decode_prefix(env, decode); set_addressing_size(env, decode); set_operand_size(env, decode); @@ -2101,6 +2099,8 @@ static uint32_t decode_opcode(CPUX86State *env, struc= t x86_decode *decode) =20 uint32_t decode_instruction(CPUX86State *env, struct x86_decode *decode) { + memset(decode, 0, sizeof(*decode)); + return decode_opcode(env, decode); } =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441450; cv=none; d=zohomail.com; s=zohoarc; b=XdDFVU5RyYmiOitj4cY1sQ5JFzT8an7BJ/xRAtfdCziLvS/15K+UbiAQfTKrKZ8DKSOi69+ZWeWiXbSDgmbHO3I0d+BndWQr4Bz1WZimfpL5PDvaChrpmwbJ2vedmLbVlsL/jEul9eDzQeB96UZAYFfQmvKiBma74eoZ60QXbio= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441450; 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=XVarAN+0/DWoyUB8MLOubIRM9lTM8zyfCdEzEfZYXbQ=; b=US0soWRZMniqpUqGYS4cV69+ZyXalfFPw62V8xNu34OGaBol9JerOkeMHh6k//iSEZrl9CsmC6K+1T8EGLooPMq/HE6/fVK1XmweKcv0aGYbqko3Y500hZDpIqAIc4DSHRqlm+SbenRWbmIuUlhqAS4A6169RI/gSVzEMFesnGU= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441450801351.7149961336944; Mon, 2 Mar 2026 00:50:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwysn-0001US-LO; Mon, 02 Mar 2026 03:44: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 1vwysm-0001TY-Ej for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:04 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwysk-0001VX-Mc for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:03 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-356-7uWcxhPfPr6qN9w_t163bg-1; Mon, 02 Mar 2026 03:44:00 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-43999e04921so2653738f8f.0 for ; Mon, 02 Mar 2026 00:44:00 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b4e771basm10753590f8f.0.2026.03.02.00.43.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:43:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441041; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XVarAN+0/DWoyUB8MLOubIRM9lTM8zyfCdEzEfZYXbQ=; b=OBDZ0aUH+5+SZdUejqqhsR76dChMOJRI7m6Ye6dF4FC28ctBRYoD2ybMmDwLAUqPd3kud9 GLzHkUu5Cn0VE3wUJogrb4ej/JETY6Dci575IfLSEAUMbURG1GictxvK2y4SA9ajqOibVd 0Tb3X8cO1x50yLbXV5e8V1gCJir+lDQ= X-MC-Unique: 7uWcxhPfPr6qN9w_t163bg-1 X-Mimecast-MFC-AGG-ID: 7uWcxhPfPr6qN9w_t163bg_1772441039 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441038; x=1773045838; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=XVarAN+0/DWoyUB8MLOubIRM9lTM8zyfCdEzEfZYXbQ=; b=cxnbPjCAPyEjy5YR3mjC9fbEnz3urzIohHGZHv5wpR5AuxO/E+KckYwAZqCB3ROK8w oM29NVnwxv/pibmYg8ZCEGueto/T7mqbXPfjj/rgWCS46TUDJcBtZvESlovj3LYzVuDh BtKVQykQNpbGLHUYNbIWMekm43rFn9vceIA3TQ2mAr8eYRM/vX8IGo9bMQ3lZ8VRHnwn 4C9EKK2MCB7Ca52tGA2XDkEc5Bh9RrlAGU1c+XHRjyJW2mltZKKb/HT76cPgd04NH//c c857DApjuZawUm2oCTdBsHGIFqMjKdN9s41BA9kbCCCIFXKUFctWawv22/AYEEtAe6Jm HIiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441038; x=1773045838; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=XVarAN+0/DWoyUB8MLOubIRM9lTM8zyfCdEzEfZYXbQ=; b=oWcC/6Ijq3W8ouFokrKggxEfgdnhc/kKD5feqVFyFfFu+dyNaGZaztLAmIq6Qyjng/ OenfeXONJ7nYCtl3Q7azX0SIDg8vvQSVH3gKyKsAtqCviLWQ2l5Awi/uI1ryG5PDds4w rEYKtE4y/VPRZ4U9lofI0kEcZKsfeTGo8WVWqOYRCKq1NvnK/eXnywtgdlrwPuH7s++/ oD01IrqYKzwQszVcJgRNWo6cW2Ic3QIAGuMaYSHXMmelWn3v3YD8HGKPPqRwu/EHG8Vf czOQssA3uadjcyZuoX1cOuPnD34gpaTR3jWhv1t7YZn00gG1krT4LhIBPhI5PYf0juAw PFRw== X-Gm-Message-State: AOJu0Yw2BvhPBBNwd5fafl53WiPfwGFlosEYmA9XrUlY6ld02ddXeP1I 3Tbwkk3sNX3S6N0UVB2p/eLyVDBhm50VtGNZpe3Eyq2DPMV/QIcuBYD0KYlqCqVcpZN56RjUBTY fTPtNBWAvPEZ6E5M1ugcudRbUh7qxoD91HjX3YvgFEieUhEAobeiV9c1shBuD96Pqh0BhDFuzgM uAHNUYyT2y884Up6khv4JOOfT7GEv7BXp4ErcllQXA X-Gm-Gg: ATEYQzxKQ6qXz8OVKq0dT7WZS+bQIy5/qm0bc4IZlBxG4cuFNNaA6PioWAiJRu4FXGQ NDFx8U5RUYRdct+WJOh8udyIK/2t/4I+ndpNInFKYjBpi+DSE8AYzPrZdRrxPiZfjQBN6xng7r3 aJgTqVDduapYrdEPKI3t4mQFxxSYIRWVDoQ7CL46qZdHsvdO8VG+XWK+EOiDQFQTzzKCY5UjDtQ Hn3lJqo5RRysxZC03QksER0ea4AibMIUskrAOc3W+2fB+GBhTbVDGX4PW1VMXCD85W5LkRWhJoc zRay2te6qZB5XoYS4K23/pwSV1/JkZCW+Y41MmEjWCIYovRa0h5wcy2EoG5GR10kXr2b4ijja3y iPHaLUy8fVq+TiQACYmZIvl4hbg6PjxbsEhViUKBxdd0ZwjOwh6vrhorK0uKSqu1oXoNyYjb59p Olpbs1HYfBPv8MM2R91qCAt9j3Lns= X-Received: by 2002:a5d:5d85:0:b0:439:9465:906f with SMTP id ffacd0b85a97d-439971a5d45mr30147751f8f.2.1772441038420; Mon, 02 Mar 2026 00:43:58 -0800 (PST) X-Received: by 2002:a5d:5d85:0:b0:439:9465:906f with SMTP id ffacd0b85a97d-439971a5d45mr30147703f8f.2.1772441037962; Mon, 02 Mar 2026 00:43:57 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 005/102] target/i386/emulate: rework string_rep emulation Date: Mon, 2 Mar 2026 09:42:00 +0100 Message-ID: <20260302084338.473368-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441451099158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-5-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_emu.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/target/i386/emulate/x86_emu.c b/target/i386/emulate/x86_emu.c index 4409f7bc134..bf96fe06b45 100644 --- a/target/i386/emulate/x86_emu.c +++ b/target/i386/emulate/x86_emu.c @@ -466,18 +466,25 @@ static inline void string_increment_reg(CPUX86State *= env, int reg, write_reg(env, reg, val, decode->addressing_size); } =20 +static inline int get_ZF(CPUX86State *env) { + return env->cc_dst ? 0 : CC_Z; +} + static inline void string_rep(CPUX86State *env, struct x86_decode *decode, void (*func)(CPUX86State *env, struct x86_decode *ins), int re= p) { target_ulong rcx =3D read_reg(env, R_ECX, decode->addressing_size); - while (rcx--) { + + while (rcx !=3D 0) { + bool is_cmps_or_scas =3D decode->cmd =3D=3D X86_DECODE_CMD_CMPS ||= decode->cmd =3D=3D X86_DECODE_CMD_SCAS; func(env, decode); + rcx--; write_reg(env, R_ECX, rcx, decode->addressing_size); - if ((PREFIX_REP =3D=3D rep) && !env->cc_dst) { + if ((PREFIX_REP =3D=3D rep) && !get_ZF(env) && is_cmps_or_scas) { break; } - if ((PREFIX_REPN =3D=3D rep) && env->cc_dst) { + if ((PREFIX_REPN =3D=3D rep) && get_ZF(env)&& is_cmps_or_scas) { break; } } --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441090; cv=none; d=zohomail.com; s=zohoarc; b=d7OCLkJ/X0TKo1b6495Hgek6yPHf6f17iTbiLLQJ6mJ97A+2YRgSvXngCFBEWp6ZBDidzxxx3dM8ZDlBfwehPWScNIEn9/MYLIL8U3tX7lhtp/YtLlxzTtH5tVOJalJLw+97xGrEoC5ULCXRHtkTvtcQfrEYuQz1TwwOxCrS6+I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441090; 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=GnFW0QusOQ9hOBMv83u5V0q3saz7qewGSXhZFjWhdLY=; b=Ekn7hc7QaOiVV9rzNruTOWm+wFHu1ovdWl1Y5LN1IVAymZG9fMvWLT5INrly7SPClXlQ5Lbmlo2Mkg1WtvtTXRyKGpsVySM0GXjtjkH2H3XZhGd9Qq3vaophaphWojXp3YZ6Ny2vYLl5yXaitHGIPLgGL84f1uSOsptW/be+I+g= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177244109009586.87175068301019; Mon, 2 Mar 2026 00:44:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwysq-0001VY-RZ; Mon, 02 Mar 2026 03:44:08 -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 1vwyso-0001VM-Se for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:06 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwysn-0001Vx-25 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:06 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-385-4Xoz8URYMzi4yEHYM0oRGg-1; Mon, 02 Mar 2026 03:44:03 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4837a71903aso25388695e9.1 for ; Mon, 02 Mar 2026 00:44:02 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439bb686a32sm1968294f8f.13.2026.03.02.00.43.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:43:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441044; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GnFW0QusOQ9hOBMv83u5V0q3saz7qewGSXhZFjWhdLY=; b=W4qLoKoZJO2rYymDnsuXTSmJaIcjxoisxvT9akE431ZwsY61Fxi4dWL3Ja8jl/NX+xxFVD UBOrkApLsIwpSqAgrJeGablTLaLldytZjfUYYJ5oncUB6VIpFC/FJkBfH3DF9KXAIhm4cG vYklF8HmpSpbgoEj5oX9bssao8vOzfI= X-MC-Unique: 4Xoz8URYMzi4yEHYM0oRGg-1 X-Mimecast-MFC-AGG-ID: 4Xoz8URYMzi4yEHYM0oRGg_1772441042 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441041; x=1773045841; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GnFW0QusOQ9hOBMv83u5V0q3saz7qewGSXhZFjWhdLY=; b=m1wZQVjePNFE1BpTa0QgRBn5SMmgQi6VkZYwwiyzGkTz8unvN9ANIgmNW0Nw7hy774 +//3YCCn7RspljgQLWSb3X8iGAfENXy8pdKzeI0AuUG33GeMf87oWhz8Ji0sGBTfPL3r dzxlcfPVZJY4+Q4lEGceyBka7PLDx4jlFVNfg8cSUiQb40ZatHW3M8xV1JHi4vHKLW6X SuMcdEEbmTpIUtOicR94DagmljKkFFE5HgN1cpmLe5bTm2KI5Uma5yaF7koLsBQTpUQW zl8MYq2vuCAsqiBvVAKQQ2mNxQSqr//S1092Con3euvxi3pZsJSw0+OcP4hroMX6UCNy Mk5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441041; x=1773045841; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=GnFW0QusOQ9hOBMv83u5V0q3saz7qewGSXhZFjWhdLY=; b=BwZogFguYMXIG4K3OOHhCBaDONK8Rux/bHXHQCQgraOZlmS6jt+AXejWOYvcN2Ec65 KPeAdO9cIogHq0I97vhiJxEpK0ZJGzo9yFg2vxrycwrTMl8BBqbZIIKt0gMtKJH/Yapw 2/UdlnwYJbvZvL04w3UL0Xs5b9yir9bNPmehctuj+wgfQ/qfQ3yPoyOuK8EbmItp081j XMhlaSiWrKGxLo5RV4y2YJOBKYFBe+QUdyenqUw307JbsJIpnvKBM01DVb1Uvmw1o+xW g55cFGKm6gu9LykeQVm5juRz4+5h/YMd3lUDlYhgrLL2E+x4LFGB7llJsFmEh8/vggNl YwsA== X-Gm-Message-State: AOJu0YzOFwcLg5XPZ9jrW4rb0ZT199fTBKJ0jRTrj65fluMGTu5pgEsG SmCXYLGFXqs+DvUw3x/U9bZLdOQMLLT01a/E//NKOaFyNIhZzzc48p+hybIF3SuI2GQ+qm2obGw aYaOAt+wLtGNxO4ZlBPvx5m5ZoYbdVnhNIjw1lqPvrf2ft7jKV17hrS+KAfZNtmkMw9UfQsjLQE 2fujDwcMAQtJ5jh6fwekWKH/Tuza4mXMWbl4LM8UKh X-Gm-Gg: ATEYQzycwTT7okCDjfeNbsPRxUrIWf4t28v0m7d1UouamVcAu7kI0BV8fWlmZWhUZCa J1S1JQ2HxpXQfPWQiObbk6vredriaUnC13aDAm8FmOXaoqEd8aeSI7lmflzccNszBftonHEITWq U1HpMOCzbqXAEDpVkB2AHAeu48vlD7E0qttJBAe6wKRRLejDhbTTHfqYgRK7kLjAStdrtabsRp7 80dHFuiEu3RrQIwkv4ZqATdci+7ysSwX7jjSRyqA9WxOuySwwYZ8kxZRpsqA+EuT14sLN79VOMl eoaKBKaydkpoAR8jnP7Kno65d2VGHZtRb6X+XSWDkpOzRoQa8DCHP3ztZeynOoTg2lvXlsNHhuS Bj5PNdv8SDO+JuQuQcl7RZpTkeQdROyyAaeVbhYBLf96Nb/wghqySbIqOPKs+HQcQ330duydJQX T8738tihMtyE2Rvg0et5Qbdo5uXTg= X-Received: by 2002:a05:600c:444d:b0:483:885:f0b0 with SMTP id 5b1f17b1804b1-483c9c243fbmr210797095e9.35.1772441041039; Mon, 02 Mar 2026 00:44:01 -0800 (PST) X-Received: by 2002:a05:600c:444d:b0:483:885:f0b0 with SMTP id 5b1f17b1804b1-483c9c243fbmr210796625e9.35.1772441040539; Mon, 02 Mar 2026 00:44:00 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 006/102] target/i386: emulate, hvf: move x86_mmu to common code Date: Mon, 2 Mar 2026 09:42:01 +0100 Message-ID: <20260302084338.473368-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441091674158500 From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Reviewed-by: Philippe Mathieu-Daud=C3=A9 Link: https://lore.kernel.org/r/20260223233950.96076-6-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/{hvf =3D> emulate}/x86_mmu.h | 0 target/i386/{hvf =3D> emulate}/x86_mmu.c | 14 +++++++++----- target/i386/hvf/hvf.c | 10 +++++++++- target/i386/hvf/x86.c | 2 +- target/i386/hvf/x86_task.c | 2 +- target/i386/emulate/meson.build | 1 + target/i386/hvf/meson.build | 1 - 7 files changed, 21 insertions(+), 9 deletions(-) rename target/i386/{hvf =3D> emulate}/x86_mmu.h (100%) rename target/i386/{hvf =3D> emulate}/x86_mmu.c (95%) diff --git a/target/i386/hvf/x86_mmu.h b/target/i386/emulate/x86_mmu.h similarity index 100% rename from target/i386/hvf/x86_mmu.h rename to target/i386/emulate/x86_mmu.h diff --git a/target/i386/hvf/x86_mmu.c b/target/i386/emulate/x86_mmu.c similarity index 95% rename from target/i386/hvf/x86_mmu.c rename to target/i386/emulate/x86_mmu.c index fe44d2edf4a..b82a55a3da7 100644 --- a/target/i386/hvf/x86_mmu.c +++ b/target/i386/emulate/x86_mmu.c @@ -19,10 +19,10 @@ #include "qemu/osdep.h" #include "panic.h" #include "cpu.h" +#include "system/address-spaces.h" +#include "system/memory.h" #include "emulate/x86.h" -#include "x86_mmu.h" -#include "vmcs.h" -#include "vmx.h" +#include "emulate/x86_mmu.h" =20 #define pte_present(pte) (pte & PT_PRESENT) #define pte_write_access(pte) (pte & PT_WRITE) @@ -99,6 +99,8 @@ static bool get_pt_entry(CPUState *cpu, struct gpt_transl= ation *pt, static bool test_pt_entry(CPUState *cpu, struct gpt_translation *pt, int level, int *largeness, bool pae) { + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; uint64_t pte =3D pt->pte[level]; =20 if (pt->write_access) { @@ -127,7 +129,7 @@ static bool test_pt_entry(CPUState *cpu, struct gpt_tra= nslation *pt, pt->err_code |=3D MMU_PAGE_PT; } =20 - uint32_t cr0 =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR0); + uint32_t cr0 =3D env->cr[0]; /* check protection */ if (cr0 & CR0_WP_MASK) { if (pt->write_access && !pte_write_access(pte)) { @@ -179,9 +181,11 @@ static inline uint64_t large_page_gpa(struct gpt_trans= lation *pt, bool pae, static bool walk_gpt(CPUState *cpu, target_ulong addr, int err_code, struct gpt_translation *pt, bool pae) { + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; int top_level, level; int largeness =3D 0; - target_ulong cr3 =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR3); + target_ulong cr3 =3D env->cr[3]; uint64_t page_mask =3D pae ? PAE_PTE_PAGE_MASK : LEGACY_PTE_PAGE_MASK; =20 memset(pt, 0, sizeof(*pt)); diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c index ce54020f003..0b3674ad33d 100644 --- a/target/i386/hvf/hvf.c +++ b/target/i386/hvf/hvf.c @@ -62,7 +62,7 @@ #include "emulate/x86.h" #include "x86_descr.h" #include "emulate/x86_flags.h" -#include "x86_mmu.h" +#include "emulate/x86_mmu.h" #include "emulate/x86_decode.h" #include "emulate/x86_emu.h" #include "x86_task.h" @@ -254,11 +254,19 @@ static void hvf_read_segment_descriptor(CPUState *s, = struct x86_segment_descript =20 static void hvf_read_mem(CPUState *cpu, void *data, target_ulong gva, int = bytes) { + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + env->cr[0] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR0); + env->cr[3] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR3); vmx_read_mem(cpu, data, gva, bytes); } =20 static void hvf_write_mem(CPUState *cpu, void *data, target_ulong gva, int= bytes) { + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + env->cr[0] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR0); + env->cr[3] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR3); vmx_write_mem(cpu, gva, data, bytes); } =20 diff --git a/target/i386/hvf/x86.c b/target/i386/hvf/x86.c index 5c75ec9a007..2fa210ff601 100644 --- a/target/i386/hvf/x86.c +++ b/target/i386/hvf/x86.c @@ -23,7 +23,7 @@ #include "emulate/x86_emu.h" #include "vmcs.h" #include "vmx.h" -#include "x86_mmu.h" +#include "emulate/x86_mmu.h" #include "x86_descr.h" =20 /* static uint32_t x86_segment_access_rights(struct x86_segment_descriptor= *var) diff --git a/target/i386/hvf/x86_task.c b/target/i386/hvf/x86_task.c index bdf8b51ae67..b1e541a6420 100644 --- a/target/i386/hvf/x86_task.c +++ b/target/i386/hvf/x86_task.c @@ -16,7 +16,7 @@ #include "vmx.h" #include "emulate/x86.h" #include "x86_descr.h" -#include "x86_mmu.h" +#include "emulate/x86_mmu.h" #include "emulate/x86_decode.h" #include "emulate/x86_emu.h" #include "x86_task.h" diff --git a/target/i386/emulate/meson.build b/target/i386/emulate/meson.bu= ild index b6dafb6a5be..dd047c424a1 100644 --- a/target/i386/emulate/meson.build +++ b/target/i386/emulate/meson.build @@ -2,6 +2,7 @@ emulator_files =3D files( 'x86_decode.c', 'x86_emu.c', 'x86_flags.c', + 'x86_mmu.c' ) =20 i386_system_ss.add(when: [hvf, 'CONFIG_HVF'], if_true: emulator_files) diff --git a/target/i386/hvf/meson.build b/target/i386/hvf/meson.build index 519d190f0e6..22bf886978f 100644 --- a/target/i386/hvf/meson.build +++ b/target/i386/hvf/meson.build @@ -3,7 +3,6 @@ i386_system_ss.add(when: [hvf, 'CONFIG_HVF'], if_true: file= s( 'x86.c', 'x86_cpuid.c', 'x86_descr.c', - 'x86_mmu.c', 'x86_task.c', 'x86hvf.c', 'hvf-cpu.c', --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441122; cv=none; d=zohomail.com; s=zohoarc; b=aFKafWzryWVHTJnsZpWZ34Sn9FxH4aHIxR2XQxul2DCFeobYjFLhkn7RKV6C3c2rFOhKx9VgkcNUXpNcYHj6kxumYru3/0QcnhJokphnynpHukIqeCWq41kGd9DAYW0XfppQw33/y5BVZ4x9RtcBsye/9eA8aIsQGSDAQcBL4hQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441122; 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=LAHzhuiA9dV8ep+8a24XyrlRe7yv5/OefzsW5S9DsHM=; b=Lveu6IELV7aLteF/CRJcBqKP138Ca6Xvnsa/OC6fub3d5l7d5mfgCJCMnHpst0NlwfmKcBYKiS9W9nPfECq412/ihUsllhmvfxDxr4vG0k+5laNiwuIyQu36ottKu2A6W+uB1+RCdznZbj/qv33ecg8RwIthLWxQ1aEwBcOAkvI= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441122091527.077788649184; Mon, 2 Mar 2026 00:45:22 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyss-0001W6-EX; Mon, 02 Mar 2026 03:44:10 -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 1vwysr-0001Ve-2J for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwysp-0001WK-EA for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:08 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-408-ty8dQ5pONHm98e2rErFw0Q-1; Mon, 02 Mar 2026 03:44:05 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-43997e095cdso2909861f8f.3 for ; Mon, 02 Mar 2026 00:44:05 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b1b97927sm11040692f8f.28.2026.03.02.00.44.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441046; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LAHzhuiA9dV8ep+8a24XyrlRe7yv5/OefzsW5S9DsHM=; b=L25TaQwusk5IRKGFayLKxaQzAEdgDK2cIaR9R+KBNDk1wBklkFnLRF8NbAVniQAU2mpVJj hP09ZTyxUKdNxTIScthy41WTHJwzLimA0oIgMH9q5Pn9WtNrMwpzPocmp9xGbGFDXNvJQw XHMQO7XwvdYmmvXz3WYeiZBSI5Rk9Jg= X-MC-Unique: ty8dQ5pONHm98e2rErFw0Q-1 X-Mimecast-MFC-AGG-ID: ty8dQ5pONHm98e2rErFw0Q_1772441044 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441043; x=1773045843; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LAHzhuiA9dV8ep+8a24XyrlRe7yv5/OefzsW5S9DsHM=; b=tMRHJq6pGutp0cu5sLqlVNGdIWbQsyNPtqYwy2b9qdZsSeZMKecIq2Pzi6giQ8QS9q BP2FU4xRIxA6kjbH+xt8iWrk4YDOMmflcc/DZnNPAvo/yOO3UjeIMqBdLYw0jExcKPoZ rQmPtrb7yCvMlYhSZw0J7O0gheOQZUEv0oHqRntdPEoKa0w6BhJVllEKDcaG2Rz4vTDR lbn8ReAmKlTcohnq1lafBkwxkrWQ7WPTk/c6hcOqDVqRoZYwyawNED0hG9MrTY0+CFYE nkk45S0UF2vGZuAlrHkhD5SiTvj73x7l+CY3XmSUw5PW8bKcGGDPFr7PVWvxT9iHQ8vp bR0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441043; x=1773045843; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=LAHzhuiA9dV8ep+8a24XyrlRe7yv5/OefzsW5S9DsHM=; b=EwuNrefKHlWQMO0u1DACKN0fn98XPSrgiCJd0Ao5g5NHo9ngZcA4U1yQS+BjUoShqo zsfa5dybh91/O7KUTRYlQnZYVJT+DY0nvednS5iC6VUpgd2aqZLe8dQ7C85W6LLiDAMi RTfW6vuy7sGsF9sjvbqhGc/e8D62v5ml0ZMElSiEyK549qWlup2cRDrA3WiGUHAZAd94 D4sTFucraJJk2yvePXyPGmT+WMYLFF7OaQLeHGzlR4AJ7ZvkWxqSsKYUgR40hFpCSYew cmnw/K5YXQ91vgOo4Q7Igj+B+fEM/suquSic19+rnJrWgqDlwCqZ/1aYdjTzzyv2NqS2 SI+g== X-Gm-Message-State: AOJu0Yzm09nFGdgDcr1FGJs0MIMsAeURX+EeC66TIGGhT7euUzjW4V/M nB33JFCxtTFPAs5zK/OXJ0XVfCXZcFGZn9pA37+sPmnJ3NRn1ASwNNuxZ4UIie9jUmhA/fEHx5I 5xQGzK+SUmBJfGvF4eGAPKcugpK5f4HAC3aKdr5e2zIuMsJ0xvpBSTqayewQ9TzFteB4ZnjY6+x XiDh0NLBZFUKCKtFVv56OUIP2tDHR5TZXR1fP7LeIC X-Gm-Gg: ATEYQzxSUtRkIl2KOhkPR6Gy7f1UMAgjEIWgxpn/BJy2RTGsT6BoT0WrMUPlCRS50OT rK8qECnijIzSOx0oLaBqf50K6OsaCmIhP0j6t4W/ZJBcNW+q1CWAK4M84XpeHnMtV4OF0S6h5k1 VC1uBY+8izF6PrRge/BvQuki2TfuO7kAUhudT9muXUqkuw4O7YfqhiTabzNq5MxTHZC3U41+eTX R9/B0axPgiC3G19k5QRp3mHDQxIE5/eY1YKsgA52Ph19jcCN82m8Lj+NFFz00Q8UxQzqowpnsBR xkqRLPt9BlAv0uxRm6mzv9PVXn3EZCxqNNEQgxR2TtMIMMilvxFqzkJc0LgW8GUxXwsg0ultSK6 2a9Kpd8NBYWuGlh66FGVITCXU9fGYmt5tGGcpEnheIDmwER0nwenn0RfEY/bV/N/5XxNug823pw 4mcsvUtg7CciZG/sAN2RD3kDgWFyE= X-Received: by 2002:a05:6000:2404:b0:437:6e55:a736 with SMTP id ffacd0b85a97d-4399dde3046mr20698801f8f.7.1772441043430; Mon, 02 Mar 2026 00:44:03 -0800 (PST) X-Received: by 2002:a05:6000:2404:b0:437:6e55:a736 with SMTP id ffacd0b85a97d-4399dde3046mr20698756f8f.7.1772441042975; Mon, 02 Mar 2026 00:44:02 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 007/102] whpx: i386: re-enable guest debug support Date: Mon, 2 Mar 2026 09:42:02 +0100 Message-ID: <20260302084338.473368-8-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441123564158500 From: Mohamed Mediouni Fix what got broken several years ago by adding ops->supports_guest_debug support as an architecture-specific function. arm64 WHP doesn't currently provide support needed for this. Signed-off-by: Mohamed Mediouni Reviewed-by: Philippe Mathieu-Daud=C3=A9 Link: https://lore.kernel.org/r/20260223233950.96076-7-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- include/system/whpx-all.h | 4 ++++ accel/whpx/whpx-accel-ops.c | 8 ++++++++ target/arm/whpx/whpx-all.c | 5 +++++ target/i386/whpx/whpx-all.c | 5 +++++ 4 files changed, 22 insertions(+) diff --git a/include/system/whpx-all.h b/include/system/whpx-all.h index f13cdf7f660..3db074c38c5 100644 --- a/include/system/whpx-all.h +++ b/include/system/whpx-all.h @@ -17,4 +17,8 @@ void whpx_translate_cpu_breakpoints( struct whpx_breakpoints *breakpoints, CPUState *cpu, int cpu_breakpoint_count); + +/* called by whpx-accel-ops */ +bool whpx_arch_supports_guest_debug(void); + #endif diff --git a/accel/whpx/whpx-accel-ops.c b/accel/whpx/whpx-accel-ops.c index 50fadea0fd6..b8f41544cbe 100644 --- a/accel/whpx/whpx-accel-ops.c +++ b/accel/whpx/whpx-accel-ops.c @@ -17,6 +17,7 @@ =20 #include "system/whpx.h" #include "system/whpx-internal.h" +#include "system/whpx-all.h" #include "system/whpx-accel-ops.h" =20 static void *whpx_cpu_thread_fn(void *arg) @@ -81,6 +82,12 @@ static bool whpx_vcpu_thread_is_idle(CPUState *cpu) return !whpx_irqchip_in_kernel(); } =20 +static bool whpx_supports_guest_debug(void) +{ + return whpx_arch_supports_guest_debug(); +} + + static void whpx_accel_ops_class_init(ObjectClass *oc, const void *data) { AccelOpsClass *ops =3D ACCEL_OPS_CLASS(oc); @@ -89,6 +96,7 @@ static void whpx_accel_ops_class_init(ObjectClass *oc, co= nst void *data) ops->kick_vcpu_thread =3D whpx_kick_vcpu_thread; ops->cpu_thread_is_idle =3D whpx_vcpu_thread_is_idle; ops->handle_interrupt =3D generic_handle_interrupt; + ops->supports_guest_debug =3D whpx_supports_guest_debug; =20 ops->synchronize_post_reset =3D whpx_cpu_synchronize_post_reset; ops->synchronize_post_init =3D whpx_cpu_synchronize_post_init; diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c index 40ada2d5b65..e01e6499ba4 100644 --- a/target/arm/whpx/whpx-all.c +++ b/target/arm/whpx/whpx-all.c @@ -303,6 +303,11 @@ void whpx_translate_cpu_breakpoints( /* Breakpoints aren=E2=80=99t supported on this platform */ } =20 +bool whpx_arch_supports_guest_debug(void)=20 +{ + return false; +} + static void whpx_get_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTE= R_VALUE* val) { struct whpx_state *whpx =3D &whpx_global; diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 8210250dc3b..e1f0fa5e770 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -1272,6 +1272,11 @@ void whpx_apply_breakpoints( } } =20 +bool whpx_arch_supports_guest_debug(void)=20 +{ + return true; +} + /* Returns the address of the next instruction that is about to be execute= d. */ static vaddr whpx_vcpu_get_pc(CPUState *cpu, bool exit_context_valid) { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441119; cv=none; d=zohomail.com; s=zohoarc; b=IUjeZIxIXim758t94ZdnTF98pYhFec7ebc6bwnwV4HuWAgx/wtvadVjc2Kuvcb8bCKYasRG1Jr8CAu9cofjrD4PlXu/WZwVj1EKOuNbR/+ab1Yf11jQFwtClaVUKyl72Jh1GOKuz+n9yZ9i5oxC6C05VB22Dugf5u+NC8XzeMc4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441119; 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=JruPiL/RMqNrXj7flD5Mqv0Tag1Q1v6iCWYNayccrwU=; b=XNHs1KOWzHJwTYaww1yRPraxpOJvgw/kJ3+hNGigE+XJxK3Z5CAIucnO/BwRwJAYq4ys7I81BIKOrZpZbD4FAm3LU+TKCwtJbRXavd3Wp3L1wi5VC2FrYMLXlz2n5Go9N3r9r4FA0gH3RYw+39g9y0FYGRktDnwOJUwr067rCqI= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177244111956390.65581543551866; Mon, 2 Mar 2026 00:45:19 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyte-00023c-CL; Mon, 02 Mar 2026 03:45: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 1vwytB-0001i5-Ao for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:30 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyt5-0001XV-R5 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:27 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-317-VFzA-QnfM22Aa4a3R_rqrQ-1; Mon, 02 Mar 2026 03:44:07 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-439b699b9a6so698900f8f.3 for ; Mon, 02 Mar 2026 00:44:07 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b130abfasm10459937f8f.34.2026.03.02.00.44.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441061; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JruPiL/RMqNrXj7flD5Mqv0Tag1Q1v6iCWYNayccrwU=; b=CKDeKOIiqTEgUU1UYQ9lAPeFfG0mAfsFHmWFfJz/+32yRyaDriBchQA/Mm4Pomk10Q2tya WLz+fl949vnXmIjDR/3jAOKH27H0h+PpR0HTAqR/vzGVHKPwD2v8eaMggRkyfgBK0JdnNd 2efPf724v3YP1qFCfkIntUMN/o8hg2Y= X-MC-Unique: VFzA-QnfM22Aa4a3R_rqrQ-1 X-Mimecast-MFC-AGG-ID: VFzA-QnfM22Aa4a3R_rqrQ_1772441046 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441046; x=1773045846; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JruPiL/RMqNrXj7flD5Mqv0Tag1Q1v6iCWYNayccrwU=; b=lsj5dSFbDB20uHcgGf8I1CDW1Jfk1A8s/yHWHSKULi84ZUPS0U0LEYvPcxFXtNcvBG t377kjkK6QF7CpzH1D2YhDvMYr5zHg/Thn2Hh8t5KlMsV9OwadMeWNx0sNACwYJ2B9Si SgI/XQrdm84tWcdf13bB38vUBqqaCGl37mEn7DlQE1Q12vr0ATp5NyIVFE7mKrHSTtft tgtYAxesX+fSAEMYnCUkm5Pjg4lPn9VKRW0epGgnfVV1qJ0/LYlyFpvZR3vEp6NwXfa7 VkgLQtsrfn0oCbMwqL2+mO2kScofxiu78RKcc80OJghfO3cxHDVtaia88mRv2aaGRKt8 Xrxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441046; x=1773045846; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=JruPiL/RMqNrXj7flD5Mqv0Tag1Q1v6iCWYNayccrwU=; b=bdCa2K+z7TdIKpNE32Be15ZkHdDL0RAhEppBEGp6QWmYx+W+DXsxHk4NKI95rMD2eP L7CsxW+xD+vm39S66hj9qgWYYEsomOTzqSOcAxUSDRl28gXC34BYhB4w048TsWmpGF3p N95m0OWnNep1NtcCDZOyiLfaz/BCtOROtZZOSelaJgVYFB4ArDnXfs9rU/C3CG1ezvyE wru+vBSX070FAC6CpUj4aRZZGL1Q46NEoFhykHa2BE0c2nUE7OTdpO1pM9BYQ3vYuntB D0g6IKqqz6tk3BEAsBYx0qVH2v7ffwyskUu1B2sx6IUjl/yqr7Gc2ddZ9FJC/wRCDuKC 0ViA== X-Gm-Message-State: AOJu0YyyjHSxEm5mNrjcphOdXjVpmJoRYHpJgJSkTJGfDV7Sn5G5elWP p00Lr6B2qhQtpZGcOF0toeja4/4U73IiFPm1Aa1KZ/Pc40G3CkmEKiMhimOYa0aXFy+I4UvTeoO Tzrs9CRntfsMiFjhkLgDqbQoJkK3GwPKAukvSplAMkBFOALce877g5UN3nep16yysGgrUNzVCCI eaiVD56kywUTYHTNQCyHOyI0TQE7sgSuggJRwSnUBp X-Gm-Gg: ATEYQzyeV5uY68DV/ipELRA+61flSJw2BjZOcH6V9TiIkfMjoZ7xa25mFFiVNNxC5A5 bX9ctlo4xI5uuSbpG9z/MVwL3zJ5AJvMxP8WOku63lGN2Tn6AFdSyVOxf6EKBK3esYjlNKG1F/Y Sz4eUcQFcfAlLFl30ERwvqrqXYIgCSq3Ofwb6FjP/c885MnuK4lDKEEl8N/KVP8KSBzzjoaoktG 2Pvl28V1zKJZvunicRrrItQaV/94+30TCgIQ1Dc7wUSnIArnkWm18u5D73soiWI9Kjod0DTsATi xbRNJowZHtLg8f8sbOBWIVWqtW1zBwtACwAqhSBUjczxf0YzJpYRt9repIk3NVNgAuwwK1bh/Jk nWkpR04UMWYjO5q/xPJwb71YeM6i23DipdPR2rPdfWeERZw+IUys3n6sGd7MMY0Re7WZkcFYGRL zUE9DVtxaqoH9Cinv02T3hWHUz/d0= X-Received: by 2002:a05:6000:40ce:b0:435:a3b9:9b8 with SMTP id ffacd0b85a97d-4399ddf8063mr21269457f8f.24.1772441046039; Mon, 02 Mar 2026 00:44:06 -0800 (PST) X-Received: by 2002:a05:6000:40ce:b0:435:a3b9:9b8 with SMTP id ffacd0b85a97d-4399ddf8063mr21269386f8f.24.1772441045445; Mon, 02 Mar 2026 00:44:05 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 008/102] whpx: preparatory changes before switching over from winhvemulation Date: Mon, 2 Mar 2026 09:42:03 +0100 Message-ID: <20260302084338.473368-9-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441121670158501 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-8-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 2 +- target/i386/emulate/meson.build | 1 + target/i386/mshv/meson.build | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 9f222a0c9fe..065613722f1 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -2286,7 +2286,7 @@ typedef struct CPUArchState { QEMUTimer *xen_periodic_timer; QemuMutex xen_timers_lock; #endif -#if defined(CONFIG_HVF) || defined(CONFIG_MSHV) +#if defined(CONFIG_HVF) || defined(CONFIG_MSHV) || defined(CONFIG_WHPX) void *emu_mmio_buf; #endif =20 diff --git a/target/i386/emulate/meson.build b/target/i386/emulate/meson.bu= ild index dd047c424a1..1bb35162498 100644 --- a/target/i386/emulate/meson.build +++ b/target/i386/emulate/meson.build @@ -7,3 +7,4 @@ emulator_files =3D files( =20 i386_system_ss.add(when: [hvf, 'CONFIG_HVF'], if_true: emulator_files) i386_system_ss.add(when: 'CONFIG_MSHV', if_true: emulator_files) +i386_system_ss.add(when: 'CONFIG_WHPX', if_true: emulator_files) diff --git a/target/i386/mshv/meson.build b/target/i386/mshv/meson.build index 647e5dafb77..3fadd4598a5 100644 --- a/target/i386/mshv/meson.build +++ b/target/i386/mshv/meson.build @@ -6,3 +6,7 @@ i386_mshv_ss.add(files( )) =20 i386_system_ss.add_all(when: 'CONFIG_MSHV', if_true: i386_mshv_ss) + +i386_system_ss.add(when: 'CONFIG_WHPX', if_true: files( + 'x86.c', +)) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441116; cv=none; d=zohomail.com; s=zohoarc; b=R6zsFk5JZcrLp8/6GemVsFv4+hRQ71zJ0UX2m8G3S34qyVagBMN0cGbj/0Ya4Y0Ube1ACe25g3VsiHzpbRFQlgrRZzf8dYFGvWAL2nSzfzSSu1qUdzDmiB9Ao/PzKOwYZENGmGUH6BQw2jzSNGFovB+eJw9jmJi44+oXKKWvHBs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441116; 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=5glJM2P7fY2YVXE7FFswaKmcrolKLgkeSRsFSCk7y4s=; b=YLGp8CxQdTiiH7CTpLasscTF51rllASXiIbTKkDe2jv7toPlLXm+uSCEdYwN+yRPpSoM70e5YiqcPsz7EpKKpQ58AUxyG2MJliOrDXBls3fNwI1RIrCxI8iqydAiz/4snr/3vrvfV3KG3iPHVYolYh3Z/oxCcpMAzEa9bhjqP2U= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441116035950.8722338119028; Mon, 2 Mar 2026 00:45:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytE-0001j9-8y; Mon, 02 Mar 2026 03:44:32 -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 1vwyt9-0001hT-S0 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:27 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyt3-0001XA-Sg for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:25 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-381-CqsrNeRsNP-LgNVw8PfscA-1; Mon, 02 Mar 2026 03:44:10 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-4363333c102so2851396f8f.1 for ; Mon, 02 Mar 2026 00:44:10 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439abdf5430sm15119019f8f.5.2026.03.02.00.44.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441057; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5glJM2P7fY2YVXE7FFswaKmcrolKLgkeSRsFSCk7y4s=; b=YwXRziaCyY7qkaSjygiDhIXnOLGQbSYK6A2BSDluQ68cRjCu6ILmxgEM9TF4exNjqyFZ8W aZ6ZGkuAcNc1hPCN+miY90ejZ4WNp/lGNXHO4bQTlS8NLWF8lAG3Nan81iFoNo63YSdcS+ ddzfZAScDTxhoP/f3p42VUcpWZpnusE= X-MC-Unique: CqsrNeRsNP-LgNVw8PfscA-1 X-Mimecast-MFC-AGG-ID: CqsrNeRsNP-LgNVw8PfscA_1772441049 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441048; x=1773045848; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5glJM2P7fY2YVXE7FFswaKmcrolKLgkeSRsFSCk7y4s=; b=SMyVX/+3f4IsBPDwDuMJJOQhPxEnOMybY7KUWJJIBRMybL4g2Jf6YadHhkoa6zJV36 1+cxh1YONvUZ+E+Gp+YVxAXZtHSxfuQrZLELviukzxaBFmtxXknLvhKDnUgIZZddABMk GAY9DK0yM7tRspBOOpXLel2MVanvpAhDa0/raJmDAtjp52p9c1/PlWB3B3/sEW3VUl8D keWZBnam4Xe6SsMuDWEEI9fO9Vd5jMiFYm16Mvma8VXxZ3QXpas2NwsvCvYBZ0lUaNAA Z8b/frh3uR64C4BqZ6GQGDZNNU8mjeAUChGvcpKpSr/Xa8hL8SIzuIXRbbPQBMtAJFZt 2mrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441048; x=1773045848; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5glJM2P7fY2YVXE7FFswaKmcrolKLgkeSRsFSCk7y4s=; b=SrkS4K0Fjk5xBe8VPGPuA1Pm5XctprPDf4KLjWO1sZWKLFITwvFS7mGKMFHGiGrmKS KrtAoNkBGw9Yp2c5Ve2UGEEb0qFkbyoEZdlaW3ODyCxryLYnhm10YeIjxd81yoh+MjW8 v0vDK2Ar2ZbMKLepyOTEjFmwCLTR1CopXCg4cjnQ1aA+0SyXAuk5V630SLW3EpKuGMfL 34ZbEEFpWNQcG81r7qyyiRU13JhjnitQkipGdaUZkHWy0J0FThDWnU/ZEhHFD9OFF3va Dy8gbk/H57vjB+uw5xG8P3986+c7uZ1EjVjnEzX3YF3lrZme9jgBIWt1d+8RSQpSzTfy jR2g== X-Gm-Message-State: AOJu0Yzhb17Aw7TNzwVg5y0gerM4f8OCFiVrVDWznPXiTd+dwmK0YJFe AXJJGaRVO+233RwLyBgiuZdnKahD5uUdXkKQ1RHbTE+ujwlB8j58IizxGus6W978qpuPNWFBhog REPKo3E+B3qzUhNcbm56FovW8DgChliqXAooN4TIpGocZzqsFSducRVDVompkC+NUMKOZxacicV VFx5wKhQ20kvkMuYRgg+UUpSEDPLJ0g4smx36lSh2g X-Gm-Gg: ATEYQzzCXU+lkLDzsdwnE3+0lv4FI1kdw4J9EfOnaYiSuTSMM36C3H5IU04wrEgxg90 kU2Z/Tj7rL/Ya8D1Dot5s9Trm5iFlEUZ97A3cn9Mp6a89C4who1N8WD+vGcRsdbdybcBiw4JagE Y705XzBFz5teOF6k4+dYGuYUuJuLiWKXfDSa/nGCCYOW3fIwgKUA3nm1luD2uBOG7+GKvHDbUVM h2Qc/F8YcsUmyYOZ49oww3oSDVofB4w9TJEgwO3zj2UkelWJuO4hwObzHggFD0Ecu6hYe8U0djb NtJlXiq5bbstpZm7h7vm6lFJVJ+4JlAReNo28u4+kqVnaKdeiPR8uWkrGWiPBpl1nhyRs5ZCUE1 hiQxX6kAyFEMfHVWzSG00Da7NbJy/Gl8HMOA3+aHENigAghA+wbocG8h/+C88RVH5F5AyVMs9Uz O0KVRrvHylneF/FIe7VYjk7AybgM8= X-Received: by 2002:a05:6000:2f86:b0:435:8ad8:b7a with SMTP id ffacd0b85a97d-4399de2c5a6mr19151141f8f.46.1772441047931; Mon, 02 Mar 2026 00:44:07 -0800 (PST) X-Received: by 2002:a05:6000:2f86:b0:435:8ad8:b7a with SMTP id ffacd0b85a97d-4399de2c5a6mr19151089f8f.46.1772441047352; Mon, 02 Mar 2026 00:44:07 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 009/102] whpx: refactor whpx_destroy_vcpu to arch-specific function Date: Mon, 2 Mar 2026 09:42:04 +0100 Message-ID: <20260302084338.473368-10-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441130589158500 From: Mohamed Mediouni Avoid a TARGET_X86_64 define by moving platform-specific code away from generic WHPX support. Signed-off-by: Mohamed Mediouni Reviewed-by: Philippe Mathieu-Daud=C3=A9 Link: https://lore.kernel.org/r/20260223233950.96076-9-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- include/system/whpx-all.h | 1 + accel/whpx/whpx-common.c | 5 +---- target/arm/whpx/whpx-all.c | 5 +++++ target/i386/whpx/whpx-all.c | 6 ++++++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/include/system/whpx-all.h b/include/system/whpx-all.h index 3db074c38c5..b831c463b0b 100644 --- a/include/system/whpx-all.h +++ b/include/system/whpx-all.h @@ -17,6 +17,7 @@ void whpx_translate_cpu_breakpoints( struct whpx_breakpoints *breakpoints, CPUState *cpu, int cpu_breakpoint_count); +void whpx_arch_destroy_vcpu(CPUState *cpu); =20 /* called by whpx-accel-ops */ bool whpx_arch_supports_guest_debug(void); diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c index f018a8f5c7d..c57a0d3f0f9 100644 --- a/accel/whpx/whpx-common.c +++ b/accel/whpx/whpx-common.c @@ -236,10 +236,7 @@ void whpx_destroy_vcpu(CPUState *cpu) struct whpx_state *whpx =3D &whpx_global; =20 whp_dispatch.WHvDeleteVirtualProcessor(whpx->partition, cpu->cpu_index= ); -#ifdef HOST_X86_64 - AccelCPUState *vcpu =3D cpu->accel; - whp_dispatch.WHvEmulatorDestroyEmulator(vcpu->emulator); -#endif + whpx_arch_destroy_vcpu(cpu); g_free(cpu->accel); } =20 diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c index e01e6499ba4..0a31c7b9464 100644 --- a/target/arm/whpx/whpx-all.c +++ b/target/arm/whpx/whpx-all.c @@ -308,6 +308,11 @@ bool whpx_arch_supports_guest_debug(void) return false; } =20 +void whpx_arch_destroy_vcpu(CPUState *cpu) +{ + /* currently empty on Arm */ +} + static void whpx_get_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTE= R_VALUE* val) { struct whpx_state *whpx =3D &whpx_global; diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index e1f0fa5e770..cdcaebbe167 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -1277,6 +1277,12 @@ bool whpx_arch_supports_guest_debug(void) return true; } =20 +void whpx_arch_destroy_vcpu(CPUState *cpu) +{ + AccelCPUState *vcpu =3D cpu->accel; + whp_dispatch.WHvEmulatorDestroyEmulator(vcpu->emulator); +} + /* Returns the address of the next instruction that is about to be execute= d. */ static vaddr whpx_vcpu_get_pc(CPUState *cpu, bool exit_context_valid) { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772442040; cv=none; d=zohomail.com; s=zohoarc; b=CTiBcE799+h9G1h4FDQzngxu4vNl9Q/lZG6NXuv1eoSgIuljN6JSZbFvszOLkK3YggVV40ztCgiOGwFhOJL3VOu0vzDU5Hg0ZZE9seFyc2rIHQSeMFZwoLc5dO1Znf80MLXgODlhIiFGsyFLQ9jULfl7zdEAInQsonzaN+uOZbc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772442040; 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=KxeFgXMQUKofiCJ9WaS9KH7c4WL0gbGsydEVVUW1XxA=; b=Tk5pkf8pvrj4rkCvInQK4fx/PfkZjKRbm8AacgUnuBup3jByUIlJnpu0F4FKqf302O/G7Mq3vYtLKCIAe+N3sjKCd9j1Cim2OIRdFAGgVcejY20R65pXI5XCE0FRn8qJsKyWCb+EhEzA1yWu/w0rLhp/9fMaIkTuCt0RaDGB9zc= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772442040389512.5004330971611; Mon, 2 Mar 2026 01:00:40 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyt7-0001ZJ-RO; Mon, 02 Mar 2026 03:44:25 -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 1vwyt4-0001X7-3x for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:23 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwysy-0001Wk-9l for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:17 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-12-A58fMCZXMf6G8FBQIxxptQ-1; Mon, 02 Mar 2026 03:44:12 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-482d8e6e13aso32788695e9.3 for ; Mon, 02 Mar 2026 00:44:11 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd70e692sm413479265e9.7.2026.03.02.00.44.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441053; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KxeFgXMQUKofiCJ9WaS9KH7c4WL0gbGsydEVVUW1XxA=; b=Eqec8GDj6ja7xKZPLWd5wNHhoC+epn4dCLG7TDbXdrv1PRbjdHuG2im4veZkBazf+NbV+0 NV0mUEPQkHEN9wsnHkhR7uQBX1jKOZ3poQwYq7kPqaBEj/UYvX6948al/afqgkkqTCeDNj JQ/IagRqCW80ecRIcpkqITFHcUJEAfY= X-MC-Unique: A58fMCZXMf6G8FBQIxxptQ-1 X-Mimecast-MFC-AGG-ID: A58fMCZXMf6G8FBQIxxptQ_1772441051 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441049; x=1773045849; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KxeFgXMQUKofiCJ9WaS9KH7c4WL0gbGsydEVVUW1XxA=; b=TGarHLB3flNu6DpjqCsIok/eGV/rO/fsFtOX3b6Hpntotp7PQB+ZUlXW3sQ6sc4mGO gHSTw641a5F0/mWLM5XwToujgc3nLbLphJpe49rMfZhVw+is5Dmtgtv0vyofuCC5AN+c eWsG37dMSd5C00DC1+SvpXz6CkHeF5Tdnz1kI6aAZ771UrNjTMFIH5hiqTVrhrS2q327 /3FRMwH58ql6f1LpC3vKW/hnlX7vlwVgPglwUnoNuPE9fT6fvQbI3QKRxC4PpUvglemW oYQH/pKU8fZZCQatQmqeuMavRp9M9kTWHEjhl8t/wpkxiMmozPfB5fUHb9dBC7ck4ZQe r8bQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441049; x=1773045849; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=KxeFgXMQUKofiCJ9WaS9KH7c4WL0gbGsydEVVUW1XxA=; b=ufqScnXn3QZBIP2N+rl3qCynjc3qCLM1XNLKj7cDG6Ffo5jhDiZcsVwmIQwG12AQVR 07NZOwbPISlHqOHz+BvP2z0+IlzBiXchJ2JJ9FDMG56Tudsu9dlQycgIkqre1tFt8zQ/ m2yD6BvKmacCKbYLkGOeP3ZOHyg9Z7Uu4GDHTWstmMo3ef8Tf+X0i9uvSFOlt3D8WPFh ljKckB5pZHFrQT2mfxiaCzMGBD4IFk955Z/A2CDMHnX+ZTaZ9aCUpyGGLa8+4zIFtoHu mMVcVrOMtyhza+nyJq+t9P94wiZ1kMMesowoAwXmxQvJyuUQZiC4KTM7R0gHGDueQMTi j0sA== X-Gm-Message-State: AOJu0Yw1H8zXZmEadE6bu4HhGJLJmYclkhsLGgVKkS5hOETxoGhmCEYm lDdKn5upEJxKDeMCx0ueyei4S/I/RwCmrhEd5kMkAm0mURtpKiXVdrFOE1o+3o2kI6Nuc7qRAup vWOaesP0Ay0TwlPlOtElFP8peLaGIC6MGLPKFSh/OJrQkjOtfvq/5R7thG8PZ7uT2HBsA5WuhB1 TM3DRmoOpxwg95Mspuzbe8KxgPcZ0w+ecnuTV7EvoZ X-Gm-Gg: ATEYQzzmvVIdcfOJKRjNjW/+Mw6c+vXRlYD9y6wCJTbwPuDAL+hlxyZ5vg5nhB92ztE JhJg7ljnrpc3ypbzi75XANlJs7htCQY0Htv7bydFR++Cmps+OqztR23b8JBEr1h48ghymtXp5qI /hzDJcCrtqDGn6xBPFntkXASb2rMyMxwIB294dK4hUWcYdecXUhdlhfi0I3JDGyfwZHfdK5i3kC 3jSrMpLW9JA3HyP2k5m3qH0U1VQFauNTAI2OD84PZLykVGtY44N6UnIIRD8co5PMyD0hREAKAb1 M/iqMnAyJvzAaxy2Cu9MHajsu16dglgv4P/deZdUyYt+Qisy1wWrwMOZjOphcv6mw//d0hCE9ST sCVU6ViLuCGOLTnsWo1Txj8l3h30mabAJG1sqhzCjHH/fh074hCb8CrWq3cuK1zM5qaUFawuRsU zVCAmOIOnV5Bx4tSiQdXe0al+Z330= X-Received: by 2002:a05:600c:a086:b0:483:a895:9d85 with SMTP id 5b1f17b1804b1-483c9ba3ae6mr211380195e9.2.1772441049219; Mon, 02 Mar 2026 00:44:09 -0800 (PST) X-Received: by 2002:a05:600c:a086:b0:483:a895:9d85 with SMTP id 5b1f17b1804b1-483c9ba3ae6mr211379655e9.2.1772441048686; Mon, 02 Mar 2026 00:44:08 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni , Bernhard Beschow Subject: [PULL 010/102] whpx: move whpx_get_reg/whpx_set_reg to generic code Date: Mon, 2 Mar 2026 09:42:05 +0100 Message-ID: <20260302084338.473368-11-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772442042338158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni These will be used in the next commit on the x86_64 backend too. Also move flush_cpu_state as it's used by get_reg/set_reg and the arm64 cod= e. Signed-off-by: Mohamed Mediouni Reviewed-by: Bernhard Beschow Link: https://lore.kernel.org/r/20260223233950.96076-10-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- include/system/whpx-common.h | 3 +++ accel/whpx/whpx-common.c | 35 ++++++++++++++++++++++++++++++++++ target/arm/whpx/whpx-all.c | 37 +----------------------------------- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/include/system/whpx-common.h b/include/system/whpx-common.h index b86fe9db6eb..a4e16e13099 100644 --- a/include/system/whpx-common.h +++ b/include/system/whpx-common.h @@ -20,6 +20,9 @@ int whpx_first_vcpu_starting(CPUState *cpu); int whpx_last_vcpu_stopping(CPUState *cpu); void whpx_memory_init(void); struct whpx_breakpoint *whpx_lookup_breakpoint_by_addr(uint64_t address); +void whpx_flush_cpu_state(CPUState *cpu); +void whpx_get_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE= * val); +void whpx_set_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE= val); =20 /* On x64: same as WHvX64ExceptionTypeDebugTrapOrFault */ #define WHPX_INTERCEPT_DEBUG_TRAPS 1 diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c index c57a0d3f0f9..21e9f1a1781 100644 --- a/accel/whpx/whpx-common.c +++ b/accel/whpx/whpx-common.c @@ -46,6 +46,41 @@ static HMODULE hWinHvEmulation; struct whpx_state whpx_global; struct WHPDispatch whp_dispatch; =20 +void whpx_flush_cpu_state(CPUState *cpu) +{ + if (cpu->vcpu_dirty) { + whpx_set_registers(cpu, WHPX_SET_RUNTIME_STATE); + cpu->vcpu_dirty =3D false; + } +} + +void whpx_get_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE= * val) +{ + struct whpx_state *whpx =3D &whpx_global; + HRESULT hr; + + whpx_flush_cpu_state(cpu); + + hr =3D whp_dispatch.WHvGetVirtualProcessorRegisters(whpx->partition, c= pu->cpu_index, + ®, 1, val); + + if (FAILED(hr)) { + error_report("WHPX: Failed to get register %08x, hr=3D%08lx", reg,= hr); + } +} + +void whpx_set_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE= val) +{ + struct whpx_state *whpx =3D &whpx_global; + HRESULT hr; + hr =3D whp_dispatch.WHvSetVirtualProcessorRegisters(whpx->partition, c= pu->cpu_index, + ®, 1, &val); + + if (FAILED(hr)) { + error_report("WHPX: Failed to set register %08x, hr=3D%08lx", reg,= hr); + } +} + /* Tries to find a breakpoint at the specified address. */ struct whpx_breakpoint *whpx_lookup_breakpoint_by_addr(uint64_t address) { diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c index 0a31c7b9464..0d56e468bdf 100644 --- a/target/arm/whpx/whpx-all.c +++ b/target/arm/whpx/whpx-all.c @@ -273,14 +273,6 @@ static struct whpx_sreg_match whpx_sreg_match[] =3D { { WHvArm64RegisterSpEl1, ENCODE_AA64_CP_REG(4, 1, 3, 4, 0) }, }; =20 -static void flush_cpu_state(CPUState *cpu) -{ - if (cpu->vcpu_dirty) { - whpx_set_registers(cpu, WHPX_SET_RUNTIME_STATE); - cpu->vcpu_dirty =3D false; - } -} - HRESULT whpx_set_exception_exit_bitmap(UINT64 exceptions) { if (exceptions !=3D 0) { @@ -313,33 +305,6 @@ void whpx_arch_destroy_vcpu(CPUState *cpu) /* currently empty on Arm */ } =20 -static void whpx_get_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTE= R_VALUE* val) -{ - struct whpx_state *whpx =3D &whpx_global; - HRESULT hr; - - flush_cpu_state(cpu); - - hr =3D whp_dispatch.WHvGetVirtualProcessorRegisters(whpx->partition, c= pu->cpu_index, - ®, 1, val); - - if (FAILED(hr)) { - error_report("WHPX: Failed to get register %08x, hr=3D%08lx", reg,= hr); - } -} - -static void whpx_set_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTE= R_VALUE val) -{ - struct whpx_state *whpx =3D &whpx_global; - HRESULT hr; - hr =3D whp_dispatch.WHvSetVirtualProcessorRegisters(whpx->partition, c= pu->cpu_index, - ®, 1, &val); - - if (FAILED(hr)) { - error_report("WHPX: Failed to set register %08x, hr=3D%08lx", reg,= hr); - } -} - static void whpx_get_global_reg(WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE = *val) { struct whpx_state *whpx =3D &whpx_global; @@ -526,7 +491,7 @@ int whpx_vcpu_run(CPUState *cpu) if (advance_pc) { WHV_REGISTER_VALUE pc; =20 - flush_cpu_state(cpu); + whpx_flush_cpu_state(cpu); pc.Reg64 =3D vcpu->exit_ctx.MemoryAccess.Header.Pc + 4; whpx_set_reg(cpu, WHvArm64RegisterPc, pc); } --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441122; cv=none; d=zohomail.com; s=zohoarc; b=A6c3AzqvES3R/VeWrRNiTpHo44jd3w/LuL1FoLCfcuUchQlWiP3j9Quku1qUqXwZ5KIxsaL+G0iB0LOnUi9SD9E0GVP55NeEYhgGzP/RK8NFNKDgE1yF3oR0+IEDRajivsfkOY+W2x4iLBCPhq9BTEPzOj68bniPtKt39WFnzX0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441122; 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=lfcZzc/DZcWi8if1BQU+wSLjMESP5Db2QDdPAzM1JlA=; b=Zh7pQjHktpnyyf5pvJh4tl5qmn5x5Py7SCCAMstm9P3iqbJuLLY0PgXp6y143R++Me2S4SgJNQV+NoFvR3TToK6aT5XSybo/XCrT5/6GW+gseftkymrs0PnvIP/mvAAA5SUtTv9YqL8ivcvqJZDs+ClLek5fbKgdWN0Vyt2ervQ= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441121997529.2035649571119; Mon, 2 Mar 2026 00:45:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyt8-0001ej-Fi; Mon, 02 Mar 2026 03:44:26 -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 1vwyt4-0001X8-4k for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:23 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwysy-0001Ww-BI for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:19 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-252-FktiBpIuO0Or_IgM3xCAZQ-1; Mon, 02 Mar 2026 03:44:14 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-48071615686so32863135e9.1 for ; Mon, 02 Mar 2026 00:44:14 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd7030b9sm317685125e9.4.2026.03.02.00.44.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441055; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lfcZzc/DZcWi8if1BQU+wSLjMESP5Db2QDdPAzM1JlA=; b=dXkCNUXMQvz7hbmsEuwiJG2JfxyekZ8Am2JA6e8QejekpHMEy1AlmaN+nSyrAVMx4aKikT zcjzJQemqGXtfvCGCw0HkYI6KbcI9CwGWqM5fHYG0uOdILxHV3WVEU5nIYMPBiPCjhSDc+ LTbeV3mmuEO0GKwcU0++SU6k2nU/lAg= X-MC-Unique: FktiBpIuO0Or_IgM3xCAZQ-1 X-Mimecast-MFC-AGG-ID: FktiBpIuO0Or_IgM3xCAZQ_1772441053 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441052; x=1773045852; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lfcZzc/DZcWi8if1BQU+wSLjMESP5Db2QDdPAzM1JlA=; b=mAZZ0Xl3la3bZJF6jcg/8R0W5eYM5z9bbHtV5pLbYiryZ51xAHWNuo2hB60+pREnW8 hMQ8iZxxbaUu4vaBOHLLQoZFnBKKcyuXuXKwxFhEtqYcoCj+WvIr1xxzZ/fwfQ38YynG NQXuzkaqAeovXkYbhtD9W7D/yvr5XNT9iixaHxiAA7LcZs+iKaG9JB4+JjA5ehXF+8K4 EnouZVvdW5Ny/T7SyeOB0R0uUR9rTYZn6Q/GUTKA772vTJFHWRYiuNo3+jaWfwqKn9nm OwMNhqwLL5IkPtie5Zr54AD2i9Vj3H09n+HcWXf9t6GzjCs16wnMSRaEvr749USTQT8m HgaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441052; x=1773045852; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lfcZzc/DZcWi8if1BQU+wSLjMESP5Db2QDdPAzM1JlA=; b=cxbBZpybxjBP6UI5PWUZtXWvsJRmnQ688dN7Dmck7y3GpC8W8hjePg23HTY/FNXOwL YD+36um4WQQ7prZDMo4SLhXeGImqEgPeO03tOw1VuxQ8TqEyo/YPUfUkwaWTVkNznVuc dsC+TtNhN7diGRQsTC+Tes4MZNWxRIiXOUnSXdaQ2J6yQFVXIloYxnmy2SXX+P3aY+YZ CK2S7kc4QgFHCbbRqVMIFZsDVknaXp4DoDidtWAsLYvwRn511zgN8X9iaAmK+bhWAPSF PcCEfzyt3P7IuFwzOpoQOFmR1UTY+IapsRBzwq4hWDE8f7gheReknIJ2xtAmroAizZOr 0VSA== X-Gm-Message-State: AOJu0YyL0EMJbj82s+DJJiqU8dj5CYzuL1448lyNShDpEx8DazWPRYGz +692VjMM7+INdWkTQ55iGbzJBahM6G9RZxa733nysClnIEyGkZZCuPxbxpnXA9YXig0xF4HrkO8 ApnsWdZl/3zM8qSijRM16AEcbgLMGAmro1/S7eZwIeXBP8oX1paTnMO6Ilxwhh+rgwJ0G88wLm1 1mgCda9VRD43vpavpZxYhn3VDyDQI8rOXfOD/ISTl3 X-Gm-Gg: ATEYQzy2YKCoSnoT7Yn0k1tb7Y/4GsT3CFbMmQRuP+jQ0qyuX6thvnlixHw4fI6JLE0 cRWEdVzCQsUykGQOhoFV7gq5cmlWUfxGkB9gp3n18h2MBhzyOtvxtCZC3PhZ8CRU2MrFhVXwMiO Xmtzb30BUSxbxbqgX3Y9j46XGPud9tK+Gqkvw5NaZfIYTHB3GmyWu+w2P/HSAOwnYdTc/udUDGw K/TdDgnFKVPOQ0NpHlJRG5/ZD0d4m62mWW3UjJRCCfS71NJgbTdLPfuG/4UxlF5T34cD6DmrytB /bGVxyv1ZdcoUcW4Wigync/45xUIRDBbZulyhzvm3GM+KNjKps/6T4RF3wSzrbGeIlyfUkpNV/B tPlH5Hpe8VPBIyoBPrjs4cGABkgIj9/3AXuv7tjvHraPo1sUV3FVEH4+qBQapYLruyVaTxU4AGi McDLlFB77zBZtdoGVqIntHHicqEpE= X-Received: by 2002:a05:600c:4fc8:b0:47b:e2a9:2bd7 with SMTP id 5b1f17b1804b1-483c9beaca0mr238450375e9.19.1772441052291; Mon, 02 Mar 2026 00:44:12 -0800 (PST) X-Received: by 2002:a05:600c:4fc8:b0:47b:e2a9:2bd7 with SMTP id 5b1f17b1804b1-483c9beaca0mr238449855e9.19.1772441051694; Mon, 02 Mar 2026 00:44:11 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 011/102] whpx: i386: switch over from winhvemulation to target/i386/emulate Date: Mon, 2 Mar 2026 09:42:06 +0100 Message-ID: <20260302084338.473368-12-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441127653158501 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Using the mshv backend as a base, move away from winhvemulation to using common QEMU code used by the HVF and mshv backends. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-11-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 274 +++++++++++++++++------------------- 1 file changed, 126 insertions(+), 148 deletions(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index cdcaebbe167..eb6076d2f49 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -15,6 +15,7 @@ #include "gdbstub/helpers.h" #include "qemu/accel.h" #include "accel/accel-ops.h" +#include "system/memory.h" #include "system/whpx.h" #include "system/cpus.h" #include "system/runstate.h" @@ -36,8 +37,12 @@ #include "system/whpx-all.h" #include "system/whpx-common.h" =20 +#include "emulate/x86_decode.h" +#include "emulate/x86_emu.h" +#include "emulate/x86_flags.h" +#include "emulate/x86_mmu.h" + #include -#include =20 #define HYPERV_APIC_BUS_FREQUENCY (200000000ULL) =20 @@ -756,160 +761,140 @@ void whpx_get_registers(CPUState *cpu) x86_update_hflags(env); } =20 -static HRESULT CALLBACK whpx_emu_ioport_callback( - void *ctx, - WHV_EMULATOR_IO_ACCESS_INFO *IoAccess) +static int emulate_instruction(CPUState *cpu, const uint8_t *insn_bytes, s= ize_t insn_len) { - MemTxAttrs attrs =3D { 0 }; - address_space_rw(&address_space_io, IoAccess->Port, attrs, - &IoAccess->Data, IoAccess->AccessSize, - IoAccess->Direction); - return S_OK; + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + struct x86_decode decode =3D { 0 }; + x86_insn_stream stream =3D { .bytes =3D insn_bytes, .len =3D insn_len = }; + + whpx_get_registers(cpu); + decode_instruction_stream(env, &decode, &stream); + exec_instruction(env, &decode); + whpx_set_registers(cpu, WHPX_SET_RUNTIME_STATE); + + return 0; } =20 -static HRESULT CALLBACK whpx_emu_mmio_callback( - void *ctx, - WHV_EMULATOR_MEMORY_ACCESS_INFO *ma) +static int whpx_handle_mmio(CPUState *cpu, WHV_RUN_VP_EXIT_CONTEXT *exit_c= tx) { - CPUState *cs =3D (CPUState *)ctx; - AddressSpace *as =3D cpu_addressspace(cs, MEMTXATTRS_UNSPECIFIED); + WHV_MEMORY_ACCESS_CONTEXT *ctx =3D &exit_ctx->MemoryAccess; + int ret; =20 - address_space_rw(as, ma->GpaAddress, MEMTXATTRS_UNSPECIFIED, - ma->Data, ma->AccessSize, ma->Direction); - return S_OK; -} - -static HRESULT CALLBACK whpx_emu_getreg_callback( - void *ctx, - const WHV_REGISTER_NAME *RegisterNames, - UINT32 RegisterCount, - WHV_REGISTER_VALUE *RegisterValues) -{ - HRESULT hr; - struct whpx_state *whpx =3D &whpx_global; - CPUState *cpu =3D (CPUState *)ctx; - - hr =3D whp_dispatch.WHvGetVirtualProcessorRegisters( - whpx->partition, cpu->cpu_index, - RegisterNames, RegisterCount, - RegisterValues); - if (FAILED(hr)) { - error_report("WHPX: Failed to get virtual processor registers," - " hr=3D%08lx", hr); - } - - return hr; -} - -static HRESULT CALLBACK whpx_emu_setreg_callback( - void *ctx, - const WHV_REGISTER_NAME *RegisterNames, - UINT32 RegisterCount, - const WHV_REGISTER_VALUE *RegisterValues) -{ - HRESULT hr; - struct whpx_state *whpx =3D &whpx_global; - CPUState *cpu =3D (CPUState *)ctx; - - hr =3D whp_dispatch.WHvSetVirtualProcessorRegisters( - whpx->partition, cpu->cpu_index, - RegisterNames, RegisterCount, - RegisterValues); - if (FAILED(hr)) { - error_report("WHPX: Failed to set virtual processor registers," - " hr=3D%08lx", hr); - } - - /* - * The emulator just successfully wrote the register state. We clear t= he - * dirty state so we avoid the double write on resume of the VP. - */ - cpu->vcpu_dirty =3D false; - - return hr; -} - -static HRESULT CALLBACK whpx_emu_translate_callback( - void *ctx, - WHV_GUEST_VIRTUAL_ADDRESS Gva, - WHV_TRANSLATE_GVA_FLAGS TranslateFlags, - WHV_TRANSLATE_GVA_RESULT_CODE *TranslationResult, - WHV_GUEST_PHYSICAL_ADDRESS *Gpa) -{ - HRESULT hr; - struct whpx_state *whpx =3D &whpx_global; - CPUState *cpu =3D (CPUState *)ctx; - WHV_TRANSLATE_GVA_RESULT res; - - hr =3D whp_dispatch.WHvTranslateGva(whpx->partition, cpu->cpu_index, - Gva, TranslateFlags, &res, Gpa); - if (FAILED(hr)) { - error_report("WHPX: Failed to translate GVA, hr=3D%08lx", hr); - } else { - *TranslationResult =3D res.ResultCode; - } - - return hr; -} - -static const WHV_EMULATOR_CALLBACKS whpx_emu_callbacks =3D { - .Size =3D sizeof(WHV_EMULATOR_CALLBACKS), - .WHvEmulatorIoPortCallback =3D whpx_emu_ioport_callback, - .WHvEmulatorMemoryCallback =3D whpx_emu_mmio_callback, - .WHvEmulatorGetVirtualProcessorRegisters =3D whpx_emu_getreg_callback, - .WHvEmulatorSetVirtualProcessorRegisters =3D whpx_emu_setreg_callback, - .WHvEmulatorTranslateGvaPage =3D whpx_emu_translate_callback, -}; - -static int whpx_handle_mmio(CPUState *cpu, WHV_MEMORY_ACCESS_CONTEXT *ctx) -{ - HRESULT hr; - AccelCPUState *vcpu =3D cpu->accel; - WHV_EMULATOR_STATUS emu_status; - - hr =3D whp_dispatch.WHvEmulatorTryMmioEmulation( - vcpu->emulator, cpu, - &vcpu->exit_ctx.VpContext, ctx, - &emu_status); - if (FAILED(hr)) { - error_report("WHPX: Failed to parse MMIO access, hr=3D%08lx", hr); - return -1; - } - - if (!emu_status.EmulationSuccessful) { - error_report("WHPX: Failed to emulate MMIO access with" - " EmulatorReturnStatus: %u", emu_status.AsUINT32); + ret =3D emulate_instruction(cpu, ctx->InstructionBytes, ctx->Instructi= onByteCount); + if (ret < 0) { + error_report("failed to emulate mmio"); return -1; } =20 return 0; } =20 +static void handle_io(CPUState *env, uint16_t port, void *buffer, + int direction, int size, int count) +{ + int i; + uint8_t *ptr =3D buffer; + + for (i =3D 0; i < count; i++) { + address_space_rw(&address_space_io, port, MEMTXATTRS_UNSPECIFIED, + ptr, size, + direction); + ptr +=3D size; + } +} + +static void whpx_bump_rip(CPUState *cpu, WHV_RUN_VP_EXIT_CONTEXT *exit_ctx) +{ + WHV_REGISTER_VALUE reg; + whpx_get_reg(cpu, WHvX64RegisterRip, ®); + reg.Reg64 =3D exit_ctx->VpContext.Rip + exit_ctx->VpContext.Instructio= nLength; + whpx_set_reg(cpu, WHvX64RegisterRip, reg); +} + static int whpx_handle_portio(CPUState *cpu, - WHV_X64_IO_PORT_ACCESS_CONTEXT *ctx) + WHV_RUN_VP_EXIT_CONTEXT *exit_ctx) { - HRESULT hr; - AccelCPUState *vcpu =3D cpu->accel; - WHV_EMULATOR_STATUS emu_status; + WHV_X64_IO_PORT_ACCESS_CONTEXT *ctx =3D &exit_ctx->IoPortAccess; + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + int ret; =20 - hr =3D whp_dispatch.WHvEmulatorTryIoEmulation( - vcpu->emulator, cpu, - &vcpu->exit_ctx.VpContext, ctx, - &emu_status); - if (FAILED(hr)) { - error_report("WHPX: Failed to parse PortIO access, hr=3D%08lx", hr= ); - return -1; + if (!ctx->AccessInfo.StringOp && !ctx->AccessInfo.IsWrite) { + uint64_t val =3D 0; + WHV_REGISTER_VALUE reg; + + whpx_get_reg(cpu, WHvX64RegisterRax, ®); + handle_io(cpu, ctx->PortNumber, &val, 0, ctx->AccessInfo.AccessSiz= e, 1); + if (ctx->AccessInfo.AccessSize =3D=3D 1) { + reg.Reg8 =3D val; + } else if (ctx->AccessInfo.AccessSize =3D=3D 2) { + reg.Reg16 =3D val; + } else if (ctx->AccessInfo.AccessSize =3D=3D 4) { + reg.Reg64 =3D (uint32_t)val; + } else { + reg.Reg64 =3D (uint64_t)val; + } + whpx_bump_rip(cpu, exit_ctx); + whpx_set_reg(cpu, WHvX64RegisterRax, reg); + return 0; + } else if (!ctx->AccessInfo.StringOp && ctx->AccessInfo.IsWrite) { + RAX(env) =3D ctx->Rax; + handle_io(cpu, ctx->PortNumber, &RAX(env), 1, ctx->AccessInfo.Acce= ssSize, 1); + whpx_bump_rip(cpu, exit_ctx); + return 0; } =20 - if (!emu_status.EmulationSuccessful) { - error_report("WHPX: Failed to emulate PortIO access with" - " EmulatorReturnStatus: %u", emu_status.AsUINT32); + ret =3D emulate_instruction(cpu, ctx->InstructionBytes, exit_ctx->VpCo= ntext.InstructionLength); + if (ret < 0) { + error_report("failed to emulate I/O port access"); return -1; } =20 return 0; } =20 +static void write_mem(CPUState *cpu, void *data, target_ulong addr, int by= tes) +{ + vmx_write_mem(cpu, addr, data, bytes); +} + +static void read_mem(CPUState *cpu, void *data, target_ulong addr, int byt= es) +{ + vmx_read_mem(cpu, data, addr, bytes); +} + +static void read_segment_descriptor(CPUState *cpu, + struct x86_segment_descriptor *desc, + enum X86Seg seg_idx) +{ + bool ret; + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + SegmentCache *seg =3D &env->segs[seg_idx]; + x86_segment_selector sel =3D { .sel =3D seg->selector & 0xFFFF }; + + ret =3D x86_read_segment_descriptor(cpu, desc, sel); + if (ret =3D=3D false) { + error_report("failed to read segment descriptor"); + abort(); + } +} + + +static const struct x86_emul_ops whpx_x86_emul_ops =3D { + .read_mem =3D read_mem, + .write_mem =3D write_mem, + .read_segment_descriptor =3D read_segment_descriptor, + .handle_io =3D handle_io +}; + +static void whpx_init_emu(void) +{ + init_decoder(); + init_emu(&whpx_x86_emul_ops); +} + /* * Controls whether we should intercept various exceptions on the guest, * namely breakpoint/single-step events. @@ -1279,8 +1264,9 @@ bool whpx_arch_supports_guest_debug(void) =20 void whpx_arch_destroy_vcpu(CPUState *cpu) { - AccelCPUState *vcpu =3D cpu->accel; - whp_dispatch.WHvEmulatorDestroyEmulator(vcpu->emulator); + X86CPU *x86cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86cpu->env; + g_free(env->emu_mmio_buf); } =20 /* Returns the address of the next instruction that is about to be execute= d. */ @@ -1639,11 +1625,11 @@ int whpx_vcpu_run(CPUState *cpu) =20 switch (vcpu->exit_ctx.ExitReason) { case WHvRunVpExitReasonMemoryAccess: - ret =3D whpx_handle_mmio(cpu, &vcpu->exit_ctx.MemoryAccess); + ret =3D whpx_handle_mmio(cpu, &vcpu->exit_ctx); break; =20 case WHvRunVpExitReasonX64IoPortAccess: - ret =3D whpx_handle_portio(cpu, &vcpu->exit_ctx.IoPortAccess); + ret =3D whpx_handle_portio(cpu, &vcpu->exit_ctx); break; =20 case WHvRunVpExitReasonX64InterruptWindow: @@ -1990,22 +1976,11 @@ int whpx_init_vcpu(CPUState *cpu) =20 vcpu =3D g_new0(AccelCPUState, 1); =20 - hr =3D whp_dispatch.WHvEmulatorCreateEmulator( - &whpx_emu_callbacks, - &vcpu->emulator); - if (FAILED(hr)) { - error_report("WHPX: Failed to setup instruction completion support= ," - " hr=3D%08lx", hr); - ret =3D -EINVAL; - goto error; - } - hr =3D whp_dispatch.WHvCreateVirtualProcessor( whpx->partition, cpu->cpu_index, 0); if (FAILED(hr)) { error_report("WHPX: Failed to create a virtual processor," " hr=3D%08lx", hr); - whp_dispatch.WHvEmulatorDestroyEmulator(vcpu->emulator); ret =3D -EINVAL; goto error; } @@ -2067,6 +2042,8 @@ int whpx_init_vcpu(CPUState *cpu) max_vcpu_index =3D max(max_vcpu_index, cpu->cpu_index); qemu_add_vm_change_state_handler(whpx_cpu_update_state, env); =20 + env->emu_mmio_buf =3D g_new(char, 4096); + return 0; =20 error: @@ -2256,6 +2233,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms) } =20 whpx_memory_init(); + whpx_init_emu(); =20 printf("Windows Hypervisor Platform accelerator is operational\n"); return 0; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441075; cv=none; d=zohomail.com; s=zohoarc; b=gfvDqSn1oiB32txBJiajCeZ6ivMtu0rRqOdy1DUBQp/BQrc9l+EWyFJvNWf+DsSsHKvqg/P8tZpOXHlKI/vMdErAeA70Q9m0yXeFXJsvNeKtVnnHGhGHvFTy3n6WbYIr+VZdokWctksg7K+ZTLpJSitBET654I+8pUpQxKw0CBE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441075; 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=/HQjBhjFRxNhvZlXQXmp7fDntSaNFvRiU453Z3afMd0=; b=Bvi9OYI/k2KwSLD+0HINiwu6xsVGH/BtEjSdHZ/143g1IAx+io6HqHeCAMSZqTmnoaUTWtQGlPl1tIO2YeitINVqxofbkZk9DeOeBMR9mtyF5iY+WW9n+R50r+e91GVhaXK5LDUjI1InDXBBMeRL+t952uPlNbv4O5n42gmjqHQ= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441075001676.3152733528613; Mon, 2 Mar 2026 00:44:35 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyt9-0001hV-Vg; Mon, 02 Mar 2026 03:44:28 -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 1vwyt8-0001db-0P for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:26 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyt3-0001X5-Sp for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:25 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-650-wV6ni-wkMf2iLMRc1115oA-1; Mon, 02 Mar 2026 03:44:16 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-482d8e6e13aso32789075e9.3 for ; Mon, 02 Mar 2026 00:44:15 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b485a0b6sm9624965f8f.39.2026.03.02.00.44.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441057; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/HQjBhjFRxNhvZlXQXmp7fDntSaNFvRiU453Z3afMd0=; b=WWbiioHWzIi2b9vQctp5gV7H07MDRJ7i1tnR+wQdZdocElp2HzG8IjLXimbKwgdNYxH1RL 7j435SI/6WhFtdM/C/ZRHFORZogHISCLgdbBCE6c3V+PRtuxsw5G8Y//DcWCYrhNuD0VA/ WJ98Gt1ChFNPadiLqrDyNcADU0UQxMs= X-MC-Unique: wV6ni-wkMf2iLMRc1115oA-1 X-Mimecast-MFC-AGG-ID: wV6ni-wkMf2iLMRc1115oA_1772441055 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441054; x=1773045854; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/HQjBhjFRxNhvZlXQXmp7fDntSaNFvRiU453Z3afMd0=; b=YWLbUWqvgtJYyjxV5eZGEFAhpudXpl9mFT5/9gdZ6Al8N0Ilgbxm7Tk4Tp3n20jJnU BBJXtr5iiJuMG8/Qgqq5C2hJ0PSZtvicgFRjFM2ltI7hPVk2HKV8JAnS/GFrnrnpbEWw /QTbto4Dg2NPh3B1pwosMZckA5iEAaZHjv4rC6GE/NTIuxLACkfZVajgaSVuptdHjw1r /HwblO5BSAH/QRl/N1orCvNWB7Rjrr2r61+HqlwR+ylReoQPKBCZsfswBW5uroJDoNhg sw84s4er5xhjjCIJJHvEiHyO5f9EYh7U4SoP4/vL5vdS0j6ypFpLdh7ywpYB59heBA4P kwyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441054; x=1773045854; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=/HQjBhjFRxNhvZlXQXmp7fDntSaNFvRiU453Z3afMd0=; b=ZKkvPhBK3l/TO6iXzM0tNSXxQhB0QbZG/Z23t408rgMCMkbzU8iZtue+Q4rWre0B+c u+kKi/guuuyIRrlO46GYORXYzvn0i1mP1CRSqV9FuGS8y5OV9xZdmhCpOzUkWzXebTlu /v2SoyLyOztu/GAyyIOKEyYfqaB5UXVmi5skMC704/NH2G/7hTDpE9uT+H7Mr40rQkTV G1EvGuXemdf6SVJg44msV/VYVMp4m2TLOcdVpFHYhtkF1bdksi+2llfWmkNYeTWGyyB0 jHKH+YZrdMJxN2fL+rf5N2BM3A8LtIgApI9+Iw0O3T1ZS35RUsZoaNYVd5Usk/bdvdwl zi1g== X-Gm-Message-State: AOJu0Yxkkx43yYGxpkznWy5jUdE1JN0TuithVfDYSwkp1you77Pt+2AV Ibs/hfGZgk4kUdpgw5InAA4tQMvhCCcGchAH1r8IODxn2D6ligqICEgWFj3XYD0PLnubh7K2rg8 dkBMhEEbkh9QyS0XmkaZbwfeEF+dtBwZutFEQ08aTKdeyGoEy0cb5vHh7ufiFSmZSR5+KPyPhXI RblHDWb65u1s9B7PmmzkKzasZXiDPEqtOEvxmBJ8T8 X-Gm-Gg: ATEYQzzXTW0TxVACnNRU76HvWRE8sSJIMv851IOYxEt0cUiOtoabFjdjusdQJPuS0vP JPIQNdgFmGdwN978FR4o//Jn3X1z2TzEue+vcH3TVGyjaz3ba15bhxVa4fubG3i8Yxf0/IL7Gvo j5TYWQsBynyTPBJ38LZ3cUPJsxDC8X2Vy1cmnB/n2+UddDMXyYTctyXmxJaqpHEZpIdlScmrKT7 FlEHCEI/+W4v5CgTuth7e4MClWA4q8qpQqCGSnPw+pM5Bzq07eSRWf/wAyJcsxZ9Jb6lF8fqguz NvfwTjEob+qnjxJsjKtRrIFkTX5YTHN/1WXigAr0YuI97M/V+BtlAWwRFKEcbjv4bZHP8ouXpT2 BxCvYG6f9xB8b4Tlr/+KGwj30rbU+16QLWEE8IW+hxzZzZYgL4vv2sokAij2a8A7QMIe97ujGoA 4dDyWhRc0Hr6lBT/sc9+X64D00I94= X-Received: by 2002:a05:600c:a086:b0:483:a895:9d85 with SMTP id 5b1f17b1804b1-483c9ba3ae6mr211384465e9.2.1772441053638; Mon, 02 Mar 2026 00:44:13 -0800 (PST) X-Received: by 2002:a05:600c:a086:b0:483:a895:9d85 with SMTP id 5b1f17b1804b1-483c9ba3ae6mr211384025e9.2.1772441053151; Mon, 02 Mar 2026 00:44:13 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 012/102] whpx: i386: flags conversion for target/i386/emulate internal state Date: Mon, 2 Mar 2026 09:42:07 +0100 Message-ID: <20260302084338.473368-13-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441075669158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-12-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index eb6076d2f49..05248850530 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -412,6 +412,7 @@ void whpx_set_registers(CPUState *cpu, int level) vcxt.values[idx++].Reg64 =3D env->eip; =20 assert(whpx_register_names[idx] =3D=3D WHvX64RegisterRflags); + lflags_to_rflags(env); vcxt.values[idx++].Reg64 =3D env->eflags; =20 /* Translate 6+4 segment registers. HV and QEMU order matches */ @@ -637,6 +638,7 @@ void whpx_get_registers(CPUState *cpu) env->eip =3D vcxt.values[idx++].Reg64; assert(whpx_register_names[idx] =3D=3D WHvX64RegisterRflags); env->eflags =3D vcxt.values[idx++].Reg64; + rflags_to_lflags(env); =20 /* Translate 6+4 segment registers. HV and QEMU order matches */ assert(idx =3D=3D WHvX64RegisterEs); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441125; cv=none; d=zohomail.com; s=zohoarc; b=MvYh9e/FsVGis15Q1lr/lYunRYZkf/rMHMt4OMPKGdpCLI4qRsx2SXhmpz3Hl50RZ4LcMSoS9CTfOEBJnekFXmr/eeUHNtuKA97PoidyOQx9fGnCA7KS36WZqOLcksAv7CuN7X3GyFI1ERn7lPFuqp++FXWe86cLWTWYqIW+NWI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441125; 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=DjHOs1Bdw3tpUt85OROmin9Qv7K0zbnwvkrQQLrQkzU=; b=FiVVeIqEozyoqy431KV1sEK3XjGU5SZyEHMAbRuLMH1wCO6Je41uv9lM9uIc3FwEtU7HRnnm5f6+zfHqc3u2B0DCDG8Vd/B2wMJy7H3Ptp8Ica2KQItD7b3W50YMVlkyTThWcU0TGkQOVrwzdkiI/R7Otc6JeF1pL7wxquP9ypc= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441125199685.3340693838862; Mon, 2 Mar 2026 00:45:25 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytE-0001j7-8R; Mon, 02 Mar 2026 03:44:32 -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 1vwyt9-0001hU-SS for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:27 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyt3-0001XP-Tj for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:25 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-692-uBK7c6CjPouL4yamQMvVzA-1; Mon, 02 Mar 2026 03:44:18 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4836c819456so28161155e9.3 for ; Mon, 02 Mar 2026 00:44:18 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd750701sm413730355e9.11.2026.03.02.00.44.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441061; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DjHOs1Bdw3tpUt85OROmin9Qv7K0zbnwvkrQQLrQkzU=; b=cqltAYZUe0FmAqmKBJdmWaShu6lsW5Rn4PN4QZ3BVERBwg1UQTBoTpgdixFxy63jNBpIet u86NXVQMHQ8i9dl3JYrqoHqvvWLJwHYD5dPfe6UcVQB8mQv29c2aHCuFUdk1w7XiJUuzhx 74gs+5THHrejehfgL/Df+10H4tVXEis= X-MC-Unique: uBK7c6CjPouL4yamQMvVzA-1 X-Mimecast-MFC-AGG-ID: uBK7c6CjPouL4yamQMvVzA_1772441057 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441056; x=1773045856; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DjHOs1Bdw3tpUt85OROmin9Qv7K0zbnwvkrQQLrQkzU=; b=Br7xh/6RgQXCLu+Vvm3kF1e8frR23JTLNKgp38TriCg4UoAg2KvQGzCzEXpQJ661f6 eSS/nybDrxiZh4LOeF5Ei/My2q18wXQiJRoOy41c4PtG8b4ipwesKHChZ81PwdGucByI TXRjg7HXb7KWxcA/5QNfipiH5ezUS2UJ/po9T3xzYD1xBeh8YMG4mOhf7yfrZAM0qpv8 +qDFwjYes2OGOglSIAGauBDLtyjLBQ+dlJ9y0e/oN+QHVPTtqt1lKvKCWfrAOkhhMR/t Aa0UCk+f+Rdkz6HVMONBDlAF1wH5C+blzcYyp4AGY0Ynr6AFCGWUf7UUHfWq1HsuJD95 6ykA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441056; x=1773045856; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=DjHOs1Bdw3tpUt85OROmin9Qv7K0zbnwvkrQQLrQkzU=; b=MYtKC0IhcFcHoypwCV8KF1+RQeTcDhJ2h241XHT487kGBRUnewhtHtzCkpYvcyaB6z 3sE93LVh61C0ROV/SfhqdSPiLwcG2+Cu5GQOhuajGxqCvbGpbqzVcLJzmgswSpn2MIqQ 0l3M8ZMOYIWPta1Wb8/jCeoLSW4jBBuKkn9E0QEjA0Vy4lUzcj9c1Aymj/AmMqejeTgf NBkcAzefv8AXS7J4AAgQFMyFULz6c4eQVc8PcrhQ79V325pbh1zPPa/9KbW0HOJY3rVs pvDpARpc5P5Z0QHaJ8VXyl5wm2p6taxAAGeaNsnpzDmY0UJTbBB2e8arTQ8hihypy3dT ioeQ== X-Gm-Message-State: AOJu0YxZNBavjmrPpvOe19u904sNpYEcnGekY88jQxldBg+/Wc1qogrR 2NiNedfqKv0XijMGAjvF6NPGx4/e9LA3H7xaa0cjBSxRGvqy5awUJexBA9EetcnkEQ/M2hN18Sc IsVhyx6jQwwbvr/fK4sEBZeDj8tj0OLZzeiCKjteUIg4xbimdffjltI9nroud7J8XOQqMLtYJWd 1dpOkuIO/W3/Jhjrur8NBG/bO6bXz0x/i/veqDNvgF X-Gm-Gg: ATEYQzwILr0lbBcEy9eZ7j1MxRRDC5wMpx0eFlYzkjPgGnqruqqHyiTXep1dpl6PlK3 kvvNFov3rgpbkYApJRWNyb5x5iKoY0a9jxHI16OQBlBWrUj8I3NzXukhSbR6VI3lt+LFx+h/3hI 42LnFmRcF4Oo2gT1GWj6tJLYflgdmgpg4mML4gAhhoY1GG8x3fDTZrWpO2KuQQl+lY36vA1PVq0 L4wAUqO1zvHgUAJJjA246VmoVPnfbSZh+yQohC6YOo5Dq56JMmdspaaoFNso9nD64cxNe5Nfjnf g7adPb6Cz8VKEHY2LzAhnZJCksqDN69Mic6WDHYywQ6Mje0BqOBJIYkw90gaDFLq8gSPZ0BeHT+ OqGdQeULKAsE4zr7Wli2GMMsBNld/HoUg4qQ/1YR4lsEkyidkbOR+AdXDiK8KqsLNvxj9zCtvjM GykLLpBG962Keo0wVA8uECMhrbrGI= X-Received: by 2002:a05:600c:b90:b0:483:abeb:7a5c with SMTP id 5b1f17b1804b1-483c9bdb600mr202112065e9.12.1772441056244; Mon, 02 Mar 2026 00:44:16 -0800 (PST) X-Received: by 2002:a05:600c:b90:b0:483:abeb:7a5c with SMTP id 5b1f17b1804b1-483c9bdb600mr202111765e9.12.1772441055752; Mon, 02 Mar 2026 00:44:15 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 013/102] whpx: i386: remove remaining winhvemulation support code Date: Mon, 2 Mar 2026 09:42:08 +0100 Message-ID: <20260302084338.473368-14-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441125664158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni After moving away to target/i386/emulate, this is no longer necessary. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-13-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- meson.build | 3 +-- include/system/whpx-common.h | 3 --- include/system/whpx-internal.h | 16 ---------------- accel/whpx/whpx-common.c | 22 ---------------------- 4 files changed, 1 insertion(+), 43 deletions(-) diff --git a/meson.build b/meson.build index 3cd1d8dbc66..2bae618d848 100644 --- a/meson.build +++ b/meson.build @@ -865,8 +865,7 @@ if get_option('whpx').allowed() and host_os =3D=3D 'win= dows' endif # Leave CONFIG_WHPX disabled else - if cc.has_header('winhvplatform.h', required: get_option('whpx')) and \ - cc.has_header('winhvemulation.h', required: get_option('whpx')) + if cc.has_header('winhvplatform.h', required: get_option('whpx')) accelerators +=3D 'CONFIG_WHPX' endif endif diff --git a/include/system/whpx-common.h b/include/system/whpx-common.h index a4e16e13099..04289afd973 100644 --- a/include/system/whpx-common.h +++ b/include/system/whpx-common.h @@ -3,9 +3,6 @@ #define SYSTEM_WHPX_COMMON_H =20 struct AccelCPUState { -#ifdef HOST_X86_64 - WHV_EMULATOR_HANDLE emulator; -#endif bool window_registered; bool interruptable; bool ready_for_pic_interrupt; diff --git a/include/system/whpx-internal.h b/include/system/whpx-internal.h index ad6ade223ee..7a1c9871f18 100644 --- a/include/system/whpx-internal.h +++ b/include/system/whpx-internal.h @@ -4,9 +4,6 @@ =20 #include #include -#ifdef HOST_X86_64 -#include -#endif #include "hw/i386/apic.h" #include "exec/vaddr.h" =20 @@ -89,12 +86,6 @@ void whpx_apic_get(APICCommonState *s); X(HRESULT, WHvResetPartition, \ (WHV_PARTITION_HANDLE Partition)) \ =20 -#define LIST_WINHVEMULATION_FUNCTIONS(X) \ - X(HRESULT, WHvEmulatorCreateEmulator, (const WHV_EMULATOR_CALLBACKS* Cal= lbacks, WHV_EMULATOR_HANDLE* Emulator)) \ - X(HRESULT, WHvEmulatorDestroyEmulator, (WHV_EMULATOR_HANDLE Emulator)) \ - X(HRESULT, WHvEmulatorTryIoEmulation, (WHV_EMULATOR_HANDLE Emulator, VOI= D* Context, const WHV_VP_EXIT_CONTEXT* VpContext, const WHV_X64_IO_PORT_ACC= ESS_CONTEXT* IoInstructionContext, WHV_EMULATOR_STATUS* EmulatorReturnStatu= s)) \ - X(HRESULT, WHvEmulatorTryMmioEmulation, (WHV_EMULATOR_HANDLE Emulator, V= OID* Context, const WHV_VP_EXIT_CONTEXT* VpContext, const WHV_MEMORY_ACCESS= _CONTEXT* MmioInstructionContext, WHV_EMULATOR_STATUS* EmulatorReturnStatus= )) \ - #define WHP_DEFINE_TYPE(return_type, function_name, signature) \ typedef return_type (WINAPI *function_name ## _t) signature; =20 @@ -103,16 +94,10 @@ void whpx_apic_get(APICCommonState *s); =20 /* Define function typedef */ LIST_WINHVPLATFORM_FUNCTIONS(WHP_DEFINE_TYPE) -#ifdef HOST_X86_64 -LIST_WINHVEMULATION_FUNCTIONS(WHP_DEFINE_TYPE) -#endif LIST_WINHVPLATFORM_FUNCTIONS_SUPPLEMENTAL(WHP_DEFINE_TYPE) =20 struct WHPDispatch { LIST_WINHVPLATFORM_FUNCTIONS(WHP_DECLARE_MEMBER) -#ifdef HOST_X86_64 - LIST_WINHVEMULATION_FUNCTIONS(WHP_DECLARE_MEMBER) -#endif LIST_WINHVPLATFORM_FUNCTIONS_SUPPLEMENTAL(WHP_DECLARE_MEMBER) }; =20 @@ -122,7 +107,6 @@ bool init_whp_dispatch(void); =20 typedef enum WHPFunctionList { WINHV_PLATFORM_FNS_DEFAULT, - WINHV_EMULATION_FNS_DEFAULT, WINHV_PLATFORM_FNS_SUPPLEMENTAL } WHPFunctionList; =20 diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c index 21e9f1a1781..88eef557998 100644 --- a/accel/whpx/whpx-common.c +++ b/accel/whpx/whpx-common.c @@ -39,9 +39,6 @@ bool whpx_allowed; bool whpx_irqchip_in_kernel; static bool whp_dispatch_initialized; static HMODULE hWinHvPlatform; -#ifdef HOST_X86_64 -static HMODULE hWinHvEmulation; -#endif =20 struct whpx_state whpx_global; struct WHPDispatch whp_dispatch; @@ -393,7 +390,6 @@ static bool load_whp_dispatch_fns(HMODULE *handle, HMODULE hLib =3D *handle; =20 #define WINHV_PLATFORM_DLL "WinHvPlatform.dll" - #define WINHV_EMULATION_DLL "WinHvEmulation.dll" #define WHP_LOAD_FIELD_OPTIONAL(return_type, function_name, signature)= \ whp_dispatch.function_name =3D \ (function_name ## _t)GetProcAddress(hLib, #function_name); \ @@ -420,14 +416,6 @@ static bool load_whp_dispatch_fns(HMODULE *handle, WHP_LOAD_LIB(WINHV_PLATFORM_DLL, hLib) LIST_WINHVPLATFORM_FUNCTIONS(WHP_LOAD_FIELD) break; - case WINHV_EMULATION_FNS_DEFAULT: -#ifdef HOST_X86_64 - WHP_LOAD_LIB(WINHV_EMULATION_DLL, hLib) - LIST_WINHVEMULATION_FUNCTIONS(WHP_LOAD_FIELD) -#else - g_assert_not_reached(); -#endif - break; case WINHV_PLATFORM_FNS_SUPPLEMENTAL: WHP_LOAD_LIB(WINHV_PLATFORM_DLL, hLib) LIST_WINHVPLATFORM_FUNCTIONS_SUPPLEMENTAL(WHP_LOAD_FIELD_OPTIONAL) @@ -543,11 +531,6 @@ bool init_whp_dispatch(void) if (!load_whp_dispatch_fns(&hWinHvPlatform, WINHV_PLATFORM_FNS_DEFAULT= )) { goto error; } -#ifdef HOST_X86_64 - if (!load_whp_dispatch_fns(&hWinHvEmulation, WINHV_EMULATION_FNS_DEFAU= LT)) { - goto error; - } -#endif assert(load_whp_dispatch_fns(&hWinHvPlatform, WINHV_PLATFORM_FNS_SUPPLEMENTAL)); whp_dispatch_initialized =3D true; @@ -557,11 +540,6 @@ error: if (hWinHvPlatform) { FreeLibrary(hWinHvPlatform); } -#ifdef HOST_X86_64 - if (hWinHvEmulation) { - FreeLibrary(hWinHvEmulation); - } -#endif return false; } =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441753; cv=none; d=zohomail.com; s=zohoarc; b=l6GHOqS5aarDFvqTUHPYfctJ1IJ4krQsxk5KWy9EHMvhnI60PnpxcT+ISzXJRegm0UGo9IJ8q3whJupnUncGe/gbVnmeC/FoUUIFyGIkrzkHwM2FXfELZJbItPXyPgMRPRSB2S+sbUMpmxIWeO+Y+0JgNWF9SJStCaazfQ67ZA4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441753; 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=QmVK0bcekiL2x3ZWRO+xZBQLALeEszgKhFgyBuGGwZU=; b=nZkWEHYBkELzDZypDv4Rg/FiS4aaHXTVTInCOMqiHCcF7WocSqjJ5n2kuoyg/7FskgSeZIfezw1NuU9z8xIvqq+TsWDutIx47EXuo6cXOorgERZsB0ilp9jiowe9mBg5GE7QWSxQSIAxCHFZEYBTI0d3/jLS4Mu6fL8lZsNyjhk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441753930693.7441410773534; Mon, 2 Mar 2026 00:55:53 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytI-0001mR-4i; Mon, 02 Mar 2026 03:44:36 -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 1vwytA-0001i2-HM for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:30 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyt5-0001Xl-Qj for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:27 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-114-HXtylQs9M9K3Z7dRLKpUyg-1; Mon, 02 Mar 2026 03:44:20 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4837a718f41so23623265e9.2 for ; Mon, 02 Mar 2026 00:44:20 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd6f2f88sm378175255e9.2.2026.03.02.00.44.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441062; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QmVK0bcekiL2x3ZWRO+xZBQLALeEszgKhFgyBuGGwZU=; b=Fp6Xs98WGvSJqhGem1hv0nTAV14SM3TzhO5ftXtqXfgQ/uuJ472teNNByAqgpOpdUS3i+9 6Amz/hS9f0Z1SIH1+bOLaPe5X13QVGZ1SG3LmS6q6x7Yo7pm9WdKGIHqYEYgKzTPDlhKuw SGOlmQvIVcRJ6p5cn2dNvZpfcujvMFU= X-MC-Unique: HXtylQs9M9K3Z7dRLKpUyg-1 X-Mimecast-MFC-AGG-ID: HXtylQs9M9K3Z7dRLKpUyg_1772441060 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441059; x=1773045859; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QmVK0bcekiL2x3ZWRO+xZBQLALeEszgKhFgyBuGGwZU=; b=bUAGR4GqO+l5iisnd5S7KEvyBOT7yc+ubKEjzuhzEgkVCI+nSHxnyBR9hO1vHlBnxq NtE7SZzUZWgrbMCjFErLQ3GgFG1GNg+4lFJVu/7efpKh5jcgDyrUjN7mGUFf6JXHujcy P6GlAS4yT9dfQU1o7mrJhUv5ONMCqhTDHzMc6VMwoqWPgZftDVolxF26I7ASBAHjGioU 9KszrNMcevoLllylcDVMQRjJFoBnIRzvN7kElp4vLc9ZApM8xooIhewvjZjF//m0cp8P 38BGg5JxYd036RUBbO+PkPJ2PWp0SDLRcpN4BIc9VcfLNwRPv37+EsZBu7QGmtOOZcR8 4//g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441059; x=1773045859; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=QmVK0bcekiL2x3ZWRO+xZBQLALeEszgKhFgyBuGGwZU=; b=Wu4Nv+VXlANNpeczM7f+GtmdX76Khb27Ugpxsmg7TSdx8AU+w8EcAvBgi71M9yz3Tp veI5RSdm+CTgrpoJxBhU0gCc4fLGRMkwiXTeLgituz3Y/K6auFcVB2gwJ35F1LmaT0XQ /nJvWa7H7piFvMdxQx6r2pf8foDeIUKsqM5CJrpW5ddOVjFvRbWlEbN0glIkQSdHZQPF BCk0i7TYuAOV5oCXVNZDrtztg6mverjp4a7JtkhB3eBZR/xG9Vih9n3XVLFmcPw955K1 pJzOe+8i3+1CbWYg0vDAwDSRO5MCdQKPoOtwiJRR8EXu4HZfqUvkMmuP5vmApcFg28aU VoYw== X-Gm-Message-State: AOJu0Yyye2peL7GCzg3lryzATh1irNoYPIZSUvlP2MTus27jtDvY6sUQ 0ffdjlBfaPutYt+B2MbQUztxPDLs1MHcsCEadaWacEzZ6vwDeHNMZK5+9QzYLT8hY/umBfJeqcL DhWoboq8MPXyygvhV4v9iM2qxeKVwfun31cn1n/7SWiN3dW7W1CukPPEXidrMsUalS0kPlTCihG sQuc0TUJYhwrKJo5iMBlE4uwJ6HnYeagSDOejBo70P X-Gm-Gg: ATEYQzw2FTzx4aE4Mx40i6a+6ynsp8LiXmCCWS/QaMOKir/jN9F3LBmOp7sL2sHFt8m uZvEiSAUw84ceqURhCIclmZsN6XhsimdI57VTAZVs2A387W6JgNkBdWrR0PsZvG40lpLsKLTk5U qeFH2+Xcb3wbEj8SD6yXFOA/uK0ejJe147YIU0IWeAwVmE4UXDPK99V8jJNlAaQFjoYLSGXDysJ eKW6O1NJBnvdaD+FZ9zldx4Q1He+8sfv4OqbDoSLEhmV0vPz2dPpcO1Tv5/9Sh76IzV9KkuzLoS cuZoHq+76dKZVAvBYYFUOJvscvNGwg4WUsfKX2ZhW5tRpRTWLmcMnruvvO9yigYgIMXAEcH5cxi 3oc76K7TDWFELtANldyqxg2dT7gXiS7vmff2WH+BoZtpUnNauCD4uNqLLE0RfeH7H2i6DuhwDnk XXd5mD3a79/J7jsTKmXSXeS92K+to= X-Received: by 2002:a05:600c:3e8e:b0:47a:8cce:2940 with SMTP id 5b1f17b1804b1-483c9ba2922mr212596305e9.14.1772441058551; Mon, 02 Mar 2026 00:44:18 -0800 (PST) X-Received: by 2002:a05:600c:3e8e:b0:47a:8cce:2940 with SMTP id 5b1f17b1804b1-483c9ba2922mr212595965e9.14.1772441058037; Mon, 02 Mar 2026 00:44:18 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 014/102] whpx: i386: remove messages Date: Mon, 2 Mar 2026 09:42:09 +0100 Message-ID: <20260302084338.473368-15-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441754734158500 From: Mohamed Mediouni Remove some messages printed by the WHPX backend that don't have an equivalent elsewhere and don't convey an error. Signed-off-by: Mohamed Mediouni Reviewed-by: Philippe Mathieu-Daud=C3=A9 Link: https://lore.kernel.org/r/20260223233950.96076-14-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 05248850530..2f2c613eda0 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -2163,7 +2163,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms) whp_dispatch.WHvSetVirtualProcessorInterruptControllerState2) { WHV_X64_LOCAL_APIC_EMULATION_MODE mode =3D WHvX64LocalApicEmulationModeXApic; - printf("WHPX: setting APIC emulation mode in the hypervisor\n"); hr =3D whp_dispatch.WHvSetPartitionProperty( whpx->partition, WHvPartitionPropertyCodeLocalApicEmulationMode, @@ -2237,7 +2236,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms) whpx_memory_init(); whpx_init_emu(); =20 - printf("Windows Hypervisor Platform accelerator is operational\n"); return 0; =20 error: --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441206; cv=none; d=zohomail.com; s=zohoarc; b=arF03q3rAvXcbqV6NJ81AzoobygutHpyMJ9cT2TzgUEdAEy45kpRi9kUKvytYzM/sRIuQ4mbxGDxdUIhQDgwszCFqd2oYE3zqvpDSF6d3OR3AAbu65dDz01OMC33+L0I2O5AF6sKrng86xvHesfs3xJAEkGCCJhgalUhJQMHs2s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441206; 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=zPx0GudsuJ7+vudVgsrPzB4kl2V8XPk+UFVlv6vuYpE=; b=iiBtrK/lgrybIBJXzUJGji9cJ5KxIYkaCynYOKapDQM1cGrpukzGqm7Yxp9nYoqRGj9911Zti83DHuFcUyb1ww8IcJdqBJyl+UvtvQvQT37YyqLMa8Gbopze0PEdXBi/GZauRGia/t9zULhMNm0f6FMu5tmIC8/GuWB0TEbWvCk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177244120634573.30225848219084; Mon, 2 Mar 2026 00:46:46 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytH-0001lw-RZ; Mon, 02 Mar 2026 03:44:35 -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 1vwytB-0001i7-OV for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:30 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyt7-0001Y4-Os for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:28 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-258-078gXQzVOK6mdD9ep7cooQ-1; Mon, 02 Mar 2026 03:44:24 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4836ff58111so42861685e9.1 for ; Mon, 02 Mar 2026 00:44:23 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b55d15besm8961321f8f.30.2026.03.02.00.44.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441065; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zPx0GudsuJ7+vudVgsrPzB4kl2V8XPk+UFVlv6vuYpE=; b=YWG+mAVA4miQXSuCGykbx4nPUNxZ7nXEhauSU9FIWgIH4OJR33PBFCU/T91lwdZVuP8zoB acheSmKKUSxeR0lemz//EN6b2ifvwmnOGg/O5YtzRWwPhUCOGypblj6R5Okapy71iv+GVI WqPQxmLyMvhViHr3jntrPBOAc6ZmEHU= X-MC-Unique: 078gXQzVOK6mdD9ep7cooQ-1 X-Mimecast-MFC-AGG-ID: 078gXQzVOK6mdD9ep7cooQ_1772441063 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441062; x=1773045862; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zPx0GudsuJ7+vudVgsrPzB4kl2V8XPk+UFVlv6vuYpE=; b=OX2b6Easu6uUyU6TBtNPnB5yaJymDiFwq384QYblEclwMnzN0gLX1anJdKvBNYGnvg Jv7f6qnpV5/P0a2JiUo5EttSvMNWREwYquawfM5kp5caI4O6oWC0EUSV2r81PP+PIfSX Cni4WkDA4ZPwO7glqjAzr6+Mz/5URbnvGi6XDhpwDinTsNZQYFAtxWzCrRcGHEZCSPjm XOgf8NNNxF2xj3wWo54oX/BN3zgxIaapji6ihck+sB9f19c1P7GPyYN3lvqdfMkOV2hj IDxVO6qdVJy59dbLO6O2rn0Ycje86gJmsIKOv3jVWNQoqESOG9Z0XAWck0Yds2Ii3gvM lUbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441062; x=1773045862; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zPx0GudsuJ7+vudVgsrPzB4kl2V8XPk+UFVlv6vuYpE=; b=RCQbdIQiM4y8Nj/XwoBLJ3agYlJHadxpI2VES6lZRFCmr7gm/cQZdhcqC3DYE9Ovze UyjDCVnxg3EQrnqqaA89EV6MfYofbQrm9C5+NthwdV8PzUmN4A41FVZGziCg7Q9Rd6Om Sj0efaX/3cY/fXOJbsm3t34vstLL1fF7Akskxl/qqWKYYdlbdlWsyslGKXDEIOLfnKiw SRWHJDKONhzXz+P3FWPd7SN2kVXA4I6FvmFKaLWYM8HDt4pMjkqjNTMyTDOmVtKiYftw qhVwmg9FQhthBHe62n3pabnmZineV/SLny33D40qseu3UJr1GjGCMw/bSCiWAgQyRGIB g+QA== X-Gm-Message-State: AOJu0YyjE/qWKq20AeQLxDporDAw0iVO/or2S/tcmWYB+8AZsJMtnyYh xhc5G88oKWXb0mv1mQkeVx+Dn8xb8Cvd0TumjOyljMHf2HHmgkGJn1RWdtrgKbF06coRFLbJ1Xp YnWd2tffxO4YzM4H9eh3H9u/pAkxk7mv0j8gpoo0WwjralpHfIFqMdaf0PbZB3IcbSKoIBqPOUb dsVgeQ5ndVt65aBzwc4b0Fhy7EVfsKD+dQ727LEtG9 X-Gm-Gg: ATEYQzyVCX/M8k5FGQ21luyDypelVYQPecnLSorwjptz2gihE2mpOTYfMe5pV//5LkV DSiHjW+bLdN6MCaqJ94eGN024yJPKOoGtcgaNlkbeQodz91yXfVK3lNa0BRZDRLia8TcF83KG9z UT2rCLOJqNEkbPTkXrJGoPxIz2rs5hDeVaWM4hWa1K77yxQgLjaCOEZcrKtVhH9Wju8ms+j6RDz 3H3L/9SQz9PaOA8xvqIVFN0sfubXbmtyJt85KI08He/7Tr0ftt51tcWYONEWYGIkWBwpayU1TVZ D5TqeAJKZs/xFOVtUJHJ0xQW1eWylIOzCqhL1FIukMlf0jPY1TrkFc4XwNru+s2pTHwz07/rgOo TXooI2dDjZwMgA/qGn5FUBSEDf6fOhYQ8KXWw2KGd6qv9mO736LPg5JFm4+3xJvQtxHW5xPMe8s PpA7Q30+HA934K82IWFJMZJBk2crc= X-Received: by 2002:a05:600c:c04b:10b0:483:79a6:e7e1 with SMTP id 5b1f17b1804b1-483c9ba7e28mr143316145e9.7.1772441061756; Mon, 02 Mar 2026 00:44:21 -0800 (PST) X-Received: by 2002:a05:600c:c04b:10b0:483:79a6:e7e1 with SMTP id 5b1f17b1804b1-483c9ba7e28mr143315865e9.7.1772441061270; Mon, 02 Mar 2026 00:44:21 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 015/102] whpx: i386: remove CPUID trapping Date: Mon, 2 Mar 2026 09:42:10 +0100 Message-ID: <20260302084338.473368-16-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441207947158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Very partial in its current state and results in significantly inconsistent CPUID data. Remove it until it's reimplemented later. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-15-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 104 ------------------------------------ 1 file changed, 104 deletions(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 2f2c613eda0..baa3169c55c 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -1795,75 +1795,6 @@ int whpx_vcpu_run(CPUState *cpu) ret =3D 0; break; } - case WHvRunVpExitReasonX64Cpuid: { - WHV_REGISTER_VALUE reg_values[5]; - WHV_REGISTER_NAME reg_names[5]; - UINT32 reg_count =3D 5; - UINT64 cpuid_fn, rip =3D 0, rax =3D 0, rcx =3D 0, rdx =3D 0, r= bx =3D 0; - X86CPU *x86_cpu =3D X86_CPU(cpu); - CPUX86State *env =3D &x86_cpu->env; - - memset(reg_values, 0, sizeof(reg_values)); - - rip =3D vcpu->exit_ctx.VpContext.Rip + - vcpu->exit_ctx.VpContext.InstructionLength; - cpuid_fn =3D vcpu->exit_ctx.CpuidAccess.Rax; - - /* - * Ideally, these should be supplied to the hypervisor during = VCPU - * initialization and it should be able to satisfy this reques= t. - * But, currently, WHPX doesn't support setting CPUID values i= n the - * hypervisor once the partition has been setup, which is too = late - * since VCPUs are realized later. For now, use the values from - * QEMU to satisfy these requests, until WHPX adds support for - * being able to set these values in the hypervisor at runtime. - */ - cpu_x86_cpuid(env, cpuid_fn, 0, (UINT32 *)&rax, (UINT32 *)&rbx, - (UINT32 *)&rcx, (UINT32 *)&rdx); - switch (cpuid_fn) { - case 0x40000000: - /* Expose the vmware cpu frequency cpuid leaf */ - rax =3D 0x40000010; - rbx =3D rcx =3D rdx =3D 0; - break; - - case 0x40000010: - rax =3D env->tsc_khz; - rbx =3D env->apic_bus_freq / 1000; /* Hz to KHz */ - rcx =3D rdx =3D 0; - break; - - case 0x80000001: - /* Remove any support of OSVW */ - rcx &=3D ~CPUID_EXT3_OSVW; - break; - } - - reg_names[0] =3D WHvX64RegisterRip; - reg_names[1] =3D WHvX64RegisterRax; - reg_names[2] =3D WHvX64RegisterRcx; - reg_names[3] =3D WHvX64RegisterRdx; - reg_names[4] =3D WHvX64RegisterRbx; - - reg_values[0].Reg64 =3D rip; - reg_values[1].Reg64 =3D rax; - reg_values[2].Reg64 =3D rcx; - reg_values[3].Reg64 =3D rdx; - reg_values[4].Reg64 =3D rbx; - - hr =3D whp_dispatch.WHvSetVirtualProcessorRegisters( - whpx->partition, cpu->cpu_index, - reg_names, - reg_count, - reg_values); - - if (FAILED(hr)) { - error_report("WHPX: Failed to set CpuidAccess state regist= ers," - " hr=3D%08lx", hr); - } - ret =3D 0; - break; - } case WHvRunVpExitReasonException: whpx_get_registers(cpu); =20 @@ -2017,26 +1948,6 @@ int whpx_init_vcpu(CPUState *cpu) } } =20 - /* - * If the vmware cpuid frequency leaf option is set, and we have a val= id - * tsc value, trap the corresponding cpuid's. - */ - if (x86_cpu->vmware_cpuid_freq && env->tsc_khz) { - UINT32 cpuidExitList[] =3D {1, 0x80000001, 0x40000000, 0x40000010}; - - hr =3D whp_dispatch.WHvSetPartitionProperty( - whpx->partition, - WHvPartitionPropertyCodeCpuidExitList, - cpuidExitList, - RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32)); - - if (FAILED(hr)) { - error_report("WHPX: Failed to set partition CpuidExitList hr= =3D%08lx", - hr); - ret =3D -EINVAL; - goto error; - } - } =20 vcpu->interruptable =3D true; cpu->vcpu_dirty =3D true; @@ -2073,7 +1984,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms) WHV_CAPABILITY whpx_cap; UINT32 whpx_cap_size; WHV_PARTITION_PROPERTY prop; - UINT32 cpuidExitList[] =3D {1, 0x80000001}; WHV_CAPABILITY_FEATURES features =3D {0}; =20 whpx =3D &whpx_global; @@ -2183,7 +2093,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms) /* Register for MSR and CPUID exits */ memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY)); prop.ExtendedVmExits.X64MsrExit =3D 1; - prop.ExtendedVmExits.X64CpuidExit =3D 1; prop.ExtendedVmExits.ExceptionExit =3D 1; if (whpx_irqchip_in_kernel()) { prop.ExtendedVmExits.X64ApicInitSipiExitTrap =3D 1; @@ -2200,19 +2109,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms) goto error; } =20 - hr =3D whp_dispatch.WHvSetPartitionProperty( - whpx->partition, - WHvPartitionPropertyCodeCpuidExitList, - cpuidExitList, - RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32)); - - if (FAILED(hr)) { - error_report("WHPX: Failed to set partition CpuidExitList hr=3D%08= lx", - hr); - ret =3D -EINVAL; - goto error; - } - /* * We do not want to intercept any exceptions from the guest, * until we actually start debugging with gdb. --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441226; cv=none; d=zohomail.com; s=zohoarc; b=RW7toeWYuAOVJKonvjmgDqdhT6kh7oS+/NL9vlZq1Mo0vaz4LUyz/VR/RgZfRyDHK3fBznDRXUgENrLfnK3naXlLik6TONTXjcLTuujlkqTqwAzoZ4rMvKFb7rmqDehp+r1VMaoa7VKUtZN8lpUE09pRj/CWIHtyOEKXkh0Ub0g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441226; 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=wm3ocIz5yPuGAgAzqL1S37jXenPDu6rAMForht0QG5U=; b=hoagUqpuypihzNlGyBy5p50iw4f9J2OFZY165wAljwVXgFD9/VPmHUjmEnjuLIqKeROfeJv2mE44ONqxMq0kaHn2ZW12zlS7LZZy+Z8AfHh1kuGXPbctfmoGX6cpg9kIyVXC5lnFLFJTjHYJlgh5llrKxNn/ikLveSA4w1aKOwE= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441226046441.4449826448481; Mon, 2 Mar 2026 00:47:06 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytR-0001nj-L3; Mon, 02 Mar 2026 03:44:48 -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 1vwytD-0001j8-Aw for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:32 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytB-0001Ya-4M for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:31 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-340-pxzqF27OMnCSKN9iAQ0h5g-1; Mon, 02 Mar 2026 03:44:26 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4836abfc742so33317225e9.0 for ; Mon, 02 Mar 2026 00:44:26 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfb296bfsm154969135e9.0.2026.03.02.00.44.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441067; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wm3ocIz5yPuGAgAzqL1S37jXenPDu6rAMForht0QG5U=; b=K8sv/0WPSi//Xc+wgntrAe782J14femFg6Vi9VvCx3ADRNgyOPg/pg1Jt1UE+05CGaTFpP 6wvs8bUAFbYcGjxvSUBvMZqSW/CJCXiBDz7E/yOmTZK4gijzZCpMqn0cCEAaYDrP9m5soe 3K06rdubsfCPeAYZeSJz8lTOX52AmZI= X-MC-Unique: pxzqF27OMnCSKN9iAQ0h5g-1 X-Mimecast-MFC-AGG-ID: pxzqF27OMnCSKN9iAQ0h5g_1772441065 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441064; x=1773045864; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wm3ocIz5yPuGAgAzqL1S37jXenPDu6rAMForht0QG5U=; b=ZNxkrc9h2EA0LAUaGHTlzTiAgvI80VrZ6svA9enSshFTULK08Qv6U2Mg4UpI2TZJj2 KQU/ihljaEdDpHEB+dl5TkrWFM/V0kFKZCrCIafL/rJxKHBZ7iiksZxZ+r61TStXkz7k k7L8Egrq6oTWfS+eh2OHTbA7GZgU8/14wAieCZBiQUSO0c/kiqeTc6hNmfe3metbfQba cUfOZth8sI+FQUfmfKSVzTGXi7sKNwiybCKzAb1eaixQRHBoxXs3YtSXFULmSn+XfgM8 40sV+uzsMukCzRErNZTR5OcEB5FhdmWm5ekP5fZQjF7ypqm54PVo9k3ndtcbgexC91zX svqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441064; x=1773045864; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=wm3ocIz5yPuGAgAzqL1S37jXenPDu6rAMForht0QG5U=; b=C5gNOEMFVS8WIRbMQsyg37gxOZD8NNKoxZmnzA6kCcHdCc4jZxtUXIFHNQM0H1Sg6q 8mmQQAdcF0uIrCBHcl3hrynraowg3ix/ZuBKfmS3aQ5HgjtM62kO5L67rNbqM4bHfeYn iTeFX5FyXsYaXuWeeVRSe39coBnIthR1rCK74CgjM0EmPa3vq99Tfb4mzy1guA5GLpxk SIkJJE+jBllBPFCAG7uUVEEOWU7e/AZtK+KtyqNuyGOtUjueQxGOBXQiA5GZeNbycpbw tn1J7ynsYzp0PFdsBsHKtzkOjeXa0MV1vok1QXgxVH8u877Q8tJfxOMPFnNh3n9jV51O /w0A== X-Gm-Message-State: AOJu0YxE3tZ9Lq+2XyLpsAQZJeizRWYQTl8O3xajdPlzCPfgcQ3JNTRs s8Hp19zsQqotkjvPDYXIiBtSRtvLCe9b56jNw51DLPn8uxUGaM4yejyf9nGvFaUOauq88WYCYR8 OAIO6b3upKc3ysnDewSsq0TGIPJNs5E9yRSHgZMk1gGmkc46h8YTDNHCP/qoQHXtoG0fovqntBN UGN9v/BGJVHoX3XHrhVW1pN1J8mwLsTFMq8mcz+xGE X-Gm-Gg: ATEYQzzZoOd8d2l8HrwtaVkbntM6Mim5sJ3GdNlOvp1s1eJe+/craFqdgBEmMIx0N/4 bUDISxy316Scg8EsXDBMNDUO7ZaKmrObJrRPke+ldMEJLG6lO/fhPZMZMzQavsO/g5x2SMEGHXN QjyhuvmkkxfSIQym73XuA8j/xj6yTMCB7Q//cKoOxjFw3rD7z6/UKcwEFclIrH/oB8mJv702jm1 RrbOel9KoUdXo76eto7qifU/lC81IXwvwTtRKt+wThYft2F3WopxtyuhZAD0AqAJwhk8GTCkJ8v /EOWmENLD8n2mR+EXX2m4ZnA19bdjvzEiTKtNPwiVjWegD1HPOiNJMBPW6DQLecIsyPVZe4TCIZ vMHDWDTTCWrj/HXjE6aZBrgBToDH0QmnomQdwXSGOSeeurqv8hig7INFF3QE/S7yvK8rh/PN2+k f5lrBSjtnUnXt5ki2DSpyifLwu5fY= X-Received: by 2002:a05:600c:1d12:b0:483:9cdc:8ac1 with SMTP id 5b1f17b1804b1-483c9b9eb7amr184465915e9.11.1772441064499; Mon, 02 Mar 2026 00:44:24 -0800 (PST) X-Received: by 2002:a05:600c:1d12:b0:483:9cdc:8ac1 with SMTP id 5b1f17b1804b1-483c9b9eb7amr184465355e9.11.1772441063910; Mon, 02 Mar 2026 00:44:23 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL 016/102] whpx: common, i386, arm: rework state levels Date: Mon, 2 Mar 2026 09:42:11 +0100 Message-ID: <20260302084338.473368-17-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441228095158500 From: Mohamed Mediouni Change state levels from a set of ifdefs to an enum. Make register state loads use state levels too. Signed-off-by: Mohamed Mediouni Reviewed-by: Philippe Mathieu-Daud=C3=A9 Link: https://lore.kernel.org/r/20260223233950.96076-16-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- include/system/whpx-accel-ops.h | 16 ++++++++++------ include/system/whpx-all.h | 6 ++++-- accel/whpx/whpx-common.c | 8 ++++---- target/arm/whpx/whpx-all.c | 8 ++++---- target/i386/whpx/whpx-all.c | 16 ++++++++-------- 5 files changed, 30 insertions(+), 24 deletions(-) diff --git a/include/system/whpx-accel-ops.h b/include/system/whpx-accel-op= s.h index ed9d4c49f4d..4b2a7326548 100644 --- a/include/system/whpx-accel-ops.h +++ b/include/system/whpx-accel-ops.h @@ -22,11 +22,15 @@ void whpx_cpu_synchronize_post_reset(CPUState *cpu); void whpx_cpu_synchronize_post_init(CPUState *cpu); void whpx_cpu_synchronize_pre_loadvm(CPUState *cpu); =20 -/* state subset only touched by the VCPU itself during runtime */ -#define WHPX_SET_RUNTIME_STATE 1 -/* state subset modified during VCPU reset */ -#define WHPX_SET_RESET_STATE 2 -/* full state set, modified during initialization or on vmload */ -#define WHPX_SET_FULL_STATE 3 +typedef enum WHPXStateLevel { + /* subset of runtime state for faster returns from vmexit */ + WHPX_LEVEL_FAST_RUNTIME_STATE, + /* state subset only touched by the VCPU itself during runtime */ + WHPX_LEVEL_RUNTIME_STATE, + /* state subset modified during VCPU reset */ + WHPX_LEVEL_RESET_STATE, + /* full state set, modified during initialization or on vmload */ + WHPX_LEVEL_FULL_STATE +} WHPXStateLevel; =20 #endif /* TARGET_I386_WHPX_ACCEL_OPS_H */ diff --git a/include/system/whpx-all.h b/include/system/whpx-all.h index b831c463b0b..2cbea71b149 100644 --- a/include/system/whpx-all.h +++ b/include/system/whpx-all.h @@ -2,10 +2,12 @@ #ifndef SYSTEM_WHPX_ALL_H #define SYSTEM_WHPX_ALL_H =20 +#include "system/whpx-accel-ops.h" + /* Called by whpx-common */ int whpx_vcpu_run(CPUState *cpu); -void whpx_get_registers(CPUState *cpu); -void whpx_set_registers(CPUState *cpu, int level); +void whpx_get_registers(CPUState *cpu, WHPXStateLevel level); +void whpx_set_registers(CPUState *cpu, WHPXStateLevel level); int whpx_accel_init(AccelState *as, MachineState *ms); void whpx_cpu_instance_init(CPUState *cs); HRESULT whpx_set_exception_exit_bitmap(UINT64 exceptions); diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c index 88eef557998..4863fc86631 100644 --- a/accel/whpx/whpx-common.c +++ b/accel/whpx/whpx-common.c @@ -46,7 +46,7 @@ struct WHPDispatch whp_dispatch; void whpx_flush_cpu_state(CPUState *cpu) { if (cpu->vcpu_dirty) { - whpx_set_registers(cpu, WHPX_SET_RUNTIME_STATE); + whpx_set_registers(cpu, WHPX_LEVEL_RUNTIME_STATE); cpu->vcpu_dirty =3D false; } } @@ -180,7 +180,7 @@ int whpx_last_vcpu_stopping(CPUState *cpu) static void do_whpx_cpu_synchronize_state(CPUState *cpu, run_on_cpu_data a= rg) { if (!cpu->vcpu_dirty) { - whpx_get_registers(cpu); + whpx_get_registers(cpu, WHPX_LEVEL_FULL_STATE); cpu->vcpu_dirty =3D true; } } @@ -188,14 +188,14 @@ static void do_whpx_cpu_synchronize_state(CPUState *c= pu, run_on_cpu_data arg) static void do_whpx_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg) { - whpx_set_registers(cpu, WHPX_SET_RESET_STATE); + whpx_set_registers(cpu, WHPX_LEVEL_RESET_STATE); cpu->vcpu_dirty =3D false; } =20 static void do_whpx_cpu_synchronize_post_init(CPUState *cpu, run_on_cpu_data arg) { - whpx_set_registers(cpu, WHPX_SET_FULL_STATE); + whpx_set_registers(cpu, WHPX_LEVEL_FULL_STATE); cpu->vcpu_dirty =3D false; } =20 diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c index 0d56e468bdf..bb94eac7bf8 100644 --- a/target/arm/whpx/whpx-all.c +++ b/target/arm/whpx/whpx-all.c @@ -417,7 +417,7 @@ int whpx_vcpu_run(CPUState *cpu) do { bool advance_pc =3D false; if (cpu->vcpu_dirty) { - whpx_set_registers(cpu, WHPX_SET_RUNTIME_STATE); + whpx_set_registers(cpu, WHPX_LEVEL_RUNTIME_STATE); cpu->vcpu_dirty =3D false; } =20 @@ -482,7 +482,7 @@ int whpx_vcpu_run(CPUState *cpu) default: error_report("WHPX: Unexpected VP exit code 0x%08x", vcpu->exit_ctx.ExitReason); - whpx_get_registers(cpu); + whpx_get_registers(cpu, WHPX_LEVEL_FULL_STATE); bql_lock(); qemu_system_guest_panicked(cpu_get_crash_info(cpu)); bql_unlock(); @@ -516,7 +516,7 @@ static void clean_whv_register_value(WHV_REGISTER_VALUE= *val) memset(val, 0, sizeof(WHV_REGISTER_VALUE)); } =20 -void whpx_get_registers(CPUState *cpu) +void whpx_get_registers(CPUState *cpu, WHPXStateLevel level) { ARMCPU *arm_cpu =3D ARM_CPU(cpu); CPUARMState *env =3D &arm_cpu->env; @@ -563,7 +563,7 @@ void whpx_get_registers(CPUState *cpu) aarch64_restore_sp(env, arm_current_el(env)); } =20 -void whpx_set_registers(CPUState *cpu, int level) +void whpx_set_registers(CPUState *cpu, WHPXStateLevel level) { ARMCPU *arm_cpu =3D ARM_CPU(cpu); CPUARMState *env =3D &arm_cpu->env; diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index baa3169c55c..c09d9affefa 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -367,7 +367,7 @@ static uint64_t whpx_cr8_to_apic_tpr(uint64_t cr8) return cr8 << 4; } =20 -void whpx_set_registers(CPUState *cpu, int level) +void whpx_set_registers(CPUState *cpu, WHPXStateLevel level) { struct whpx_state *whpx =3D &whpx_global; AccelCPUState *vcpu =3D cpu->accel; @@ -386,7 +386,7 @@ void whpx_set_registers(CPUState *cpu, int level) * Following MSRs have side effects on the guest or are too heavy for * runtime. Limit them to full state update. */ - if (level >=3D WHPX_SET_RESET_STATE) { + if (level >=3D WHPX_LEVEL_RESET_STATE) { whpx_set_tsc(cpu); } =20 @@ -583,7 +583,7 @@ static void whpx_get_xcrs(CPUState *cpu) cpu_env(cpu)->xcr0 =3D xcr0.Reg64; } =20 -void whpx_get_registers(CPUState *cpu) +void whpx_get_registers(CPUState *cpu, WHPXStateLevel level) { struct whpx_state *whpx =3D &whpx_global; AccelCPUState *vcpu =3D cpu->accel; @@ -770,10 +770,10 @@ static int emulate_instruction(CPUState *cpu, const u= int8_t *insn_bytes, size_t struct x86_decode decode =3D { 0 }; x86_insn_stream stream =3D { .bytes =3D insn_bytes, .len =3D insn_len = }; =20 - whpx_get_registers(cpu); + whpx_get_registers(cpu, WHPX_LEVEL_FAST_RUNTIME_STATE); decode_instruction_stream(env, &decode, &stream); exec_instruction(env, &decode); - whpx_set_registers(cpu, WHPX_SET_RUNTIME_STATE); + whpx_set_registers(cpu, WHPX_LEVEL_FAST_RUNTIME_STATE); =20 return 0; } @@ -1589,7 +1589,7 @@ int whpx_vcpu_run(CPUState *cpu) =20 do { if (cpu->vcpu_dirty) { - whpx_set_registers(cpu, WHPX_SET_RUNTIME_STATE); + whpx_set_registers(cpu, WHPX_LEVEL_RUNTIME_STATE); cpu->vcpu_dirty =3D false; } =20 @@ -1796,7 +1796,7 @@ int whpx_vcpu_run(CPUState *cpu) break; } case WHvRunVpExitReasonException: - whpx_get_registers(cpu); + whpx_get_registers(cpu, WHPX_LEVEL_FULL_STATE); =20 if ((vcpu->exit_ctx.VpException.ExceptionType =3D=3D WHvX64ExceptionTypeDebugTrapOrFault) && @@ -1828,7 +1828,7 @@ int whpx_vcpu_run(CPUState *cpu) default: error_report("WHPX: Unexpected VP exit code %d", vcpu->exit_ctx.ExitReason); - whpx_get_registers(cpu); + whpx_get_registers(cpu, WHPX_LEVEL_FULL_STATE); bql_lock(); qemu_system_guest_panicked(cpu_get_crash_info(cpu)); bql_unlock(); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441496; cv=none; d=zohomail.com; s=zohoarc; b=Fy5JLNjZWsvryo1CcQdBaX+eMzjJVMsezUU6DE6+i2mrRM8fde+sEofIsjbiFDBa/nCEIXe6gm2MHQrRQMHhBvW8wzfiDccuWmChkUhndQrsK8EFJDUyuJk5yWbx0g6W16wI1O9+J/nHkZ+k1zb1CmKV98jIWuIraCpIM4J2RuY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441496; 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=gjvR+OkxZ7HxwHV/I2EnmhZdobN9zycIS9gtCz8oxR4=; b=n/5Z58G+U0iTUz9Br2hqiacYF/TACTIFH2o21Oabh6ycjxTGlEHhDQcIj/TMk9LyZ1KRKncy1yzWDNo808Rw593iWk58h+IOtNKHclvsvy4XWA7834eMIaOSfVzZWxhIkdZCrfUklrpqZ9XdmvmtSaL3ymtURhHBcVMZg2r/ctA= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441496697894.2584531745094; Mon, 2 Mar 2026 00:51:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytp-0002lI-5O; Mon, 02 Mar 2026 03:45:09 -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 1vwytN-0001pe-EU for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytJ-0001aH-J7 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:40 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-21-uMud_eDiMnqAN_3mmg3EeA-1; Mon, 02 Mar 2026 03:44:29 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4836ff58111so42862925e9.1 for ; Mon, 02 Mar 2026 00:44:29 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b4410bsm283021895e9.6.2026.03.02.00.44.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441076; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gjvR+OkxZ7HxwHV/I2EnmhZdobN9zycIS9gtCz8oxR4=; b=ODLkCdHTlAclPUapwhNJZG3sHMyuqVosoM4E/LAX05vcq00KMy22S62DDN8UA2obifkAhJ 5e9EA/90h5PESsFItS+5vegmYYueZULgJ9FyTE6GVoUHP7W4tQngLHp8VMIyj2zkQqj+mA tkTsSPd0Td56/ee2Wk84mnfC35t6ou8= X-MC-Unique: uMud_eDiMnqAN_3mmg3EeA-1 X-Mimecast-MFC-AGG-ID: uMud_eDiMnqAN_3mmg3EeA_1772441068 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441067; x=1773045867; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gjvR+OkxZ7HxwHV/I2EnmhZdobN9zycIS9gtCz8oxR4=; b=GZw/BcbNxpue2jC4Yvlz2s+D8d8gMaPadJTY8xEeIZBUIalb9OEu3W1uZqBc6CVRy0 HCvYIH7Ky5NLponUnVuKVJ5Ar1vvyX2PGNQJ5FLkzOdgj7TWBe+aFV7PC5LbBqLhWwK1 xFQiREBkojSdLWQk2wCb6dS56Oq1mXo3LraUT0/zvirhVBggfwx9F77ARVZMF9xv3w7t 2jtHTNchOn8/+JtDz35Y/GZq7UlSoeT/4uI/wC+w4ApPj4Bfv6Hf1RMKrJ5mXKAHpjFo lJx6OJbCFBix66vqkqAgM5ojxwSjTB5axZOwwe346UNUmGc10gsmfDceFf+MQYWy/0eN l2kA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441067; x=1773045867; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=gjvR+OkxZ7HxwHV/I2EnmhZdobN9zycIS9gtCz8oxR4=; b=fsBcCNoqtZ9WQvFQ7o55FemH/oiEKYuqVVD29R0wSqyLQrQyEpWowNpHLVNtE+v88r 5LYVvz8q8czM2ZKDbFI8VSqrRQeIS5ZnUYKKT2XTKT7Fw3muB4msjMlBe8rdEs/b1vnl ObOWIW0wPCO+cRwpQW4wtyI956Rgv22uBmdE3zXia+UAeG3Rel2maeQrMBKTbPwWdle3 AH/Lv73wwEm7KS2XTkv8cC3tDmChEy8roG9PN3ilbfBpLqGClQ4qc0E9H39PRd03WN7t bY1Yr4orxplJgECkU4mXU9s1PWCwd5KXahT4+5fp1iZBTMjgeve/7VYudlB7FNYwJe3Y us9A== X-Gm-Message-State: AOJu0Yy8z4tGHKxu8PAoeI3ps7O2r/ZWAZMKt5d/Q24wPQxI8WuGuR1X eJOUMV99dzXgVHZUDgmmFTGZ0oKyAWlmjMfyzyNfUsMraG/eCUvElaBShkQMIRJrYaohdyXs5Tz 9mYhwH+gBVoNan93P0vMM9XfVtWDP8h4zZugJfPm5WHLmIFeCn8ftyyJ4E04lKES6z3JhIASNPL AIXP6VFgB8JPb6upruCEA8hTBBPiq61BP96zk1himi X-Gm-Gg: ATEYQzyzc+DCm8SvS8pkQ3mBYEEICoRACBJScTXMsuNex4A10A4IDQ7hzark3NtwR9Y RF1Hck3v2t8nIzkKRqayGz/AAFrI3FZ96VwyVMvF8YdKlRG0aCMiiIahZuiRYhEAD935GdQjxRw QLuuejCdBms2eQuS5zOKLB87FykRL4n9VihgDYDiEoTd0l2+zeQHH3AadNM5hHrtlRKJpTwxo7h ptXPv2tQ8B9svXPt60JQ50znL1UJvRfLzJocDtOzmU/iXqsWVEONqqB/YJmdT7rcX+tei0U23wG LPQsf7MEn/B3X7MBzxLWhLAI/KKzSXrQbZOBPavjFP+tEP+IwodCm089pUxk0MUam1ZjOaK+wlF OLLK/1MDBsYFNnqVlvkOQfEnwZ43WXUfkK8rZGluRTLuS/MlBGuWoQOAXykYdg+cXl/DS/CyeKf NTjzAKwi1dwxJEEXkpoxYAf+iz6jU= X-Received: by 2002:a05:600c:630d:b0:483:7903:c3b1 with SMTP id 5b1f17b1804b1-483c9bedb42mr162623955e9.20.1772441067316; Mon, 02 Mar 2026 00:44:27 -0800 (PST) X-Received: by 2002:a05:600c:630d:b0:483:7903:c3b1 with SMTP id 5b1f17b1804b1-483c9bedb42mr162623575e9.20.1772441066769; Mon, 02 Mar 2026 00:44:26 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni , Bernhard Beschow Subject: [PULL 017/102] whpx: i386: saving/restoring less state for WHPX_LEVEL_FAST_RUNTIME_STATE Date: Mon, 2 Mar 2026 09:42:12 +0100 Message-ID: <20260302084338.473368-18-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441497334158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Optimise vmexits by save/restoring less state in those cases instead of the= full state. Signed-off-by: Mohamed Mediouni Reviewed-by: Bernhard Beschow Link: https://lore.kernel.org/r/20260223233950.96076-17-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 196 +++++++++++++++++++----------------- 1 file changed, 101 insertions(+), 95 deletions(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index c09d9affefa..ab583e922d4 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -422,118 +422,124 @@ void whpx_set_registers(CPUState *cpu, WHPXStateLev= el level) } =20 assert(idx =3D=3D WHvX64RegisterLdtr); - vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->ldt, 0, 0); - - assert(idx =3D=3D WHvX64RegisterTr); - vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->tr, 0, 0); - - assert(idx =3D=3D WHvX64RegisterIdtr); - vcxt.values[idx].Table.Base =3D env->idt.base; - vcxt.values[idx].Table.Limit =3D env->idt.limit; - idx +=3D 1; - - assert(idx =3D=3D WHvX64RegisterGdtr); - vcxt.values[idx].Table.Base =3D env->gdt.base; - vcxt.values[idx].Table.Limit =3D env->gdt.limit; - idx +=3D 1; - - /* CR0, 2, 3, 4, 8 */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr0); - vcxt.values[idx++].Reg64 =3D env->cr[0]; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr2); - vcxt.values[idx++].Reg64 =3D env->cr[2]; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr3); - vcxt.values[idx++].Reg64 =3D env->cr[3]; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr4); - vcxt.values[idx++].Reg64 =3D env->cr[4]; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr8); - vcxt.values[idx++].Reg64 =3D vcpu->tpr; - - /* 8 Debug Registers - Skipped */ - /* - * Extended control registers needs to be handled separately depending - * on whether xsave is supported/enabled or not. + * Skip those registers for synchronisation after MMIO accesses + * as they're not going to be modified in that case. */ - whpx_set_xcrs(cpu); + if (level > WHPX_LEVEL_FAST_RUNTIME_STATE) { + vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->ldt, 0, 0); =20 - /* 16 XMM registers */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterXmm0); - idx_next =3D idx + 16; - for (i =3D 0; i < sizeof(env->xmm_regs) / sizeof(ZMMReg); i +=3D 1, id= x +=3D 1) { - vcxt.values[idx].Reg128.Low64 =3D env->xmm_regs[i].ZMM_Q(0); - vcxt.values[idx].Reg128.High64 =3D env->xmm_regs[i].ZMM_Q(1); - } - idx =3D idx_next; + assert(idx =3D=3D WHvX64RegisterTr); + vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->tr, 0, 0); =20 - /* 8 FP registers */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterFpMmx0); - for (i =3D 0; i < 8; i +=3D 1, idx +=3D 1) { - vcxt.values[idx].Fp.AsUINT128.Low64 =3D env->fpregs[i].mmx.MMX_Q(0= ); - /* vcxt.values[idx].Fp.AsUINT128.High64 =3D - env->fpregs[i].mmx.MMX_Q(1); - */ - } + assert(idx =3D=3D WHvX64RegisterIdtr); + vcxt.values[idx].Table.Base =3D env->idt.base; + vcxt.values[idx].Table.Limit =3D env->idt.limit; + idx +=3D 1; =20 - /* FP control status register */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterFpControlStatus); - vcxt.values[idx].FpControlStatus.FpControl =3D env->fpuc; - vcxt.values[idx].FpControlStatus.FpStatus =3D - (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; - vcxt.values[idx].FpControlStatus.FpTag =3D 0; - for (i =3D 0; i < 8; ++i) { - vcxt.values[idx].FpControlStatus.FpTag |=3D (!env->fptags[i]) << i; - } - vcxt.values[idx].FpControlStatus.Reserved =3D 0; - vcxt.values[idx].FpControlStatus.LastFpOp =3D env->fpop; - vcxt.values[idx].FpControlStatus.LastFpRip =3D env->fpip; - idx +=3D 1; + assert(idx =3D=3D WHvX64RegisterGdtr); + vcxt.values[idx].Table.Base =3D env->gdt.base; + vcxt.values[idx].Table.Limit =3D env->gdt.limit; + idx +=3D 1; =20 - /* XMM control status register */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterXmmControlStatus); - vcxt.values[idx].XmmControlStatus.LastFpRdp =3D 0; - vcxt.values[idx].XmmControlStatus.XmmStatusControl =3D env->mxcsr; - vcxt.values[idx].XmmControlStatus.XmmStatusControlMask =3D 0x0000ffff; - idx +=3D 1; + /* CR0, 2, 3, 4, 8 */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr0); + vcxt.values[idx++].Reg64 =3D env->cr[0]; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr2); + vcxt.values[idx++].Reg64 =3D env->cr[2]; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr3); + vcxt.values[idx++].Reg64 =3D env->cr[3]; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr4); + vcxt.values[idx++].Reg64 =3D env->cr[4]; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr8); + vcxt.values[idx++].Reg64 =3D vcpu->tpr; =20 - /* MSRs */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterEfer); - vcxt.values[idx++].Reg64 =3D env->efer; + /* 8 Debug Registers - Skipped */ + + /* + * Extended control registers needs to be handled separately depen= ding + * on whether xsave is supported/enabled or not. + */ + whpx_set_xcrs(cpu); + + /* 16 XMM registers */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterXmm0); + idx_next =3D idx + 16; + for (i =3D 0; i < sizeof(env->xmm_regs) / sizeof(ZMMReg); i +=3D 1= , idx +=3D 1) { + vcxt.values[idx].Reg128.Low64 =3D env->xmm_regs[i].ZMM_Q(0); + vcxt.values[idx].Reg128.High64 =3D env->xmm_regs[i].ZMM_Q(1); + } + idx =3D idx_next; + + /* 8 FP registers */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterFpMmx0); + for (i =3D 0; i < 8; i +=3D 1, idx +=3D 1) { + vcxt.values[idx].Fp.AsUINT128.Low64 =3D env->fpregs[i].mmx.MMX= _Q(0); + /* vcxt.values[idx].Fp.AsUINT128.High64 =3D + env->fpregs[i].mmx.MMX_Q(1); + */ + } + + /* FP control status register */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterFpControlStat= us); + vcxt.values[idx].FpControlStatus.FpControl =3D env->fpuc; + vcxt.values[idx].FpControlStatus.FpStatus =3D + (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; + vcxt.values[idx].FpControlStatus.FpTag =3D 0; + for (i =3D 0; i < 8; ++i) { + vcxt.values[idx].FpControlStatus.FpTag |=3D (!env->fptags[i]) = << i; + } + vcxt.values[idx].FpControlStatus.Reserved =3D 0; + vcxt.values[idx].FpControlStatus.LastFpOp =3D env->fpop; + vcxt.values[idx].FpControlStatus.LastFpRip =3D env->fpip; + idx +=3D 1; + + /* XMM control status register */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterXmmControlSta= tus); + vcxt.values[idx].XmmControlStatus.LastFpRdp =3D 0; + vcxt.values[idx].XmmControlStatus.XmmStatusControl =3D env->mxcsr; + vcxt.values[idx].XmmControlStatus.XmmStatusControlMask =3D 0x0000f= fff; + idx +=3D 1; + + /* MSRs */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterEfer); + vcxt.values[idx++].Reg64 =3D env->efer; #ifdef TARGET_X86_64 - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterKernelGsBase); - vcxt.values[idx++].Reg64 =3D env->kernelgsbase; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterKernelGsBase); + vcxt.values[idx++].Reg64 =3D env->kernelgsbase; #endif =20 - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterApicBase); - vcxt.values[idx++].Reg64 =3D vcpu->apic_base; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterApicBase); + vcxt.values[idx++].Reg64 =3D vcpu->apic_base; =20 - /* WHvX64RegisterPat - Skipped */ + /* WHvX64RegisterPat - Skipped */ =20 - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterCs); - vcxt.values[idx++].Reg64 =3D env->sysenter_cs; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterEip); - vcxt.values[idx++].Reg64 =3D env->sysenter_eip; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterEsp); - vcxt.values[idx++].Reg64 =3D env->sysenter_esp; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterStar); - vcxt.values[idx++].Reg64 =3D env->star; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterCs); + vcxt.values[idx++].Reg64 =3D env->sysenter_cs; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterEip); + vcxt.values[idx++].Reg64 =3D env->sysenter_eip; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterEsp); + vcxt.values[idx++].Reg64 =3D env->sysenter_esp; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterStar); + vcxt.values[idx++].Reg64 =3D env->star; #ifdef TARGET_X86_64 - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterLstar); - vcxt.values[idx++].Reg64 =3D env->lstar; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCstar); - vcxt.values[idx++].Reg64 =3D env->cstar; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSfmask); - vcxt.values[idx++].Reg64 =3D env->fmask; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterLstar); + vcxt.values[idx++].Reg64 =3D env->lstar; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCstar); + vcxt.values[idx++].Reg64 =3D env->cstar; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSfmask); + vcxt.values[idx++].Reg64 =3D env->fmask; #endif =20 - /* Interrupt / Event Registers - Skipped */ + /* Interrupt / Event Registers - Skipped */ =20 - assert(idx =3D=3D RTL_NUMBER_OF(whpx_register_names)); + assert(idx =3D=3D RTL_NUMBER_OF(whpx_register_names)); + } =20 hr =3D whp_dispatch.WHvSetVirtualProcessorRegisters( whpx->partition, cpu->cpu_index, whpx_register_names, - RTL_NUMBER_OF(whpx_register_names), + idx, &vcxt.values[0]); =20 if (FAILED(hr)) { @@ -613,7 +619,7 @@ void whpx_get_registers(CPUState *cpu, WHPXStateLevel l= evel) hr); } =20 - if (whpx_irqchip_in_kernel()) { + if (level > WHPX_LEVEL_FAST_RUNTIME_STATE && whpx_irqchip_in_kernel())= { /* * Fetch the TPR value from the emulated APIC. It may get overwrit= ten * below with the value from CR8 returned by @@ -670,7 +676,7 @@ void whpx_get_registers(CPUState *cpu, WHPXStateLevel l= evel) env->cr[4] =3D vcxt.values[idx++].Reg64; assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr8); tpr =3D vcxt.values[idx++].Reg64; - if (tpr !=3D vcpu->tpr) { + if (level > WHPX_LEVEL_FAST_RUNTIME_STATE && tpr !=3D vcpu->tpr) { vcpu->tpr =3D tpr; cpu_set_apic_tpr(x86_cpu->apic_state, whpx_cr8_to_apic_tpr(tpr)); } @@ -756,7 +762,7 @@ void whpx_get_registers(CPUState *cpu, WHPXStateLevel l= evel) =20 assert(idx =3D=3D RTL_NUMBER_OF(whpx_register_names)); =20 - if (whpx_irqchip_in_kernel()) { + if (level > WHPX_LEVEL_FAST_RUNTIME_STATE && whpx_irqchip_in_kernel())= { whpx_apic_get(x86_cpu->apic_state); } =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441813; cv=none; d=zohomail.com; s=zohoarc; b=kS+ZbxJN0DT2PXzXyy0IFFOv+vKIFkI46Z7sqorRbKaD3FHn9smrsP5LmaEgitlPD1FZc2Yz//FM9G/EyvweRAe0rsvr9NtyZd+ZIAWXfQ+06mHI+0luPjTIwb0rB3JlIRODqlJhg9fLjpz2GMq124Z6l98nHFbIGD4yYXETauU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441813; 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=9RQTvXPDbTQKJ4rDKt+Fw9lkp8OzkZ5K+RmnX6t8yP8=; b=i5H+opCxLko3mQ3Xv+kBJ6MnzX2vQA3w5E5Auml7NwS+fazJsqbj9SkwAI0Itnu3dTw7Pkt3/cOHAvdAnjSfN26ZRXz8VHaq8xSdZrrv5gfdIr6iMVeF4mxRV/AvVLqATbWoUnVAPvLzak89FsiJWpr/5HedCYKPAab0Zi8nVxI= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441813368871.523616300454; Mon, 2 Mar 2026 00:56:53 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyto-0002d3-6G; Mon, 02 Mar 2026 03:45:08 -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 1vwytH-0001mH-Sq for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:35 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytF-0001Zj-MU for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:35 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-577-2ht7Oeu3MTSfCuhpvAEudA-1; Mon, 02 Mar 2026 03:44:31 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-439b5346b6cso769118f8f.0 for ; Mon, 02 Mar 2026 00:44:31 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c765c67sm27716851f8f.32.2026.03.02.00.44.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441073; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9RQTvXPDbTQKJ4rDKt+Fw9lkp8OzkZ5K+RmnX6t8yP8=; b=OG3p0loOWPqn/q4qScyUKANuM1Nfn9fJbAzubS9qBn3YsfVL5vZn48tGWg19y4RFX4URk7 BPvv7YPkX2WmY8ln1LeqSUbVrcOa2vRmbGyAMuhm1K5XgxOqDz5q+xhr5aG76ilPFTmLM9 xqBDXcjT5jmdy+/q/ixjJ5ARLjXnpVc= X-MC-Unique: 2ht7Oeu3MTSfCuhpvAEudA-1 X-Mimecast-MFC-AGG-ID: 2ht7Oeu3MTSfCuhpvAEudA_1772441071 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441070; x=1773045870; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9RQTvXPDbTQKJ4rDKt+Fw9lkp8OzkZ5K+RmnX6t8yP8=; b=GOFfyj3wMAPfrJXmEKXS5mdtu8p+oFcS6QSw/PuHcAb1Csi9yWQdSdKhnD4Rhfl04/ LAFr4xQWe2MaKVCEgM5fLBjCCUYWGF1mjIDw3LeAnfv6KY9GSWtnh5cZSJE0vmcDUga0 LivKySjch0OfhU8YhyqGZlDLxohAo+L9eYi2KFG62gl77LJNCqeusjP5dR3/uFjk0gT5 oRhnKmgrWu/CvO/5BI5bmG5ctZqoQlFZeavCF7W/xe9u1Ntl4GhwJOlJrtJIx/YTRBMJ DqrvRE+qVIeG1m8/nSDZZRnjSidaHzIzQ87YR1vikeNl/82hH9MGdN6iJqDNv/YMqmT9 +Zjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441070; x=1773045870; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=9RQTvXPDbTQKJ4rDKt+Fw9lkp8OzkZ5K+RmnX6t8yP8=; b=qgd2kqPwI1Bl9pElOR6VBSp+UIyRu2xwov06tqlUM3zaQdkpJMpzUVOviJXekM+m8w ZDlUUuWTrp/0RNVw7t8fVtP440oM/XQwUvw40yMyul/tpPQZQ3HDqaWAUbD6KOK5mbbY K8VY757svX0dWyUdtBdKeAOqzR2dlsIEpLNasn0hJlcYidvTco+m19yK/fzlDwfdY6r9 NDxkMyCcBKmhsBawnUyXU9X42Fnr41A8vhmflcd1bdcigCIxu6OM5GgFu/8/tWdfIGxB xKa5blvfG/x6slBxnTUEE0SWM/UGxoVXAkEVmmBdIH/Eb+8AtxyrJEMbRDWJbDa6U/U9 S/rQ== X-Gm-Message-State: AOJu0YwmnYwnbVS/zkHOr4qAxIxObohNcM40pZ1LTtD9RTjbw9CFP7wa j6/wFwTGP0r5vwKv2h2IxxyRfQJIOR2+iXYgpzaTmBGHj+3fa4Rpr2Se71f/LRBXXW4uFVyvEsn A2y5mUGFrKHSMXpdFNfxwo0TW8dgCKF1bRuXUH+t2QRNO8bUf3OEW5WvMUvjbdwBtbmYe1roVe5 TpTZrv6WqJQ+bfnBEqGgdTyOvTcQluwzjnDKRUAjEk X-Gm-Gg: ATEYQzwaNmaX27UCFwR4/qb7RxDFib3MkbLNeEpaHL6O4KsnEatrpBaSr/7c/cInPbV CuKPpfT73yn/S+dt9QrkYCIkxIxsX0f6jfswPopYyNKqvy/k3742JqmVgj2B1LPaOyPnQ7WJl+M TA2m4CVLOitJN7NQKJangJO4IzHD3JHH+RV4TNBlLP7EV7AC48lQFk5KGVQnuFyXb6e8ugEym/W /jQvW22I+7dohZqBhnH9sDFzQfNNT+AX3xqqwm1WxAKtLSDu6djUiI/rUc4FgjmQI/9JpkmaYyZ hwOmjErJ3KFtblZBiAuPWkSojkdeJ3wBO0sbPDGBFXOQU/IAWrz8g1TyZ6rrX9vSwB5nF/ElA2u gLLpe/0xaRkuHh8VAHXSAnrxI/6xDwlA7l7d5LMCYEjjKTFnju0eyO9xmqVnD4SQlAUYvHU4k2i T8Qu70LNpzQopliQmPdUN9MeTu7cg= X-Received: by 2002:a05:6000:1acf:b0:439:b6d6:71a with SMTP id ffacd0b85a97d-439b6d60af9mr4929495f8f.51.1772441069824; Mon, 02 Mar 2026 00:44:29 -0800 (PST) X-Received: by 2002:a05:6000:1acf:b0:439:b6d6:71a with SMTP id ffacd0b85a97d-439b6d60af9mr4929450f8f.51.1772441069265; Mon, 02 Mar 2026 00:44:29 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 018/102] target/i386: mshv, emulate: move the generic x86 helpers to target/i386/emulate Date: Mon, 2 Mar 2026 09:42:13 +0100 Message-ID: <20260302084338.473368-19-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441814953158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni HVF doesn't use them at this point, but move them to common code as that's = what they are. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-18-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/{mshv/x86.c =3D> emulate/x86_helpers.c} | 0 target/i386/emulate/meson.build | 7 +++++++ target/i386/mshv/meson.build | 4 ---- 3 files changed, 7 insertions(+), 4 deletions(-) rename target/i386/{mshv/x86.c =3D> emulate/x86_helpers.c} (100%) diff --git a/target/i386/mshv/x86.c b/target/i386/emulate/x86_helpers.c similarity index 100% rename from target/i386/mshv/x86.c rename to target/i386/emulate/x86_helpers.c diff --git a/target/i386/emulate/meson.build b/target/i386/emulate/meson.bu= ild index 1bb35162498..1fa1a8e8ec8 100644 --- a/target/i386/emulate/meson.build +++ b/target/i386/emulate/meson.build @@ -5,6 +5,13 @@ emulator_files =3D files( 'x86_mmu.c' ) =20 +emulator_helper_files =3D files( + 'x86_helpers.c' +) + i386_system_ss.add(when: [hvf, 'CONFIG_HVF'], if_true: emulator_files) i386_system_ss.add(when: 'CONFIG_MSHV', if_true: emulator_files) i386_system_ss.add(when: 'CONFIG_WHPX', if_true: emulator_files) + +i386_system_ss.add(when: 'CONFIG_MSHV', if_true: emulator_helper_files) +i386_system_ss.add(when: 'CONFIG_WHPX', if_true: emulator_helper_files) diff --git a/target/i386/mshv/meson.build b/target/i386/mshv/meson.build index 3fadd4598a5..49f28d4a5b9 100644 --- a/target/i386/mshv/meson.build +++ b/target/i386/mshv/meson.build @@ -2,11 +2,7 @@ i386_mshv_ss =3D ss.source_set() =20 i386_mshv_ss.add(files( 'mshv-cpu.c', - 'x86.c', )) =20 i386_system_ss.add_all(when: 'CONFIG_MSHV', if_true: i386_mshv_ss) =20 -i386_system_ss.add(when: 'CONFIG_WHPX', if_true: files( - 'x86.c', -)) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441493; cv=none; d=zohomail.com; s=zohoarc; b=BHFCHNdUfFcrVs3zIDgoCCnF/mAP1VK66xTr29j3XaEUEwZn/Qc/F6Tvr6qSA01zm9pWR27MOXGGZWKYCpbxHwW8crE8UGJbpnwqjb0uoROF6s0YZ+OLUI5W8z8JVzRo7+3OHUTl2oL9udMtDj7APlQaZWwt1+9Ff2/DyFhl4Fw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441493; 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=5AI3avZm19KLQD7LDt8OMGbB5svIMdjv1ikVmHJAqqY=; b=SkK99rYBn3IPdJcSxwzYT4KgGOrxzBPzPxfxUjHZLiEtsRjGuKSMlMOzPQsqKUWU/GzE2X1l5HGvthf0b3lCFngD+fNPzWiJLdhskPJnHM4pK+8Q36gaOiTEcsMLVKdCzQISDezzznQjAB3jwU4u6nCfJ7ztyd1xkoqsgt6y03I= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441493677566.9244554324838; Mon, 2 Mar 2026 00:51:33 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytp-0002o9-BF; Mon, 02 Mar 2026 03:45:09 -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 1vwytJ-0001np-QP for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:41 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytH-0001Zv-Sg for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:37 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-274-5qoZuhWDMFuOlbsMlUI-ag-1; Mon, 02 Mar 2026 03:44:33 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-439b50dfca1so584722f8f.0 for ; Mon, 02 Mar 2026 00:44:33 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b55d15besm8962989f8f.30.2026.03.02.00.44.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441075; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5AI3avZm19KLQD7LDt8OMGbB5svIMdjv1ikVmHJAqqY=; b=BCw08yHgUJi46UoJhxsxrF13ROV0h4wx/rCkwBt+3AsT3QEPiMDP7FEp7mQXXH2gQIObt+ aV7MpLu7EgcbcYcK3Qj0Z0cHmi3Lx3NR6qEOEoZ/ohqopHcHtv2FvK03Dxmmp6/Q6GsSTF 86RjLmVudTYgD/BcaIPiGf18+3Ydktw= X-MC-Unique: 5qoZuhWDMFuOlbsMlUI-ag-1 X-Mimecast-MFC-AGG-ID: 5qoZuhWDMFuOlbsMlUI-ag_1772441073 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441072; x=1773045872; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5AI3avZm19KLQD7LDt8OMGbB5svIMdjv1ikVmHJAqqY=; b=li4i2XgBKbrAPokC2f0TWqIXNBE161jr5J6HEECnO9NvOrXsYk4Ch9Fo18QKWEkTnb Q/OxdiBDqNarPtQO+WhzyvEFendxEWAvHPdr5dPglPcczEJkCc46iL8+IqmS7tQe20tw +bbbn6qeOiMd1hb4VgG0Jt9xbTQsmY4/CSdOtPfUtFZfc9pPrCccm/S8s5qwb0H1Dwd6 4xTycoWtydULgC5CpaSVo7Mose3xC39FMAkE1ejCzimbfCTEUhact3q8l8j4k/WXQU+J EQvOFL/oG3YpImHw0yxzws6C9rXaWO0KaZaLulHfcJJDZ7TmB6RPkCZ97qPC8u9YbPEC 68RQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441072; x=1773045872; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5AI3avZm19KLQD7LDt8OMGbB5svIMdjv1ikVmHJAqqY=; b=n2/9oP2YPVNHoYjDp3/oYvYqr5rNJ4JFUedefYyjpcdLSXjBhWD5OZ9TJ+CGPoxw/e C0ZOXP3Yn2eZ9Z+PUg2+frPbnp5D+uPFvrc8TDw8E5lBSbpAEjLSnxAR1uJeOZmnxhpi //ua5EZph3ajuo4Lp2AXiF0OM0MQiuQeErAWTuL8NXClW/I3/xSO3+AZMcuoS+Bl5bjO doQ+xheTijGlvDgMabJV6jvKNgQ1Z80DqL+306IlpDGrOEpBG57JlDC5dg2bR/aofG0y RXWA7wrEBTJA4IlmhoIOZ3LYUnUJOggKDGcYhMaPCx9l6quVmueqPFOIGAq+Tr5b6Zu9 orEQ== X-Gm-Message-State: AOJu0YzkBAAJXGc6P+vOZ7wrrw5aJXs4cquqH3BMxl3A3GfuDIPGF85I xMcJtZbVgVSTsK3hSFUni5CgJewdyD6wPuhMe+R3Q+ZPWEJ3NIe1NkrbmWAqEUoCFxCchQjWJEd x9zDnIjeYDiweDcpx0aYXp9O+50sW+/L33xaE3VRm4ubO+oKxMPcH83FHJB9jVur/sVoYKY42CA Um3uDUJ0DNuMk/JuvDh+y7T9sk44ttUTmtWbCpWqSM X-Gm-Gg: ATEYQzyhnzidwG9pgHl/aGaNMj1treE994G0cd7v9yr0CTEM2bWQxFXFtqAcmKwBd8R yfaCQOC+BdZyiffVKH0ojIMBXqtAnDgvhgu4zO0XGEpfJl308ZoJEJbqY3tcB9zqNq28RqNLiyi /SwXfRoVtEoDT6Ro8x651Ag1vFhhSF2rc+5DUueCjcu5bXLsf5EbBXwTF3IydoVtN7xf1yFY7j3 tlBFF83BMRlP5EQddsxYLQYooVCT58q/GkinuZEIXsxUrxruqvLWZZ0JJ9MY6j7q2g71svVNYXH aEjw8PlMqVwzR0cwyvxmmvSJLqZBQdcofTLbO8YHdxSfW4wyW4d9j9UgOdZuSHPxQ9q3q3PO1fD 7W+e/Gi/b/zOOA39DVzCnaJUoPIgd2q9zST7scf/0QY9ILFgLx4a6UbfTQ94lB8lqpEb033+YSH lsS4UJnSRJ4HVxapqqvUAh1D2v0fg= X-Received: by 2002:a05:6000:61e:b0:435:a501:359 with SMTP id ffacd0b85a97d-4399de36b18mr21323460f8f.41.1772441072134; Mon, 02 Mar 2026 00:44:32 -0800 (PST) X-Received: by 2002:a05:6000:61e:b0:435:a501:359 with SMTP id ffacd0b85a97d-4399de36b18mr21323409f8f.41.1772441071638; Mon, 02 Mar 2026 00:44:31 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 019/102] target/i386: emulate: 5-level paging for the page table walker Date: Mon, 2 Mar 2026 09:42:14 +0100 Message-ID: <20260302084338.473368-20-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441495320158501 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-19-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86.h | 1 + target/i386/emulate/x86_helpers.c | 8 ++++++++ target/i386/emulate/x86_mmu.c | 3 +++ target/i386/hvf/x86.c | 5 +++++ 4 files changed, 17 insertions(+) diff --git a/target/i386/emulate/x86.h b/target/i386/emulate/x86.h index 73edccfba00..caf0e3be50e 100644 --- a/target/i386/emulate/x86.h +++ b/target/i386/emulate/x86.h @@ -263,6 +263,7 @@ bool x86_is_protected(CPUState *cpu); bool x86_is_real(CPUState *cpu); bool x86_is_v8086(CPUState *cpu); bool x86_is_long_mode(CPUState *cpu); +bool x86_is_la57(CPUState *cpu); bool x86_is_long64_mode(CPUState *cpu); bool x86_is_paging_mode(CPUState *cpu); bool x86_is_pae_enabled(CPUState *cpu); diff --git a/target/i386/emulate/x86_helpers.c b/target/i386/emulate/x86_he= lpers.c index 0700cc05efb..7bdd7e4c2a1 100644 --- a/target/i386/emulate/x86_helpers.c +++ b/target/i386/emulate/x86_helpers.c @@ -236,6 +236,14 @@ bool x86_is_long_mode(CPUState *cpu) return ((efer & lme_lma) =3D=3D lme_lma); } =20 +bool x86_is_la57(CPUState *cpu) +{ + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + uint64_t is_la57 =3D env->cr[4] & CR4_LA57_MASK; + return is_la57; +} + bool x86_is_long64_mode(CPUState *cpu) { error_report("unimplemented: is_long64_mode()"); diff --git a/target/i386/emulate/x86_mmu.c b/target/i386/emulate/x86_mmu.c index b82a55a3da7..35987a897aa 100644 --- a/target/i386/emulate/x86_mmu.c +++ b/target/i386/emulate/x86_mmu.c @@ -56,6 +56,9 @@ static int gpt_top_level(CPUState *cpu, bool pae) return 2; } if (x86_is_long_mode(cpu)) { + if (x86_is_la57(cpu)) { + return 5; + } return 4; } =20 diff --git a/target/i386/hvf/x86.c b/target/i386/hvf/x86.c index 2fa210ff601..e98f480f411 100644 --- a/target/i386/hvf/x86.c +++ b/target/i386/hvf/x86.c @@ -138,6 +138,11 @@ bool x86_is_long_mode(CPUState *cpu) return rvmcs(cpu->accel->fd, VMCS_GUEST_IA32_EFER) & MSR_EFER_LMA; } =20 +bool x86_is_la57(CPUState *cpu) +{ + return false; +} + bool x86_is_long64_mode(CPUState *cpu) { struct vmx_segment desc; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441351; cv=none; d=zohomail.com; s=zohoarc; b=aOK8YT7qSw8oDMuMMr3sMfT9wBULOINYP+sHNvXldrSOOVucHzhGM/HYWjHXSFUXEQqTvwueCcXwZQpDJ0CjPZdwiw4lzC0p8mQI5zWRu4CC2QEPK3UbhW/2LfQ7bJj72hg2iM7CVFz0vKfoVMdyaUZrjgd5iZTGNTdVsjF6dvY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441351; 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=efG39ehvTXHsHgsUkk8khNEEn/y1C14CuxY6g8oqngM=; b=l/PoKubFylpSyLxHyZTTSnvx5iU+AGwzjwEWz1XIa/a6B5HZ6+t2OE9J/h6VR+NLyUSxDGd7v/lUw39WLu1SChv/PP19spNo5FsKJGF3ZXK3u0zFXfOe7KiFVx5XoAw6p26DoGBYQV0kCjVZvT2VpGqyNFZPJdwv8X70+UXL/bE= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441351765398.3029447582227; Mon, 2 Mar 2026 00:49:11 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytq-0002zV-G4; Mon, 02 Mar 2026 03:45:10 -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 1vwytR-0001w7-DC for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytN-0001af-6c for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:45 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-657-E6X_o8wCObuVduBo4mwCvw-1; Mon, 02 Mar 2026 03:44:37 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4837a718f41so23625585e9.2 for ; Mon, 02 Mar 2026 00:44:37 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b503425asm7934880f8f.25.2026.03.02.00.44.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441078; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=efG39ehvTXHsHgsUkk8khNEEn/y1C14CuxY6g8oqngM=; b=Irr6U1hqYCFizdHfkmzMIMN+Lqumffg7Fx4ZxPCPAYOeGobKov5+yEjNQZOL3EQFLIm0+F NwGy+xG+FZdSkYYMR1xGMPrVK5xE+p3ibXMolLqj92fn+tFh/WAbvnxl7cjfwZsh4D0MMc bDN3x4vBxbgjf/9aiHqTu3VFXjuSu+E= X-MC-Unique: E6X_o8wCObuVduBo4mwCvw-1 X-Mimecast-MFC-AGG-ID: E6X_o8wCObuVduBo4mwCvw_1772441076 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441076; x=1773045876; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=efG39ehvTXHsHgsUkk8khNEEn/y1C14CuxY6g8oqngM=; b=BlDq+lfC1bAzQDjZPj65cQQR/pxKRmluYyon52KoTH+f5OH8jJW0VSFh8Br/DUGotz oWIuFaErFAZMrZIOfGBj2QHaw6dShVoMBoWuUskdtBLPbIH8n0/BS8IcXpXRriB0R6+X hqYaGPY+EKQveF6HttGNGc5KeMZJGDdmQFfypPX+KtkDCCt7zhzK3OUUr9GM0VBT5R0k R9Q0LXWrdwvSYtRzwFou7aE4E6xw8naoDH29DiPCh/oPkhVDMFtFdYz5DQ8D/8Ft4naj lmqkw2HOtxCxXQ+ilBUSEsf7tPv17J1VtDUhJhGA6vfCiZvZvyFVXBVwfIHBbuz5QsU/ Ut+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441076; x=1773045876; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=efG39ehvTXHsHgsUkk8khNEEn/y1C14CuxY6g8oqngM=; b=E5k1a+VAm9ia+jj3/XMWtqJBghQvvlF2V97Mv8oxIC7I+XiH7TWNxoj0+e9fzh8NY9 6uUQPC9eBoEIrGDgDF2tET0SwjdhTORYJo9+bIumTf0vVytmwspsGioZTx+iVN8zN5Ll 8uaJw2bPYlZmCbQgPVmhuMiLaqM8yqpuvFPWQQnl851+EFTeafkrWTJQN29k25/gc+wx URTWutP7K0NsqYcaifSQbfb6rXdBQtjfRaSp2BEo1tdxqVYHGezzM9qBN5iKK7EZRGYw 0TSpvOtRsjVmG210GneSQGrLYpFHM4n53Xd0/85+zPs/IcnYIlu1jTGIjL6Xm+t1dW6t Khsg== X-Gm-Message-State: AOJu0YwEFEakIGWKLLHXNMnbs6nnbemeXIDK7r/eP3tH1xuQvwT4Qatd vn5ZzuYo26r/oAZsdFmSTe4f9enJaHbInAmdQz7SjsR4kfhB8KDB6WaYSuwzIdBVGRiQ4sjIHnw lg1bzdVtck5nNL+5Js3hjybGCU/1+mE0GacUmnuMO5hYOmCZdrJMAxqAr5LTDzZb24AwzVYM6Gr kBLOJSwf/VZKgjjzSYBqsSs+bArijdv9Gqh71V5vA/ X-Gm-Gg: ATEYQzyBZxgsT8LJZGK2ld9CK59CJT7c/uQW/YBAyE8ek4AAW0Xd+G2uKCfjtwRkhGk 2iz+s+TlrOervBG5PNElPoo+6r7AOlSFybap3I5YFtxmpkRM6lEXT+i4rjCUQwaA8l6FdvcgjuC uOiA4Zx7lkp4IyuFkYzRn4JWtdpIOywDyzAtnQ2z6X0g6TKgj+9iLv3iZcEtgPcQppSlqIS9iJv /bRxOzoaRO8PhYtZeaxYrWsvisIESsdmDnne8Ty51QN7HJLlIEypMz5C9qRQzND53bVWsCmBj4s 5YmxVQNiQXPnVP7SvJul/PQeUb9DraYDcjsm/2o1/9eo7WfILyh2pNkW74+lZXqKiJNOl/6zN6v GQBrqs3kQcsKfoE7dM5W0emKhEBFLFPoVDXnDJTIAUOcJOU68n0ae/b2UXYb2jUDajxWBActHfX AoM3F+w/6YGZz9f68QIwoQHQBCatk= X-Received: by 2002:a05:600c:1d12:b0:483:9cdc:8ac1 with SMTP id 5b1f17b1804b1-483c9b9eb7amr184474735e9.11.1772441075338; Mon, 02 Mar 2026 00:44:35 -0800 (PST) X-Received: by 2002:a05:600c:1d12:b0:483:9cdc:8ac1 with SMTP id 5b1f17b1804b1-483c9b9eb7amr184474055e9.11.1772441074567; Mon, 02 Mar 2026 00:44:34 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 020/102] target/i386: emulate, hvf, mshv: rework MMU code Date: Mon, 2 Mar 2026 09:42:15 +0100 Message-ID: <20260302084338.473368-21-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441352664158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni target/i386/emulate doesn't currently properly emulate instructions which might cause a page fault during their execution. Notably, REP STOS/MO= VS from MMIO to an address which is unmapped until a page fault exception is r= aised causes an abort() in vmx_write_mem. Change the interface between the HW accel backend and target/i386/emulate a= s a first step towards addressing that. Adapt the page table walker code to give actionable errors, while leaving a possibility for backends to provide their own walker. This removes the usage of the Hyper-V page walker in the mshv backend. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-20-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_emu.h | 4 +- target/i386/emulate/x86_mmu.h | 31 +++++-- target/i386/emulate/x86_decode.c | 2 +- target/i386/emulate/x86_emu.c | 14 +-- target/i386/emulate/x86_helpers.c | 5 +- target/i386/emulate/x86_mmu.c | 146 +++++++++++++++++++----------- target/i386/hvf/hvf.c | 31 +++---- target/i386/hvf/x86.c | 6 +- target/i386/hvf/x86_task.c | 8 +- target/i386/mshv/mshv-cpu.c | 71 --------------- target/i386/whpx/whpx-all.c | 12 --- 11 files changed, 146 insertions(+), 184 deletions(-) diff --git a/target/i386/emulate/x86_emu.h b/target/i386/emulate/x86_emu.h index 05686b162f6..3e485b8ca36 100644 --- a/target/i386/emulate/x86_emu.h +++ b/target/i386/emulate/x86_emu.h @@ -21,13 +21,13 @@ =20 #include "x86.h" #include "x86_decode.h" +#include "x86_mmu.h" #include "cpu.h" =20 struct x86_emul_ops { void (*fetch_instruction)(CPUState *cpu, void *data, target_ulong addr, int bytes); - void (*read_mem)(CPUState *cpu, void *data, target_ulong addr, int byt= es); - void (*write_mem)(CPUState *cpu, void *data, target_ulong addr, int by= tes); + MMUTranslateResult (*mmu_gva_to_gpa) (CPUState *cpu, target_ulong gva,= uint64_t *gpa, MMUTranslateFlags flags); void (*read_segment_descriptor)(CPUState *cpu, struct x86_segment_desc= riptor *desc, enum X86Seg seg); void (*handle_io)(CPUState *cpu, uint16_t port, void *data, int direct= ion, diff --git a/target/i386/emulate/x86_mmu.h b/target/i386/emulate/x86_mmu.h index 9447ae072cd..190bd272a23 100644 --- a/target/i386/emulate/x86_mmu.h +++ b/target/i386/emulate/x86_mmu.h @@ -30,15 +30,30 @@ #define PT_GLOBAL (1 << 8) #define PT_NX (1llu << 63) =20 -/* error codes */ -#define MMU_PAGE_PT (1 << 0) -#define MMU_PAGE_WT (1 << 1) -#define MMU_PAGE_US (1 << 2) -#define MMU_PAGE_NX (1 << 3) +typedef enum MMUTranslateFlags { + MMU_TRANSLATE_VALIDATE_WRITE =3D BIT(1), + MMU_TRANSLATE_VALIDATE_EXECUTE =3D BIT(2), + MMU_TRANSLATE_PRIV_CHECKS_EXEMPT =3D BIT(3) +} MMUTranslateFlags; =20 -bool mmu_gva_to_gpa(CPUState *cpu, target_ulong gva, uint64_t *gpa); +typedef enum MMUTranslateResult { + MMU_TRANSLATE_SUCCESS =3D 0, + MMU_TRANSLATE_PAGE_NOT_MAPPED =3D 1, + MMU_TRANSLATE_PRIV_VIOLATION =3D 2, + MMU_TRANSLATE_INVALID_PT_FLAGS =3D 3, + MMU_TRANSLATE_GPA_UNMAPPED =3D 4, + MMU_TRANSLATE_GPA_NO_READ_ACCESS =3D 5, + MMU_TRANSLATE_GPA_NO_WRITE_ACCESS =3D 6 +} MMUTranslateResult; + +MMUTranslateResult mmu_gva_to_gpa(CPUState *cpu, target_ulong gva, uint64_= t *gpa, MMUTranslateFlags flags); + +/* Thin wrappers x86_write_mem_ex/x86_read_mem_ex for code readability */ +MMUTranslateResult x86_write_mem(CPUState *cpu, void *data, target_ulong g= va, int bytes); +MMUTranslateResult x86_read_mem(CPUState *cpu, void *data, target_ulong gv= a, int bytes); + +MMUTranslateResult x86_write_mem_priv(CPUState *cpu, void *data, target_ul= ong gva, int bytes); +MMUTranslateResult x86_read_mem_priv(CPUState *cpu, void *data, target_ulo= ng gva, int bytes); =20 -void vmx_write_mem(CPUState *cpu, target_ulong gva, void *data, int bytes); -void vmx_read_mem(CPUState *cpu, void *data, target_ulong gva, int bytes); =20 #endif /* X86_MMU_H */ diff --git a/target/i386/emulate/x86_decode.c b/target/i386/emulate/x86_dec= ode.c index 7bbcd2a9a2a..9faa65a5797 100644 --- a/target/i386/emulate/x86_decode.c +++ b/target/i386/emulate/x86_decode.c @@ -80,7 +80,7 @@ static inline uint64_t decode_bytes(CPUX86State *env, str= uct x86_decode *decode, if (emul_ops->fetch_instruction) { emul_ops->fetch_instruction(env_cpu(env), &val, va, size); } else { - emul_ops->read_mem(env_cpu(env), &val, va, size); + x86_read_mem(env_cpu(env), &val, va, size); } } decode->len +=3D size; diff --git a/target/i386/emulate/x86_emu.c b/target/i386/emulate/x86_emu.c index bf96fe06b45..cfa35561dd5 100644 --- a/target/i386/emulate/x86_emu.c +++ b/target/i386/emulate/x86_emu.c @@ -166,7 +166,7 @@ void write_val_to_reg(void *reg_ptr, target_ulong val, = int size) =20 static void write_val_to_mem(CPUX86State *env, target_ulong ptr, target_ul= ong val, int size) { - emul_ops->write_mem(env_cpu(env), &val, ptr, size); + x86_write_mem(env_cpu(env), &val, ptr, size); } =20 void write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_= ulong val, int size) @@ -180,7 +180,7 @@ void write_val_ext(CPUX86State *env, struct x86_decode_= op *decode, target_ulong =20 uint8_t *read_mmio(CPUX86State *env, target_ulong ptr, int bytes) { - emul_ops->read_mem(env_cpu(env), env->emu_mmio_buf, ptr, bytes); + x86_read_mem(env_cpu(env), env->emu_mmio_buf, ptr, bytes); return env->emu_mmio_buf; } =20 @@ -497,7 +497,7 @@ static void exec_ins_single(CPUX86State *env, struct x8= 6_decode *decode) =20 emul_ops->handle_io(env_cpu(env), DX(env), env->emu_mmio_buf, 0, decode->operand_size, 1); - emul_ops->write_mem(env_cpu(env), env->emu_mmio_buf, addr, + x86_write_mem(env_cpu(env), env->emu_mmio_buf, addr, decode->operand_size); =20 string_increment_reg(env, R_EDI, decode); @@ -518,7 +518,7 @@ static void exec_outs_single(CPUX86State *env, struct x= 86_decode *decode) { target_ulong addr =3D decode_linear_addr(env, decode, RSI(env), R_DS); =20 - emul_ops->read_mem(env_cpu(env), env->emu_mmio_buf, addr, + x86_read_mem(env_cpu(env), env->emu_mmio_buf, addr, decode->operand_size); emul_ops->handle_io(env_cpu(env), DX(env), env->emu_mmio_buf, 1, decode->operand_size, 1); @@ -604,7 +604,7 @@ static void exec_stos_single(CPUX86State *env, struct x= 86_decode *decode) addr =3D linear_addr_size(env_cpu(env), RDI(env), decode->addressing_size, R_ES); val =3D read_reg(env, R_EAX, decode->operand_size); - emul_ops->write_mem(env_cpu(env), &val, addr, decode->operand_size); + x86_write_mem(env_cpu(env), &val, addr, decode->operand_size); =20 string_increment_reg(env, R_EDI, decode); } @@ -628,7 +628,7 @@ static void exec_scas_single(CPUX86State *env, struct x= 86_decode *decode) addr =3D linear_addr_size(env_cpu(env), RDI(env), decode->addressing_size, R_ES); decode->op[1].type =3D X86_VAR_IMMEDIATE; - emul_ops->read_mem(env_cpu(env), &decode->op[1].val, addr, decode->ope= rand_size); + x86_read_mem(env_cpu(env), &decode->op[1].val, addr, decode->operand_s= ize); =20 EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, false); string_increment_reg(env, R_EDI, decode); @@ -653,7 +653,7 @@ static void exec_lods_single(CPUX86State *env, struct x= 86_decode *decode) target_ulong val =3D 0; =20 addr =3D decode_linear_addr(env, decode, RSI(env), R_DS); - emul_ops->read_mem(env_cpu(env), &val, addr, decode->operand_size); + x86_read_mem(env_cpu(env), &val, addr, decode->operand_size); write_reg(env, R_EAX, val, decode->operand_size); =20 string_increment_reg(env, R_ESI, decode); diff --git a/target/i386/emulate/x86_helpers.c b/target/i386/emulate/x86_he= lpers.c index 7bdd7e4c2a1..024f9a2afcf 100644 --- a/target/i386/emulate/x86_helpers.c +++ b/target/i386/emulate/x86_helpers.c @@ -13,6 +13,7 @@ #include "cpu.h" #include "emulate/x86_decode.h" #include "emulate/x86_emu.h" +#include "emulate/x86_mmu.h" #include "qemu/error-report.h" #include "system/mshv.h" =20 @@ -176,7 +177,7 @@ bool x86_read_segment_descriptor(CPUState *cpu, } =20 gva =3D base + sel.index * 8; - emul_ops->read_mem(cpu, desc, gva, sizeof(*desc)); + x86_read_mem_priv(cpu, desc, gva, sizeof(*desc)); =20 return true; } @@ -200,7 +201,7 @@ bool x86_read_call_gate(CPUState *cpu, struct x86_call_= gate *idt_desc, } =20 gva =3D base + gate * 8; - emul_ops->read_mem(cpu, idt_desc, gva, sizeof(*idt_desc)); + x86_read_mem_priv(cpu, idt_desc, gva, sizeof(*idt_desc)); =20 return true; } diff --git a/target/i386/emulate/x86_mmu.c b/target/i386/emulate/x86_mmu.c index 35987a897aa..11e17c2db1d 100644 --- a/target/i386/emulate/x86_mmu.c +++ b/target/i386/emulate/x86_mmu.c @@ -21,7 +21,9 @@ #include "cpu.h" #include "system/address-spaces.h" #include "system/memory.h" +#include "qemu/error-report.h" #include "emulate/x86.h" +#include "emulate/x86_emu.h" #include "emulate/x86_mmu.h" =20 #define pte_present(pte) (pte & PT_PRESENT) @@ -32,6 +34,11 @@ #define pte_large_page(pte) (pte & PT_PS) #define pte_global_access(pte) (pte & PT_GLOBAL) =20 +#define mmu_validate_write(flags) (flags & MMU_TRANSLATE_VALIDATE_WRITE) +#define mmu_validate_execute(flags) (flags & MMU_TRANSLATE_VALIDATE_EXECUT= E) +#define mmu_priv_checks_exempt(flags) (flags & MMU_TRANSLATE_PRIV_CHECKS_E= XEMPT) + + #define PAE_CR3_MASK (~0x1fllu) #define LEGACY_CR3_MASK (0xffffffff) =20 @@ -40,14 +47,16 @@ #define PAE_PTE_LARGE_PAGE_MASK ((-1llu << (21)) & ((1llu << 52) - 1)) #define PAE_PTE_SUPER_PAGE_MASK ((-1llu << (30)) & ((1llu << 52) - 1)) =20 +static bool is_user(CPUState *cpu) +{ + return false; +} + + struct gpt_translation { target_ulong gva; uint64_t gpa; - int err_code; uint64_t pte[5]; - bool write_access; - bool user_access; - bool exec_access; }; =20 static int gpt_top_level(CPUState *cpu, bool pae) @@ -99,25 +108,15 @@ static bool get_pt_entry(CPUState *cpu, struct gpt_tra= nslation *pt, } =20 /* test page table entry */ -static bool test_pt_entry(CPUState *cpu, struct gpt_translation *pt, - int level, int *largeness, bool pae) +static MMUTranslateResult test_pt_entry(CPUState *cpu, struct gpt_translat= ion *pt, + int level, int *largeness, bool pae, MMUTranslat= eFlags flags) { X86CPU *x86_cpu =3D X86_CPU(cpu); CPUX86State *env =3D &x86_cpu->env; uint64_t pte =3D pt->pte[level]; =20 - if (pt->write_access) { - pt->err_code |=3D MMU_PAGE_WT; - } - if (pt->user_access) { - pt->err_code |=3D MMU_PAGE_US; - } - if (pt->exec_access) { - pt->err_code |=3D MMU_PAGE_NX; - } - if (!pte_present(pte)) { - return false; + return MMU_TRANSLATE_PAGE_NOT_MAPPED; } =20 if (pae && !x86_is_long_mode(cpu) && 2 =3D=3D level) { @@ -125,32 +124,30 @@ static bool test_pt_entry(CPUState *cpu, struct gpt_t= ranslation *pt, } =20 if (level && pte_large_page(pte)) { - pt->err_code |=3D MMU_PAGE_PT; *largeness =3D level; } - if (!level) { - pt->err_code |=3D MMU_PAGE_PT; - } =20 uint32_t cr0 =3D env->cr[0]; /* check protection */ if (cr0 & CR0_WP_MASK) { - if (pt->write_access && !pte_write_access(pte)) { - return false; + if (mmu_validate_write(flags) && !pte_write_access(pte)) { + return MMU_TRANSLATE_PRIV_VIOLATION; } } =20 - if (pt->user_access && !pte_user_access(pte)) { - return false; + if (!mmu_priv_checks_exempt(flags)) { + if (is_user(cpu) && !pte_user_access(pte)) { + return MMU_TRANSLATE_PRIV_VIOLATION; + } } =20 - if (pae && pt->exec_access && !pte_exec_access(pte)) { - return false; + if (pae && mmu_validate_execute(flags) && !pte_exec_access(pte)) { + return MMU_TRANSLATE_PRIV_VIOLATION; } =20 exit: /* TODO: check reserved bits */ - return true; + return MMU_TRANSLATE_SUCCESS; } =20 static inline uint64_t pse_pte_to_page(uint64_t pte) @@ -181,7 +178,7 @@ static inline uint64_t large_page_gpa(struct gpt_transl= ation *pt, bool pae, =20 =20 =20 -static bool walk_gpt(CPUState *cpu, target_ulong addr, int err_code, +static MMUTranslateResult walk_gpt(CPUState *cpu, target_ulong addr, MMUTr= anslateFlags flags, struct gpt_translation *pt, bool pae) { X86CPU *x86_cpu =3D X86_CPU(cpu); @@ -190,21 +187,20 @@ static bool walk_gpt(CPUState *cpu, target_ulong addr= , int err_code, int largeness =3D 0; target_ulong cr3 =3D env->cr[3]; uint64_t page_mask =3D pae ? PAE_PTE_PAGE_MASK : LEGACY_PTE_PAGE_MASK; + MMUTranslateResult res; =20 memset(pt, 0, sizeof(*pt)); top_level =3D gpt_top_level(cpu, pae); =20 pt->pte[top_level] =3D pae ? (cr3 & PAE_CR3_MASK) : (cr3 & LEGACY_CR3_= MASK); pt->gva =3D addr; - pt->user_access =3D (err_code & MMU_PAGE_US); - pt->write_access =3D (err_code & MMU_PAGE_WT); - pt->exec_access =3D (err_code & MMU_PAGE_NX); =20 for (level =3D top_level; level > 0; level--) { get_pt_entry(cpu, pt, level, pae); + res =3D test_pt_entry(cpu, pt, level - 1, &largeness, pae, flags); =20 - if (!test_pt_entry(cpu, pt, level - 1, &largeness, pae)) { - return false; + if (res) { + return res; } =20 if (largeness) { @@ -218,69 +214,111 @@ static bool walk_gpt(CPUState *cpu, target_ulong add= r, int err_code, pt->gpa =3D large_page_gpa(pt, pae, largeness); } =20 - return true; + return res; } =20 =20 -bool mmu_gva_to_gpa(CPUState *cpu, target_ulong gva, uint64_t *gpa) +MMUTranslateResult mmu_gva_to_gpa(CPUState *cpu, target_ulong gva, uint64_= t *gpa, MMUTranslateFlags flags) { + if (emul_ops->mmu_gva_to_gpa) { + return emul_ops->mmu_gva_to_gpa(cpu, gva, gpa, flags); + } + bool res; struct gpt_translation pt; - int err_code =3D 0; =20 if (!x86_is_paging_mode(cpu)) { *gpa =3D gva; - return true; + return MMU_TRANSLATE_SUCCESS; } =20 - res =3D walk_gpt(cpu, gva, err_code, &pt, x86_is_pae_enabled(cpu)); - if (res) { + res =3D walk_gpt(cpu, gva, flags, &pt, x86_is_pae_enabled(cpu)); + if (res =3D=3D MMU_TRANSLATE_SUCCESS) { *gpa =3D pt.gpa; - return true; } =20 - return false; + return res; } =20 -void vmx_write_mem(CPUState *cpu, target_ulong gva, void *data, int bytes) +static MMUTranslateResult x86_write_mem_ex(CPUState *cpu, void *data, targ= et_ulong gva, int bytes, bool priv_check_exempt) { + MMUTranslateResult translate_res =3D MMU_TRANSLATE_SUCCESS; + MemTxResult mem_tx_res; uint64_t gpa; =20 while (bytes > 0) { /* copy page */ int copy =3D MIN(bytes, 0x1000 - (gva & 0xfff)); =20 - if (!mmu_gva_to_gpa(cpu, gva, &gpa)) { - VM_PANIC_EX("%s: mmu_gva_to_gpa " TARGET_FMT_lx " failed\n", - __func__, gva); - } else { - address_space_write(&address_space_memory, gpa, - MEMTXATTRS_UNSPECIFIED, data, copy); + translate_res =3D mmu_gva_to_gpa(cpu, gva, &gpa, MMU_TRANSLATE_VAL= IDATE_WRITE); + if (translate_res) { + return translate_res; + } + + mem_tx_res =3D address_space_write(&address_space_memory, gpa, + MEMTXATTRS_UNSPECIFIED, data, copy); + + if (mem_tx_res =3D=3D MEMTX_DECODE_ERROR) { + warn_report("write to unmapped mmio region gpa=3D0x%" PRIx64 "= size=3D%i", gpa, bytes); + return MMU_TRANSLATE_GPA_UNMAPPED; + } else if (mem_tx_res =3D=3D MEMTX_ACCESS_ERROR) { + return MMU_TRANSLATE_GPA_NO_WRITE_ACCESS; } =20 bytes -=3D copy; gva +=3D copy; data +=3D copy; } + return translate_res; } =20 -void vmx_read_mem(CPUState *cpu, void *data, target_ulong gva, int bytes) +MMUTranslateResult x86_write_mem(CPUState *cpu, void *data, target_ulong g= va, int bytes) { + return x86_write_mem_ex(cpu, data, gva, bytes, false); +} + +MMUTranslateResult x86_write_mem_priv(CPUState *cpu, void *data, target_ul= ong gva, int bytes) +{ + return x86_write_mem_ex(cpu, data, gva, bytes, true); +} + +static MMUTranslateResult x86_read_mem_ex(CPUState *cpu, void *data, targe= t_ulong gva, int bytes, bool priv_check_exempt) +{ + MMUTranslateResult translate_res =3D MMU_TRANSLATE_SUCCESS; + MemTxResult mem_tx_res; uint64_t gpa; =20 while (bytes > 0) { /* copy page */ int copy =3D MIN(bytes, 0x1000 - (gva & 0xfff)); =20 - if (!mmu_gva_to_gpa(cpu, gva, &gpa)) { - VM_PANIC_EX("%s: mmu_gva_to_gpa " TARGET_FMT_lx " failed\n", - __func__, gva); + translate_res =3D mmu_gva_to_gpa(cpu, gva, &gpa, 0); + if (translate_res) { + return translate_res; } - address_space_read(&address_space_memory, gpa, MEMTXATTRS_UNSPECIF= IED, + mem_tx_res =3D address_space_read(&address_space_memory, gpa, MEMT= XATTRS_UNSPECIFIED, data, copy); =20 + if (mem_tx_res =3D=3D MEMTX_DECODE_ERROR) { + warn_report("read from unmapped mmio region gpa=3D0x%" PRIx64 = " size=3D%i", gpa, bytes); + return MMU_TRANSLATE_GPA_UNMAPPED; + } else if (mem_tx_res =3D=3D MEMTX_ACCESS_ERROR) { + return MMU_TRANSLATE_GPA_NO_READ_ACCESS; + } + bytes -=3D copy; gva +=3D copy; data +=3D copy; } + return translate_res; +} + +MMUTranslateResult x86_read_mem(CPUState *cpu, void *data, target_ulong gv= a, int bytes) +{ + return x86_read_mem_ex(cpu, data, gva, bytes, false); +} + +MMUTranslateResult x86_read_mem_priv(CPUState *cpu, void *data, target_ulo= ng gva, int bytes) +{ + return x86_read_mem_ex(cpu, data, gva, bytes, true); } diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c index 0b3674ad33d..fb039ff7bd5 100644 --- a/target/i386/hvf/hvf.c +++ b/target/i386/hvf/hvf.c @@ -252,27 +252,7 @@ static void hvf_read_segment_descriptor(CPUState *s, s= truct x86_segment_descript vmx_segment_to_x86_descriptor(s, &vmx_segment, desc); } =20 -static void hvf_read_mem(CPUState *cpu, void *data, target_ulong gva, int = bytes) -{ - X86CPU *x86_cpu =3D X86_CPU(cpu); - CPUX86State *env =3D &x86_cpu->env; - env->cr[0] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR0); - env->cr[3] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR3); - vmx_read_mem(cpu, data, gva, bytes); -} - -static void hvf_write_mem(CPUState *cpu, void *data, target_ulong gva, int= bytes) -{ - X86CPU *x86_cpu =3D X86_CPU(cpu); - CPUX86State *env =3D &x86_cpu->env; - env->cr[0] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR0); - env->cr[3] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR3); - vmx_write_mem(cpu, gva, data, bytes); -} - static const struct x86_emul_ops hvf_x86_emul_ops =3D { - .read_mem =3D hvf_read_mem, - .write_mem =3D hvf_write_mem, .read_segment_descriptor =3D hvf_read_segment_descriptor, .handle_io =3D hvf_handle_io, .simulate_rdmsr =3D hvf_simulate_rdmsr, @@ -490,6 +470,14 @@ static void hvf_cpu_x86_cpuid(CPUX86State *env, uint32= _t index, uint32_t count, } } =20 +static void hvf_load_crs(CPUState *cs) +{ + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + + env->cr[0] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR0); + env->cr[3] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR3); +} void hvf_load_regs(CPUState *cs) { X86CPU *cpu =3D X86_CPU(cs); @@ -802,6 +790,7 @@ static int hvf_handle_vmexit(CPUState *cpu) struct x86_decode decode; =20 hvf_load_regs(cpu); + hvf_load_crs(cpu); decode_instruction(env, &decode); exec_instruction(env, &decode); hvf_store_regs(cpu); @@ -843,6 +832,7 @@ static int hvf_handle_vmexit(CPUState *cpu) } =20 hvf_load_regs(cpu); + hvf_load_crs(cpu); decode_instruction(env, &decode); assert(ins_len =3D=3D decode.len); exec_instruction(env, &decode); @@ -948,6 +938,7 @@ static int hvf_handle_vmexit(CPUState *cpu) struct x86_decode decode; =20 hvf_load_regs(cpu); + hvf_load_crs(cpu); decode_instruction(env, &decode); exec_instruction(env, &decode); hvf_store_regs(cpu); diff --git a/target/i386/hvf/x86.c b/target/i386/hvf/x86.c index e98f480f411..7fe710aca3b 100644 --- a/target/i386/hvf/x86.c +++ b/target/i386/hvf/x86.c @@ -72,7 +72,7 @@ bool x86_read_segment_descriptor(CPUState *cpu, return false; } =20 - vmx_read_mem(cpu, desc, base + sel.index * 8, sizeof(*desc)); + x86_read_mem_priv(cpu, desc, base + sel.index * 8, sizeof(*desc)); return true; } =20 @@ -95,7 +95,7 @@ bool x86_write_segment_descriptor(CPUState *cpu, printf("%s: gdt limit\n", __func__); return false; } - vmx_write_mem(cpu, base + sel.index * 8, desc, sizeof(*desc)); + x86_write_mem_priv(cpu, desc, base + sel.index * 8, sizeof(*desc)); return true; } =20 @@ -111,7 +111,7 @@ bool x86_read_call_gate(CPUState *cpu, struct x86_call_= gate *idt_desc, return false; } =20 - vmx_read_mem(cpu, idt_desc, base + gate * 8, sizeof(*idt_desc)); + x86_read_mem_priv(cpu, idt_desc, base + gate * 8, sizeof(*idt_desc)); return true; } =20 diff --git a/target/i386/hvf/x86_task.c b/target/i386/hvf/x86_task.c index b1e541a6420..64e30e970d9 100644 --- a/target/i386/hvf/x86_task.c +++ b/target/i386/hvf/x86_task.c @@ -93,16 +93,16 @@ static int task_switch_32(CPUState *cpu, x86_segment_se= lector tss_sel, x86_segme uint32_t eip_offset =3D offsetof(struct x86_tss_segment32, eip); uint32_t ldt_sel_offset =3D offsetof(struct x86_tss_segment32, ldt); =20 - vmx_read_mem(cpu, &tss_seg, old_tss_base, sizeof(tss_seg)); + x86_read_mem_priv(cpu, &tss_seg, old_tss_base, sizeof(tss_seg)); save_state_to_tss32(cpu, &tss_seg); =20 - vmx_write_mem(cpu, old_tss_base + eip_offset, &tss_seg.eip, ldt_sel_of= fset - eip_offset); - vmx_read_mem(cpu, &tss_seg, new_tss_base, sizeof(tss_seg)); + x86_write_mem_priv(cpu, &tss_seg.eip, old_tss_base + eip_offset, ldt_s= el_offset - eip_offset); + x86_read_mem_priv(cpu, &tss_seg, new_tss_base, sizeof(tss_seg)); =20 if (old_tss_sel.sel !=3D 0xffff) { tss_seg.prev_tss =3D old_tss_sel.sel; =20 - vmx_write_mem(cpu, new_tss_base, &tss_seg.prev_tss, sizeof(tss_seg= .prev_tss)); + x86_write_mem_priv(cpu, &tss_seg.prev_tss, new_tss_base, sizeof(ts= s_seg.prev_tss)); } load_state_from_tss32(cpu, &tss_seg); return 0; diff --git a/target/i386/mshv/mshv-cpu.c b/target/i386/mshv/mshv-cpu.c index f190e83bd15..2bc978deb25 100644 --- a/target/i386/mshv/mshv-cpu.c +++ b/target/i386/mshv/mshv-cpu.c @@ -1548,74 +1548,6 @@ int mshv_create_vcpu(int vm_fd, uint8_t vp_index, in= t *cpu_fd) return 0; } =20 -static int guest_mem_read_with_gva(const CPUState *cpu, uint64_t gva, - uint8_t *data, uintptr_t size, - bool fetch_instruction) -{ - int ret; - uint64_t gpa, flags; - - flags =3D HV_TRANSLATE_GVA_VALIDATE_READ; - ret =3D translate_gva(cpu, gva, &gpa, flags); - if (ret < 0) { - error_report("failed to translate gva to gpa"); - return -1; - } - - ret =3D mshv_guest_mem_read(gpa, data, size, false, fetch_instruction); - if (ret < 0) { - error_report("failed to read from guest memory"); - return -1; - } - - return 0; -} - -static int guest_mem_write_with_gva(const CPUState *cpu, uint64_t gva, - const uint8_t *data, uintptr_t size) -{ - int ret; - uint64_t gpa, flags; - - flags =3D HV_TRANSLATE_GVA_VALIDATE_WRITE; - ret =3D translate_gva(cpu, gva, &gpa, flags); - if (ret < 0) { - error_report("failed to translate gva to gpa"); - return -1; - } - ret =3D mshv_guest_mem_write(gpa, data, size, false); - if (ret < 0) { - error_report("failed to write to guest memory"); - return -1; - } - return 0; -} - -static void write_mem(CPUState *cpu, void *data, target_ulong addr, int by= tes) -{ - if (guest_mem_write_with_gva(cpu, addr, data, bytes) < 0) { - error_report("failed to write memory"); - abort(); - } -} - -static void fetch_instruction(CPUState *cpu, void *data, - target_ulong addr, int bytes) -{ - if (guest_mem_read_with_gva(cpu, addr, data, bytes, true) < 0) { - error_report("failed to fetch instruction"); - abort(); - } -} - -static void read_mem(CPUState *cpu, void *data, target_ulong addr, int byt= es) -{ - if (guest_mem_read_with_gva(cpu, addr, data, bytes, false) < 0) { - error_report("failed to read memory"); - abort(); - } -} - static void read_segment_descriptor(CPUState *cpu, struct x86_segment_descriptor *desc, enum X86Seg seg_idx) @@ -1634,9 +1566,6 @@ static void read_segment_descriptor(CPUState *cpu, } =20 static const struct x86_emul_ops mshv_x86_emul_ops =3D { - .fetch_instruction =3D fetch_instruction, - .read_mem =3D read_mem, - .write_mem =3D write_mem, .read_segment_descriptor =3D read_segment_descriptor, }; =20 diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index ab583e922d4..561a48206ca 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -862,16 +862,6 @@ static int whpx_handle_portio(CPUState *cpu, return 0; } =20 -static void write_mem(CPUState *cpu, void *data, target_ulong addr, int by= tes) -{ - vmx_write_mem(cpu, addr, data, bytes); -} - -static void read_mem(CPUState *cpu, void *data, target_ulong addr, int byt= es) -{ - vmx_read_mem(cpu, data, addr, bytes); -} - static void read_segment_descriptor(CPUState *cpu, struct x86_segment_descriptor *desc, enum X86Seg seg_idx) @@ -891,8 +881,6 @@ static void read_segment_descriptor(CPUState *cpu, =20 =20 static const struct x86_emul_ops whpx_x86_emul_ops =3D { - .read_mem =3D read_mem, - .write_mem =3D write_mem, .read_segment_descriptor =3D read_segment_descriptor, .handle_io =3D handle_io }; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441493; cv=none; d=zohomail.com; s=zohoarc; b=g8i3mCdRqnKnIN4OC6Frjs+K+5JfzByB92OiwcX7sYhVWkh1iqCqoYbEPBk3P3LpCd2E49zDRFCFZZc0xROdzw7lFcNKi6aQQZ4ivk7ZBFbeBPPqhmbyUKQsIy8zlkNwqhmz/Y7S8xK6fRmtf9yCWMsqvkXpLJEOtd2sia3xL6c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441493; 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=rk5SULnMgDTQKKXSzTMen0TGNNIoLrqNZFPrXzrPfxI=; b=dogKiVIbWt0kCznSfTKKe06nwv44y4ZBFox3kOghy6LCZbrVtSuiiOazq5UCvrQDCCdoaLqofIMC2BvoTT4bL7RuBjl5PcIde+RprZ59r7zefjJF7XvoStYS+AnKXEbiFaSwM+5WUkYbwWyPwHi+sId1tCR5F83w9LqUZB4yL64= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441493587470.92849941122995; Mon, 2 Mar 2026 00:51:33 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytr-0003AJ-Lp; Mon, 02 Mar 2026 03:45:11 -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 1vwytQ-0001w6-Hv for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytN-0001al-73 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:42 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-594-VohWB_uANIWltlicy9U-eA-1; Mon, 02 Mar 2026 03:44:38 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-483a2db68caso34653345e9.0 for ; Mon, 02 Mar 2026 00:44:38 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfccb9f9sm132058095e9.23.2026.03.02.00.44.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441079; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rk5SULnMgDTQKKXSzTMen0TGNNIoLrqNZFPrXzrPfxI=; b=BdAYRsobMHOsl/zqFTMmc5Ip8OgotC7uMxBGfxwZ2RcQXTTk2G6xhnbYj5wGI+g4Z3C3Zb H/tiomRGrUSGgQDuRsJSUMV6xZJd2bYc8cTdwxvs05ZCsgueh+HpEidX0VEjAhuV6UE5Z+ LLsMZaQyN4a3pkZOHPajvdHb7b80dLM= X-MC-Unique: VohWB_uANIWltlicy9U-eA-1 X-Mimecast-MFC-AGG-ID: VohWB_uANIWltlicy9U-eA_1772441077 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441076; x=1773045876; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rk5SULnMgDTQKKXSzTMen0TGNNIoLrqNZFPrXzrPfxI=; b=Zaf8biIBQ68JFQPvczJddJ7EFb0Ui/iuI/OXtlzBU5ipce/6gHskffI8fzEb9tCIgX nOsRi4BNeCkGFrabeL3t8oRo43CiCj18d8kMm48WYC6TqJjwtWyYiJI//j3fUWgHGPIh 2z06CHxwQgN+yG8EVK4qGzrnycXxMbxzC101o0s6VqqFKZFepf5Uwylg+AgqlBiwyiGz PBxgYi2bUKB5PxRG0rRaI/++nba9YWKoPsseIdGcLNvEsepP7SauqPR/stuz57yl+iYS U6kLySrUe4vO8YAbC8ot6xcmuDzS/kBusG/Dion9GYUAD0+9NY53d3cwLT2GWC9n3UyW Zp4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441076; x=1773045876; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=rk5SULnMgDTQKKXSzTMen0TGNNIoLrqNZFPrXzrPfxI=; b=fQzY2y96hsGg7JMUojyGZWRS5J97HH1GzbObV+A4PFZxaeYQr4g+8VmNa5sQ+VcuIp 7QGrLWvav/5C2a3wCveYrOZxv+q4WmnZLbgYlQ8WkbrvTYHlF1Dl/7bOBJgwLEOHBt8v arCxFsF5E9uFkQtwXZ/iGh4vdBpyXcSr0KV4cKVE+y4vw+6HbfKk2t2pxGnZl11E1saQ d41hbo2SFzeK+wkreJbgRHP02c1NzerGSnqLzKy6WiBppWJqwU0bg5z/z9lHMz6L2fjt tb0Tc8+4Gm/fBUW2yj0yLRM+T8PvSVKGbEmQCXEd4j5efMbdRs9LVVd/CapSx0GscqyW +Uzw== X-Gm-Message-State: AOJu0YyJo5/+Nj6CQ5nAWOLRLuGSklfoWp0fUxjUVL7rEh+9EVtE9Pq1 UpYjNXYlbZWC23vBTyJ9FqoL8POvI+8A8VoKKiy4d3nrQNx7thMlNzfKBwtjjs3rULOseU0hwEq czHx4e1W2UvZAP87Tv7HqoEnuElpjjaD1eKpxk2zfEjOBTnrvk2HFtRUsQa0o+ACRDJgbfS5pEo QlgC0hsqHMgFN4MK0MnPVQzDmAVIROWLkFjrB5Ag7L X-Gm-Gg: ATEYQzzJkIR0BqTeHLIuFHgG8Qa24JCeIRO1kjmKPx1x1fcIbhBO988Xe11xn52RvS+ 0vdgVzJsBc83Jt3V50hC7kmGHtwC+hkGIkdOF4QJPuPQ85886GYPRPOu361+2IqCqLhzZ7OL9k7 U4rcNo9XB5Y5G36oHUQJ2bIwxR/h1DotvJCivU7ESqUdPircbt8oJc8y0xtGreA03Si7k4+2yjT Y988ogicLVHqP0WDpiOggaWWrC6UHuIF90zLoFOVvg+1EI324mZnn/dPJIhnHyLT1k7wAK39sRk alHnP1+qJesvVv9wPEWGGCOjSAoOjnmSAeUhiT7zj2m5e8EUWPPX8fq7ZQ0VIpBEmqhQ/ZWmeW9 EDcAjiNw0behlN7AN8pdLkQajFPHcpmbLDADK52YaPYY9cih4ZHsdpkkaNSZW08h/iI1OtKDTM/ 7ktgr9KBPgDnIC8CcV10kU/oCfjlA= X-Received: by 2002:a05:600c:470a:b0:477:abea:9028 with SMTP id 5b1f17b1804b1-483c9ba68eemr183395665e9.6.1772441076551; Mon, 02 Mar 2026 00:44:36 -0800 (PST) X-Received: by 2002:a05:600c:470a:b0:477:abea:9028 with SMTP id 5b1f17b1804b1-483c9ba68eemr183395185e9.6.1772441076064; Mon, 02 Mar 2026 00:44:36 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 021/102] hvf: i386: save/restore CR0/2/3 Date: Mon, 2 Mar 2026 09:42:16 +0100 Message-ID: <20260302084338.473368-22-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441495350158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni For symmetry, save/restore the same set of registers even when not needed. CR2 save/restore needed as page faults injected to the guest imply modifyin= g CR2. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-21-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/hvf/hvf.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c index fb039ff7bd5..a70f8461b04 100644 --- a/target/i386/hvf/hvf.c +++ b/target/i386/hvf/hvf.c @@ -477,7 +477,19 @@ static void hvf_load_crs(CPUState *cs) =20 env->cr[0] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR0); env->cr[3] =3D rvmcs(cpu->accel->fd, VMCS_GUEST_CR3); + env->cr[2] =3D rreg(cpu->accel->fd, HV_X86_CR2); } + +static void hvf_save_crs(CPUState *cs) +{ + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + + wvmcs(cpu->accel->fd, VMCS_GUEST_CR0, env->cr[0]); + wvmcs(cpu->accel->fd, VMCS_GUEST_CR3, env->cr[3]); + wreg(cs->accel->fd, HV_X86_CR2, env->cr[2]); +} + void hvf_load_regs(CPUState *cs) { X86CPU *cpu =3D X86_CPU(cs); @@ -794,6 +806,7 @@ static int hvf_handle_vmexit(CPUState *cpu) decode_instruction(env, &decode); exec_instruction(env, &decode); hvf_store_regs(cpu); + hvf_save_crs(cpu); break; } break; @@ -837,6 +850,7 @@ static int hvf_handle_vmexit(CPUState *cpu) assert(ins_len =3D=3D decode.len); exec_instruction(env, &decode); hvf_store_regs(cpu); + hvf_save_crs(cpu); =20 break; } @@ -942,6 +956,7 @@ static int hvf_handle_vmexit(CPUState *cpu) decode_instruction(env, &decode); exec_instruction(env, &decode); hvf_store_regs(cpu); + hvf_save_crs(cpu); break; } case EXIT_REASON_TPR: { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441281; cv=none; d=zohomail.com; s=zohoarc; b=nOyNbSFBn6FWfQYyLTR1/CvAqm6CAgiaDm+GNkp3H5HRCtRjA1RBCaEWVqt6GXrXPX4ZpSQWyKzv30dU8togo134FL26ufTrbe4wUScY9kyxL9OHGiC5NNz+2YKDFPehTFu+RefPHrMKLu7rx43pQukLvxk3YGWdcyS4IXHJw+Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441281; 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=HjkgyPw4GIZy7xWS0r6nwvwf8hxxJ78+m9f+iA3D1SQ=; b=CR5vshFggAm2AJMYQH+zm90yj/918H0CHt8XMCn7sH1CbYtc9JGv1dn6Op+XC3t0xQLTE5KZVdU4PCB0lobemWedHV1m7LwJCYm1WeYeN7lz1lLeNAbe2YSWe38BnCvrlNDc0cJg3O8jk+H40lG6lHMhhc5x47H+sFqsE+jA7Kg= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441281930354.0316526287397; Mon, 2 Mar 2026 00:48:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytr-00037H-5i; Mon, 02 Mar 2026 03:45:11 -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 1vwytT-0001wH-MM for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:51 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytQ-0001bZ-Ro for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:46 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-642-cfbcvh1IM3qfphLdUIsqDA-1; Mon, 02 Mar 2026 03:44:41 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4837b7903f3so52513065e9.2 for ; Mon, 02 Mar 2026 00:44:41 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd750607sm391021055e9.10.2026.03.02.00.44.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441083; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HjkgyPw4GIZy7xWS0r6nwvwf8hxxJ78+m9f+iA3D1SQ=; b=P/qU3DVWI/I+LotwCtnMxEYHgtJG1jzyjGHNoLOJO5BhJe5CwpcIR0bbgJoBK4MLRowONb hyuLwVGwQ6XIV/9acFsIOTGYaswlHHi+7CZHg4gCcIxfsL0GiQNHQRscqElYMXmUehQc/c y2RElVTCJakMXWzIq/VxHIPD1NBcp1Y= X-MC-Unique: cfbcvh1IM3qfphLdUIsqDA-1 X-Mimecast-MFC-AGG-ID: cfbcvh1IM3qfphLdUIsqDA_1772441081 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441079; x=1773045879; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HjkgyPw4GIZy7xWS0r6nwvwf8hxxJ78+m9f+iA3D1SQ=; b=Dre+TlMQ6fIocdTS47HfVq4zp7BwurKOs4+nUExdtwOAjyzbPHfiKU7N0U77WfK5yp qpkEd+VsUVZxBRoqFqjb1Cak6JkJPXOXAKZwOSzPjnPDgZ/2RiywuxvSWNBWMQo58u4k Q5oqbKapfm55eN5anU6fd8u3F3AzBFE7mDajdxrwJNSFZRWKz6Z/0m/ohLSsFfacntVS gCwY/37E6XEdsQWSa5E+XBNQfeP4aKXs+sDDhtkXnFfC1SoJzPEuu49KZmprdvN/t7FA sqPNbyRhQ5xS/B+vYnRetMY6aQd0JDfUAxDOfFv4GHUUdFnLjsPzVpQgIltgNzPVCA0w YrqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441079; x=1773045879; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=HjkgyPw4GIZy7xWS0r6nwvwf8hxxJ78+m9f+iA3D1SQ=; b=CipVMn5qKwvkz65/4Z5Twm3dC5CG/VlsEb2+WCo4Yd+xx/ASCOTspz4Cu3D+bUsF0T Z/WAkRNO34ir+z8i8IUJTpPidgpZ/TYj9ZOgZ32fAMXVTtch/zHpatWBLBN6KBAEtqrT tcV8G5QnuGmZtLVZarIb4/Lo33gY8VbNG3Sr8VFGsrA6lQW3GNG6tXJu567tL5pWG15D ldcW9eG3dBXNEb6285FCb6VnBbIK3wcqPJxQM7KfA0bn+RDRIly5cwmcCusS4CflScUn wPQtaydWEP+xMp6R9S0HpQt54nU7o/Pp9eHeqR2ut/iT3lgY/SY8UCEQ0tn3wJ72CqoV GBhw== X-Gm-Message-State: AOJu0YzZuzKde5+j52LTWTfdExIiVSj/fpm+awX544G9NmMvUOnA/2XM Y596GOq6w6p8/40JVKxrD4Vm9u1uNbbmgqtzZuXd2X6JaFKi1oNOFqOOENC9f+kHQl3pD2qqjDH TMPt1IHOhVz68wx4UpP4/4eh6iRtmuMRF62mUSmh4Xclyr5z/NeAq+79OmLQf40VETuVopfuOD4 G9F8Z6/rsRwKlpGPC4QEytN11VnXLqDqNe1IBBP8xq X-Gm-Gg: ATEYQzxLxdVq7NSa9eDlTPvW7MEdbnIX090clcblbAGng8ya51MPo5Wb86K5EgWaLy1 GXO0q5Ili7ZOGIAk/xIzgP7bN45vTGgOb3VGu5lN4N7ncRj2dhyMCU4g2Cc/33SnHoUBb8Y+H/t 2uMceXymsvBcmRuHjYgLZy8b+e3aXrjXqSRGY6xb3yfKKLmyLfFon7E+N/nZ7GnBOdYuErPM6Lw W3FCzUm7e1R1sR86kStTvlpf3kBTdJEd8kl1E78a01SOywguwFn1/HQg9n/SzXKbAMDoiOVpwpk tK8iCbb6kf2++dJL473VMHk03XiZ6a4oaESZMQBw8eSFRqPIRbb25AVm91SzSRtpWwd/EVkGxEB 6sZdjcB8t5lYFLfZ2p9oEXDOqyFo5jXsbam4efEBgslE07MJ6xnGhsU44rMTZb1/DZG9DikNmq3 07976JdSjYgf7PAACPgwEPVln2pVM= X-Received: by 2002:a05:600c:46c4:b0:483:8e43:6dce with SMTP id 5b1f17b1804b1-483c9c2143emr191860395e9.29.1772441079600; Mon, 02 Mar 2026 00:44:39 -0800 (PST) X-Received: by 2002:a05:600c:46c4:b0:483:8e43:6dce with SMTP id 5b1f17b1804b1-483c9c2143emr191859835e9.29.1772441079079; Mon, 02 Mar 2026 00:44:39 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 022/102] target/i386: emulate: get rid of write_val_to_mem() helper Date: Mon, 2 Mar 2026 09:42:17 +0100 Message-ID: <20260302084338.473368-23-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441282297158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-22-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_emu.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/target/i386/emulate/x86_emu.c b/target/i386/emulate/x86_emu.c index cfa35561dd5..3aedd638a10 100644 --- a/target/i386/emulate/x86_emu.c +++ b/target/i386/emulate/x86_emu.c @@ -164,17 +164,12 @@ void write_val_to_reg(void *reg_ptr, target_ulong val= , int size) } } =20 -static void write_val_to_mem(CPUX86State *env, target_ulong ptr, target_ul= ong val, int size) -{ - x86_write_mem(env_cpu(env), &val, ptr, size); -} - void write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_= ulong val, int size) { if (decode->type =3D=3D X86_VAR_REG) { write_val_to_reg(decode->regptr, val, size); } else { - write_val_to_mem(env, decode->addr, val, size); + x86_write_mem(env_cpu(env), &val, decode->addr, size); } } =20 @@ -548,7 +543,7 @@ static void exec_movs_single(CPUX86State *env, struct x= 86_decode *decode) decode->addressing_size, R_ES); =20 val =3D read_val_from_mem(env, src_addr, decode->operand_size); - write_val_to_mem(env, dst_addr, val, decode->operand_size); + x86_write_mem(env_cpu(env), &val, dst_addr, decode->operand_size); =20 string_increment_reg(env, R_ESI, decode); string_increment_reg(env, R_EDI, decode); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441231; cv=none; d=zohomail.com; s=zohoarc; b=Yt+mmQYbQszT4g1KG5ttGyyVrc5CWHuhfaOJLiTsQ65dZMwcbohe9Hp3b5koDuhcMB+ay1g0U3mqwTfl7MTTlk15ZsIxvU6uzLjmjG+oYh0ggrGq4++dVeF9nlK+IcaKaR5ZPvTwlXXVJm5OR2tcXQuUkuCYrBlcsEplpmllf1A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441231; 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=+QmbZVQLw7we7iRqAwvFKjmYWGyjd6I1ZKI7CG2NM7E=; b=e34WFrw9JX06/W0RDDYGFXgBO+DtzrXfIFktLR6Sk7VZYUpCPz4VoHuvLOOUQtYtBzkJeRJRxb+lBeDjr3clPoAI/OddwNiBiMO6ZYUuBlL/36BlOdvIRRX7XNTEuXMUEdNj+bQiISBfwNoHl4koJ95mUBdczpWk532CSLBcfjk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441231844479.1323011500855; Mon, 2 Mar 2026 00:47:11 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyts-0003Hu-PL; Mon, 02 Mar 2026 03:45:12 -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 1vwytV-0001yr-Nd for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:53 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytT-0001br-0U for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:48 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-648-sVbcy2V1PYKq6mMdhIVdgw-1; Mon, 02 Mar 2026 03:44:44 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4837bfcfe0dso53775135e9.1 for ; Mon, 02 Mar 2026 00:44:43 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd750607sm391024115e9.10.2026.03.02.00.44.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441085; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+QmbZVQLw7we7iRqAwvFKjmYWGyjd6I1ZKI7CG2NM7E=; b=QLLffVDz39xjQ9lroxsV2dle/AoUswb9t0sfDRRde+25oaSXizVfTa9lgbD9gcTmCjUK9m S3N8y0kRyHCp6C/625lOR8gOqlebzc98UBhCLc0xnGKtVnZap8Q7khkzPm3pQ5M4Td0dvh rLDCJ7xP1Qpypxoo9k7gelVds6OMcKc= X-MC-Unique: sVbcy2V1PYKq6mMdhIVdgw-1 X-Mimecast-MFC-AGG-ID: sVbcy2V1PYKq6mMdhIVdgw_1772441083 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441082; x=1773045882; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+QmbZVQLw7we7iRqAwvFKjmYWGyjd6I1ZKI7CG2NM7E=; b=fZPsd4N+EeYLrdl3aK3tyqpHN6cWhN6Dx0lznHQXiN5duSHQBkKBadllxWmSFBC+B5 CW9R8QnfcuB1aiboMgQ6Mbz9sbOwYEhx/hVGjAlc+50hGSlE0Tehmgm9NkL+suvADbx+ k39PzH67fibx+0zQt9xiY/I+IL9y9CADrsfr9wxI3Bb80PtisEBAtAv4qsgYMp0uaxP9 7sZAvSdjtbQ1VnvWSAwOQdGa9qXYo+stUuZX6j38YQoUYyF0gIj03wJ00dtxOk/83gw3 1J/sTaAEJ2AN/7lJT+yoO9xCNHS+YgTSeYPXsscS2U6+0hwLWnxg/+BIkhKLDMDRt1Ck j4hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441082; x=1773045882; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+QmbZVQLw7we7iRqAwvFKjmYWGyjd6I1ZKI7CG2NM7E=; b=W0uqI5SyJla6yanxwBnI+gpAtxCOgx9F/bEM1ZjajBoMoYCroBDqFY3TY74L5EeQsj 6MKKA0kzH75f8DqaIk6itLWjzAjDvumcchErqesIxWM+X9/WtuEqrUBSkpcBmsS8uz2d j9gvUFkZNQAzNu+5+HtNjd2SHDJ7xlHdpz8aHMht7uBXCjnvI9or098edApte5qer0Rq qDDx8+VCIMgLm15U1hLPTEBJTsCtrNqBe1dFvrhLpuKmgylaKHPIn0iXAF6ro8YsqaK0 6Tx+bCooyvWAwfk54D3yuugzpzM/cHCWYh4BK+mAwiQHtGb3RGkg2AZ+dKQatpnRxQIq lxfw== X-Gm-Message-State: AOJu0Ywz2x6g9f9TWRkYpBEs0Z+qzqiscYp/En7cyJzmGm2AKNi8Xyi1 MRGsJBWq3ZlK3rllr+yigTdx7bx0w52egDYxa3IIA3Uj7H9EbyIO6KYY62khdlLUA9kwEsg6ylg 1SMoftFcQ/rRJk/UFC6yhysiXDT981T1nJs9e7nysksDMlfyp3r3OR7QMJO8WFrbrI6/tgtF9Oy ameTpUd941KG2076OO//RT2iGWnBNZU7LKIcMYN12m X-Gm-Gg: ATEYQzx4Q//G8DAk1KHPZia/F/R2eh9dpW0BJ364svZn22c8gl5IIyr1dKDeL1xHOdS A234EQSjkPrsuACDpoSAJ80FJfu93l1B/jRvN5mP+368jUZlG8OA6USfD/a8jeG+UIjPLJZVRiM Lli0BkFkQTHzAuEk1sCTArWrSX2xn5TWH1AM/TVa4DD0ylwkm078vr1HwxJTTj7uhygsgBTGr1H v9ZDixTfmcG3ZjCsgSx677Lex8Blpj0vsil36otWzeKeJQ9g/FxAVAgQ/Xjkb4MBuXaaBhRTdKl akB+MIcr1vLrBVCUWu4Jkm9O4c+Zpk3LSPYOiyL1hu3xaLopy7ZJ++NHAfzzFc8oxv+FuAu8lVc qeXzgLi5qpYMTl33l6/v4kO4iVlgO3OAodLSlQ2ls3RpuvoGCv0f4G7QhI63AXI4eYELR3cHEIh OXX0YI38WJQNYIKdZDIZB/zPQGdC0= X-Received: by 2002:a05:600c:6217:b0:480:1b65:b744 with SMTP id 5b1f17b1804b1-483c9bc5bb6mr200303335e9.28.1772441081912; Mon, 02 Mar 2026 00:44:41 -0800 (PST) X-Received: by 2002:a05:600c:6217:b0:480:1b65:b744 with SMTP id 5b1f17b1804b1-483c9bc5bb6mr200302845e9.28.1772441081498; Mon, 02 Mar 2026 00:44:41 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 023/102] target/i386: emulate: raise an exception on translation fault Date: Mon, 2 Mar 2026 09:42:18 +0100 Message-ID: <20260302084338.473368-24-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441232076158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-23-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_mmu.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/target/i386/emulate/x86_mmu.c b/target/i386/emulate/x86_mmu.c index 11e17c2db1d..8261ca16351 100644 --- a/target/i386/emulate/x86_mmu.c +++ b/target/i386/emulate/x86_mmu.c @@ -240,8 +240,29 @@ MMUTranslateResult mmu_gva_to_gpa(CPUState *cpu, targe= t_ulong gva, uint64_t *gpa return res; } =20 +static int translate_res_to_error_code(MMUTranslateResult res, bool is_wri= te, bool is_user) +{ + int error_code =3D 0; + if (is_user) { + error_code |=3D PG_ERROR_U_MASK; + } + if (!(res & MMU_TRANSLATE_PAGE_NOT_MAPPED)) { + error_code |=3D PG_ERROR_P_MASK; + } + if (is_write && (res & MMU_TRANSLATE_PRIV_VIOLATION)) { + error_code |=3D PG_ERROR_W_MASK; + } + if (res & MMU_TRANSLATE_INVALID_PT_FLAGS) { + error_code |=3D PG_ERROR_RSVD_MASK; + } + return error_code; +} + static MMUTranslateResult x86_write_mem_ex(CPUState *cpu, void *data, targ= et_ulong gva, int bytes, bool priv_check_exempt) { + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + MMUTranslateResult translate_res =3D MMU_TRANSLATE_SUCCESS; MemTxResult mem_tx_res; uint64_t gpa; @@ -252,6 +273,9 @@ static MMUTranslateResult x86_write_mem_ex(CPUState *cp= u, void *data, target_ulo =20 translate_res =3D mmu_gva_to_gpa(cpu, gva, &gpa, MMU_TRANSLATE_VAL= IDATE_WRITE); if (translate_res) { + int error_code =3D translate_res_to_error_code(translate_res, = true, is_user(cpu)); + env->cr[2] =3D gva; + x86_emul_raise_exception(env, EXCP0E_PAGE, error_code); return translate_res; } =20 @@ -284,6 +308,9 @@ MMUTranslateResult x86_write_mem_priv(CPUState *cpu, vo= id *data, target_ulong gv =20 static MMUTranslateResult x86_read_mem_ex(CPUState *cpu, void *data, targe= t_ulong gva, int bytes, bool priv_check_exempt) { + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + MMUTranslateResult translate_res =3D MMU_TRANSLATE_SUCCESS; MemTxResult mem_tx_res; uint64_t gpa; @@ -294,6 +321,9 @@ static MMUTranslateResult x86_read_mem_ex(CPUState *cpu= , void *data, target_ulon =20 translate_res =3D mmu_gva_to_gpa(cpu, gva, &gpa, 0); if (translate_res) { + int error_code =3D translate_res_to_error_code(translate_res, = false, is_user(cpu)); + env->cr[2] =3D gva; + x86_emul_raise_exception(env, EXCP0E_PAGE, error_code); return translate_res; } mem_tx_res =3D address_space_read(&address_space_memory, gpa, MEMT= XATTRS_UNSPECIFIED, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441168; cv=none; d=zohomail.com; s=zohoarc; b=ge6/hkS2jwv2jbLLetgY5un6MjFVPJMS+4SwczTXbszFjU0zjJC8JTWnHxE/Y3zgdMFgSveP1QWvRE+nWM7EWdqRBl0SNM2Kc4Zt5QRp9Dh66XIJzkqAr6jtytDn4ou9FMWJW0pyfCHy0oBe2Ys+G2mA3oOyb6qkx4Y8Noz9MCU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441168; 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=IY2hcMqKKT16aeB8avf2viKArpoc9pPECGzH6yhOCo4=; b=lN6vpJgghLKwfH2mrC8Iz+ECbsAAoxPudgDCfTEt6NUNXvoLZpJxLCDisnYTzOiCifEzR6qMmw4BeiKBS6Lv4y5LuRvKmBvtOjUUGNjHnYO8S1PsAntZqjZ8OH9DhjcmsxlZi62na7cLOExvkXDMLwl4zgOn8MLBEhJhVGbyVl0= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441168811304.9931366152314; Mon, 2 Mar 2026 00:46:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytu-0003Si-C2; Mon, 02 Mar 2026 03:45:14 -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 1vwytX-000219-SD for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:54 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytU-0001cF-Ns for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:50 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-610-jcz5oSl1O1SoMWWaYCs5WA-1; Mon, 02 Mar 2026 03:44:46 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-439bcec86dfso98129f8f.3 for ; Mon, 02 Mar 2026 00:44:46 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c60e40fsm26049820f8f.7.2026.03.02.00.44.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441088; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IY2hcMqKKT16aeB8avf2viKArpoc9pPECGzH6yhOCo4=; b=LV31LGJKQ2GZtT9SSaIbJ+E0snDi/feSf5zCOeQm2LL47ir6r2Q2zMlbWvlS3jUsYbuqKc i5Vu4fUvVwcWcDo8hBRD1CpU5VW7JE9ieCjqQoK0CUdhATai4UfnKqvkgWdUnqZ14aTjkX rsjFdfenaGZhVjrIcp3ZWb7GKF5hfFE= X-MC-Unique: jcz5oSl1O1SoMWWaYCs5WA-1 X-Mimecast-MFC-AGG-ID: jcz5oSl1O1SoMWWaYCs5WA_1772441086 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441085; x=1773045885; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IY2hcMqKKT16aeB8avf2viKArpoc9pPECGzH6yhOCo4=; b=jLm/tWd4aX57f5elYQSWpD7iwrI9PwfyC7CMyJ8GLcELWO8WwWCKLDVNAI3EPC3oZO QSgzHkJ2Tp8ljBtLin5NH27JBSJ2AfLRtljvdCsPzZIJ5EPyzThLhrcQLCNKb49TxRzk nZ/takTgm4QiFmpl2k4h8a6Vkp44jZW+XT2rvG9Y/grmOKXrRYP8xO7HlImq3+q/aFXi wgO4rWYnsaRWZ1UzJBL98Gq/01lkCHo3iH8/u07ELbKuwY5oYMZA03OH7KJX1hy4H2RF g9UR4txJb2skpW4aCrUe3hc2obhin7xD+ps6oQlDqQwGMaPhtU7FOKPoNJoDxI1lzRVh otsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441085; x=1773045885; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IY2hcMqKKT16aeB8avf2viKArpoc9pPECGzH6yhOCo4=; b=XjsVsiNjYv65Db9pMuIpSonxbPdAdniq7vfDlUWfx/TdoeOMB84zBMiSrZb5Rj3hB0 DP5qs+MMtvt/iCSjCW+dqqYNXfk1FWRBls4XJPJr3QzSIqOJZfdvgIZAtymZX5uIxpPT 5pI9EZ068lIkPFfa7Bor9ea57F5c9eMMW+FzbpnUDtZ8rx3CY4X2sPZhmaV/FVqo9Quo 60ahC5JknvswjMTF+PR3kl5FXldSvrzwgg6jcvB87g8sP1pV/rB4QwWai6HfDQGxNy+O gAYNNkqkoFaJHN8us/Gpx3bVZQ4GnBspKtvKEJOj0uX0x+d9lTrO1G+V2qR1ywav2r/a /x3A== X-Gm-Message-State: AOJu0YzFPxZKXbFoOeTYFSBaX5iraB8Uvaw2/DPcuYN8bNMyOtBLv3/y O5f3GHC+BbCNPtK8yZfkwMceFewlqBfHOFbZubVd35KwdXx//UvIccdJ4NKWhRzIPfC+fYXJZuK 8WXhUb+6AOp6tWUgLXnIKkr++VuLzXLJ/APFlfb8cmvqREq8zdvykbnDlUN50xONqpJI4x+6Zaw slLJXFDQqmzcLip9nmVpRIEZpMIeUYolVTio4F7ctw X-Gm-Gg: ATEYQzxvmI3E5MNLE+uNmIM2LKVAcfdCcxsYianx2bjLHTsbXMnKX/xvVoaWXxNoja/ 2hXbyu6XUks+I11/GpB7W//DjsI+B4vtdI9nbBeEhuZnPcRKrkpiNiKBQF/GLyOMOGOU4w+PrGH Rb3JQ3j5kEFf/aIwkgqc7z9uCG31KGJhinTl7xgLt2eu/9v2sctWR1EKGAPya+AzQ1Zopgl80uJ OKlxrPVB6vWRRW7c2D+9R8AwTHznWbgYTc2VaHT2E5GDAI6RC3BEh/wI2g4DwEzBHdbP0Lg4Fco ewoGnIFAyx2q4QTULTL1c8ul5OTPLvqNLXPJ1V5c580yJTn3oXv7b+TM1ENSLD4pYnOFcmyUXce LvUdIxvFyf8wQwrUmY0INiEF1iAPO0NAkd3gZ/PS5CtYTO+VTymU0g+w0NCPJqNfS2vRnJp4VT7 NGEwYcvfEmI6MRq/iIhz6QNrZn+sQ= X-Received: by 2002:a05:6000:24ca:b0:439:b564:7a6c with SMTP id ffacd0b85a97d-439b5647fa6mr6055815f8f.4.1772441084605; Mon, 02 Mar 2026 00:44:44 -0800 (PST) X-Received: by 2002:a05:6000:24ca:b0:439:b564:7a6c with SMTP id ffacd0b85a97d-439b5647fa6mr6055753f8f.4.1772441083947; Mon, 02 Mar 2026 00:44:43 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 024/102] target/i386: emulate: remove fetch_instruction helper too Date: Mon, 2 Mar 2026 09:42:19 +0100 Message-ID: <20260302084338.473368-25-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441169713158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Not used anymore. Link: https://lore.kernel.org/r/20260223233950.96076-24-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_emu.h | 2 -- target/i386/emulate/x86_decode.c | 6 +----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/target/i386/emulate/x86_emu.h b/target/i386/emulate/x86_emu.h index 3e485b8ca36..6b691118221 100644 --- a/target/i386/emulate/x86_emu.h +++ b/target/i386/emulate/x86_emu.h @@ -25,8 +25,6 @@ #include "cpu.h" =20 struct x86_emul_ops { - void (*fetch_instruction)(CPUState *cpu, void *data, target_ulong addr, - int bytes); MMUTranslateResult (*mmu_gva_to_gpa) (CPUState *cpu, target_ulong gva,= uint64_t *gpa, MMUTranslateFlags flags); void (*read_segment_descriptor)(CPUState *cpu, struct x86_segment_desc= riptor *desc, enum X86Seg seg); diff --git a/target/i386/emulate/x86_decode.c b/target/i386/emulate/x86_dec= ode.c index 9faa65a5797..bae1dd4d6f8 100644 --- a/target/i386/emulate/x86_decode.c +++ b/target/i386/emulate/x86_decode.c @@ -77,11 +77,7 @@ static inline uint64_t decode_bytes(CPUX86State *env, st= ruct x86_decode *decode, memcpy(&val, decode->stream->bytes + decode->len, size); } else { target_ulong va =3D linear_rip(env_cpu(env), env->eip) + decode->l= en; - if (emul_ops->fetch_instruction) { - emul_ops->fetch_instruction(env_cpu(env), &val, va, size); - } else { - x86_read_mem(env_cpu(env), &val, va, size); - } + x86_read_mem(env_cpu(env), &val, va, size); } decode->len +=3D size; =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441252; cv=none; d=zohomail.com; s=zohoarc; b=jDcFybm8mHjzG4f0q1SR4QmlNEMaiYKBMKK38OS7LB0DJZfnD1KayvZ3eoEesqbhxDhAqVzEX8AUQ9fajZRT2mM/rYObE5i1ut6Xmr6tf9/OCa3jbaDON2vAuPFKURy5FWeJ6qCBIDYgSRIzhGLqY04flzpJW+PHoDI0ED0AHas= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441252; 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=6jP0wrr/WHTKUeZphGxDZz0G8W/sby2Vn9bBFERnTZc=; b=L2qOH5ZEzxHx0oADbZCPHSKlAS1WhsO0ER0nRCg+Wj+u6+2kYM6Td5ZKZiZK10h0TW3FpUrhII6WOLvPkeT+XfQ9/eiDxGFloLg9j7AcoQ5r391Sai+HdyuOmNb7BNJxCnG+JycPjH/2n8AX0maJj3m5Y7D6OYEJG8+EGkd6Xkw= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441252972178.30736501129536; Mon, 2 Mar 2026 00:47:32 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytv-0003aO-E5; Mon, 02 Mar 2026 03:45:15 -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 1vwyta-00026W-2H for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:56 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytX-0001cf-KN for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:53 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-632-CYsQqbAFNCyDQyikXOehqw-1; Mon, 02 Mar 2026 03:44:49 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4836cf00787so48172995e9.1 for ; Mon, 02 Mar 2026 00:44:49 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b44207sm285275155e9.7.2026.03.02.00.44.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441090; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6jP0wrr/WHTKUeZphGxDZz0G8W/sby2Vn9bBFERnTZc=; b=hU85r5Eff6zKSmxfo4u8dzrPdJNSB5WnCFyYnn3MF/lQw2GqChwh6a/bQCAHhzWp5CST+q /jPy8QAn7ro+mlKgH/itbskEracu1pKirf/2nPRMGG4WKGKVEWkx/VQyFWNHUeruCE4uqD woqqAI7r9fKiV/ekK3Kfxvn4pib0jlc= X-MC-Unique: CYsQqbAFNCyDQyikXOehqw-1 X-Mimecast-MFC-AGG-ID: CYsQqbAFNCyDQyikXOehqw_1772441088 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441087; x=1773045887; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=6jP0wrr/WHTKUeZphGxDZz0G8W/sby2Vn9bBFERnTZc=; b=gfwhVrtn2Z7JBHn+CmDTl2BRHQPfY6beCl4RypusMa09+T8XHAjcp8yHFUJmxyXu0X dbJEaBg931r67HffTAw9Gi14atmoJtZrNH5m12166mo+YV6G2Nzs1mDr7KTP0JvRUbq/ SzVX4W79JtSELFO66L8+JyPaZpx+WjqctHqoQY+joWVfdCONkhtcZWn51P7xrYAlGBj6 k1zWonUGBjkvqIvQpXkrYgsA+Ars0PX3e1lhd5Zty+LsLPlB70N9KFjC6osBuF65Vg1Z GuzsglFchlgaEGl7ekC9cEusRrSWLOsoPr7vFe486/nGE8Y3o0OsRoZlZIXHYdBFjBM7 3eHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441087; x=1773045887; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=6jP0wrr/WHTKUeZphGxDZz0G8W/sby2Vn9bBFERnTZc=; b=axM4XvjIqZctQlhJzkmXvR1mNEVMlx3MslUpYNLfRL3MXNDvSiuKqcbUMA9YqYhX0f dYeWtspoE5H3jRtyJ0uyuF3i0uOFMObF0Yf/2CFxBS2P7W/wwH/VIeRPGsm3lfJskdua mqWh6gan/cT9hKDiWQKGvJfloDL6Q6FWVCJUA0WsoXcGNV3KGUAYdac/utyRS+hNzVYa 7pC/D4GlMe90fZ5og+MGkMZFXuSlDUgaaG27aRvp14YAuc7Xd40BPehVHIuuNQDofROM dCa9ICcxiIrCsBr85gA9YPN+pHKdNqnBvOIgvdy5XmNDH+8sfmBK1Gpt7n1RJ9kcVmyH ASmg== X-Gm-Message-State: AOJu0YwvdrY03dK2V+g/yV7nFL0xFvdKiMGDlzoG6vLWAbjfhR0Ivlsb BwRdlbbJW00z9bTI8qBr9WCgOt8EPQHTrFwcB9MIC1SFT0cMSJYVAsmVkotMZmIMWPsp45+/RRA tJ2gIEEkh5bOEweqtXoQvhSMyAFRuD6/ZAEC3203QZmfiApLF59vzRno7K8/8TcOe9aT8rhYe2d bn4zZxJGAlQQTZ6C0VFojhU3ACtqIMEZ3irU//kF1A X-Gm-Gg: ATEYQzyhBQr1qJFsnRZUL2eLr3cRoSSPjCnv7YlqWmhx01KUNAZlW4lAcEG7CmKpXXQ PiDti5aC+BwQ+2GcVIw08kUl0dEKM9D4vK83Sd3IXq+34DllmBet87SH0Iwnn0h1ua5fPlagZVZ XqvAIVCoxsZfesEBJGKP9vPyXRLL63531uFAfUUUY5acg1Ks9mhybFceTV7t1/VOukwXO+2+4Zh k6Ip7ar2nOdrXF+F+9htsp7yobxyYPuW5ytqmrpFt4nVso1F7T1rzkEUXzrBwMWQxWBv4GPaeyQ 2ZoPbWIemroUynrHntVkPxiqhM71bVWTEsrQhqyC9K/KnqPGth6PcJH3Bb27kvZsHn5XbLzj2r0 fz3nPMiFNHtTqzc7B7ZT95m4O5ceWU6NFFM20mEpfJGvBffeGWcRwa9BXNhFJwuToQmcQ+6ynka TdGCTM5SBTN/m8MdbSCWeM1GStQIk= X-Received: by 2002:a05:600c:608a:b0:47e:e2b8:66e6 with SMTP id 5b1f17b1804b1-483c9934dd3mr205544795e9.14.1772441087216; Mon, 02 Mar 2026 00:44:47 -0800 (PST) X-Received: by 2002:a05:600c:608a:b0:47e:e2b8:66e6 with SMTP id 5b1f17b1804b1-483c9934dd3mr205544395e9.14.1772441086704; Mon, 02 Mar 2026 00:44:46 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 025/102] target/i386: emulate: propagate memory errors on most reads/writes Date: Mon, 2 Mar 2026 09:42:20 +0100 Message-ID: <20260302084338.473368-26-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441254138158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Use that to not bump RIP for those cases. Warn on read/write from/to unmapped MMIO, but not consider that as an excep= tion. For reads, return 0xFF(s) as the register value in that case. Leaves a coverage gap for read_val_ext(), to be handled in a later commit. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-25-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_emu.c | 119 +++++++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 31 deletions(-) diff --git a/target/i386/emulate/x86_emu.c b/target/i386/emulate/x86_emu.c index 3aedd638a10..ec6bc798a42 100644 --- a/target/i386/emulate/x86_emu.c +++ b/target/i386/emulate/x86_emu.c @@ -36,11 +36,14 @@ ///////////////////////////////////////////////////////////////////////// =20 #include "qemu/osdep.h" +#include "qemu/error-report.h" #include "panic.h" #include "x86_decode.h" #include "x86.h" #include "x86_emu.h" #include "x86_flags.h" +#include "x86_mmu.h" + =20 #define EXEC_2OP_FLAGS_CMD(env, decode, cmd, FLAGS_FUNC, save_res) \ { \ @@ -175,43 +178,56 @@ void write_val_ext(CPUX86State *env, struct x86_decod= e_op *decode, target_ulong =20 uint8_t *read_mmio(CPUX86State *env, target_ulong ptr, int bytes) { - x86_read_mem(env_cpu(env), env->emu_mmio_buf, ptr, bytes); + MMUTranslateResult res =3D x86_read_mem(env_cpu(env), env->emu_mmio_bu= f, ptr, bytes); + if (res) { + if (res =3D=3D MMU_TRANSLATE_GPA_UNMAPPED) { + memset(env->emu_mmio_buf, 0xFF, bytes); + return env->emu_mmio_buf; + } + return NULL; + } return env->emu_mmio_buf; } =20 =20 -static target_ulong read_val_from_mem(CPUX86State *env, target_long ptr, i= nt size) +static bool read_val_from_mem(CPUX86State *env, target_long ptr, int size,= target_ulong* val) { - target_ulong val; uint8_t *mmio_ptr; =20 mmio_ptr =3D read_mmio(env, ptr, size); + if (mmio_ptr =3D=3D NULL) { + return 1; + } switch (size) { case 1: - val =3D *(uint8_t *)mmio_ptr; + *val =3D *(uint8_t *)mmio_ptr; break; case 2: - val =3D *(uint16_t *)mmio_ptr; + *val =3D *(uint16_t *)mmio_ptr; break; case 4: - val =3D *(uint32_t *)mmio_ptr; + *val =3D *(uint32_t *)mmio_ptr; break; case 8: - val =3D *(uint64_t *)mmio_ptr; + *val =3D *(uint64_t *)mmio_ptr; break; default: VM_PANIC("bad size\n"); break; } - return val; + return 0; } =20 target_ulong read_val_ext(CPUX86State *env, struct x86_decode_op *decode, = int size) { + target_ulong val; if (decode->type =3D=3D X86_VAR_REG) { return read_val_from_reg(decode->regptr, size); } else { - return read_val_from_mem(env, decode->addr, size); + if (read_val_from_mem(env, decode->addr, size, &val)) { + error_report("target/i386/emulate: read_val_ext: reading from = unmapped address."); + } + return val; } } =20 @@ -465,15 +481,17 @@ static inline int get_ZF(CPUX86State *env) { return env->cc_dst ? 0 : CC_Z; } =20 -static inline void string_rep(CPUX86State *env, struct x86_decode *decode, - void (*func)(CPUX86State *env, +static inline bool string_rep(CPUX86State *env, struct x86_decode *decode, + bool (*func)(CPUX86State *env, struct x86_decode *ins), int re= p) { target_ulong rcx =3D read_reg(env, R_ECX, decode->addressing_size); =20 while (rcx !=3D 0) { bool is_cmps_or_scas =3D decode->cmd =3D=3D X86_DECODE_CMD_CMPS ||= decode->cmd =3D=3D X86_DECODE_CMD_SCAS; - func(env, decode); + if (func(env, decode)) { + return 1; + } rcx--; write_reg(env, R_ECX, rcx, decode->addressing_size); if ((PREFIX_REP =3D=3D rep) && !get_ZF(env) && is_cmps_or_scas) { @@ -483,33 +501,44 @@ static inline void string_rep(CPUX86State *env, struc= t x86_decode *decode, break; } } + return 0; } =20 -static void exec_ins_single(CPUX86State *env, struct x86_decode *decode) +static bool exec_ins_single(CPUX86State *env, struct x86_decode *decode) { + MMUTranslateResult res; + target_ulong addr =3D linear_addr_size(env_cpu(env), RDI(env), decode->addressing_size, R_ES); =20 emul_ops->handle_io(env_cpu(env), DX(env), env->emu_mmio_buf, 0, decode->operand_size, 1); - x86_write_mem(env_cpu(env), env->emu_mmio_buf, addr, + res =3D x86_write_mem(env_cpu(env), env->emu_mmio_buf, addr, decode->operand_size); + if (res) { + return 1; + } =20 string_increment_reg(env, R_EDI, decode); + return 0; } =20 static void exec_ins(CPUX86State *env, struct x86_decode *decode) { + bool res; if (decode->rep) { - string_rep(env, decode, exec_ins_single, 0); + res =3D string_rep(env, decode, exec_ins_single, 0); } else { - exec_ins_single(env, decode); + res =3D exec_ins_single(env, decode); } =20 + if (res) { + return; + } env->eip +=3D decode->len; } =20 -static void exec_outs_single(CPUX86State *env, struct x86_decode *decode) +static bool exec_outs_single(CPUX86State *env, struct x86_decode *decode) { target_ulong addr =3D decode_linear_addr(env, decode, RSI(env), R_DS); =20 @@ -519,48 +548,64 @@ static void exec_outs_single(CPUX86State *env, struct= x86_decode *decode) decode->operand_size, 1); =20 string_increment_reg(env, R_ESI, decode); + return 0; } =20 static void exec_outs(CPUX86State *env, struct x86_decode *decode) { + bool res; if (decode->rep) { - string_rep(env, decode, exec_outs_single, 0); + res =3D string_rep(env, decode, exec_outs_single, 0); } else { - exec_outs_single(env, decode); + res =3D exec_outs_single(env, decode); } =20 + if (res) { + return; + } env->eip +=3D decode->len; } =20 -static void exec_movs_single(CPUX86State *env, struct x86_decode *decode) +static bool exec_movs_single(CPUX86State *env, struct x86_decode *decode) { target_ulong src_addr; target_ulong dst_addr; target_ulong val; + MMUTranslateResult res; =20 src_addr =3D decode_linear_addr(env, decode, RSI(env), R_DS); dst_addr =3D linear_addr_size(env_cpu(env), RDI(env), decode->addressing_size, R_ES); =20 - val =3D read_val_from_mem(env, src_addr, decode->operand_size); - x86_write_mem(env_cpu(env), &val, dst_addr, decode->operand_size); + if (read_val_from_mem(env, src_addr, decode->operand_size, &val)) { + return 1; + } + res =3D x86_write_mem(env_cpu(env), &val, dst_addr, decode->operand_si= ze); + if (res) { + return 1; + } =20 string_increment_reg(env, R_ESI, decode); string_increment_reg(env, R_EDI, decode); + return 0; } =20 static void exec_movs(CPUX86State *env, struct x86_decode *decode) { + bool res; if (decode->rep) { - string_rep(env, decode, exec_movs_single, 0); + res =3D string_rep(env, decode, exec_movs_single, 0); } else { - exec_movs_single(env, decode); + res =3D exec_movs_single(env, decode); } =20 + if (res) { + return; + } env->eip +=3D decode->len; } =20 -static void exec_cmps_single(CPUX86State *env, struct x86_decode *decode) +static bool exec_cmps_single(CPUX86State *env, struct x86_decode *decode) { target_ulong src_addr; target_ulong dst_addr; @@ -570,14 +615,19 @@ static void exec_cmps_single(CPUX86State *env, struct= x86_decode *decode) decode->addressing_size, R_ES); =20 decode->op[0].type =3D X86_VAR_IMMEDIATE; - decode->op[0].val =3D read_val_from_mem(env, src_addr, decode->operand= _size); + if (read_val_from_mem(env, src_addr, decode->operand_size, &decode->op= [0].val)) { + return 1; + } decode->op[1].type =3D X86_VAR_IMMEDIATE; - decode->op[1].val =3D read_val_from_mem(env, dst_addr, decode->operand= _size); + if (read_val_from_mem(env, dst_addr, decode->operand_size, &decode->op= [1].val)) { + return 1; + } =20 EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, false); =20 string_increment_reg(env, R_ESI, decode); string_increment_reg(env, R_EDI, decode); + return 0; } =20 static void exec_cmps(CPUX86State *env, struct x86_decode *decode) @@ -591,17 +641,22 @@ static void exec_cmps(CPUX86State *env, struct x86_de= code *decode) } =20 =20 -static void exec_stos_single(CPUX86State *env, struct x86_decode *decode) +static bool exec_stos_single(CPUX86State *env, struct x86_decode *decode) { target_ulong addr; target_ulong val; + MMUTranslateResult res; =20 addr =3D linear_addr_size(env_cpu(env), RDI(env), decode->addressing_size, R_ES); val =3D read_reg(env, R_EAX, decode->operand_size); - x86_write_mem(env_cpu(env), &val, addr, decode->operand_size); + res =3D x86_write_mem(env_cpu(env), &val, addr, decode->operand_size); + if (res) { + return 1; + } =20 string_increment_reg(env, R_EDI, decode); + return 0; } =20 =20 @@ -616,7 +671,7 @@ static void exec_stos(CPUX86State *env, struct x86_deco= de *decode) env->eip +=3D decode->len; } =20 -static void exec_scas_single(CPUX86State *env, struct x86_decode *decode) +static bool exec_scas_single(CPUX86State *env, struct x86_decode *decode) { target_ulong addr; =20 @@ -627,6 +682,7 @@ static void exec_scas_single(CPUX86State *env, struct x= 86_decode *decode) =20 EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, false); string_increment_reg(env, R_EDI, decode); + return 0; } =20 static void exec_scas(CPUX86State *env, struct x86_decode *decode) @@ -642,7 +698,7 @@ static void exec_scas(CPUX86State *env, struct x86_deco= de *decode) env->eip +=3D decode->len; } =20 -static void exec_lods_single(CPUX86State *env, struct x86_decode *decode) +static bool exec_lods_single(CPUX86State *env, struct x86_decode *decode) { target_ulong addr; target_ulong val =3D 0; @@ -652,6 +708,7 @@ static void exec_lods_single(CPUX86State *env, struct x= 86_decode *decode) write_reg(env, R_EAX, val, decode->operand_size); =20 string_increment_reg(env, R_ESI, decode); + return 0; } =20 static void exec_lods(CPUX86State *env, struct x86_decode *decode) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441163; cv=none; d=zohomail.com; s=zohoarc; b=Jo2oKhBo16G/C/HXG7pviLL/yAjJTPQiyNFcxoVcXlKE3HvpV6G3VVSGqHgXfOvU/UzYout8AD2r/4DisAjqMVBixA9h8iZgn+hiLoulbWkg0863DqYxopRw8NII0KtJX5Lz5NoWkXT1Bi5tTgUEQXAHY4bH+Hxe+yI+SKFl9EA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441163; 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=2WdEDDjMaTqiYRF10E9g0Cwhkz1kZFv12Jw8FozsU1M=; b=PqLF0sZybzCu2WKbDsT56B5mDb7K2wsG0zrxFFaNdOXrpKy79wzNrQwryqc9GZadlxExAeHoI0YDbjWltAmMQCi19dy2eJhKPWJ7GdGiK6mhsBeh2n8zveQdFBjX2kz7xCmmeTPazyNPlNodzhW6mUMK1vIlEPmDyr7CqBYBEAQ= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441163524145.23128430269333; Mon, 2 Mar 2026 00:46:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytw-0003jl-SM; Mon, 02 Mar 2026 03:45:16 -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 1vwytc-0002EK-Hq for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:58 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyta-0001cy-19 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:55 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-139-eHDAzD1mM1W-psfUYjozug-1; Mon, 02 Mar 2026 03:44:51 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439af95a718so1175203f8f.2 for ; Mon, 02 Mar 2026 00:44:51 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b503424fsm9214101f8f.22.2026.03.02.00.44.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441093; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2WdEDDjMaTqiYRF10E9g0Cwhkz1kZFv12Jw8FozsU1M=; b=Kor8a+XJq5aMe42ZfWwTQGnRLRpeeE08G70O4sTf+LqHp/3LrfqdnvaE6r6Yt/FG4GGeZD 8M0L42Tx+lgNpnKuJtuvT9Iy11iROyY2o52eY+fCWQpQNWdPZu10uhLrSaf1W/px5aLg/u Dt3zFAvSl8SiU4jHMwXn8MaZZ36Tk+w= X-MC-Unique: eHDAzD1mM1W-psfUYjozug-1 X-Mimecast-MFC-AGG-ID: eHDAzD1mM1W-psfUYjozug_1772441091 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441090; x=1773045890; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2WdEDDjMaTqiYRF10E9g0Cwhkz1kZFv12Jw8FozsU1M=; b=nE5wGhfqPzqa0qdL6mhcAyvH84z19uyhMvhxekrCzOZJnxTBpwwSjNz1kQrIZ5IaF0 3LMhFqt/auaih6LbucXZlq8xtTnuzRR9ATR+YICUW5ApDWJQ6tSoAlulEbW/jJ7oDGWF GXva/0mFehTA1GlqPaABGDcrmE/poNvXdg/Wt8YdLapOwPBXmD/vQJzmw0d4lweLCm94 EmqjoSDATAfCpZzKDhq80jE5LEbDgekebI5YpeEgCkD9OzntFugO0R0RnleImv/OxFYs IzmWyWs2PXakC0sVefJKfuacfDz1NE2GRtI+HL0NVV8xg6m77bB5cRyNTnoQau6R0UXK F9ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441090; x=1773045890; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2WdEDDjMaTqiYRF10E9g0Cwhkz1kZFv12Jw8FozsU1M=; b=Rl0JsL7V2Z/s/e097vWCeRSMihxUliaRbltPQe5LTKjMPDWBxHd3kFM36kiqHKzL69 fHJB8DPrEPlPcX/YTRJUQdV+sDFTgP5Iw3YQy96M331lRbV5CPvJIgMNBjD/GifltNne gcQLE74QPOOjJk4/VrNDUfhsBOqxXMru06qOPVHZbvOzcWmSwi7Ua95+l7/H736lqSB9 EzU/QhXDQ9gk/qwhD/8wRQODaunNFmMadYzVuZXLcTJwKHLEIGU+TZfyRqhDxxKFgEU0 FvhLhK23otkrkACfx9FqQTTfXKEXvN95X/733TdBA3WscrZtozribGE0892mQhVc1OgG siYw== X-Gm-Message-State: AOJu0YyAe7LqWNCuYTajvz/1mh7HaEccvIvKihoapvYMpTIEsiL1cHai Efk5hfWzeBTN/mKGO6ZK2igLzB7pJqeiSZdZsQjeJFJbfF0gBdYamj1uXaZQYHGSETdbHNRbeG7 2E36H7qa/JdG/NxCo/asf7EpTfHD2UpnHO1jHZmwSo5gRnTXtlcnfHTDz4Fp81dwBztxVUanCsq ahUdVwK5VTZWn3TxJNAQrPFI3WtSgoY4HK/9lZrMY+ X-Gm-Gg: ATEYQzzavccJKtSamqViXYveQXSg2nW0RgS43Fl+3zhCspAAVPyE07dH5+HcWpC8A9n VwYchaatfKy/8JmHq8BztkcttAflG4QGh1AwBlRCp16+0sdoNBUn5VqS+0Vc5veivXdft0NKp5q cz1SXOOB/COwCJGJW1IebjKZqFU6az+YOWi5gZlNrXcRyEN1jr7ewcsrQqqWOpOL4pvD1yxKLrO 7CewHvj8VhTdynhNVpJCjNrfqtV6BFydqu3H+BEEIFkmY5s0heplcVCj+3P1TD0Gx2i1nnZBGAy Jn1EYsW7wJzF83K5hTVqA7zJy2ENcv7WZS+rGprTtIA3DNg3tqnBEGNS/DWko/tIENeVeMJk49P 8uv//cuggLHSr4EM6OBAhhJ0QwhpD1J8u5r/gS9ZUEPHOxbPtMI7urbyblL3tTYx1DUMhClpe0t hKh3RiZpSDbO6I5FuyXoEucpBmNDo= X-Received: by 2002:a05:6000:2c04:b0:439:b486:ba5e with SMTP id ffacd0b85a97d-439b486c3c9mr6722781f8f.51.1772441089791; Mon, 02 Mar 2026 00:44:49 -0800 (PST) X-Received: by 2002:a05:6000:2c04:b0:439:b486:ba5e with SMTP id ffacd0b85a97d-439b486c3c9mr6722743f8f.51.1772441089284; Mon, 02 Mar 2026 00:44:49 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 026/102] whpx: i386: inject exceptions Date: Mon, 2 Mar 2026 09:42:21 +0100 Message-ID: <20260302084338.473368-27-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441163745158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-26-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 561a48206ca..0259782a822 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -1506,6 +1506,26 @@ static void whpx_vcpu_process_async_events(CPUState = *cpu) } } =20 +static void whpx_inject_exceptions(CPUState* cpu) +{ + X86CPU *x86_cpu =3D X86_CPU(cpu); + CPUX86State *env =3D &x86_cpu->env; + + if (env->exception_injected) { + env->exception_injected =3D 0; + WHV_REGISTER_VALUE reg =3D {}; + reg.ExceptionEvent.EventPending =3D 1; + reg.ExceptionEvent.EventType =3D WHvX64PendingEventException; + reg.ExceptionEvent.DeliverErrorCode =3D 1; + reg.ExceptionEvent.Vector =3D env->exception_nr; + reg.ExceptionEvent.ErrorCode =3D env->error_code; + if (env->exception_nr =3D=3D EXCP0E_PAGE) { + reg.ExceptionEvent.ExceptionParameter =3D env->cr[2]; + } + whpx_set_reg(cpu, WHvRegisterPendingEvent, reg); + } +} + int whpx_vcpu_run(CPUState *cpu) { HRESULT hr; @@ -1600,6 +1620,8 @@ int whpx_vcpu_run(CPUState *cpu) whpx_vcpu_configure_single_stepping(cpu, true, NULL); } =20 + whpx_inject_exceptions(cpu); + hr =3D whp_dispatch.WHvRunVirtualProcessor( whpx->partition, cpu->cpu_index, &vcpu->exit_ctx, sizeof(vcpu->exit_ctx)); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441130; cv=none; d=zohomail.com; s=zohoarc; b=aHiUmP62VRRLmzqDKlYwCANT5ltv9PEhPPpgsz9NRhQGM2/rOqYNzb9r8lKPbPGSu7GNBtCU3WRk+tUL8RqsAVByUFt2j7aLc17wSN4+vehzd/d5BDCFIDKp4d26N6jzJthZkBrUKzk68pRcjJVVIxdrUfN3Tn4/MAW+03bGIl4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441130; 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=LPDCKeB4WGvMUnywQ5mFOhN5RUcO9TC0SxTRUaIhbWY=; b=MDNFzgKMdMGjIPvGlXvz4gjX5tTfJI4JbCeNEJexXF03rMQbHlb480F480bNRyW01kZArc+iOL1HMxfwCsCyuoNFg2TOKzaOp/9ZEPzTWQ8wF4OcUx4CLLT03FH8fDoIjFTWGotdOin0wMPM0xdoKzs8mh2vixLrMIHwGLwM1mg= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441130870202.62716167858161; Mon, 2 Mar 2026 00:45:30 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyu1-0004El-OV; Mon, 02 Mar 2026 03:45:22 -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 1vwyte-0002Fo-C3 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:00 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytc-0001dF-KJ for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:58 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-676-HLXtWt9NOmiP44oczB1tOg-1; Mon, 02 Mar 2026 03:44:55 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439af95a718so1175230f8f.2 for ; Mon, 02 Mar 2026 00:44:54 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b55df68dsm7264919f8f.26.2026.03.02.00.44.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441096; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LPDCKeB4WGvMUnywQ5mFOhN5RUcO9TC0SxTRUaIhbWY=; b=XPqDbKo7llJlJ2x6KeOzHcwDSi16h3t7Sa/2fyWbrxQ9q4qbsBaBI/DBsXkdRPELeQiNCa I65NLqQPBzy9qjwL1bY+iNK3r3WLJdTKdCsCZ2FfgX1GtxIOJi0BbLBBj3s9pU4W/soKgG E+t1Q3Wzbff3xYJFHc2To5WYnZsD8Ao= X-MC-Unique: HLXtWt9NOmiP44oczB1tOg-1 X-Mimecast-MFC-AGG-ID: HLXtWt9NOmiP44oczB1tOg_1772441094 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441092; x=1773045892; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LPDCKeB4WGvMUnywQ5mFOhN5RUcO9TC0SxTRUaIhbWY=; b=LaH4bXrQYRi1VIpBMV9aXozKRxJboo4ta6Xbrb6zOzJK5N50JJU5U2pQCHEp8gMylu Z3ONjqJtDG2H84uykZs6iKFGkkVYD2ONHzxRyD0rl4nJyjxe0729QEKXWJw5OFK8qzEJ Z0lt9QVobZQnMZ1AcqhqF8LKK8EDPq+5asvfV3nQqg9l5rwtmg8sXlLfsztCts6le0p3 cCwmqMUO5zefkRrRWcIoOXahC4R6qJmk5vPd9rR13S2nDiXCK3KnO/do+LpPIKbsFkaC txdYtXxDptduC91QKldGn9k9i44VlmEXxwXgMSzSvD7aZCvTlJQMjiXtA/k7jmqVuHMu ixQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441092; x=1773045892; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=LPDCKeB4WGvMUnywQ5mFOhN5RUcO9TC0SxTRUaIhbWY=; b=PuS6sIdyF+AvORKDGRnkGYSKcAeLw/59KmhOYmaYQy8EKnt5W3/ZPMsyWRp6rpLWN0 yVC6xk5ICe2SI1hKMJtFafQ+CRszwHNAATmAvI3KcDX/i4lO/zrlLUU/sew4t5UKomzC NRpMkV5QIDn5xOz550+leM+FTbhKSczTaq8xa5U1VEKGW9TndJvpN9IBJLMeHbxjC0Kq ssI7N6rZvHytWQD22K8AFULHDECiha8NOpi2WJ9AtGsJ9Ni3oT5JtQXH6WPnr3hQ5cS0 M9GNN/lfkvW2lFkcrCAxzB86SbHUw/ZZpxcdZ03tbxnSz422eJ8A74kDhp1tlp5yu3HZ Xfmw== X-Gm-Message-State: AOJu0Yy8HLt5B4mZH2EYmGN0jNu7TSK2L60ngCBzMOTwbPwz2wdqAgmM FXlAwPeUzX08asTbXSA/Hmsh8zOvS0GyI8hjGIJ1GVoO12B1QxaRsUpbY1rttveYFmznqr1mvAh q1hLWD4z9H8xSkdd9s9sDkD43kcEwyBzt8gpqR90UPu8pV79zg0lYq2tlnfZtDCtxjxiDnS7Inv FPrseWFXgkihsdTWKCKybgk/MJ9DMSOaL46cR46LMT X-Gm-Gg: ATEYQzyi+w9e82v0z8ECt8E9x07WV9vNG1AdnXCr+d81MF2dVYIe4L/EzWYwpAWtceM dazIDqqNa2kVcagOy+k2I0tXdZvkaW2KDbFTbRrZNwqjsppSrhPg53e7sSG1e3q4e75MtzBUkdi TZazot0r6SJqsbvgr3Ab80JR830scmyCWos7MF8Rd72jqUlkgtwBsGGHGxdWCIaqaP5KgaltV3W BeI6sNk6A6YLl6/+04tZSUY01JW44SgBsTbXwydWGI/L9H+876i/H1iiduVNTsbDzS7a4M1GZTG RHkanp44gG2IyNS30z4x8R6cqHeNRny7BuGUCp0KUn2btDHDfMvVkUZXZdk+NxLAKX1xiTaJeZ/ AFZ/MFmVUzvgbPkRWWcfvObWhYFuUzU8lazerkjTFRY5p5/ymkeht3b9Umlj14VinnmKtoq967k Yb++4RBAKfw5v3gzZsMlDMrEVxKiY= X-Received: by 2002:a05:6000:2285:b0:439:b6bd:558d with SMTP id ffacd0b85a97d-439b6bd561fmr5439150f8f.30.1772441092188; Mon, 02 Mar 2026 00:44:52 -0800 (PST) X-Received: by 2002:a05:6000:2285:b0:439:b6bd:558d with SMTP id ffacd0b85a97d-439b6bd561fmr5439105f8f.30.1772441091691; Mon, 02 Mar 2026 00:44:51 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 027/102] whpx: i386: bump to x2apic Date: Mon, 2 Mar 2026 09:42:22 +0100 Message-ID: <20260302084338.473368-28-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441131585158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-27-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 0259782a822..d98619facee 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -2088,7 +2088,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms) if (whpx->kernel_irqchip_allowed && features.LocalApicEmulation && whp_dispatch.WHvSetVirtualProcessorInterruptControllerState2) { WHV_X64_LOCAL_APIC_EMULATION_MODE mode =3D - WHvX64LocalApicEmulationModeXApic; + WHvX64LocalApicEmulationModeX2Apic; hr =3D whp_dispatch.WHvSetPartitionProperty( whpx->partition, WHvPartitionPropertyCodeLocalApicEmulationMode, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441170; cv=none; d=zohomail.com; s=zohoarc; b=U7eMciIXtZW0D596VKjcNHMZnAgPWl9DhLS/KpqlLb2k8e8zyExe8V4cqPtFAn/px8KRJHQXl5/0P532M6OQwoQLDYDDNNdSECE/Qz+wP4/j1tK2YbQVhvfP3g4vCEhxNTmuCyIhea7Yj+K7KiRsDPBhzxV4wLRxuW896dtTQMY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441170; 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=2UvLV7T/c28934ZMwgd4/IpvmnYLu4+9i+MWfbEHqmc=; b=BK1mjdEzESFJ/y6O7cnBkxnp7cCfAqCCTXIeg7LYBbR20bLyNVzq/Gkgir3lWtafg/rsFToT9VcPtLS4SYzhuLf2qzH7KKFGv6YXMMqi0DZW6mADsEKo9XPQLi4+zWqWir94nIDNtc5OCVk9drCbh6OpSFkgJsdMgNdoHUjBYf0= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441170467801.8696956402653; Mon, 2 Mar 2026 00:46:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytw-0003jX-OT; Mon, 02 Mar 2026 03:45:16 -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 1vwyti-0002PD-Vj for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:03 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytf-0001dj-4y for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:00 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-626-kdTDtD9hMNGRZFIRrycjRw-1; Mon, 02 Mar 2026 03:44:57 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4836bf1a920so44009525e9.3 for ; Mon, 02 Mar 2026 00:44:57 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd70e692sm413520345e9.7.2026.03.02.00.44.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441098; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2UvLV7T/c28934ZMwgd4/IpvmnYLu4+9i+MWfbEHqmc=; b=KniX8n0HF+jVP1jzlQ8N4dCktqSODMeiwPpCbqr8gT5zxFIOd+VtcFd/2X7b776jn0Gkbg /pe50qlrTl1S5yhG0mhj2Ze+KVa2Lx7mUcDkxRCYOLCqr19W+o54Rm8flP8mkTp4SeUKJZ KRMO1E4jZqgv0OrHDeTBSsKk3CNudV8= X-MC-Unique: kdTDtD9hMNGRZFIRrycjRw-1 X-Mimecast-MFC-AGG-ID: kdTDtD9hMNGRZFIRrycjRw_1772441096 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441096; x=1773045896; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2UvLV7T/c28934ZMwgd4/IpvmnYLu4+9i+MWfbEHqmc=; b=VHcMiTxToTOZm+HSqbhJVND6GfoPgdVyLZYkWBXaedHJH2p6fd885214H9uKxKFaIj Lw3mIJj1OXjSE/x+FwRrfWI7U3tjUVkaI3D2aaUZnv8eGi7jXopivktVy3IWqvZiXMaW BfLM1i5j1zRA5Qbyulbb5phewCnQTU8cE4VNyPryEVv+XeKKYYndGeb9Ni/aChFbqlDB VwSMC0HcjkEqNkPDSv9fHvpCOr3woAIvSk4GOur/sFotVMuTbWy+l3hWTGplfmcbCVkI ffxNuIXI1pIHnil64dNm92e21+CpvcNmDFOQ2MMGGyHuGneQXvxiAdYuvJvklFHTzZdm JJkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441096; x=1773045896; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2UvLV7T/c28934ZMwgd4/IpvmnYLu4+9i+MWfbEHqmc=; b=qEbrGTuXwmAo2hbmeGos1acMkbql0Ij7It3iq+ovnGf+AY8kF/lDbhtOi5qczy12K/ phObefDSDR6XCUlSUtSRjm9+dTOWiuoBwfCjEry2t9qdwDUgg9vB3+io/rtyqbfqPWcB bARVl3tIykelCB+fJt/qCyvoA7WbbWOf7bcxyw3LpW+/wEkYXHM6Z29Ny9oj0AO+Asvw /T2330Hmcvmb/YO4a8SVSzzVdtGT9NF24QgwiDpkL95VvXePoxME5qcQi80t1iGu7Wdd /CYkHzJiVZtK2vu1SEUKKYR7fNYkWmcvnBOEYPyatBdCtD2PlKBI7AB8T5X48x6BeaN7 VFWg== X-Gm-Message-State: AOJu0Ywgg4ovZXqS+D5wQCY69AvYnlNFQaz5TQGhv0JsiRantAJ+bSh7 GhgmQGsq1CGJKwz62I8Spgc4vBZCE6GGUiy1Mnkw4512QPsvSgRmxPp8cFhaorpi+4MrxAF2/uE 7ZkrZO80Vd5oDq2QD2njA3msbRi1+8yMD1ujJcdELz5OaQZmyepN7MbYOnIhAvFPvMF0TeabioV 43wW9f7o/cHM+61x+1+Fa2PevFTk3ubwRd3gILfHMU X-Gm-Gg: ATEYQzxyXqaL0t+FxpRDrzYp5mnNvErJciDdnZ6041dtKAqK7QhrIi+gfrtoqhoW7tf X7Zu4KOqYNiN9700SdDtF/b/v2HwC+SH9eWvD4rhWUobr+bzY0rfBVoma0AOkRHhDlAuIpPjO1t uIe3nBCY3VAr9IOel4e8231LrpSMLuab7HlQwZq9fphS77sVI/8d6/qD5xVCWbD1JoN0YZH6uYt 73yP8bJdUxmFkpKG2fmoPwX0I1HAZrdw2SUy54WDq6chr6QlITfJdOxQZLSXEp64umQ5HNlg5Y6 IZdjiweHTsBLJiRUB+1X8kcj5kjzIw9zdWL2itTbsSyr9L4vaXKuB8ufD0ORqJBAJYTXFkNWtDQ O0KfVFr2g4ogwy6Gtbn15OPFO5ERajsFj5q4/GcCbbD/DGNpsmW/jkgeQoL5OXrump1osb7ObOs Z/RUq9wdoTuGcSdOTumuMBrHH8ypY= X-Received: by 2002:a05:600c:5395:b0:483:bcff:7948 with SMTP id 5b1f17b1804b1-483c9b9eaf4mr197679425e9.10.1772441095844; Mon, 02 Mar 2026 00:44:55 -0800 (PST) X-Received: by 2002:a05:600c:5395:b0:483:bcff:7948 with SMTP id 5b1f17b1804b1-483c9b9eaf4mr197678975e9.10.1772441095314; Mon, 02 Mar 2026 00:44:55 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 028/102] whpx: i386: ignore send_msi to interrupt vector 0 Date: Mon, 2 Mar 2026 09:42:23 +0100 Message-ID: <20260302084338.473368-29-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441171737158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-28-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-apic.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/target/i386/whpx/whpx-apic.c b/target/i386/whpx/whpx-apic.c index b934fdcbe19..f26ecaf6e83 100644 --- a/target/i386/whpx/whpx-apic.c +++ b/target/i386/whpx/whpx-apic.c @@ -192,6 +192,11 @@ static void whpx_send_msi(MSIMessage *msg) uint8_t trigger_mode =3D (data >> MSI_DATA_TRIGGER_SHIFT) & 0x1; uint8_t delivery =3D (data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x7; =20 + if (vector =3D=3D 0) { + warn_report("Ignoring request for interrupt vector 0"); + return; + } + WHV_INTERRUPT_CONTROL interrupt =3D { /* Values correspond to delivery modes */ .Type =3D delivery, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441165; cv=none; d=zohomail.com; s=zohoarc; b=FEzZgV2mv9YoC8mrBvtSbTot+nToNW0/QSgpH+b9OTr+w9RRiN+y0B6D6wsJymtK9OZYUTaYc0G1NZHAef2ph0N33y1ougGrC9bW/BJ7D2pUCztEsQu8nsVB3aLzzMNv9/Zu68vr6n0QAs2oUhWJDzG/LWiPQHllVT1d6ZESnqY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441165; 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=a1//taG4v80HV7pxQnwGvKwm3iZy6wZS7mFJbO5AEtw=; b=ffOYXsE9k8g6fMdlpmMsPgzHo4Ftc0DcU094aqd0aH44i39CCMEzsHcF8Sbp++hnMdE6BS1geFTK+kGaeCggyhyPPxiaIIYFO9tArWocN40JUeWgGNZ8tN2Dbi0bQlc/ZnBGzlfaIWeVFCOAsv5rIg9/w8qn9sk+IMILPhPh3vM= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441165767169.76485959076865; Mon, 2 Mar 2026 00:46:05 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyts-0003Gv-IV; Mon, 02 Mar 2026 03:45:12 -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 1vwytm-0002aL-3v for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:07 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyti-0001eD-OX for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:05 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-96-aNMrBUreMnWZEN9E4zwyMg-1; Mon, 02 Mar 2026 03:45:00 -0500 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-439b5346b6cso769440f8f.0 for ; Mon, 02 Mar 2026 00:45:00 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfbb465bsm284181615e9.3.2026.03.02.00.44.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441102; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=a1//taG4v80HV7pxQnwGvKwm3iZy6wZS7mFJbO5AEtw=; b=e69wLZMaw7ttXEqiUOM59zzIRJDTYJzzlEYmMd7fZJ/7l038grsoqIRgA8mqPtwFGZ6XtX PYeemkEpsl46nA15tsKUwrcla3GxIj1kPsPPFJsJ247J6Xkm6WfVX+g47ZnuZZjJmOenjf bD2WVnzzXFoJEzD7F2uJ63j1bCatPJs= X-MC-Unique: aNMrBUreMnWZEN9E4zwyMg-1 X-Mimecast-MFC-AGG-ID: aNMrBUreMnWZEN9E4zwyMg_1772441100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441098; x=1773045898; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=a1//taG4v80HV7pxQnwGvKwm3iZy6wZS7mFJbO5AEtw=; b=lYkZw7H/m2Cz1CHFLKRHTL2pfwsNP4WOpoGdGztv0nDy5DEOFB4nV4+trxtBbYqPA9 mGzOhdd5zuFY16PYmbvOsxhjMqhmHlN+9EKVFOEWhckb45Txq3l7eEZsAYy+GmOjfLgs U9xg9GpJuk5MB/Rj0mUQwvjhZwxFRgo7rohA5iTHF/YE+29zJkr3+4CfJtJeRQ9zc3Af +GGhVb+SJ16zeVXZscupdZAmGn2cJu6ojktWRFtsKwUAngSJh5b4jFJOiXPiFX1p36Ju g+a2n0BLRoXap7O6IZyqDY5zChwhNE1QlHgYKQkWknLKNkaA9uUCT+SIoqbVIp0XtSaT EifA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441098; x=1773045898; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=a1//taG4v80HV7pxQnwGvKwm3iZy6wZS7mFJbO5AEtw=; b=oWqmM6X2d3w59RMa0An6KQxmNllsxsY6Ut8kYd19XcoujulediOigeyrqQ9zP4rAUZ U+v0wKu6a3zhd6kWfr/xsVNxq5NIk5Ap1qSGAd275Ufnoq1gyxlEEiSv8c/TNGmDNiLJ fZg4Dxi3gnBHtPFNiePwfEJHPZ2NbDRbswGkchvXQb1UFwjVJmht2CcvL59DMEXYGO3W dba7D0uf20hdwvSzpqT5nZqjIRd5cjuLrKbmB9PSN15zbs7TvaZRxLKA7WS2Csxc56TN NcAPMcfGDYO3g1s7hZW3t+QBbDxvkfXQAm5h1zXFht8+Vr7kWyYy6p220VaXDbGNY+Mm hhUQ== X-Gm-Message-State: AOJu0Yy1NLOhVMcNE41Uhb7XhqCz7Iz7L7B7oDEAanrJkLtkJ0RxTpHi WYQvw2og29L8713tagMf7Immihkca7+nPWsOqFYr8eT32fu6IGsm5pOk6VF8bMqVwj6QgXrpaqA SdboFlUZB16hExcc206MlMjH/k8u1poRgbYDpqt8qswKOG8KnlvR+47gBa9HfVXTNX0PGOIWV+b 7HZ2gqAcZoZC43jE5iJKZh47GEk9wsuL+dCPvtgyTg X-Gm-Gg: ATEYQzzrThyIUN6yyZLbmoh4uKsDcYRZzkEVFXT7G+Wk0aJe/h5VDBmKjrWadizZhdu 7zVHnohj1XM2sn0zT1xHfL1+wYFg88GvveQYVQ++t/7OZKn5Fc3SfJlDO19N0PRqfju03Tys62k OgFoVI8XN3Au1oZluATuOwyReKDsgCTsuHgkPDzw2E/htgPTXf6kJbldet2qyhR2qpJzMccu6SE oRwv9VI4GpPsDNvSCX2zkvf0QaKd8K8T78NJ/HZqf6vMUAOG32VIuq+nJHeObYPAAb3jcFhgnf6 RLdTEbBUtkVKcAXA52Fvm4nNPOmg31AEuSXhJq4L672YTq7zWTzEJYE4mLAVIjDVlK+HkrCcsYq OwPHfst5H092PK76K4Dhc2uYCwnqgpczBhE5ocj0y588IlIS/H/PhMYk7ZdfCdyVBnQN9e2pfn3 64cCDRS5MBvuqZKI+tZxrfA2nTfPA= X-Received: by 2002:a05:600c:81c9:b0:483:7783:5363 with SMTP id 5b1f17b1804b1-483c9bfa6bdmr172976225e9.26.1772441098140; Mon, 02 Mar 2026 00:44:58 -0800 (PST) X-Received: by 2002:a05:600c:81c9:b0:483:7783:5363 with SMTP id 5b1f17b1804b1-483c9bfa6bdmr172975785e9.26.1772441097503; Mon, 02 Mar 2026 00:44:57 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni Subject: [PULL 029/102] target/i386: emulate: propagate errors all the way and stop early Date: Mon, 2 Mar 2026 09:42:24 +0100 Message-ID: <20260302084338.473368-30-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441167724158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni This ended up being a bigger patch than I thought it'd be... Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260223233950.96076-29-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_emu.h | 18 +-- target/i386/emulate/x86_emu.c | 227 ++++++++++++++++++++++------------ 2 files changed, 160 insertions(+), 85 deletions(-) diff --git a/target/i386/emulate/x86_emu.h b/target/i386/emulate/x86_emu.h index 6b691118221..0f284b0c3d1 100644 --- a/target/i386/emulate/x86_emu.h +++ b/target/i386/emulate/x86_emu.h @@ -44,15 +44,15 @@ target_ulong read_reg(CPUX86State *env, int reg, int si= ze); void write_reg(CPUX86State *env, int reg, target_ulong val, int size); target_ulong read_val_from_reg(void *reg_ptr, int size); void write_val_to_reg(void *reg_ptr, target_ulong val, int size); -void write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_= ulong val, int size); +bool write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_= ulong val, int size); uint8_t *read_mmio(CPUX86State *env, target_ulong ptr, int bytes); -target_ulong read_val_ext(CPUX86State *env, struct x86_decode_op *decode, = int size); +bool read_val_ext(CPUX86State *env, struct x86_decode_op *decode, int size= , target_ulong* val); =20 -void exec_movzx(CPUX86State *env, struct x86_decode *decode); -void exec_shl(CPUX86State *env, struct x86_decode *decode); -void exec_movsx(CPUX86State *env, struct x86_decode *decode); -void exec_ror(CPUX86State *env, struct x86_decode *decode); -void exec_rol(CPUX86State *env, struct x86_decode *decode); -void exec_rcl(CPUX86State *env, struct x86_decode *decode); -void exec_rcr(CPUX86State *env, struct x86_decode *decode); +bool exec_movzx(CPUX86State *env, struct x86_decode *decode); +bool exec_shl(CPUX86State *env, struct x86_decode *decode); +bool exec_movsx(CPUX86State *env, struct x86_decode *decode); +bool exec_ror(CPUX86State *env, struct x86_decode *decode); +bool exec_rol(CPUX86State *env, struct x86_decode *decode); +bool exec_rcl(CPUX86State *env, struct x86_decode *decode); +bool exec_rcr(CPUX86State *env, struct x86_decode *decode); #endif diff --git a/target/i386/emulate/x86_emu.c b/target/i386/emulate/x86_emu.c index ec6bc798a42..8d35f3338c1 100644 --- a/target/i386/emulate/x86_emu.c +++ b/target/i386/emulate/x86_emu.c @@ -47,7 +47,9 @@ =20 #define EXEC_2OP_FLAGS_CMD(env, decode, cmd, FLAGS_FUNC, save_res) \ { \ - fetch_operands(env, decode, 2, true, true, false); \ + if (fetch_operands(env, decode, 2, true, true, false)) {\ + return 1; \ + }\ switch (decode->operand_size) { \ case 1: \ { \ @@ -55,7 +57,7 @@ uint8_t v2 =3D (uint8_t)decode->op[1].val; \ uint8_t diff =3D v1 cmd v2; \ if (save_res) { \ - write_val_ext(env, &decode->op[0], diff, 1); \ + if (write_val_ext(env, &decode->op[0], diff, 1)) { return 1; }= \ } \ FLAGS_FUNC##8(env, v1, v2, diff); \ break; \ @@ -66,7 +68,7 @@ uint16_t v2 =3D (uint16_t)decode->op[1].val; \ uint16_t diff =3D v1 cmd v2; \ if (save_res) { \ - write_val_ext(env, &decode->op[0], diff, 2); \ + if (write_val_ext(env, &decode->op[0], diff, 2)) { return 1; }= \ } \ FLAGS_FUNC##16(env, v1, v2, diff); \ break; \ @@ -77,7 +79,7 @@ uint32_t v2 =3D (uint32_t)decode->op[1].val; \ uint32_t diff =3D v1 cmd v2; \ if (save_res) { \ - write_val_ext(env, &decode->op[0], diff, 4); \ + if (write_val_ext(env, &decode->op[0], diff, 4)) { return 1; }= \ } \ FLAGS_FUNC##32(env, v1, v2, diff); \ break; \ @@ -167,13 +169,20 @@ void write_val_to_reg(void *reg_ptr, target_ulong val= , int size) } } =20 -void write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_= ulong val, int size) +bool write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_= ulong val, int size) { if (decode->type =3D=3D X86_VAR_REG) { write_val_to_reg(decode->regptr, val, size); } else { - x86_write_mem(env_cpu(env), &val, decode->addr, size); + MMUTranslateResult res =3D x86_write_mem(env_cpu(env), &val, decod= e->addr, size); + if (res) { + if (res =3D=3D MMU_TRANSLATE_GPA_UNMAPPED) { + return 0; + } + return 1; + } } + return 0; } =20 uint8_t *read_mmio(CPUX86State *env, target_ulong ptr, int bytes) @@ -218,20 +227,19 @@ static bool read_val_from_mem(CPUX86State *env, targe= t_long ptr, int size, targe return 0; } =20 -target_ulong read_val_ext(CPUX86State *env, struct x86_decode_op *decode, = int size) +bool read_val_ext(CPUX86State *env, struct x86_decode_op *decode, int size= , target_ulong* val) { - target_ulong val; if (decode->type =3D=3D X86_VAR_REG) { - return read_val_from_reg(decode->regptr, size); + *val =3D read_val_from_reg(decode->regptr, size); } else { - if (read_val_from_mem(env, decode->addr, size, &val)) { - error_report("target/i386/emulate: read_val_ext: reading from = unmapped address."); + if (read_val_from_mem(env, decode->addr, size, val)) { + return 1; } - return val; } + return 0; } =20 -static void fetch_operands(CPUX86State *env, struct x86_decode *decode, +static bool fetch_operands(CPUX86State *env, struct x86_decode *decode, int n, bool val_op0, bool val_op1, bool val_op2) { int i; @@ -251,8 +259,10 @@ static void fetch_operands(CPUX86State *env, struct x8= 6_decode *decode, case X86_VAR_RM: calc_modrm_operand(env, decode, &decode->op[i]); if (calc_val[i]) { - decode->op[i].val =3D read_val_ext(env, &decode->op[i], - decode->operand_size); + if (read_val_ext(env, &decode->op[i],decode->operand_size, + &decode->op[i]= .val)) { + return 1; + } } break; case X86_VAR_OFFSET: @@ -260,68 +270,81 @@ static void fetch_operands(CPUX86State *env, struct x= 86_decode *decode, decode->op[i].addr, R_DS); if (calc_val[i]) { - decode->op[i].val =3D read_val_ext(env, &decode->op[i], - decode->operand_size); + if (read_val_ext(env, &decode->op[i], decode->operand_size, + &decode->op[i].val)) { + return 1; + } } break; default: break; } } + return 0; } =20 -static void exec_mov(CPUX86State *env, struct x86_decode *decode) +static bool exec_mov(CPUX86State *env, struct x86_decode *decode) { fetch_operands(env, decode, 2, false, true, false); - write_val_ext(env, &decode->op[0], decode->op[1].val, - decode->operand_size); + if (write_val_ext(env, &decode->op[0], decode->op[1].val, + decode->operand_size)) { + return 1; + } =20 env->eip +=3D decode->len; + return 0; } =20 -static void exec_add(CPUX86State *env, struct x86_decode *decode) +static bool exec_add(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, +, SET_FLAGS_OSZAPC_ADD, true); env->eip +=3D decode->len; + return 0; } =20 -static void exec_or(CPUX86State *env, struct x86_decode *decode) +static bool exec_or(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, |, SET_FLAGS_OSZAPC_LOGIC, true); env->eip +=3D decode->len; + return 0; } =20 -static void exec_adc(CPUX86State *env, struct x86_decode *decode) +static bool exec_adc(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, +get_CF(env)+, SET_FLAGS_OSZAPC_ADD, t= rue); env->eip +=3D decode->len; + return 0; } =20 -static void exec_sbb(CPUX86State *env, struct x86_decode *decode) +static bool exec_sbb(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, -get_CF(env)-, SET_FLAGS_OSZAPC_SUB, t= rue); env->eip +=3D decode->len; + return 0; } =20 -static void exec_and(CPUX86State *env, struct x86_decode *decode) +static bool exec_and(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, &, SET_FLAGS_OSZAPC_LOGIC, true); env->eip +=3D decode->len; + return 0; } =20 -static void exec_sub(CPUX86State *env, struct x86_decode *decode) +static bool exec_sub(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, true); env->eip +=3D decode->len; + return 0; } =20 -static void exec_xor(CPUX86State *env, struct x86_decode *decode) +static bool exec_xor(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, ^, SET_FLAGS_OSZAPC_LOGIC, true); env->eip +=3D decode->len; + return 0; } =20 -static void exec_neg(CPUX86State *env, struct x86_decode *decode) +static bool exec_neg(CPUX86State *env, struct x86_decode *decode) { /*EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, false);*/ int32_t val; @@ -342,15 +365,17 @@ static void exec_neg(CPUX86State *env, struct x86_dec= ode *decode) =20 /*lflags_to_rflags(env);*/ env->eip +=3D decode->len; + return 0; } =20 -static void exec_cmp(CPUX86State *env, struct x86_decode *decode) +static bool exec_cmp(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, false); env->eip +=3D decode->len; + return 0; } =20 -static void exec_inc(CPUX86State *env, struct x86_decode *decode) +static bool exec_inc(CPUX86State *env, struct x86_decode *decode) { decode->op[1].type =3D X86_VAR_IMMEDIATE; decode->op[1].val =3D 0; @@ -358,33 +383,37 @@ static void exec_inc(CPUX86State *env, struct x86_dec= ode *decode) EXEC_2OP_FLAGS_CMD(env, decode, +1+, SET_FLAGS_OSZAP_ADD, true); =20 env->eip +=3D decode->len; + return 0; } =20 -static void exec_dec(CPUX86State *env, struct x86_decode *decode) +static bool exec_dec(CPUX86State *env, struct x86_decode *decode) { decode->op[1].type =3D X86_VAR_IMMEDIATE; decode->op[1].val =3D 0; =20 EXEC_2OP_FLAGS_CMD(env, decode, -1-, SET_FLAGS_OSZAP_SUB, true); env->eip +=3D decode->len; + return 0; } =20 -static void exec_tst(CPUX86State *env, struct x86_decode *decode) +static bool exec_tst(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, &, SET_FLAGS_OSZAPC_LOGIC, false); env->eip +=3D decode->len; + return 0; } =20 -static void exec_not(CPUX86State *env, struct x86_decode *decode) +static bool exec_not(CPUX86State *env, struct x86_decode *decode) { fetch_operands(env, decode, 1, true, false, false); =20 write_val_ext(env, &decode->op[0], ~decode->op[0].val, decode->operand_size); env->eip +=3D decode->len; + return 0; } =20 -void exec_movzx(CPUX86State *env, struct x86_decode *decode) +bool exec_movzx(CPUX86State *env, struct x86_decode *decode) { int src_op_size; int op_size =3D decode->operand_size; @@ -398,13 +427,16 @@ void exec_movzx(CPUX86State *env, struct x86_decode *= decode) } decode->operand_size =3D src_op_size; calc_modrm_operand(env, decode, &decode->op[1]); - decode->op[1].val =3D read_val_ext(env, &decode->op[1], src_op_size); + if (read_val_ext(env, &decode->op[1], src_op_size, &decode->op[1].val)= ) { + return 1; + } write_val_ext(env, &decode->op[0], decode->op[1].val, op_size); =20 env->eip +=3D decode->len; + return 0; } =20 -static void exec_out(CPUX86State *env, struct x86_decode *decode) +static bool exec_out(CPUX86State *env, struct x86_decode *decode) { switch (decode->opcode[0]) { case 0xe6: @@ -426,9 +458,10 @@ static void exec_out(CPUX86State *env, struct x86_deco= de *decode) break; } env->eip +=3D decode->len; + return 0; } =20 -static void exec_in(CPUX86State *env, struct x86_decode *decode) +static bool exec_in(CPUX86State *env, struct x86_decode *decode) { target_ulong val =3D 0; switch (decode->opcode[0]) { @@ -463,6 +496,7 @@ static void exec_in(CPUX86State *env, struct x86_decode= *decode) } =20 env->eip +=3D decode->len; + return 0; } =20 static inline void string_increment_reg(CPUX86State *env, int reg, @@ -523,7 +557,7 @@ static bool exec_ins_single(CPUX86State *env, struct x8= 6_decode *decode) return 0; } =20 -static void exec_ins(CPUX86State *env, struct x86_decode *decode) +static bool exec_ins(CPUX86State *env, struct x86_decode *decode) { bool res; if (decode->rep) { @@ -533,9 +567,10 @@ static void exec_ins(CPUX86State *env, struct x86_deco= de *decode) } =20 if (res) { - return; + return 1; } env->eip +=3D decode->len; + return 0; } =20 static bool exec_outs_single(CPUX86State *env, struct x86_decode *decode) @@ -551,7 +586,7 @@ static bool exec_outs_single(CPUX86State *env, struct x= 86_decode *decode) return 0; } =20 -static void exec_outs(CPUX86State *env, struct x86_decode *decode) +static bool exec_outs(CPUX86State *env, struct x86_decode *decode) { bool res; if (decode->rep) { @@ -561,9 +596,10 @@ static void exec_outs(CPUX86State *env, struct x86_dec= ode *decode) } =20 if (res) { - return; + return 1; } env->eip +=3D decode->len; + return 0; } =20 static bool exec_movs_single(CPUX86State *env, struct x86_decode *decode) @@ -590,7 +626,7 @@ static bool exec_movs_single(CPUX86State *env, struct x= 86_decode *decode) return 0; } =20 -static void exec_movs(CPUX86State *env, struct x86_decode *decode) +static bool exec_movs(CPUX86State *env, struct x86_decode *decode) { bool res; if (decode->rep) { @@ -600,9 +636,10 @@ static void exec_movs(CPUX86State *env, struct x86_dec= ode *decode) } =20 if (res) { - return; + return 1; } env->eip +=3D decode->len; + return 0; } =20 static bool exec_cmps_single(CPUX86State *env, struct x86_decode *decode) @@ -630,7 +667,7 @@ static bool exec_cmps_single(CPUX86State *env, struct x= 86_decode *decode) return 0; } =20 -static void exec_cmps(CPUX86State *env, struct x86_decode *decode) +static bool exec_cmps(CPUX86State *env, struct x86_decode *decode) { if (decode->rep) { string_rep(env, decode, exec_cmps_single, decode->rep); @@ -638,6 +675,7 @@ static void exec_cmps(CPUX86State *env, struct x86_deco= de *decode) exec_cmps_single(env, decode); } env->eip +=3D decode->len; + return 0; } =20 =20 @@ -660,7 +698,7 @@ static bool exec_stos_single(CPUX86State *env, struct x= 86_decode *decode) } =20 =20 -static void exec_stos(CPUX86State *env, struct x86_decode *decode) +static bool exec_stos(CPUX86State *env, struct x86_decode *decode) { if (decode->rep) { string_rep(env, decode, exec_stos_single, 0); @@ -669,6 +707,7 @@ static void exec_stos(CPUX86State *env, struct x86_deco= de *decode) } =20 env->eip +=3D decode->len; + return 0; } =20 static bool exec_scas_single(CPUX86State *env, struct x86_decode *decode) @@ -685,7 +724,7 @@ static bool exec_scas_single(CPUX86State *env, struct x= 86_decode *decode) return 0; } =20 -static void exec_scas(CPUX86State *env, struct x86_decode *decode) +static bool exec_scas(CPUX86State *env, struct x86_decode *decode) { decode->op[0].type =3D X86_VAR_REG; decode->op[0].reg =3D R_EAX; @@ -696,6 +735,7 @@ static void exec_scas(CPUX86State *env, struct x86_deco= de *decode) } =20 env->eip +=3D decode->len; + return 0; } =20 static bool exec_lods_single(CPUX86State *env, struct x86_decode *decode) @@ -711,7 +751,7 @@ static bool exec_lods_single(CPUX86State *env, struct x= 86_decode *decode) return 0; } =20 -static void exec_lods(CPUX86State *env, struct x86_decode *decode) +static bool exec_lods(CPUX86State *env, struct x86_decode *decode) { if (decode->rep) { string_rep(env, decode, exec_lods_single, 0); @@ -720,6 +760,7 @@ static void exec_lods(CPUX86State *env, struct x86_deco= de *decode) } =20 env->eip +=3D decode->len; + return 0; } =20 void x86_emul_raise_exception(CPUX86State *env, int exception_index, int e= rror_code) @@ -730,23 +771,25 @@ void x86_emul_raise_exception(CPUX86State *env, int e= xception_index, int error_c env->exception_injected =3D 1; } =20 -static void exec_rdmsr(CPUX86State *env, struct x86_decode *decode) +static bool exec_rdmsr(CPUX86State *env, struct x86_decode *decode) { emul_ops->simulate_rdmsr(env_cpu(env)); env->eip +=3D decode->len; + return 0; } =20 -static void exec_wrmsr(CPUX86State *env, struct x86_decode *decode) +static bool exec_wrmsr(CPUX86State *env, struct x86_decode *decode) { emul_ops->simulate_wrmsr(env_cpu(env)); env->eip +=3D decode->len; + return 0; } =20 /* * flag: * 0 - bt, 1 - btc, 2 - bts, 3 - btr */ -static void do_bt(CPUX86State *env, struct x86_decode *decode, int flag) +static bool do_bt(CPUX86State *env, struct x86_decode *decode, int flag) { int32_t displacement; uint8_t index; @@ -755,7 +798,9 @@ static void do_bt(CPUX86State *env, struct x86_decode *= decode, int flag) =20 VM_PANIC_ON(decode->rex.rex); =20 - fetch_operands(env, decode, 2, false, true, false); + if (fetch_operands(env, decode, 2, false, true, false)) { + return 1; + } index =3D decode->op[1].val & mask; =20 if (decode->op[0].type !=3D X86_VAR_REG) { @@ -769,14 +814,16 @@ static void do_bt(CPUX86State *env, struct x86_decode= *decode, int flag) VM_PANIC("bt 64bit\n"); } } - decode->op[0].val =3D read_val_ext(env, &decode->op[0], - decode->operand_size); + if (read_val_ext(env, &decode->op[0], + decode->operand_size, &decode->op[0].= val)) { + return 1; + } cf =3D (decode->op[0].val >> index) & 0x01; =20 switch (flag) { case 0: set_CF(env, cf); - return; + return 0; case 1: decode->op[0].val ^=3D (1u << index); break; @@ -787,41 +834,58 @@ static void do_bt(CPUX86State *env, struct x86_decode= *decode, int flag) decode->op[0].val &=3D ~(1u << index); break; } - write_val_ext(env, &decode->op[0], decode->op[0].val, - decode->operand_size); + if (write_val_ext(env, &decode->op[0], decode->op[0].val, + decode->operand_size)) { + return 1; + } set_CF(env, cf); + return 0; } =20 -static void exec_bt(CPUX86State *env, struct x86_decode *decode) +static bool exec_bt(CPUX86State *env, struct x86_decode *decode) { - do_bt(env, decode, 0); + if (do_bt(env, decode, 0)) { + return 1; + } env->eip +=3D decode->len; + return 0; } =20 -static void exec_btc(CPUX86State *env, struct x86_decode *decode) +static bool exec_btc(CPUX86State *env, struct x86_decode *decode) { - do_bt(env, decode, 1); + if (do_bt(env, decode, 1)) { + return 1; + } env->eip +=3D decode->len; + return 0; } =20 -static void exec_btr(CPUX86State *env, struct x86_decode *decode) +static bool exec_btr(CPUX86State *env, struct x86_decode *decode) { - do_bt(env, decode, 3); + if (do_bt(env, decode, 3)) { + return 1; + } env->eip +=3D decode->len; + return 0; } =20 -static void exec_bts(CPUX86State *env, struct x86_decode *decode) +static bool exec_bts(CPUX86State *env, struct x86_decode *decode) { - do_bt(env, decode, 2); + if (do_bt(env, decode, 2)) { + return 1; + } env->eip +=3D decode->len; + return 0; } =20 -void exec_shl(CPUX86State *env, struct x86_decode *decode) +bool exec_shl(CPUX86State *env, struct x86_decode *decode) { uint8_t count; int of =3D 0, cf =3D 0; =20 - fetch_operands(env, decode, 2, true, true, false); + if (fetch_operands(env, decode, 2, true, true, false)) { + return 1; + } =20 count =3D decode->op[1].val; count &=3D 0x1f; /* count is masked to 5 bits*/ @@ -878,12 +942,14 @@ void exec_shl(CPUX86State *env, struct x86_decode *de= code) exit: /* lflags_to_rflags(env); */ env->eip +=3D decode->len; + return 0; } =20 -void exec_movsx(CPUX86State *env, struct x86_decode *decode) +bool exec_movsx(CPUX86State *env, struct x86_decode *decode) { int src_op_size; int op_size =3D decode->operand_size; + target_ulong val; =20 fetch_operands(env, decode, 2, false, false, false); =20 @@ -895,15 +961,18 @@ void exec_movsx(CPUX86State *env, struct x86_decode *= decode) =20 decode->operand_size =3D src_op_size; calc_modrm_operand(env, decode, &decode->op[1]); - decode->op[1].val =3D sign(read_val_ext(env, &decode->op[1], src_op_si= ze), - src_op_size); + if (read_val_ext(env, &decode->op[1], src_op_size, &val)) { + return 1; + } + decode->op[1].val =3D sign(val, src_op_size); =20 write_val_ext(env, &decode->op[0], decode->op[1].val, op_size); =20 env->eip +=3D decode->len; + return 0; } =20 -void exec_ror(CPUX86State *env, struct x86_decode *decode) +bool exec_ror(CPUX86State *env, struct x86_decode *decode) { uint8_t count; =20 @@ -979,9 +1048,10 @@ void exec_ror(CPUX86State *env, struct x86_decode *de= code) } } env->eip +=3D decode->len; + return 0; } =20 -void exec_rol(CPUX86State *env, struct x86_decode *decode) +bool exec_rol(CPUX86State *env, struct x86_decode *decode) { uint8_t count; =20 @@ -1060,10 +1130,11 @@ void exec_rol(CPUX86State *env, struct x86_decode *= decode) } } env->eip +=3D decode->len; + return 0; } =20 =20 -void exec_rcl(CPUX86State *env, struct x86_decode *decode) +bool exec_rcl(CPUX86State *env, struct x86_decode *decode) { uint8_t count; int of =3D 0, cf =3D 0; @@ -1146,9 +1217,10 @@ void exec_rcl(CPUX86State *env, struct x86_decode *d= ecode) } } env->eip +=3D decode->len; + return 0; } =20 -void exec_rcr(CPUX86State *env, struct x86_decode *decode) +bool exec_rcr(CPUX86State *env, struct x86_decode *decode) { uint8_t count; int of =3D 0, cf =3D 0; @@ -1221,9 +1293,10 @@ void exec_rcr(CPUX86State *env, struct x86_decode *d= ecode) } } env->eip +=3D decode->len; + return 0; } =20 -static void exec_xchg(CPUX86State *env, struct x86_decode *decode) +static bool exec_xchg(CPUX86State *env, struct x86_decode *decode) { fetch_operands(env, decode, 2, true, true, false); =20 @@ -1233,20 +1306,22 @@ static void exec_xchg(CPUX86State *env, struct x86_= decode *decode) decode->operand_size); =20 env->eip +=3D decode->len; + return 0; } =20 -static void exec_xadd(CPUX86State *env, struct x86_decode *decode) +static bool exec_xadd(CPUX86State *env, struct x86_decode *decode) { EXEC_2OP_FLAGS_CMD(env, decode, +, SET_FLAGS_OSZAPC_ADD, true); write_val_ext(env, &decode->op[1], decode->op[0].val, decode->operand_size); =20 env->eip +=3D decode->len; + return 0; } =20 static struct cmd_handler { enum x86_decode_cmd cmd; - void (*handler)(CPUX86State *env, struct x86_decode *ins); + bool (*handler)(CPUX86State *env, struct x86_decode *ins); } handlers[] =3D { {X86_DECODE_CMD_INVL, NULL,}, {X86_DECODE_CMD_MOV, exec_mov}, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441263; cv=none; d=zohomail.com; s=zohoarc; b=nq+8F7fzD0HWqpu8OaIrfmCeMzNEuTz0/cEe7V9e8BBVDgye4iW/m50lSMX2FUFxTfZ7/nVr7cjhaVBsP6plPouzEVblLSbLSD753U5sFELhCWYY+ANF7HkwUGs6LAwwXV6nUb42fEOgV/jXwEAozQ3vPU+LP396Fa1AHMzPMVQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441263; 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=l2dC2Q9dMZO9bqztuxoBOcOQF8vWCnFvS3RUEwDP/Tg=; b=VV01rkkXVMmENwqgM0MnzDo7l0W29gh22zMg2tOGntDJ5FmKl/Q4magv2HoZuJg1516BSDTzKV3v4yFFuR4JJAVQDAqWUioH9cJMPhSITkEvBM1t/nQ9UhEeOKIxkHvX0HMuVPqmzwdlLoa8KkPgFY1beuLnm75MPJD/rI8IqOM= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441263473998.8924729825362; Mon, 2 Mar 2026 00:47:43 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytq-00033G-RY; Mon, 02 Mar 2026 03:45:10 -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 1vwytl-0002YX-Nm for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:05 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytj-0001eW-F7 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:04 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-88-pAE28c6lMzWPYib927uyMg-1; Mon, 02 Mar 2026 03:45:01 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4837b6f6b93so29833065e9.3 for ; Mon, 02 Mar 2026 00:45:01 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd6f26d7sm409057105e9.3.2026.03.02.00.44.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441102; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=l2dC2Q9dMZO9bqztuxoBOcOQF8vWCnFvS3RUEwDP/Tg=; b=L9GTC7Q8yJbkMCLOwBrXRSO5h6Qw/OX/e/DFZMvZhTUIzRo5kbsrq0kTg1c4U3c2K92RHb hzhoNuN/kPIlWI80g4GkqDKMpDpov5nl4HR08QOiTfTb3Y2HsGlJjWzVOLLM/xW0Ua9bfy htmamdVeAfE6PeqcZSj7m8IGaZZLX2Q= X-MC-Unique: pAE28c6lMzWPYib927uyMg-1 X-Mimecast-MFC-AGG-ID: pAE28c6lMzWPYib927uyMg_1772441101 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441099; x=1773045899; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=l2dC2Q9dMZO9bqztuxoBOcOQF8vWCnFvS3RUEwDP/Tg=; b=IhTcGJHfQQHx2PSV3diHrCadEEWNIDPLOEJb/dZOhth+0vqzqdc3wA1F58GH/NgcD0 tRRKg1VugscYuJWtSRD8Gvxu/wPK1Yd/M34xlRG0Bd3pWsLG2aykL2ip3+NK2QWEF4tc U+zsjQbvkkGPMfwQEg942A5lnTjWL9gNr0N/+wZbXaX4YGFt7LwEol98oIDkq1s2TvZs qeYJbd9U5I9VDrAG1tm0JC0KHDpXbeyabH3X4btUChLW9waAHVF1sfp2sjoZ4XuUkGoZ nQvZFU2gl6gAJiaaEIrTDEcWRDuIGOXpvCSLNEtPUCnYBK6YojDfUujg1s8j0TOUDZcA lPog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441099; x=1773045899; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=l2dC2Q9dMZO9bqztuxoBOcOQF8vWCnFvS3RUEwDP/Tg=; b=uuf/P/ZCVzFsFdhP+O1nlAojy3TFmv1V/S/DDMuGEOvwVGoCJteaJkUwqxtYA2VVr1 /TfB4rK6SjWyxM69iFQ/XdTHrQZkATJJDM22uXcg28dA576SFaMBgdu05OUCICL6vQaL QbTcuaQxi9rPINrjfTx9sljJ6vapxfvuuCalBNmiHLIcC2AjhfZ3xtkUFLajP1TJaoiO nOFq1p4e9t2DXen6c3zi1tB88FiLEBVW3dwN8PXgVvJt6nz6wH37UmIELy0hhY326V5r exhTM5fifGhwJrr0GZUUAM+8yDUVdiTl4Tn3PQWSNOukSTPJ8c2LXSQcED2EV6VB8upb JfPQ== X-Gm-Message-State: AOJu0YynZNZHZvGw4+JIl9kJNRZeWjnEaBvmXb4u5ntrCShaU9/ZAqDF +5WgfRW9mTc09m5aGCmY2/4v5eAS/XVrlAXLM61eL+njv4Qj1TfOh5ON6UrKf7QcDoOKJgjEDx7 e4WLKP9K9unU9W1LC7YrPKw2Dqf87z/4wJ0dLTyHEuuiQJYLc03MvjCHoB23YIynFjBv5MpuK2p C6xH8vUzNp5IcH1P0+AMNf0ZXyI8Zta6nW9JM+WVeE X-Gm-Gg: ATEYQzw8Ga5KVaIJw6eUewWffMjzIhwFPTOQojcHh1CNHkwbnMukygq0tpR7ZT8JyMm MLCsgZi727za/vtJmg9iEMsrqMgBdTXgnDqpeYVGOyNDSAaSY9IHfjuINK8qSLvPSk3iWYy54tN 57/thufTQJlC4nmfjQz/M5sq3AG5gwC5DFxVHdta7gX7AAFnDf7qKIFezF0pn2BAAfijoBnJsTh Z3YhGHoVWAl/HmrGXjXn3ep+yIhMAg+bAZBZnx5/OKTBOtUjfzpQGWvikQuCiyc4dq8Jlh33ku/ w3PwTT/0i3yMdGjq6Ika8UFeQN4z5PmkAISMu2hZPEWC/lggtYlW2eYA4Z48kgyAH0eNZC3LEbg HA3frp0XnCFpDitJ+QdE6ISt1lJICG4wTUsWSpktDu8od8nuGsiMycy7I+l4DpwqR52lXu78kzv 4qh31hTCmbdBKFGzsdiMW6S1MgbO8= X-Received: by 2002:a05:600c:6385:b0:477:54f9:6ac2 with SMTP id 5b1f17b1804b1-483c9b53c9cmr217676825e9.0.1772441099500; Mon, 02 Mar 2026 00:44:59 -0800 (PST) X-Received: by 2002:a05:600c:6385:b0:477:54f9:6ac2 with SMTP id 5b1f17b1804b1-483c9b53c9cmr217676245e9.0.1772441098875; Mon, 02 Mar 2026 00:44:58 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Maxim Levitsky Subject: [PULL 030/102] accel/kvm: Don't clear pending #SMI in kvm_get_vcpu_events Date: Mon, 2 Mar 2026 09:42:25 +0100 Message-ID: <20260302084338.473368-31-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441264229158500 Content-Type: text/plain; charset="utf-8" From: Maxim Levitsky The kvm_get_vcpu_events propogates the state of the pending smi from the kernel to the cpu->interrupt_request, with the intention of having un up to date migration state. Later the opposite is done, the kvm_put_vcpu_events restores the state of the pending #SMI from the 'cs->interrupt_request' The only problem is that kvm_get_vcpu_events also resets the SMI in cpu->interrupt_request when there is no pending #SMI indicated by the ke= rnel, and that is wrong as the SMI might be still raised by qemu. While at it, also fix a similar but more theoretical bug with regard to a latched #INIT while in SMM. A simple reproducer for this bug is to read an EFI variable in a loop from within a guest, while at the same time run 'info registers' on the qemu HMP monitor. The reads will, once in a while, fail with an 'Invalid argument' error. Signed-off-by: Maxim Levitsky Link: https://lore.kernel.org/r/20260223221908.361456-1-mlevitsk@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/kvm.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 3b66ec8c42b..bb8303c39fe 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -5501,8 +5501,6 @@ static int kvm_get_vcpu_events(X86CPU *cpu) } if (events.smi.pending) { cpu_interrupt(CPU(cpu), CPU_INTERRUPT_SMI); - } else { - cpu_reset_interrupt(CPU(cpu), CPU_INTERRUPT_SMI); } if (events.smi.smm_inside_nmi) { env->hflags2 |=3D HF2_SMM_INSIDE_NMI_MASK; @@ -5511,8 +5509,6 @@ static int kvm_get_vcpu_events(X86CPU *cpu) } if (events.smi.latched_init) { cpu_interrupt(CPU(cpu), CPU_INTERRUPT_INIT); - } else { - cpu_reset_interrupt(CPU(cpu), CPU_INTERRUPT_INIT); } } =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441164; cv=none; d=zohomail.com; s=zohoarc; b=FxZbHQyqXbcuXN7MokVRQScwzDDIUjOJTUZC3MbPU4EBt/RAT3XJCwEP6rLnNCmoC+HOmfK5qFeDb5BuZ6Fj9bm7qI1TJddeR9u/U9+wCrlxg4RfzY8dGPtaT/wG3nhvOGa1kjjKNxR0+dP6kmoVo+fC06oGGtoUV/yKMa68DrU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441164; 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=uUBrhgRgMwjvrQ/ixoEIyKXjuGoI34G02FFyFvZ4iws=; b=LmJbx6cxX9hYdKKRfu2URICUNqj355xPeM5/VLOIwGD1UEsEUa94XppXIUkJy9yPXCCXGzgbeqqxMQdmM3b3oxlYEFNoNb8h2Mp6ksQ9j9grlErLopSw+uICTygXm5cHvWz1bjMHkvQXRbS+u9ewhTHlE39OpJ7S6hxByjbSess= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441164465878.1816680141043; Mon, 2 Mar 2026 00:46:04 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyty-0003tm-T0; Mon, 02 Mar 2026 03:45:19 -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 1vwytn-0002aV-De for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:07 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytl-0001pc-UK for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:07 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-203-cCvTSoi6N06cp1Lt0hU-1A-1; Mon, 02 Mar 2026 03:45:04 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439af95a718so1175349f8f.2 for ; Mon, 02 Mar 2026 00:45:03 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b0549600sm11253716f8f.35.2026.03.02.00.44.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441105; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uUBrhgRgMwjvrQ/ixoEIyKXjuGoI34G02FFyFvZ4iws=; b=BeZ2xLcBoi85+PBgvdipXQjNDOKTFmq//Wr2XW86qE87QEjrekUjHE8K9IFVc58fq8+jXP 2FVClgVczqAqRdhxQ3zTy2644+IQ5DegOFlFiQHe2X5jDM99cLCvmC4vBtXBPHMOiinFv6 bMPTLjT3UevVhdZgfntdGVlhFLX7sdA= X-MC-Unique: cCvTSoi6N06cp1Lt0hU-1A-1 X-Mimecast-MFC-AGG-ID: cCvTSoi6N06cp1Lt0hU-1A_1772441103 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441102; x=1773045902; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uUBrhgRgMwjvrQ/ixoEIyKXjuGoI34G02FFyFvZ4iws=; b=il60MUDPf7hJ3AzSJl4u9i+dnG9z815Vb5Rk1BnEV/0W6HdB2A/PdCZWu5JTgTKmZD IUnzumWi21mF5tt0o1vXGgylxU0lf0u49fExbfVrZPtDu6ZxXgt3bRhp6CGw/4QS/AGP zSU3wrmROlw98h5j8++1sjeKK2hggi5A2nqxDutYM9PI7zaha+ko/dogPppd5f2Z/xRs AglKIyleTVCm0oYksFiS03zNbX6+ywlmYjGth3fyPI44vDqeCHJ9Jc7c4VNHSBtYZMPx 81+P9LADG85SHHAAq2kHzWXaMoW0igJLYRK1g8Bg5g0menOp3YTmgWRiw4/r/uf0hI7u 5FUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441102; x=1773045902; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=uUBrhgRgMwjvrQ/ixoEIyKXjuGoI34G02FFyFvZ4iws=; b=tfWP8cJlOdgZQ9T/6+l5iuQF6QiDDZN2WwaPMR/TKT5pIJ3+LS54fbwZ05ldiDH8ow Rr/KwtBbOjjyKgZB+vRdwAFMDqhs7o7uDHeo7kjoyEChEIrCNrlGtND3ifvK9BGqhz5U cyw/swWGw3+4Tgb6QGaXLsdPyh518lsaxCnHsp94MqzKIIo4rUcxZ2vM5scOvClFVRh/ E/wobNer2znL6SdDHhrK/3LaOMJcTCJ8Mr/CHhQBQxaxNzPTSJPOYuN+eyjC6UGu28dW ys3Mfcn/FVTZ4vc0THrC+z5aEYa3GqG458o1ZAVOFt1il9e5lXyEcW11UOlYJA0KjDqd Avlg== X-Gm-Message-State: AOJu0Yw0uNxeK0M5d579V3e0DNktazRuGx85nmc6AO3ZZosuIBAkTDIS svcmQyIUUF7VaWal3VsvgTtL3Czc/4rCB5sJvR0KAxyWI/1HvkBqgl88J03xs7FQOT8wrjYqBmo pZrVuiP/3khYolbQ8YdokQ8M8fS5fOoQePon6J+BdsS7r5Q+tkUaDVkHcNiqguAupO2Ezr9gaje gNAH7DBpnG6J8uWEK2B5DCrRybrmrNDXsION14DE6d X-Gm-Gg: ATEYQzyeMza3Hbj4ujz/uCq4TpFKjLWsStVNuiEFPB7kKWL/FR7jPD+tOhDV75naUWL ynXz8SH0ic1w+UOmd1qKlmqMaTzxYrX+fZouqYEwfb9DPmmgYxNfA6EQ3W5n1YKNo6Q1Cm9xzKr WeiKSfwl+FfkIwBsqIkxfH7D1Aw1lonAm/m3rL5DI7vDMEGXCtieD4X1fJ1/ej0rxOyI1oha4gE 4I8M6aGPxPCM7j4Lx/51w/g4KpHKzaFAp5N3cE0KsEBuhCYyMwk0SE2ro+jkvoUfwu/38s/Whi9 OPMMgkqbhEV0DyTBLTD6/E6D4OiZ5bpsgXZ20EEjrOS81OGBaZGM5gBeNPkBWaUGE7yMDcrmzTR JRs5aO+fRNmkzwBCxmZsiy011nPF4bIgFoBQGrMNGfgiUs1AGCdS5SHwjsgQbJRWZAsoPoJnsUl 1XThi8B41yotV+Yt+AA74wEneTKxs= X-Received: by 2002:a05:6000:2505:b0:439:b522:37ee with SMTP id ffacd0b85a97d-439b5223a8fmr5730356f8f.27.1772441102409; Mon, 02 Mar 2026 00:45:02 -0800 (PST) X-Received: by 2002:a05:6000:2505:b0:439:b522:37ee with SMTP id ffacd0b85a97d-439b5223a8fmr5730315f8f.27.1772441101972; Mon, 02 Mar 2026 00:45:01 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf Subject: [PULL 031/102] scripts/update-linux-headers: Add Nitro Enclaves header Date: Mon, 2 Mar 2026 09:42:26 +0100 Message-ID: <20260302084338.473368-32-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441165728158500 Content-Type: text/plain; charset="utf-8" From: Alexander Graf We want to enable QEMU to drive the /dev/nitro_enclaves device node. Add its UAPI header into our kernel sync so we have all defines we need to drive it. Signed-off-by: Alexander Graf Link: https://lore.kernel.org/r/20260225220807.33092-2-graf@amazon.com Signed-off-by: Paolo Bonzini --- scripts/update-linux-headers.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/update-linux-headers.sh b/scripts/update-linux-headers= .sh index d09d8cf4c6f..386d7a38e7a 100755 --- a/scripts/update-linux-headers.sh +++ b/scripts/update-linux-headers.sh @@ -254,6 +254,7 @@ for i in "$hdrdir"/include/linux/*virtio*.h \ "$hdrdir/include/linux/kvm_para.h" \ "$hdrdir/include/linux/vhost_types.h" \ "$hdrdir/include/linux/vmclock-abi.h" \ + "$hdrdir/include/linux/nitro_enclaves.h" \ "$hdrdir/include/linux/sysinfo.h"; do cp_portable "$i" "$output/include/standard-headers/linux" done --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441140; cv=none; d=zohomail.com; s=zohoarc; b=ajSiZBtoDfH9PMNH1svXOBBkd0lhJMdbgVvJS7a41ft4KoBdxkAsNQGdiZnBPVArIDjbKe2m9GASrwASwLjxd+HCQ1opO8XgLUGOtG3EvVeDBup9c3n34XKYq7BOIL5fPzV89In784uK/gY8IO6eBcmPPBKIv5mBkCMtQpsTvpA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441140; 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=F1Rz9QbTUIby8OgnZLoQXmrNpFdDj3N+DUt7P7RG3Co=; b=je4GRbi/ClAo3ZlPLPb1cURS2f6IlnjEjnWENQs8CwNANVfBREELHK3jDWFA6iPEuQdG6aL7i3PXUjj8SQusqgfUDE1IO48vW34B4gor+XdbJZXloj2jRTYOntTN0TDjuY+pmkEMnO4OaAax6yxJ9TwFfevwz0SR5HzfLsunnLQ= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441140434519.7506000580557; Mon, 2 Mar 2026 00:45:40 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytz-0003vz-EK; Mon, 02 Mar 2026 03:45:19 -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 1vwytu-0003WN-MP for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:14 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytr-0001qc-Mb for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:14 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-113-b1CTK8HVN-6JzqZOhZ403Q-1; Mon, 02 Mar 2026 03:45:09 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4832c4621c2so46271535e9.3 for ; Mon, 02 Mar 2026 00:45:09 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd6f26d7sm409063305e9.3.2026.03.02.00.45.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441110; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=F1Rz9QbTUIby8OgnZLoQXmrNpFdDj3N+DUt7P7RG3Co=; b=M8d/co4L5f5KZlwi0pde9hf52WkQSD8zpFE2pWA6Pvo+ZCvrcJNEFbyxXRP0V1orecL/MB roap49jo1rXobCxxnI5hezxqa4/0uIJPNY7vBR/3LhmZmF6qwwhbXQzhfcF5mwz3P7QBoQ NubIBc+u5aSPA4mD5Aa9zfLQNKzNIj0= X-MC-Unique: b1CTK8HVN-6JzqZOhZ403Q-1 X-Mimecast-MFC-AGG-ID: b1CTK8HVN-6JzqZOhZ403Q_1772441108 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441107; x=1773045907; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=F1Rz9QbTUIby8OgnZLoQXmrNpFdDj3N+DUt7P7RG3Co=; b=XSleArtTa+hb6L4IU9VeZyYdTuNvBJESFQc81vlBKyVJJFACft8M1qEJGAyhA/Lwn6 r8XVS4qJC+DddylYAHafXn4nKD6GCBL3glmLQ9G7RnYRsS65MBkyJt0vH2/0F6omk0iD MgYfLdchobdhkclfjklCq9HM12UFMx18iu8u56vYpGsqh8AGJhaRxB7/YlhQsNlSfHXY 0xtgJyfwqkHPKmL6Bz231Z0TZ+/pxVi2OLWiYOmlCXEGZwcW4rppKt6z85fEV45Vu6uR EeJYr/xpBBU9dfW6qdcI1HG8uL41rgDg7GvWvg5fXEEJ1GMZNQpxQ/TO6f+Dx/runRz8 TY+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441107; x=1773045907; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=F1Rz9QbTUIby8OgnZLoQXmrNpFdDj3N+DUt7P7RG3Co=; b=i/kC7zOZiobeFOxblJqmgDuQt/lhdsZO8KS2xQRjk1QbA/ht++4Le0pQfItKx+rOu8 jhkbSrENFHPuPGM9F4V8DwftYo1wYbAzp+ob6ryi5/8bV0Z2mGZdfYreN76hJPbLzxuj Bitx1s1wKrzLb2l1DnUY3wT+S1xdsuav4Xc8ttUzKrTjQusxQD/9wG+ZwfgmNphkB0bw K5+lK4dI9oxZ0QUVZTUPH4Qnrt4PQLvbZruk2oNx0uRO3Tgi/OYt3tMmhPUIu3BTCT1c V79RPTZUIcLCvdfhRqWhOP2mq3lMwOrPEa2xVaG1owWuLrjaVc2A4VfTkZ7LThVPgHfK Di4w== X-Gm-Message-State: AOJu0YwMyBxMsCXKW6rhomxHM8/wgDKz2VZelMyHfflHOAzHq5kYdfRX LxtFI8jn3c4IhHpk+0ACkDzNS6GoaT2rD7CsmBVzbGqsKN96Yp/gm8K7+ni2spPXMT9t7YTHfhR XNtNBKdOdUO82SE9EQJre9JObGJh0io3Vrd2TbLe3akAcERJUWImY4k2JipZOnfciI6iIP3ICAG 3ewzaFkiHKHTlz7gi0biQwqMc0XB81z9sKmDdZZs3o X-Gm-Gg: ATEYQzxNl1A3hHTb2u7cTVqspial0ff2FXXjFH+3ttXq1RIlzBtXLr+0BETP2LsIbiH Jf1C2jmmtj+9V8tw/ZGihTDKkeAQllGRW7p7hIPXM+CMYdY0HQdu8blnaNz97FLVubMZuOZo/oU AnXj83Rb3UynHZSy0eglGGV5yaMIaEIJbJ1EEcXrusyHL143Uj5FY85Qe8/D3PgUfqykopPTQ05 wVSHR8165Hj3pqLeiw2iP5dcABVekEXAQIc8lbHgERV6rg+PIXAXGudsSKFAWgU8uGFvtlfNByb R0ZdN/oeBk9S/PHvuv3qtE21FtN/L2NKxEWo1ORq4wQcps02HAB74/O0YIRI/5p8eH0PfUErmoH koL3B1pq/4ggqVnoBASzKD5E35lMfb5KtP7c4/dPAWjcb2EvS/fZv+Q3aDimP9T/80IQQLKoVDi NF+Qi6qt6BhIyEJZYvdKlAI/WWk+g= X-Received: by 2002:a05:600c:a086:b0:483:b3d7:2e80 with SMTP id 5b1f17b1804b1-483c9c1fc82mr192941495e9.33.1772441106890; Mon, 02 Mar 2026 00:45:06 -0800 (PST) X-Received: by 2002:a05:600c:a086:b0:483:b3d7:2e80 with SMTP id 5b1f17b1804b1-483c9c1fc82mr192940835e9.33.1772441106122; Mon, 02 Mar 2026 00:45:06 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf Subject: [PULL 032/102] linux-headers: Add nitro_enclaves.h Date: Mon, 2 Mar 2026 09:42:27 +0100 Message-ID: <20260302084338.473368-33-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441141697158500 Content-Type: text/plain; charset="utf-8" From: Alexander Graf QEMU is learning to drive the /dev/nitro_enclaves device node. Include its UAPI header into our local copy of kernel headers so it has all defines we need to drive it. Signed-off-by: Alexander Graf Link: https://lore.kernel.org/r/20260225220807.33092-3-graf@amazon.com Signed-off-by: Paolo Bonzini --- .../standard-headers/linux/nitro_enclaves.h | 359 ++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 include/standard-headers/linux/nitro_enclaves.h diff --git a/include/standard-headers/linux/nitro_enclaves.h b/include/stan= dard-headers/linux/nitro_enclaves.h new file mode 100644 index 00000000000..5545267dd95 --- /dev/null +++ b/include/standard-headers/linux/nitro_enclaves.h @@ -0,0 +1,359 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Copyright 2020-2021 Amazon.com, Inc. or its affiliates. All Rights Rese= rved. + */ + +#ifndef _LINUX_NITRO_ENCLAVES_H_ +#define _LINUX_NITRO_ENCLAVES_H_ + +#include "standard-headers/linux/types.h" + +/** + * DOC: Nitro Enclaves (NE) Kernel Driver Interface + */ + +/** + * NE_CREATE_VM - The command is used to create a slot that is associated = with + * an enclave VM. + * The generated unique slot id is an output parameter. + * The ioctl can be invoked on the /dev/nitro_enclaves fd, before + * setting any resources, such as memory and vCPUs, for an + * enclave. Memory and vCPUs are set for the slot mapped to an enclave. + * A NE CPU pool has to be set before calling this function. The + * pool can be set after the NE driver load, using + * /sys/module/nitro_enclaves/parameters/ne_cpus. + * Its format is the detailed in the cpu-lists section: + * https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters= .html + * CPU 0 and its siblings have to remain available for the + * primary / parent VM, so they cannot be set for enclaves. Full + * CPU core(s), from the same NUMA node, need(s) to be included + * in the CPU pool. + * + * Context: Process context. + * Return: + * * Enclave file descriptor - Enclave file descriptor used with + * ioctl calls to set vCPUs and memory + * regions, then start the enclave. + * * -1 - There was a failure in the ioctl logic. + * On failure, errno is set to: + * * EFAULT - copy_to_user() failure. + * * ENOMEM - Memory allocation failure for internal + * bookkeeping variables. + * * NE_ERR_NO_CPUS_AVAIL_IN_POOL - No NE CPU pool set / no CPUs available + * in the pool. + * * Error codes from get_unused_fd_flags() and anon_inode_getfile(). + * * Error codes from the NE PCI device request. + */ +#define NE_CREATE_VM _IOR(0xAE, 0x20, uint64_t) + +/** + * NE_ADD_VCPU - The command is used to set a vCPU for an enclave. The vCP= U can + * be auto-chosen from the NE CPU pool or it can be set by the + * caller, with the note that it needs to be available in the NE + * CPU pool. Full CPU core(s), from the same NUMA node, need(s) to + * be associated with an enclave. + * The vCPU id is an input / output parameter. If its value is 0, + * then a CPU is chosen from the enclave CPU pool and returned via + * this parameter. + * The ioctl can be invoked on the enclave fd, before an enclave + * is started. + * + * Context: Process context. + * Return: + * * 0 - Logic successfully completed. + * * -1 - There was a failure in the ioctl logic. + * On failure, errno is set to: + * * EFAULT - copy_from_user() / copy_to_user() failure. + * * ENOMEM - Memory allocation failure for internal + * bookkeeping variables. + * * EIO - Current task mm is not the same as the one + * that created the enclave. + * * NE_ERR_NO_CPUS_AVAIL_IN_POOL - No CPUs available in the NE CPU pool. + * * NE_ERR_VCPU_ALREADY_USED - The provided vCPU is already used. + * * NE_ERR_VCPU_NOT_IN_CPU_POOL - The provided vCPU is not available in t= he + * NE CPU pool. + * * NE_ERR_VCPU_INVALID_CPU_CORE - The core id of the provided vCPU is in= valid + * or out of range. + * * NE_ERR_NOT_IN_INIT_STATE - The enclave is not in init state + * (init =3D before being started). + * * NE_ERR_INVALID_VCPU - The provided vCPU is not in the available + * CPUs range. + * * Error codes from the NE PCI device request. + */ +#define NE_ADD_VCPU _IOWR(0xAE, 0x21, uint32_t) + +/** + * NE_GET_IMAGE_LOAD_INFO - The command is used to get information needed = for + * in-memory enclave image loading e.g. offset in + * enclave memory to start placing the enclave image. + * The image load info is an input / output parameter. + * It includes info provided by the caller - flags - + * and returns the offset in enclave memory where to + * start placing the enclave image. + * The ioctl can be invoked on the enclave fd, before + * an enclave is started. + * + * Context: Process context. + * Return: + * * 0 - Logic successfully completed. + * * -1 - There was a failure in the ioctl logic. + * On failure, errno is set to: + * * EFAULT - copy_from_user() / copy_to_user() failure. + * * NE_ERR_NOT_IN_INIT_STATE - The enclave is not in init state (init =3D + * before being started). + * * NE_ERR_INVALID_FLAG_VALUE - The value of the provided flag is invalid. + */ +#define NE_GET_IMAGE_LOAD_INFO _IOWR(0xAE, 0x22, struct ne_image_load_inf= o) + +/** + * NE_SET_USER_MEMORY_REGION - The command is used to set a memory region = for an + * enclave, given the allocated memory from the + * userspace. Enclave memory needs to be from the + * same NUMA node as the enclave CPUs. + * The user memory region is an input parameter. It + * includes info provided by the caller - flags, + * memory size and userspace address. + * The ioctl can be invoked on the enclave fd, + * before an enclave is started. + * + * Context: Process context. + * Return: + * * 0 - Logic successfully completed. + * * -1 - There was a failure in the ioctl logic. + * On failure, errno is set to: + * * EFAULT - copy_from_user() failure. + * * EINVAL - Invalid physical memory region(s) e.g. + * unaligned address. + * * EIO - Current task mm is not the same as + * the one that created the enclave. + * * ENOMEM - Memory allocation failure for internal + * bookkeeping variables. + * * NE_ERR_NOT_IN_INIT_STATE - The enclave is not in init state + * (init =3D before being started). + * * NE_ERR_INVALID_MEM_REGION_SIZE - The memory size of the region is not + * multiple of 2 MiB. + * * NE_ERR_INVALID_MEM_REGION_ADDR - Invalid user space address given. + * * NE_ERR_UNALIGNED_MEM_REGION_ADDR - Unaligned user space address given. + * * NE_ERR_MEM_REGION_ALREADY_USED - The memory region is already used. + * * NE_ERR_MEM_NOT_HUGE_PAGE - The memory region is not backed by + * huge pages. + * * NE_ERR_MEM_DIFFERENT_NUMA_NODE - The memory region is not from the sa= me + * NUMA node as the CPUs. + * * NE_ERR_MEM_MAX_REGIONS - The number of memory regions set for + * the enclave reached maximum. + * * NE_ERR_INVALID_PAGE_SIZE - The memory region is not backed by + * pages multiple of 2 MiB. + * * NE_ERR_INVALID_FLAG_VALUE - The value of the provided flag is invali= d. + * * Error codes from get_user_pages(). + * * Error codes from the NE PCI device request. + */ +#define NE_SET_USER_MEMORY_REGION _IOW(0xAE, 0x23, struct ne_user_memory_r= egion) + +/** + * NE_START_ENCLAVE - The command is used to trigger enclave start after t= he + * enclave resources, such as memory and CPU, have been set. + * The enclave start info is an input / output parameter. It + * includes info provided by the caller - enclave cid and + * flags - and returns the cid (if input cid is 0). + * The ioctl can be invoked on the enclave fd, after an + * enclave slot is created and resources, such as memory and + * vCPUs are set for an enclave. + * + * Context: Process context. + * Return: + * * 0 - Logic successfully completed. + * * -1 - There was a failure in the ioctl logic. + * On failure, errno is set to: + * * EFAULT - copy_from_user() / copy_to_user() failure. + * * NE_ERR_NOT_IN_INIT_STATE - The enclave is not in init state + * (init =3D before being started). + * * NE_ERR_NO_MEM_REGIONS_ADDED - No memory regions are set. + * * NE_ERR_NO_VCPUS_ADDED - No vCPUs are set. + * * NE_ERR_FULL_CORES_NOT_USED - Full core(s) not set for the enclave. + * * NE_ERR_ENCLAVE_MEM_MIN_SIZE - Enclave memory is less than minimum + * memory size (64 MiB). + * * NE_ERR_INVALID_FLAG_VALUE - The value of the provided flag is invali= d. + * * NE_ERR_INVALID_ENCLAVE_CID - The provided enclave CID is invalid. + * * Error codes from the NE PCI device request. + */ +#define NE_START_ENCLAVE _IOWR(0xAE, 0x24, struct ne_enclave_start_info) + +/** + * DOC: NE specific error codes + */ + +/** + * NE_ERR_VCPU_ALREADY_USED - The provided vCPU is already used. + */ +#define NE_ERR_VCPU_ALREADY_USED (256) +/** + * NE_ERR_VCPU_NOT_IN_CPU_POOL - The provided vCPU is not available in the + * NE CPU pool. + */ +#define NE_ERR_VCPU_NOT_IN_CPU_POOL (257) +/** + * NE_ERR_VCPU_INVALID_CPU_CORE - The core id of the provided vCPU is inva= lid + * or out of range of the NE CPU pool. + */ +#define NE_ERR_VCPU_INVALID_CPU_CORE (258) +/** + * NE_ERR_INVALID_MEM_REGION_SIZE - The user space memory region size is n= ot + * multiple of 2 MiB. + */ +#define NE_ERR_INVALID_MEM_REGION_SIZE (259) +/** + * NE_ERR_INVALID_MEM_REGION_ADDR - The user space memory region address r= ange + * is invalid. + */ +#define NE_ERR_INVALID_MEM_REGION_ADDR (260) +/** + * NE_ERR_UNALIGNED_MEM_REGION_ADDR - The user space memory region address= is + * not aligned. + */ +#define NE_ERR_UNALIGNED_MEM_REGION_ADDR (261) +/** + * NE_ERR_MEM_REGION_ALREADY_USED - The user space memory region is alread= y used. + */ +#define NE_ERR_MEM_REGION_ALREADY_USED (262) +/** + * NE_ERR_MEM_NOT_HUGE_PAGE - The user space memory region is not backed by + * contiguous physical huge page(s). + */ +#define NE_ERR_MEM_NOT_HUGE_PAGE (263) +/** + * NE_ERR_MEM_DIFFERENT_NUMA_NODE - The user space memory region is backed= by + * pages from different NUMA nodes than the CPUs. + */ +#define NE_ERR_MEM_DIFFERENT_NUMA_NODE (264) +/** + * NE_ERR_MEM_MAX_REGIONS - The supported max memory regions per enclaves = has + * been reached. + */ +#define NE_ERR_MEM_MAX_REGIONS (265) +/** + * NE_ERR_NO_MEM_REGIONS_ADDED - The command to start an enclave is trigge= red + * and no memory regions are added. + */ +#define NE_ERR_NO_MEM_REGIONS_ADDED (266) +/** + * NE_ERR_NO_VCPUS_ADDED - The command to start an enclave is triggered an= d no + * vCPUs are added. + */ +#define NE_ERR_NO_VCPUS_ADDED (267) +/** + * NE_ERR_ENCLAVE_MEM_MIN_SIZE - The enclave memory size is lower than the + * minimum supported. + */ +#define NE_ERR_ENCLAVE_MEM_MIN_SIZE (268) +/** + * NE_ERR_FULL_CORES_NOT_USED - The command to start an enclave is trigger= ed and + * full CPU cores are not set. + */ +#define NE_ERR_FULL_CORES_NOT_USED (269) +/** + * NE_ERR_NOT_IN_INIT_STATE - The enclave is not in init state when setting + * resources or triggering start. + */ +#define NE_ERR_NOT_IN_INIT_STATE (270) +/** + * NE_ERR_INVALID_VCPU - The provided vCPU is out of range of the availabl= e CPUs. + */ +#define NE_ERR_INVALID_VCPU (271) +/** + * NE_ERR_NO_CPUS_AVAIL_IN_POOL - The command to create an enclave is trig= gered + * and no CPUs are available in the pool. + */ +#define NE_ERR_NO_CPUS_AVAIL_IN_POOL (272) +/** + * NE_ERR_INVALID_PAGE_SIZE - The user space memory region is not backed b= y pages + * multiple of 2 MiB. + */ +#define NE_ERR_INVALID_PAGE_SIZE (273) +/** + * NE_ERR_INVALID_FLAG_VALUE - The provided flag value is invalid. + */ +#define NE_ERR_INVALID_FLAG_VALUE (274) +/** + * NE_ERR_INVALID_ENCLAVE_CID - The provided enclave CID is invalid, either + * being a well-known value or the CID of the + * parent / primary VM. + */ +#define NE_ERR_INVALID_ENCLAVE_CID (275) + +/** + * DOC: Image load info flags + */ + +/** + * NE_EIF_IMAGE - Enclave Image Format (EIF) + */ +#define NE_EIF_IMAGE (0x01) + +#define NE_IMAGE_LOAD_MAX_FLAG_VAL (0x02) + +/** + * struct ne_image_load_info - Info necessary for in-memory enclave image + * loading (in / out). + * @flags: Flags to determine the enclave image type + * (e.g. Enclave Image Format - EIF) (in). + * @memory_offset: Offset in enclave memory where to start placing the + * enclave image (out). + */ +struct ne_image_load_info { + uint64_t flags; + uint64_t memory_offset; +}; + +/** + * DOC: User memory region flags + */ + +/** + * NE_DEFAULT_MEMORY_REGION - Memory region for enclave general usage. + */ +#define NE_DEFAULT_MEMORY_REGION (0x00) + +#define NE_MEMORY_REGION_MAX_FLAG_VAL (0x01) + +/** + * struct ne_user_memory_region - Memory region to be set for an enclave (= in). + * @flags: Flags to determine the usage for the memory region (in). + * @memory_size: The size, in bytes, of the memory region to be set for + * an enclave (in). + * @userspace_addr: The start address of the userspace allocated memory of + * the memory region to set for an enclave (in). + */ +struct ne_user_memory_region { + uint64_t flags; + uint64_t memory_size; + uint64_t userspace_addr; +}; + +/** + * DOC: Enclave start info flags + */ + +/** + * NE_ENCLAVE_PRODUCTION_MODE - Start enclave in production mode. + */ +#define NE_ENCLAVE_PRODUCTION_MODE (0x00) +/** + * NE_ENCLAVE_DEBUG_MODE - Start enclave in debug mode. + */ +#define NE_ENCLAVE_DEBUG_MODE (0x01) + +#define NE_ENCLAVE_START_MAX_FLAG_VAL (0x02) + +/** + * struct ne_enclave_start_info - Setup info necessary for enclave start (= in / out). + * @flags: Flags for the enclave to start with (e.g. debug mode) (in). + * @enclave_cid: Context ID (CID) for the enclave vsock device. If 0 as + * input, the CID is autogenerated by the hypervisor and + * returned back as output by the driver (in / out). + */ +struct ne_enclave_start_info { + uint64_t flags; + uint64_t enclave_cid; +}; + +#endif /* _LINUX_NITRO_ENCLAVES_H_ */ --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441974; cv=none; d=zohomail.com; s=zohoarc; b=WwHYyx/zFOQ0AiCcil8zVEdP0csLwnFM55SuOMTStRcqC5No4BMHidqFzd8ZLzQ7tp9uYSUFjcJweRHqiv67YLGCxMzs5unt3bOkzoLv07cZzLNcux398916pd61Xl4kZ6vl4LquRyCo/Wg5hyW9iLY+vuoi9/y2+dUkIRhuvMM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441974; 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=z8fdGKj2U4eZl70HRcrV9ZuNs8saWotz1oFJDPe1L4c=; b=TJQMQyB1q9a1m22z171fLxBnep9yyjOayALVzKx2j5v4ymU5EvQIwm/shBZiLi7lt3391l+p4YGwy6pjcX7y5xpoDnLXjoNNtsKDj9vzzvkTJ1coEZE4l2/vjdiELmrSnhdN94Xxz0b3w5SjIip0c786Yxa5X2YzFuxFzahApAA= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441974388751.3105777204263; Mon, 2 Mar 2026 00:59:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyu5-0004a0-NI; Mon, 02 Mar 2026 03:45:25 -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 1vwytv-0003bA-D1 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytt-0001qi-4B for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:15 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-527-qMco-7buM6SkSj8ZdckWcg-1; Mon, 02 Mar 2026 03:45:10 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4837907ec88so48397255e9.0 for ; Mon, 02 Mar 2026 00:45:10 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcb318fsm194574745e9.6.2026.03.02.00.45.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441112; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=z8fdGKj2U4eZl70HRcrV9ZuNs8saWotz1oFJDPe1L4c=; b=WLyiDXXHF9pmw8YrRkzbNJRzJXZnog7M01FOoLfR/zKysSR+t9qmbG8ggJ3+B9ah6D7xYq WgQnd3ouoqnCWsyndMLW6FH7HwOwtErL1Zi8qr6mV70eZqTcLqXgDmkknPur7teulW52dK E2V0jTtfpnM79WB2tT6g4s5psZGBXDs= X-MC-Unique: qMco-7buM6SkSj8ZdckWcg-1 X-Mimecast-MFC-AGG-ID: qMco-7buM6SkSj8ZdckWcg_1772441109 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441108; x=1773045908; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=z8fdGKj2U4eZl70HRcrV9ZuNs8saWotz1oFJDPe1L4c=; b=OtQ3qqo23HrjEoI/3KJzJwCTQfglroxbI++z16aNvk5e2ZkdcqG2Z6qRXEGWSHakQm LhcimJaBMdzAGwl36jq2uqPTYfJNGY0ChwEPMaEUhAAxqcgr2IXiFCgXo+Gmzll6i8vN b5h9l6Tjd1KHlEkFxagJhIK+SdilF3nTp7zPGwpv8iOIedrE9rjqKwrw+nnxY2ksBogU T9rDc7EaFtsyoxZRkY48D4udwc6MGeGtiWs56yLvZBdK2eFF2pyCP8SiEkl7m2QsB+XI vmc0dnlCbXQ46VbUw6Iwf8+oJlzrOXrLEauZSDQWWNm3aqtcSKmK2X22hdhNrYHleq5J Ls0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441108; x=1773045908; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=z8fdGKj2U4eZl70HRcrV9ZuNs8saWotz1oFJDPe1L4c=; b=RYpWbxBxJ4N64jReK4UB1bXyqg3tuvd2MxxCui1dSG2mH9sJdn26bO9KBKzPUmir5O g8F2DY6eo0Tw9TTEtljCI/0IAHSpJwYMEmVmC2mq9AJJH8v0n1La7ouLt6h6nr7mcQtu YxL0rlzbxhkzhrByS5Ru0kqZMVtjAQr21V0hIb+rzTcoLBTudKFNApAAXcm03SBTBqnD A1s9icGdb+jklEFBMtTAJAMWBoq14VhgzaJGRsEpQja1CKQq5uQm+bz3ZvaqKL2MHLOX 4KCr6JaNQ2LA0viTnjM/VmPYB1VCPYRR1HKHOFXRov6r4LmI7JJr4MXP6w62O+P7YbYG sfKA== X-Gm-Message-State: AOJu0YzzoEfia9mdnqlV3o+7vdu9F73g6zcJ3QSW+F0oTAYEmcRhwRpj NWTV7ua3D0pFLyJ4LX5OrfDei7yemGNc+wOFU4WjTkpb3Lq937q8NWQcsTI/nAGajYLTZW+ZO0w 6wBleBfGQA2cr3gG7h6TGWmK5OQd5vFQFWNvdBKxwuDu+LPRvyTcpUNEAcRQ3qjJBQGKdybZYAa e2UEqZx9qqi47ifU9E1RyhW/VDhnh3paAyNd820hSE X-Gm-Gg: ATEYQzxEQUXmP0IBCgbigeJshXOp/NGekNCbu8RSqh2B8QzfgULBl47Y6NVbPsQ05hC iwTM7dVSwJBgkGNYVhtdgbRPSpOOHz/cUtBB/Ov3r9r93aIkI0FwpCerGvUGMYq2YlVlLCbXH+m G//rc28/egOszXy1t5lGkzSrnEOUVaRQStAVDei5Mz/aR8RtPE+RW8Mws88P3jmYasc4y8ldCfN m0Jh5fFACIqkebAaJgXTEzL2gSGuH+1R927HB04XT/tBMQPJbuHETOi2PK4mpU72G+puLi9xnoU /51p/Xb1lsvRwCwBxHYFGdCjnTvjN0X3LcLQgSR+fS5zbsUkzoVSyF+QwvSLkCOvu8blVnKNId5 AU5OQPs+zRYgFsogkHZhszzJAnBNR7tlgosVTUMg5erhno/s9KL/lP67Q2ycM2zhMZ25az1Nz0S euFdWzyDBstpLjq1xDwyjtbAsGZDU= X-Received: by 2002:a05:600c:154b:b0:477:5af7:6fa with SMTP id 5b1f17b1804b1-483c9c2059bmr169572555e9.32.1772441108277; Mon, 02 Mar 2026 00:45:08 -0800 (PST) X-Received: by 2002:a05:600c:154b:b0:477:5af7:6fa with SMTP id 5b1f17b1804b1-483c9c2059bmr169572045e9.32.1772441107762; Mon, 02 Mar 2026 00:45:07 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf Subject: [PULL 033/102] hw/nitro: Add Nitro Vsock Bus Date: Mon, 2 Mar 2026 09:42:28 +0100 Message-ID: <20260302084338.473368-34-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441975839158500 From: Alexander Graf Add a dedicated bus for Nitro Enclave vsock devices. In Nitro Enclaves, communication between parent and enclave/hypervisor happens almost exclusively through vsock. The nitro-vsock-bus models this dependency in QEMU, which allows devices in this bus to implement individual services on top of vsock. The nitro machine spawns this bus by creating the included nitro-vsock-bridge sysbus device. The nitro accel then advertises the Enclave's CID to the bus by calling nitro_vsock_bridge_start_enclave() on the bridge device as soon as it knows the CID. Nitro vsock devices can listen to that event and learn the Enclave's CID when it is available to perform actions, such as connect to the debug serial vsock port. Suggested-by: Paolo Bonzini Signed-off-by: Alexander Graf Link: https://lore.kernel.org/r/20260225220807.33092-4-graf@amazon.com Signed-off-by: Paolo Bonzini --- MAINTAINERS | 6 ++ meson.build | 1 + hw/nitro/trace.h | 4 ++ include/hw/nitro/nitro-vsock-bus.h | 71 ++++++++++++++++++++++ hw/nitro/nitro-vsock-bus.c | 98 ++++++++++++++++++++++++++++++ hw/Kconfig | 1 + hw/meson.build | 1 + hw/nitro/Kconfig | 2 + hw/nitro/meson.build | 1 + hw/nitro/trace-events | 2 + 10 files changed, 187 insertions(+) create mode 100644 hw/nitro/trace.h create mode 100644 include/hw/nitro/nitro-vsock-bus.h create mode 100644 hw/nitro/nitro-vsock-bus.c create mode 100644 hw/nitro/Kconfig create mode 100644 hw/nitro/meson.build create mode 100644 hw/nitro/trace-events diff --git a/MAINTAINERS b/MAINTAINERS index 606b16762cf..d781fe59bb1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3020,6 +3020,12 @@ F: hw/vmapple/* F: include/hw/vmapple/* F: docs/system/arm/vmapple.rst =20 +Nitro Enclaves (native) +M: Alexander Graf +S: Maintained +F: hw/nitro/ +F: include/hw/nitro/ + Subsystems ---------- Overall Audio backends diff --git a/meson.build b/meson.build index 2bae618d848..f3ee08772d4 100644 --- a/meson.build +++ b/meson.build @@ -3620,6 +3620,7 @@ if have_system 'hw/misc/macio', 'hw/net', 'hw/net/can', + 'hw/nitro', 'hw/nubus', 'hw/nvme', 'hw/nvram', diff --git a/hw/nitro/trace.h b/hw/nitro/trace.h new file mode 100644 index 00000000000..b455d6c17b3 --- /dev/null +++ b/hw/nitro/trace.h @@ -0,0 +1,4 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "trace/trace-hw_nitro.h" diff --git a/include/hw/nitro/nitro-vsock-bus.h b/include/hw/nitro/nitro-vs= ock-bus.h new file mode 100644 index 00000000000..064260aa410 --- /dev/null +++ b/include/hw/nitro/nitro-vsock-bus.h @@ -0,0 +1,71 @@ +/* + * Nitro Enclave Vsock Bus + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_NITRO_VSOCK_BUS_H +#define HW_NITRO_VSOCK_BUS_H + +#include "hw/core/qdev.h" +#include "hw/core/sysbus.h" +#include "qom/object.h" + +#define TYPE_NITRO_VSOCK_BUS "nitro-vsock-bus" +OBJECT_DECLARE_SIMPLE_TYPE(NitroVsockBus, NITRO_VSOCK_BUS) + +#define TYPE_NITRO_VSOCK_BRIDGE "nitro-vsock-bridge" +OBJECT_DECLARE_SIMPLE_TYPE(NitroVsockBridge, NITRO_VSOCK_BRIDGE) + +#define TYPE_NITRO_VSOCK_DEVICE "nitro-vsock-device" +OBJECT_DECLARE_TYPE(NitroVsockDevice, NitroVsockDeviceClass, + NITRO_VSOCK_DEVICE) + +struct NitroVsockBus { + BusState parent_obj; +}; + +struct NitroVsockBridge { + SysBusDevice parent_obj; + + NitroVsockBus bus; + uint32_t enclave_cid; +}; + +struct NitroVsockDevice { + DeviceState parent_obj; +}; + +struct NitroVsockDeviceClass { + DeviceClass parent_class; + + /* + * Called after the enclave has been started and the CID is known. + * Devices use this to establish vsock connections to the enclave. + */ + void (*enclave_started)(NitroVsockDevice *dev, uint32_t enclave_cid, + Error **errp); +}; + +/* + * Machine helper to create the Nitro vsock bridge sysbus device. + */ +NitroVsockBridge *nitro_vsock_bridge_create(void); + +/* + * Find the Nitro vsock bridge on the sysbus. + */ +static inline NitroVsockBridge *nitro_vsock_bridge_find(void) +{ + return NITRO_VSOCK_BRIDGE( + object_resolve_path_type("", TYPE_NITRO_VSOCK_BRIDGE, NULL)); +} + +/* + * Notify the bridge that the enclave has started. Dispatches + * enclave_started() to all devices on the bus. + */ +void nitro_vsock_bridge_start_enclave(NitroVsockBridge *bridge, + uint32_t enclave_cid, Error **errp); + +#endif /* HW_NITRO_VSOCK_BUS_H */ diff --git a/hw/nitro/nitro-vsock-bus.c b/hw/nitro/nitro-vsock-bus.c new file mode 100644 index 00000000000..eed29df512e --- /dev/null +++ b/hw/nitro/nitro-vsock-bus.c @@ -0,0 +1,98 @@ +/* + * Nitro Enclave Vsock Bus + * + * Copyright =C2=A9 2026 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: + * Alexander Graf + * + * A bus for Nitro Enclave vsock devices. In Nitro Enclaves, communication + * between parent and enclave/hypervisor happens almost exclusively through + * vsock. The nitro-vsock-bus models this dependency in QEMU, which allows + * devices in this bus to implement individual services on top of vsock. + * + * The nitro accel advertises the Enclave's CID to the bus by calling + * nitro_vsock_bridge_start_enclave() on the bridge device as soon as it + * knows the CID. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "monitor/qdev.h" +#include "hw/core/sysbus.h" +#include "hw/nitro/nitro-vsock-bus.h" + +void nitro_vsock_bridge_start_enclave(NitroVsockBridge *bridge, + uint32_t enclave_cid, Error **errp) +{ + ERRP_GUARD(); + BusState *qbus =3D BUS(&bridge->bus); + BusChild *kid; + + bridge->enclave_cid =3D enclave_cid; + + QTAILQ_FOREACH(kid, &qbus->children, sibling) { + NitroVsockDevice *ndev =3D NITRO_VSOCK_DEVICE(kid->child); + NitroVsockDeviceClass *ndc =3D NITRO_VSOCK_DEVICE_GET_CLASS(ndev); + + if (ndc->enclave_started) { + ndc->enclave_started(ndev, enclave_cid, errp); + if (*errp) { + return; + } + } + } +} + +NitroVsockBridge *nitro_vsock_bridge_create(void) +{ + DeviceState *dev =3D qdev_new(TYPE_NITRO_VSOCK_BRIDGE); + + qdev_set_id(dev, g_strdup("nitro-vsock"), &error_fatal); + sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); + + return NITRO_VSOCK_BRIDGE(dev); +} + +static void nitro_vsock_bridge_init(Object *obj) +{ + NitroVsockBridge *s =3D NITRO_VSOCK_BRIDGE(obj); + + qbus_init(&s->bus, sizeof(s->bus), TYPE_NITRO_VSOCK_BUS, + DEVICE(s), "nitro-vsock"); + object_property_add_uint32_ptr(obj, "enclave-cid", + &s->enclave_cid, OBJ_PROP_FLAG_READ); +} + +static void nitro_vsock_device_class_init(ObjectClass *oc, const void *dat= a) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + + dc->bus_type =3D TYPE_NITRO_VSOCK_BUS; +} + +static const TypeInfo nitro_vsock_bus_types[] =3D { + { + .name =3D TYPE_NITRO_VSOCK_BUS, + .parent =3D TYPE_BUS, + .instance_size =3D sizeof(NitroVsockBus), + }, + { + .name =3D TYPE_NITRO_VSOCK_BRIDGE, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(NitroVsockBridge), + .instance_init =3D nitro_vsock_bridge_init, + }, + { + .name =3D TYPE_NITRO_VSOCK_DEVICE, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(NitroVsockDevice), + .class_size =3D sizeof(NitroVsockDeviceClass), + .class_init =3D nitro_vsock_device_class_init, + .abstract =3D true, + }, +}; + +DEFINE_TYPES(nitro_vsock_bus_types); diff --git a/hw/Kconfig b/hw/Kconfig index f8f92b5d03d..b3ce1520a6b 100644 --- a/hw/Kconfig +++ b/hw/Kconfig @@ -22,6 +22,7 @@ source isa/Kconfig source mem/Kconfig source misc/Kconfig source net/Kconfig +source nitro/Kconfig source nubus/Kconfig source nvme/Kconfig source nvram/Kconfig diff --git a/hw/meson.build b/hw/meson.build index 66e46b8090d..36da5322f7e 100644 --- a/hw/meson.build +++ b/hw/meson.build @@ -44,6 +44,7 @@ subdir('isa') subdir('mem') subdir('misc') subdir('net') +subdir('nitro') subdir('nubus') subdir('nvme') subdir('nvram') diff --git a/hw/nitro/Kconfig b/hw/nitro/Kconfig new file mode 100644 index 00000000000..767472cb2c6 --- /dev/null +++ b/hw/nitro/Kconfig @@ -0,0 +1,2 @@ +config NITRO_VSOCK_BUS + bool diff --git a/hw/nitro/meson.build b/hw/nitro/meson.build new file mode 100644 index 00000000000..7e2807f1379 --- /dev/null +++ b/hw/nitro/meson.build @@ -0,0 +1 @@ +system_ss.add(when: 'CONFIG_NITRO_VSOCK_BUS', if_true: files('nitro-vsock-= bus.c')) diff --git a/hw/nitro/trace-events b/hw/nitro/trace-events new file mode 100644 index 00000000000..9ccc5790487 --- /dev/null +++ b/hw/nitro/trace-events @@ -0,0 +1,2 @@ +# See docs/devel/tracing.rst for syntax documentation. + --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441464; cv=none; d=zohomail.com; s=zohoarc; b=MOXLIEmd0Gg4Ni+F3mLMVCl3F6ngq/sPPpemUk9KG2ENg2SiPndqaFva2w1Vt58Cm6bHzUcuSWHdGEDQdntrRayOhOfDodTQTTa8u7fY8PKnIl6BfbM9BxD2q+Pl8a6+3mjLpcTKScqSMzhErVdVFlD5u7trEHR8RDbZAzXVyKY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441464; 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=hCNjFaHfGWm9J+niU5Zr/XHC0Ap5Ar81+fQxuYcO5Zs=; b=joPvh2EsIcaA5muFG3eWRdgHDtNF7hTzVBML27hi4dWACkFSHaC71F+kWgEAY9VG016/CHNsruZpwJp+EzcSivRr8WRTcQ7Xdt5mOXl+C1yNizqZnQlws9XbBhobhPzX1AloTccuZFbtJtfX1KZmMRwU6SxtNL6YXVuVGgQZCAI= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441464216217.19320845815923; Mon, 2 Mar 2026 00:51:04 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvi-0008IV-6s; Mon, 02 Mar 2026 03:47:06 -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 1vwyup-0005NE-Fw for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyug-0001we-K1 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:09 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-587-t8nX8KSMP8-0TqSQwMG-YQ-1; Mon, 02 Mar 2026 03:45:15 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-48378c4a79fso35148685e9.0 for ; Mon, 02 Mar 2026 00:45:14 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3addb3asm334356175e9.0.2026.03.02.00.45.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441156; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hCNjFaHfGWm9J+niU5Zr/XHC0Ap5Ar81+fQxuYcO5Zs=; b=UPlTeJpVeggib4QrhqMdL9/t4f1wlZdiyogCb5Xd3UFueWC2PyZ/pHLI662c6+ojcEfOts /dlnVjjwTv7JLYOUrlsDQu8eocOtDEW+1iAVPhu8uhwwJYkVDfoNX2ynbJDF2ZxhK6qVaI FXok2QhU/Ni6EQmXmjoWG5j2NB4zKbg= X-MC-Unique: t8nX8KSMP8-0TqSQwMG-YQ-1 X-Mimecast-MFC-AGG-ID: t8nX8KSMP8-0TqSQwMG-YQ_1772441114 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441113; x=1773045913; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hCNjFaHfGWm9J+niU5Zr/XHC0Ap5Ar81+fQxuYcO5Zs=; b=i8yROFo29/HApAjzV5H7OOZ9qEuUIsRShQjvCNrSBWfaHN1IkkivPa9rD7ih1MyD7H WONfv0FS7SWlc+mT2haSS04psuM6PsKuqQ5mHBwz9Xnr2F1Kte9oYMa5YMVO3o+w+j+q RRggeS/dlPoEIh9Hmgc8ucWsZCf0YDDY2V17j9q4yqP+0FY4Jx2wXmXLiv/q6YvU+iqt 1Zia2CCu9oP/7kW773TvIg2IOPBVx3Yp3cRcnxuBueyVM1UVgv807buJUz+E01ESBSUW kZCvBg6dScCXBDVw+DQGML016w0QUhl+qvqkc7hA2GtyfZlB278025AQlrPh/CxeJPUX jAPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441113; x=1773045913; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=hCNjFaHfGWm9J+niU5Zr/XHC0Ap5Ar81+fQxuYcO5Zs=; b=KFxheRxg+NVptrxb7MMRZepXGzh2YnSdDSQ4tlsavbAGsl62eZI7/XkhPSLbVnUC08 JXxIij8BlgR3bXMTHNWL/5CtGvsaxx0Q3DtzmKBffgc5GOiKfzB60lCiHMYgsfDurOnE Ogoyed9yJgkIoDqddMScIRq3ME68Uho2/r31HXTeqdQXloqnfYNzD+nOAkmF0M2Vo6v3 9POAXSLGNYUergH+WTIO+jptGiRdW7R/ihE9u0qnZhUR5U4uhOXqblAdmpCqnNyZERIf ggmGFur4SH+ykG3gjTVT0QuQ15MgnIY+G7g/vRiwmL0Agabf2QWIfqEa4yDcAjjqPim7 MwXQ== X-Gm-Message-State: AOJu0YxnkTnWmapHdCWMMRUSMO5z5oEFl/JaURIV2HMhhU4hsa4Gsoav I1mAlGdHjP/N1L+Kb0FF/+WqlQYQWJ54O1fIh36T6/Ua71BCJMqWcEp3ICq48uNVTKJEnYfSXTs MtuGfXRC13JttHp+wLqrqnV/EGPOwx8Uj/4DXIoWKizN3E+Fi/2mA53O+WWvLm+G0wP4Vpak1ms 3vhczNL/uA6mRcRbzHJ2TU/TWiHY8WThDjZMyd1+Tw X-Gm-Gg: ATEYQzzWga47AdnyYDTwzxHXL1jy1OyseVSTaRR8J81p0Ai1o3riN5sxZVaCJc+4Ye/ +Q7iQhzaw20syWiAdEv/DNRNxUtYItPd5xNHtf04YS4xv1c6K0Rqil8feuTBIktApUtTh6ArvJ7 OeGKNpOkq3KhwhYRZeW5qeNsOuOIhbII1Vk7Xq8jQAj3QbBySCGbqI/Jj7ueFCIZ+lbE3plrVEa Zug/TATfnfVHz29PvTBMr1/G2o0OINq874wyB8F3i03NsmoVKxBBinBIxbrDQ9gj23EfZ4XCN8S +l9weNAAvn+s/LpiR5IfmUPB0mErUxjF5UwNWCjAJpdOkemuVOzMeDlRhTDxYKH8rIleP5b8AUe /fxP7QW8lBvifKZjtUNXXrot6XUy9EpWTFp8X1uSzR9WUjwS6KKNx9ThDuXj3a2gH8t4xSvObaG L7CsemyfoHRFAB3QOM1NFPj1/dBIs= X-Received: by 2002:a05:600c:1909:b0:477:a219:cdb7 with SMTP id 5b1f17b1804b1-483c9b545e0mr218184015e9.0.1772441112403; Mon, 02 Mar 2026 00:45:12 -0800 (PST) X-Received: by 2002:a05:600c:1909:b0:477:a219:cdb7 with SMTP id 5b1f17b1804b1-483c9b545e0mr218183065e9.0.1772441111492; Mon, 02 Mar 2026 00:45:11 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf Subject: [PULL 034/102] accel: Add Nitro Enclaves accelerator Date: Mon, 2 Mar 2026 09:42:29 +0100 Message-ID: <20260302084338.473368-35-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441465344158500 From: Alexander Graf Nitro Enclaves are a confidential compute technology which allows a parent instance to carve out resources from itself and spawn a confidential sibling VM next to itself. Similar to other confidential compute solutions, this sibling is controlled by an underlying vmm, but still has a higher level vmm (QEMU) to implement some of its I/O functionality and lifecycle. Add an accelerator to drive this interface. In combination with follow-on patches to enhance the Nitro Enclaves machine model, this will allow users to run a Nitro Enclave using QEMU. Signed-off-by: Alexander Graf Link: https://lore.kernel.org/r/20260225220807.33092-5-graf@amazon.com Signed-off-by: Paolo Bonzini --- MAINTAINERS | 6 + meson.build | 12 ++ accel/nitro/trace.h | 2 + include/system/hw_accel.h | 1 + include/system/nitro-accel.h | 25 +++ accel/nitro/nitro-accel.c | 284 ++++++++++++++++++++++++++++++++++ accel/stubs/nitro-stub.c | 11 ++ accel/Kconfig | 3 + accel/meson.build | 1 + accel/nitro/meson.build | 3 + accel/nitro/trace-events | 6 + accel/stubs/meson.build | 1 + meson_options.txt | 2 + qemu-options.hx | 8 +- scripts/meson-buildoptions.sh | 3 + 15 files changed, 364 insertions(+), 4 deletions(-) create mode 100644 accel/nitro/trace.h create mode 100644 include/system/nitro-accel.h create mode 100644 accel/nitro/nitro-accel.c create mode 100644 accel/stubs/nitro-stub.c create mode 100644 accel/nitro/meson.build create mode 100644 accel/nitro/trace-events diff --git a/MAINTAINERS b/MAINTAINERS index d781fe59bb1..0458980d434 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -586,6 +586,12 @@ F: include/system/mshv.h F: include/hw/hyperv/hvgdk*.h F: include/hw/hyperv/hvhdk*.h =20 +Nitro Enclaves (native) +M: Alexander Graf +S: Maintained +F: accel/nitro/ +F: include/system/nitro-accel.h + X86 MSHV CPUs M: Magnus Kulke R: Wei Liu diff --git a/meson.build b/meson.build index f3ee08772d4..cbd6d90ce64 100644 --- a/meson.build +++ b/meson.build @@ -302,11 +302,13 @@ accelerator_targets +=3D { 'CONFIG_XEN': xen_targets } if cpu =3D=3D 'aarch64' accelerator_targets +=3D { 'CONFIG_HVF': ['aarch64-softmmu'], + 'CONFIG_NITRO': ['aarch64-softmmu'], 'CONFIG_WHPX': ['aarch64-softmmu'] } elif cpu =3D=3D 'x86_64' accelerator_targets +=3D { 'CONFIG_HVF': ['x86_64-softmmu'], + 'CONFIG_NITRO': ['x86_64-softmmu'], 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'], 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'], 'CONFIG_MSHV': ['x86_64-softmmu'], @@ -880,6 +882,11 @@ if get_option('hvf').allowed() endif endif =20 +nitro =3D not_found +if get_option('nitro').allowed() and host_os =3D=3D 'linux' + accelerators +=3D 'CONFIG_NITRO' +endif + nvmm =3D not_found if host_os =3D=3D 'netbsd' nvmm =3D cc.find_library('nvmm', required: get_option('nvmm')) @@ -921,6 +928,9 @@ endif if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled() error('HVF not available on this platform') endif +if 'CONFIG_NITRO' not in accelerators and get_option('nitro').enabled() + error('NITRO not available on this platform') +endif if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled() error('NVMM not available on this platform') endif @@ -3590,6 +3600,7 @@ if have_system 'accel/hvf', 'accel/kvm', 'accel/mshv', + 'accel/nitro', 'audio', 'backends', 'backends/tpm', @@ -4789,6 +4800,7 @@ endif summary_info =3D {} if have_system summary_info +=3D {'KVM support': config_all_accel.has_key('CONFIG= _KVM')} + summary_info +=3D {'Nitro support': config_all_accel.has_key('CONFIG= _NITRO')} summary_info +=3D {'HVF support': config_all_accel.has_key('CONFIG= _HVF')} summary_info +=3D {'WHPX support': config_all_accel.has_key('CONFIG= _WHPX')} summary_info +=3D {'NVMM support': config_all_accel.has_key('CONFIG= _NVMM')} diff --git a/accel/nitro/trace.h b/accel/nitro/trace.h new file mode 100644 index 00000000000..8c5564725dc --- /dev/null +++ b/accel/nitro/trace.h @@ -0,0 +1,2 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#include "trace/trace-accel_nitro.h" diff --git a/include/system/hw_accel.h b/include/system/hw_accel.h index 628a50e066e..f0c10b6d805 100644 --- a/include/system/hw_accel.h +++ b/include/system/hw_accel.h @@ -17,6 +17,7 @@ #include "system/mshv.h" #include "system/whpx.h" #include "system/nvmm.h" +#include "system/nitro-accel.h" =20 /** * cpu_synchronize_state: diff --git a/include/system/nitro-accel.h b/include/system/nitro-accel.h new file mode 100644 index 00000000000..a93aa6fb00d --- /dev/null +++ b/include/system/nitro-accel.h @@ -0,0 +1,25 @@ +/* + * Nitro Enclaves accelerator - public interface + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef SYSTEM_NITRO_ACCEL_H +#define SYSTEM_NITRO_ACCEL_H + +#include "qemu/accel.h" + +extern bool nitro_allowed; + +static inline bool nitro_enabled(void) +{ + return nitro_allowed; +} + +#define TYPE_NITRO_ACCEL ACCEL_CLASS_NAME("nitro") + +typedef struct NitroAccelState NitroAccelState; +DECLARE_INSTANCE_CHECKER(NitroAccelState, NITRO_ACCEL, + TYPE_NITRO_ACCEL) + +#endif /* SYSTEM_NITRO_ACCEL_H */ diff --git a/accel/nitro/nitro-accel.c b/accel/nitro/nitro-accel.c new file mode 100644 index 00000000000..a1e97a9162e --- /dev/null +++ b/accel/nitro/nitro-accel.c @@ -0,0 +1,284 @@ +/* + * Nitro Enclaves accelerator + * + * Copyright =C2=A9 2026 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: + * Alexander Graf + * + * Nitro Enclaves are a confidential compute technology which + * allows a parent instance to carve out resources from itself + * and spawn a confidential sibling VM next to itself. Similar + * to other confidential compute solutions, this sibling is + * controlled by an underlying vmm, but still has a higher level + * vmm (QEMU) to implement some of its I/O functionality and + * lifecycle. + * + * This accelerator drives /dev/nitro_enclaves to spawn a Nitro + * Enclave. It works in tandem with the nitro_enclaves machine + * which ensures the correct backend devices are available and + * that the initial seed (an EIF file) is loaded at the correct + * offset in memory. + * + * The accel starts the enclave when the machine starts, after + * all device setup is finished. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "qapi/error.h" +#include "qapi/visitor.h" +#include "qemu/module.h" +#include "qemu/rcu.h" +#include "qemu/accel.h" +#include "qemu/guest-random.h" +#include "qemu/main-loop.h" +#include "accel/accel-ops.h" +#include "accel/accel-cpu-ops.h" +#include "accel/dummy-cpus.h" +#include "system/cpus.h" +#include "hw/core/cpu.h" +#include "hw/core/boards.h" +#include "hw/nitro/nitro-vsock-bus.h" +#include "system/ramblock.h" +#include "system/nitro-accel.h" +#include "trace.h" + +#include +#include "standard-headers/linux/nitro_enclaves.h" + +bool nitro_allowed; + +typedef struct NitroAccelState { + AccelState parent_obj; + + int ne_fd; + int enclave_fd; + uint64_t slot_uid; + uint64_t enclave_cid; + bool debug_mode; +} NitroAccelState; + +static int nitro_init_machine(AccelState *as, MachineState *ms) +{ + NitroAccelState *s =3D NITRO_ACCEL(as); + uint64_t slot_uid =3D 0; + int ret; + + s->ne_fd =3D open("/dev/nitro_enclaves", O_RDWR | O_CLOEXEC); + if (s->ne_fd < 0) { + error_report("nitro: failed to open /dev/nitro_enclaves: %s", + strerror(errno)); + return -errno; + } + + ret =3D ioctl(s->ne_fd, NE_CREATE_VM, &slot_uid); + if (ret < 0) { + error_report("nitro: NE_CREATE_VM failed: %s", strerror(errno)); + close(s->ne_fd); + return -errno; + } + s->enclave_fd =3D ret; + s->slot_uid =3D slot_uid; + + return 0; +} + +static int nitro_donate_ram_block(RAMBlock *rb, void *opaque) +{ + NitroAccelState *s =3D opaque; + struct ne_user_memory_region region =3D { + .flags =3D 0, + .memory_size =3D rb->used_length, + .userspace_addr =3D (uint64_t)(uintptr_t)rb->host, + }; + + if (!rb->used_length) { + return 0; + } + + if (ioctl(s->enclave_fd, NE_SET_USER_MEMORY_REGION, ®ion) < 0) { + error_report("nitro: NE_SET_USER_MEMORY_REGION failed for %s " + "(%" PRIu64 " bytes): %s", rb->idstr, rb->used_length, + strerror(errno)); + return -errno; + } + return 0; +} + +/* + * Start the Enclave. At this point memory is set up and the EIF is loaded. + * This function donates memory, adds vCPUs, and starts the enclave. + */ +static void nitro_setup_post(AccelState *as) +{ + MachineState *ms =3D MACHINE(qdev_get_machine()); + NitroAccelState *s =3D NITRO_ACCEL(as); + int nr_cpus =3D ms->smp.cpus; + int i, ret; + struct ne_enclave_start_info start_info =3D { + .flags =3D s->debug_mode ? NE_ENCLAVE_DEBUG_MODE : 0, + .enclave_cid =3D s->enclave_cid, + }; + + ret =3D qemu_ram_foreach_block(nitro_donate_ram_block, s); + if (ret < 0) { + error_report("nitro: failed to donate memory"); + exit(1); + } + + for (i =3D 0; i < nr_cpus; i++) { + uint32_t cpu_id =3D 0; + if (ioctl(s->enclave_fd, NE_ADD_VCPU, &cpu_id) < 0) { + error_report("nitro: NE_ADD_VCPU failed: %s", strerror(errno)); + exit(1); + } + } + + ret =3D ioctl(s->enclave_fd, NE_START_ENCLAVE, &start_info); + if (ret < 0) { + switch (errno) { + case NE_ERR_NO_MEM_REGIONS_ADDED: + error_report("nitro: no memory regions added"); + break; + case NE_ERR_NO_VCPUS_ADDED: + error_report("nitro: no vCPUs added"); + break; + case NE_ERR_ENCLAVE_MEM_MIN_SIZE: + error_report("nitro: memory is below the minimum " + "required size. Try increasing -m"); + break; + case NE_ERR_FULL_CORES_NOT_USED: + error_report("nitro: requires full CPU cores. " + "Try increasing -smp to a multiple of threads " + "per core on this host (e.g. -smp 2)"); + break; + case NE_ERR_NOT_IN_INIT_STATE: + error_report("nitro: not in init state"); + break; + case NE_ERR_INVALID_FLAG_VALUE: + error_report("nitro: invalid flag value for NE_START_ENCLAVE"); + break; + case NE_ERR_INVALID_ENCLAVE_CID: + error_report("nitro: invalid enclave CID"); + break; + default: + error_report("nitro: NE_START_ENCLAVE failed: %s (errno %d)", + strerror(errno), errno); + break; + } + exit(1); + } + + s->enclave_cid =3D start_info.enclave_cid; + trace_nitro_enclave_started(s->enclave_cid); + + /* + * Notify all Nitro vsock bus devices that the enclave has started + * and provide them with the CID for vsock connections. + */ + { + NitroVsockBridge *bridge =3D nitro_vsock_bridge_find(); + Error *err =3D NULL; + + if (bridge) { + nitro_vsock_bridge_start_enclave(bridge, + (uint32_t)s->enclave_cid, &er= r); + if (err) { + error_report_err(err); + exit(1); + } + } + } +} + +/* QOM properties */ + +static bool nitro_get_debug_mode(Object *obj, Error **errp) +{ + return NITRO_ACCEL(obj)->debug_mode; +} + +static void nitro_set_debug_mode(Object *obj, bool value, Error **errp) +{ + NITRO_ACCEL(obj)->debug_mode =3D value; +} + +static void nitro_get_enclave_cid(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + uint64_t val =3D NITRO_ACCEL(obj)->enclave_cid; + visit_type_uint64(v, name, &val, errp); +} + +static void nitro_set_enclave_cid(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + uint64_t val; + if (visit_type_uint64(v, name, &val, errp)) { + NITRO_ACCEL(obj)->enclave_cid =3D val; + } +} + +static void nitro_accel_class_init(ObjectClass *oc, const void *data) +{ + AccelClass *ac =3D ACCEL_CLASS(oc); + ac->name =3D "Nitro"; + ac->init_machine =3D nitro_init_machine; + ac->setup_post =3D nitro_setup_post; + ac->allowed =3D &nitro_allowed; + + object_class_property_add_bool(oc, "debug-mode", + nitro_get_debug_mode, + nitro_set_debug_mode); + object_class_property_set_description(oc, "debug-mode", + "Start enclave in debug mode (enables console output)"); + + object_class_property_add(oc, "enclave-cid", "uint64", + nitro_get_enclave_cid, + nitro_set_enclave_cid, + NULL, NULL); + object_class_property_set_description(oc, "enclave-cid", + "Enclave CID (0 =3D auto-assigned by Nitro)"); +} + +static const TypeInfo nitro_accel_type =3D { + .name =3D TYPE_NITRO_ACCEL, + .parent =3D TYPE_ACCEL, + .instance_size =3D sizeof(NitroAccelState), + .class_init =3D nitro_accel_class_init, +}; +module_obj(TYPE_NITRO_ACCEL); + +static bool nitro_cpus_are_resettable(void) +{ + return false; +} + +static void nitro_accel_ops_class_init(ObjectClass *oc, const void *data) +{ + AccelOpsClass *ops =3D ACCEL_OPS_CLASS(oc); + ops->create_vcpu_thread =3D dummy_start_vcpu_thread; + ops->handle_interrupt =3D generic_handle_interrupt; + ops->cpus_are_resettable =3D nitro_cpus_are_resettable; +} + +static const TypeInfo nitro_accel_ops_type =3D { + .name =3D ACCEL_OPS_NAME("nitro"), + .parent =3D TYPE_ACCEL_OPS, + .class_init =3D nitro_accel_ops_class_init, + .abstract =3D true, +}; +module_obj(ACCEL_OPS_NAME("nitro")); + +static void nitro_type_init(void) +{ + type_register_static(&nitro_accel_type); + type_register_static(&nitro_accel_ops_type); +} + +type_init(nitro_type_init); diff --git a/accel/stubs/nitro-stub.c b/accel/stubs/nitro-stub.c new file mode 100644 index 00000000000..186c8444f86 --- /dev/null +++ b/accel/stubs/nitro-stub.c @@ -0,0 +1,11 @@ +/* + * Nitro accel stubs for QEMU + * + * Copyright =C2=A9 2026 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" + +bool nitro_allowed; diff --git a/accel/Kconfig b/accel/Kconfig index a60f1149238..6d052875ee2 100644 --- a/accel/Kconfig +++ b/accel/Kconfig @@ -16,6 +16,9 @@ config KVM config MSHV bool =20 +config NITRO + bool + config XEN bool select FSDEV_9P if VIRTFS diff --git a/accel/meson.build b/accel/meson.build index 289b7420ffa..7da12b9741f 100644 --- a/accel/meson.build +++ b/accel/meson.build @@ -12,6 +12,7 @@ if have_system subdir('xen') subdir('stubs') subdir('mshv') + subdir('nitro') endif =20 # qtest diff --git a/accel/nitro/meson.build b/accel/nitro/meson.build new file mode 100644 index 00000000000..e01c1bab96d --- /dev/null +++ b/accel/nitro/meson.build @@ -0,0 +1,3 @@ +nitro_ss =3D ss.source_set() +nitro_ss.add(files('nitro-accel.c')) +system_ss.add_all(when: 'CONFIG_NITRO', if_true: nitro_ss) diff --git a/accel/nitro/trace-events b/accel/nitro/trace-events new file mode 100644 index 00000000000..9673eb5aa22 --- /dev/null +++ b/accel/nitro/trace-events @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# See docs/devel/tracing.rst for syntax documentation. + +# nitro-accel.c +nitro_enclave_started(uint64_t cid) "nitro: enclave started, CID=3D%"PRIu64 diff --git a/accel/stubs/meson.build b/accel/stubs/meson.build index 48eccd1b861..5de4a279ff9 100644 --- a/accel/stubs/meson.build +++ b/accel/stubs/meson.build @@ -3,6 +3,7 @@ system_stubs_ss.add(when: 'CONFIG_XEN', if_false: files('xe= n-stub.c')) system_stubs_ss.add(when: 'CONFIG_KVM', if_false: files('kvm-stub.c')) system_stubs_ss.add(when: 'CONFIG_TCG', if_false: files('tcg-stub.c')) system_stubs_ss.add(when: 'CONFIG_HVF', if_false: files('hvf-stub.c')) +system_stubs_ss.add(when: 'CONFIG_NITRO', if_false: files('nitro-stub.c')) system_stubs_ss.add(when: 'CONFIG_NVMM', if_false: files('nvmm-stub.c')) system_stubs_ss.add(when: 'CONFIG_WHPX', if_false: files('whpx-stub.c')) system_stubs_ss.add(when: 'CONFIG_MSHV', if_false: files('mshv-stub.c')) diff --git a/meson_options.txt b/meson_options.txt index 2836156257a..31d5916cfce 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -79,6 +79,8 @@ option('whpx', type: 'feature', value: 'auto', description: 'WHPX acceleration support') option('hvf', type: 'feature', value: 'auto', description: 'HVF acceleration support') +option('nitro', type: 'feature', value: 'auto', + description: 'Nitro acceleration support') option('nvmm', type: 'feature', value: 'auto', description: 'NVMM acceleration support') option('xen', type: 'feature', value: 'auto', diff --git a/qemu-options.hx b/qemu-options.hx index 4043e8ca22b..0da2b4d0348 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -28,7 +28,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ "-machine [type=3D]name[,prop[=3Dvalue][,...]]\n" " selects emulated machine ('-machine help' for list)\n" " property accel=3Daccel1[:accel2[:...]] selects accele= rator\n" - " supported accelerators are kvm, xen, hvf, nvmm, whpx,= mshv or tcg (default: tcg)\n" + " supported accelerators are kvm, xen, hvf, nitro, nvmm= , whpx, mshv or tcg (default: tcg)\n" " vmport=3Don|off|auto controls emulation of vmport (de= fault: auto)\n" " dump-guest-core=3Don|off include guest memory in a co= re dump (default=3Don)\n" " mem-merge=3Don|off controls memory merge support (def= ault: on)\n" @@ -67,7 +67,7 @@ SRST =20 ``accel=3Daccels1[:accels2[:...]]`` This is used to enable an accelerator. Depending on the target - architecture, kvm, xen, hvf, nvmm, whpx, mshv or tcg can be + architecture, kvm, xen, hvf, nitro, nvmm, whpx, mshv or tcg can be available. By default, tcg is used. If there is more than one accelerator specified, the next one is used if the previous one fails to initialize. @@ -228,7 +228,7 @@ ERST =20 DEF("accel", HAS_ARG, QEMU_OPTION_accel, "-accel [accel=3D]accelerator[,prop[=3Dvalue][,...]]\n" - " select accelerator (kvm, xen, hvf, nvmm, whpx, mshv o= r tcg; use 'help' for a list)\n" + " select accelerator (kvm, xen, hvf, nitro, nvmm, whpx,= mshv or tcg; use 'help' for a list)\n" " igd-passthru=3Don|off (enable Xen integrated Intel gr= aphics passthrough, default=3Doff)\n" " kernel-irqchip=3Don|off|split controls accelerated ir= qchip support (default=3Don)\n" " kvm-shadow-mem=3Dsize of KVM shadow MMU in bytes\n" @@ -243,7 +243,7 @@ DEF("accel", HAS_ARG, QEMU_OPTION_accel, SRST ``-accel name[,prop=3Dvalue[,...]]`` This is used to enable an accelerator. Depending on the target - architecture, kvm, xen, hvf, nvmm, whpx, mshv or tcg can be available. + architecture, kvm, xen, hvf, nitro, nvmm, whpx, mshv or tcg can be ava= ilable. By default, tcg is used. If there is more than one accelerator specified, the next one is used if the previous one fails to initialize. diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh index e8edc5252a3..ca5b113119a 100644 --- a/scripts/meson-buildoptions.sh +++ b/scripts/meson-buildoptions.sh @@ -158,6 +158,7 @@ meson_options_help() { printf "%s\n" ' multiprocess Out of process device emulation support' printf "%s\n" ' netmap netmap network backend support' printf "%s\n" ' nettle nettle cryptography support' + printf "%s\n" ' nitro Nitro acceleration support' printf "%s\n" ' numa libnuma support' printf "%s\n" ' nvmm NVMM acceleration support' printf "%s\n" ' opengl OpenGL support' @@ -418,6 +419,8 @@ _meson_option_parse() { --disable-netmap) printf "%s" -Dnetmap=3Ddisabled ;; --enable-nettle) printf "%s" -Dnettle=3Denabled ;; --disable-nettle) printf "%s" -Dnettle=3Ddisabled ;; + --enable-nitro) printf "%s" -Dnitro=3Denabled ;; + --disable-nitro) printf "%s" -Dnitro=3Ddisabled ;; --enable-numa) printf "%s" -Dnuma=3Denabled ;; --disable-numa) printf "%s" -Dnuma=3Ddisabled ;; --enable-nvmm) printf "%s" -Dnvmm=3Denabled ;; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441203; cv=none; d=zohomail.com; s=zohoarc; b=Wob3GRaNzcxsLu8UV80Zmjbe/9IKUiwHnzGfuZdfM/iY6WI1aQUqT8xCwY7McWhgGIoR5/HjHlQwMbN+SnvStVGyyEUHIFxscpDPS7zXOJPPipWI3p7DjXzUh/SOEG7461eaN+8ImQfZByqvSJeYBpj8Lg1C8lWN5NGwbmi8uU8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441203; 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=HxkvqRRnYlF5KbWk2tQ9vyhLJTy/NzSBIyzd6zZjB+M=; b=MeqGZmgxRqLrMP8wFjcXGcs26fZEgL3n2ov6txT7MoCyWQbs6TMYaFqk8mded13wZZU/8Efj9rNWE5GEYnQ6Zzw5zjKYBLomOMvfhj/aCnD63P9GWci95O15TEZ/N2hnm3BLxWbyUBj2uVJaWwBxXvsshtlBlKgF1Jt0WumTOOI= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441203631675.8556403753734; Mon, 2 Mar 2026 00:46:43 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyux-0005TV-6n; Mon, 02 Mar 2026 03:46:21 -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 1vwyu4-0004Wx-VS for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:25 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyu2-0001sA-6R for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:24 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-593-_daOfsgfP7uDJ_k9sSN6HA-1; Mon, 02 Mar 2026 03:45:16 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4836bf1a920so44012345e9.3 for ; Mon, 02 Mar 2026 00:45:16 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b89c99sm270042655e9.15.2026.03.02.00.45.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441121; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HxkvqRRnYlF5KbWk2tQ9vyhLJTy/NzSBIyzd6zZjB+M=; b=hOyhwv9Ym8hF+ZUF4dkBDUYK4yQ3eOjxLoJW4DJxgeRF4UD9gqa5xC/F7JhQeIrHNX6T9a b2yPqbTEhtbhZKKNQO9Igl8GEx5nnPQR8gFZHcyKT+sF0j6s58TlD0r2tLJEffLBbT2bkZ it1/NdVzJXhO+Bam0ptobQZYRuo+87c= X-MC-Unique: _daOfsgfP7uDJ_k9sSN6HA-1 X-Mimecast-MFC-AGG-ID: _daOfsgfP7uDJ_k9sSN6HA_1772441115 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441114; x=1773045914; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HxkvqRRnYlF5KbWk2tQ9vyhLJTy/NzSBIyzd6zZjB+M=; b=DimGMbYcLuXB6BsX3tzeDx9/pDwv9NPpy4VOcjMyZYLaZTBiDvQ+lHn4bTKvQeQNoZ FtRPsd9nMvwKq4XDHcdVPzqcr/YR8vBQNKgStXt4dBxgL5hHTAIBJaMqKLsNJ8eZHt9S dL0A0tWN8C7F2QyBQaiee2hIMvFrLz4F/i2CelZRGQKDndywYMWam3AG7lV5SFA3LkWC d9IQogA+N3y1scoNal0wM8rVCR/0J8RDiM9yC/DNwDygqH4eH/kv/HdiAlRZANCEtDcT j/cUqSztovjwMIuFL87AaxrW23D/HQgQ0vEzHcjhghzVeL/lfsvmWte+Cp0f0m5Y1QT3 bx0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441114; x=1773045914; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=HxkvqRRnYlF5KbWk2tQ9vyhLJTy/NzSBIyzd6zZjB+M=; b=jQr9db9x6GZe1jtbIIkqUbRX0ZhSbsGs9JAFE9TRD18x2HbjYC1KifzB2kpy4WTC3i OUvQ1DFoWPguC2daK7EpZOkFkFVhcBhj9PiS2Mj2Px5ktbUodCpXYI3xpJE2hzsY0DYp g7uwG/pKoycJMBj+ocH+inK/lcm0FVZd1Xfh3+gAQQ2So/H9Myl1XwVkRxAoQ+ANarYZ OPyetRqNUrqGK97SVoB+Hc+0trH0hhK81CBFl5ZcUxDpced0XfeTdE6Am6mFm21ergjj VsfQfd/Ac6MBngLF+MhOLjrTY+9PF/ciWN+t8bURqFbYyNkS7dUnqgEsZDUJNnKOGkT6 qaFA== X-Gm-Message-State: AOJu0YzX1wJA4NE1l8sghMc9Zs+6ASFnBkdmbmz6CrgAruNLu6AeF6MF n++E1clLebNVYU1FINgwrwIri38s+/PD8acRkfAC98XH36xA/m0PmBcbRg6QVkM/uLUoG+aGhrT IUMO+aKgt5kK1uBjXzs3N4yhTHZl7FNXYWhgd/zbZpOWIf5ejOuq1QFkijsLT3xdoTJMByDj4zs ZlyjE29PCovFq9Av3uTADa8PuTx+biev0bHz88LzTV X-Gm-Gg: ATEYQzw1XASnxqzakb8s9Crzveht5vkz+ruKvkUHcI1VgeU757mqXWFJdpFqoEhzGgi gGMXwmqcuOhpn1RJuNh0YaYn37S+1lIpsXwJ9whhAm7xNGSDuqWeh0bPLzqGG5pv2GNDs6tg/hn AZNrFre10yUPiz7SrGyqoBBp7NnUZOu+kT1aRwck8Ze89lI24xZnz34bq613svZAsTbc4dVTJDj WoVVVS3YRInpbA1KFVNe7cJ2K/Zem/3p/5pvqFKGnzaEpvmHGXsuS8jufdBsohuPhJBAOVK3bGM gY+3EspzpzF0/9N87H9V8oZb0zOEWxjwiheEW6M6W4+XH+jVdm8CVicn152LogJ/itqYdJCuK// fNv0TzRZvnrQj9BiGi8oDnVb9OGy3LIkd1IsJGoCJ6ERmUaKCSKeDIR8qyg5DtGp8oX8HfjiA5c a8YDNHuldLEe/17q8/v6GUs1ju1nE= X-Received: by 2002:a05:600c:8b01:b0:477:9b4a:a82 with SMTP id 5b1f17b1804b1-483c9beb38emr216891585e9.35.1772441113676; Mon, 02 Mar 2026 00:45:13 -0800 (PST) X-Received: by 2002:a05:600c:8b01:b0:477:9b4a:a82 with SMTP id 5b1f17b1804b1-483c9beb38emr216890995e9.35.1772441113149; Mon, 02 Mar 2026 00:45:13 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf Subject: [PULL 035/102] hw/nitro/nitro-serial-vsock: Nitro Enclaves vsock console Date: Mon, 2 Mar 2026 09:42:30 +0100 Message-ID: <20260302084338.473368-36-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441205964158500 From: Alexander Graf Nitro Enclaves support a special "debug" mode. When in debug mode, the Nitro Hypervisor provides a vsock port that the parent can connect to to receive serial console output of the Enclave. Add a new nitro-serial-vsock driver that implements short-circuit logic to establish the vsock connection to that port and feed its data into a chardev, so that a machine model can use it as serial device. Signed-off-by: Alexander Graf Link: https://lore.kernel.org/r/20260225220807.33092-6-graf@amazon.com Signed-off-by: Paolo Bonzini --- include/hw/nitro/serial-vsock.h | 24 +++++++ hw/nitro/serial-vsock.c | 123 ++++++++++++++++++++++++++++++++ hw/nitro/Kconfig | 4 ++ hw/nitro/meson.build | 1 + hw/nitro/trace-events | 2 + 5 files changed, 154 insertions(+) create mode 100644 include/hw/nitro/serial-vsock.h create mode 100644 hw/nitro/serial-vsock.c diff --git a/include/hw/nitro/serial-vsock.h b/include/hw/nitro/serial-vsoc= k.h new file mode 100644 index 00000000000..c365880e110 --- /dev/null +++ b/include/hw/nitro/serial-vsock.h @@ -0,0 +1,24 @@ +/* + * Nitro Enclave Serial (vsock) + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_CHAR_NITRO_SERIAL_VSOCK_H +#define HW_CHAR_NITRO_SERIAL_VSOCK_H + +#include "hw/nitro/nitro-vsock-bus.h" +#include "chardev/char-fe.h" +#include "qom/object.h" + +#define TYPE_NITRO_SERIAL_VSOCK "nitro-serial-vsock" +OBJECT_DECLARE_SIMPLE_TYPE(NitroSerialVsockState, NITRO_SERIAL_VSOCK) + +struct NitroSerialVsockState { + NitroVsockDevice parent_obj; + + CharFrontend output; /* chardev to write console output to */ + CharFrontend vsock; /* vsock chardev to enclave console */ +}; + +#endif /* HW_CHAR_NITRO_SERIAL_VSOCK_H */ diff --git a/hw/nitro/serial-vsock.c b/hw/nitro/serial-vsock.c new file mode 100644 index 00000000000..1d56c338049 --- /dev/null +++ b/hw/nitro/serial-vsock.c @@ -0,0 +1,123 @@ +/* + * Nitro Enclave Vsock Serial + * + * Copyright =C2=A9 2026 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: + * Alexander Graf + * + * With Nitro Enclaves in debug mode, the Nitro Hypervisor provides a vsock + * port that the parent can connect to to receive serial console output of + * the Enclave. This driver implements short-circuit logic to establish the + * vsock connection to that port and feed its data into a chardev, so that + * a machine model can use it as serial device. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "qapi/error.h" +#include "chardev/char.h" +#include "chardev/char-fe.h" +#include "hw/core/qdev-properties.h" +#include "hw/core/qdev-properties-system.h" +#include "hw/nitro/serial-vsock.h" +#include "trace.h" + +#define CONSOLE_PORT_START 10000 +#define VMADDR_CID_HYPERVISOR_STR "0" + +static int nitro_serial_vsock_can_read(void *opaque) +{ + NitroSerialVsockState *s =3D opaque; + + /* Refuse vsock input until the output backend is ready */ + return qemu_chr_fe_backend_open(&s->output) ? 4096 : 0; +} + +static void nitro_serial_vsock_read(void *opaque, const uint8_t *buf, int = size) +{ + NitroSerialVsockState *s =3D opaque; + + /* Forward all vsock data to the output chardev */ + qemu_chr_fe_write_all(&s->output, buf, size); +} + +static void nitro_serial_vsock_event(void *opaque, QEMUChrEvent event) +{ + /* No need to action on connect/disconnect events, but trace for debug= */ + trace_nitro_serial_vsock_event(event); +} + +static void nitro_serial_vsock_enclave_started(NitroVsockDevice *dev, + uint32_t enclave_cid, + Error **errp) +{ + NitroSerialVsockState *s =3D NITRO_SERIAL_VSOCK(dev); + uint32_t port =3D enclave_cid + CONSOLE_PORT_START; + g_autofree char *chardev_id =3D NULL; + Chardev *chr; + ChardevBackend *backend; + ChardevSocket *sock; + + /* + * We know the Enclave CID to connect to now. Create a vsock + * client chardev that connects to the Enclave's console. + */ + chardev_id =3D g_strdup_printf("nitro-console-%u", enclave_cid); + + backend =3D g_new0(ChardevBackend, 1); + backend->type =3D CHARDEV_BACKEND_KIND_SOCKET; + sock =3D backend->u.socket.data =3D g_new0(ChardevSocket, 1); + sock->addr =3D g_new0(SocketAddressLegacy, 1); + sock->addr->type =3D SOCKET_ADDRESS_TYPE_VSOCK; + sock->addr->u.vsock.data =3D g_new0(VsockSocketAddress, 1); + sock->addr->u.vsock.data->cid =3D g_strdup(VMADDR_CID_HYPERVISOR_STR); + sock->addr->u.vsock.data->port =3D g_strdup_printf("%u", port); + sock->server =3D false; + sock->has_server =3D true; + + chr =3D qemu_chardev_new(chardev_id, TYPE_CHARDEV_SOCKET, + backend, NULL, errp); + if (!chr) { + return; + } + + if (!qemu_chr_fe_init(&s->vsock, chr, errp)) { + return; + } + + qemu_chr_fe_set_handlers(&s->vsock, + nitro_serial_vsock_can_read, + nitro_serial_vsock_read, + nitro_serial_vsock_event, + NULL, s, NULL, true); +} + +static const Property nitro_serial_vsock_props[] =3D { + DEFINE_PROP_CHR("chardev", NitroSerialVsockState, output), +}; + +static void nitro_serial_vsock_class_init(ObjectClass *oc, const void *dat= a) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + NitroVsockDeviceClass *ndc =3D NITRO_VSOCK_DEVICE_CLASS(oc); + + device_class_set_props(dc, nitro_serial_vsock_props); + ndc->enclave_started =3D nitro_serial_vsock_enclave_started; +} + +static const TypeInfo nitro_serial_vsock_info =3D { + .name =3D TYPE_NITRO_SERIAL_VSOCK, + .parent =3D TYPE_NITRO_VSOCK_DEVICE, + .instance_size =3D sizeof(NitroSerialVsockState), + .class_init =3D nitro_serial_vsock_class_init, +}; + +static void nitro_serial_vsock_register(void) +{ + type_register_static(&nitro_serial_vsock_info); +} + +type_init(nitro_serial_vsock_register); diff --git a/hw/nitro/Kconfig b/hw/nitro/Kconfig index 767472cb2c6..ce24c09c218 100644 --- a/hw/nitro/Kconfig +++ b/hw/nitro/Kconfig @@ -1,2 +1,6 @@ config NITRO_VSOCK_BUS bool + +config NITRO_SERIAL_VSOCK + bool + depends on NITRO_VSOCK_BUS diff --git a/hw/nitro/meson.build b/hw/nitro/meson.build index 7e2807f1379..76399d4265d 100644 --- a/hw/nitro/meson.build +++ b/hw/nitro/meson.build @@ -1 +1,2 @@ system_ss.add(when: 'CONFIG_NITRO_VSOCK_BUS', if_true: files('nitro-vsock-= bus.c')) +system_ss.add(when: 'CONFIG_NITRO_SERIAL_VSOCK', if_true: files('serial-vs= ock.c')) diff --git a/hw/nitro/trace-events b/hw/nitro/trace-events index 9ccc5790487..20617a024a9 100644 --- a/hw/nitro/trace-events +++ b/hw/nitro/trace-events @@ -1,2 +1,4 @@ # See docs/devel/tracing.rst for syntax documentation. =20 +# serial-vsock.c +nitro_serial_vsock_event(int event) "event %d" --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441794; cv=none; d=zohomail.com; s=zohoarc; b=fdSbYmXqrl0lpq/yVjn7+fsvFMCtBVA4WLJPe/QzJkayB+9fUDbOm1ushUySeCccVTtv1/wVva8SIMeRj2pxgjML5mZ3GtFzOl/oPVMsvyIgAXiAzErnfEk+0EFzzaPmmRRf909zofjlSOXylI2TPn+FFbL3uQqT4L+BYeIC2Xk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441794; 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=5cg9iNAoCO+mSrl7FtUY4PQzOZ1uktu6y7WfAOJhKwI=; b=eqVjb7hxpFVPeTjU10MY64m/7Sda3/eVDLuOAKVhtf3f3zUmq3NDfthhMIk1NdH7msgbykuTysJpiXnd2zcRc89lwXrX5jZG5d6fBSx1B/svlqAI7BZ3c5L0QgWR0xcsfoxmPMF9fTb7ZdF5PsrI3nsT/3HsRJ/RmWTZy8F2xmc= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441794726677.0811349484817; Mon, 2 Mar 2026 00:56:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyuI-0004iX-OM; Mon, 02 Mar 2026 03:45:48 -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 1vwyu4-0004WT-Uv for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:25 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyu1-0001s8-OM for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:24 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-64-39_OQ360PJKEXnjG-ptSQw-1; Mon, 02 Mar 2026 03:45:19 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4836cc0b38eso46190415e9.2 for ; Mon, 02 Mar 2026 00:45:19 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b841absm305835035e9.13.2026.03.02.00.45.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441120; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5cg9iNAoCO+mSrl7FtUY4PQzOZ1uktu6y7WfAOJhKwI=; b=PjGX5MNg+mQPLqGs02q/YwScty8Y0QY1WT/yaPPUDcIymx/O259/r3jbk0ESYcd5l5YUaa EEmyvrLm4HdCdoWzyaP751U598hL1j1AZPw4cnlGXYC+kDFBnrvPq0wbZVVLN4ANeHoSnH OHAMOYlv3Yy327r3lzzF48ssCFBwC58= X-MC-Unique: 39_OQ360PJKEXnjG-ptSQw-1 X-Mimecast-MFC-AGG-ID: 39_OQ360PJKEXnjG-ptSQw_1772441118 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441117; x=1773045917; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5cg9iNAoCO+mSrl7FtUY4PQzOZ1uktu6y7WfAOJhKwI=; b=Sog9covcUy0jomS+0+5aJezTfKWaO++ud0TSUILYaXOOM40dizQXmAoq6EuwJAnmoF Wu8RS2/d2d7fBe2/1eGSOel3jOcthnHw/t7NZMpbqNOb9H4b2r58yNjcgIUqmNfaavm6 K+sYHITy086T/UhzdsGUpKwkqOvvcUtKXJbHJ0+yj+lPd3cGaaKDFbIGlCN3smgQy4Ty 735K7jIeBgM50ga/PUVdfhdLRhi42OVqyaNc2KDm7PqFmN6ckn5YPVqeAG/JEhsu3V7c v5D0N/qMvxuiElrDvounYa1AZntTFmvExJDPsx9WRj8xlX8ofZpCl3djVVBaMzp9Hs28 gNQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441117; x=1773045917; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5cg9iNAoCO+mSrl7FtUY4PQzOZ1uktu6y7WfAOJhKwI=; b=FvsY9GI/Je6p2XWQ4bU1wXEPnLZ52F37GvSFqVsukW8Z+NehKD5N8z0WnHCfomynSm +Ca1fH/GUGt6+WXLXJGztNVgO4GPdBgBIwH/qzHO3rZC1JgzrY1JGgOwnEifzDTumHcg Pcb/tCLIBoGWRmPXp2f7NzA8vRf38BgeWNmaMWupBcFdI0B6/KoKy2xWpBtN9sv0dLx9 nuZrGCWY3prsDhPBr6zve1cxst2h2wx2cSSKHXaGW1dTNrjjVPqKHgiBRzxrR19p+xN9 kMnIoVschWUHmGiRWvztO7SXWEDn7Z/oSg2GRZQZbMySE83qbBeBxoNVnV0L5oNO33KB RCpQ== X-Gm-Message-State: AOJu0YwvRmrXS8Rh3Yx0XDIGTlxi4JM7qpwv2o7UFkhpIpKolWX54kGw sTLZM/i6SpAxa+wZAOM1fwlKOc+DkQDsfyoeB5d5cAFcKoE+qEVH/ZnsjrVTlRr4cNIdoeymc+a Hh/p4wfbHy9/pjOpOYVd6ZI7RupJ+4yc31+R+SSaRSzAL1NxPG2F/oy6yI3sk16CoitECpv6ICf jK59xZHZZSUJYFpVzWibwI1VTvxSbtaQXTNvvoySuY X-Gm-Gg: ATEYQzxLjF7NrO/vdzHtE5rX4+Px5dsO90hZJnxB5kRNy69qKqPjUhmB+Lv5FHKgS4r BM7teiHTH+RyRFPo7nciXBo8Q1bAbs5YKYEBVKIhT4x53Rxk//hGS2cUXGFmjusxEc4Gn+MOwEe 7pQvT2p/8GD3qN4aDLq6mB2OoVdCNl8kzKd2zWaA1yMtWOrSJ7CYDprHMHiRzZQ2uXjlgNU0zqy FJE1Mf3qF5/FDPeC2qAL9QlhJSqOLLDlnPAijU4mZ9ytEPGOCwMfk5wVado4hwYyDj8K/yZINb3 Q8uCwNp1MMXEIwpgOmIZKbyrxq8sYHsP0wVle4ifJQtK/lBHUAb5lTYvgBA5W1J+ViQVJX+nRMR H7iyc50mN4Zj3PyIV1b/jRiiwRI7aFbReG82DrzUZ1ylVDJGhH1LfcTdFQxVoS3pTD4hJtoP2Hi je5C/ZLoMwhc+1jd5XYlr1IvPgp9U= X-Received: by 2002:a05:600c:621b:b0:47e:e076:c7a5 with SMTP id 5b1f17b1804b1-483c9babe69mr198708165e9.11.1772441117238; Mon, 02 Mar 2026 00:45:17 -0800 (PST) X-Received: by 2002:a05:600c:621b:b0:47e:e076:c7a5 with SMTP id 5b1f17b1804b1-483c9babe69mr198707675e9.11.1772441116677; Mon, 02 Mar 2026 00:45:16 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf Subject: [PULL 036/102] hw/nitro: Introduce Nitro Enclave Heartbeat device Date: Mon, 2 Mar 2026 09:42:31 +0100 Message-ID: <20260302084338.473368-37-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441797099158500 From: Alexander Graf Nitro Enclaves expect the parent instance to host a vsock heartbeat listener at port 9000. To host a Nitro Enclave with the nitro accel in QEMU, add such a heartbeat listener as device model, so that the machine can easily instantiate it. Signed-off-by: Alexander Graf Link: https://lore.kernel.org/r/20260225220807.33092-7-graf@amazon.com Signed-off-by: Paolo Bonzini --- include/hw/nitro/heartbeat.h | 24 ++++++++ hw/nitro/heartbeat.c | 115 +++++++++++++++++++++++++++++++++++ hw/nitro/Kconfig | 4 ++ hw/nitro/meson.build | 1 + hw/nitro/trace-events | 4 ++ 5 files changed, 148 insertions(+) create mode 100644 include/hw/nitro/heartbeat.h create mode 100644 hw/nitro/heartbeat.c diff --git a/include/hw/nitro/heartbeat.h b/include/hw/nitro/heartbeat.h new file mode 100644 index 00000000000..6b9271a47df --- /dev/null +++ b/include/hw/nitro/heartbeat.h @@ -0,0 +1,24 @@ +/* + * Nitro Heartbeat device + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_MISC_NITRO_HEARTBEAT_H +#define HW_MISC_NITRO_HEARTBEAT_H + +#include "hw/nitro/nitro-vsock-bus.h" +#include "chardev/char-fe.h" +#include "qom/object.h" + +#define TYPE_NITRO_HEARTBEAT "nitro-heartbeat" +OBJECT_DECLARE_SIMPLE_TYPE(NitroHeartbeatState, NITRO_HEARTBEAT) + +struct NitroHeartbeatState { + NitroVsockDevice parent_obj; + + CharFrontend vsock; /* vsock server chardev for heartbeat */ + bool done; +}; + +#endif /* HW_MISC_NITRO_HEARTBEAT_H */ diff --git a/hw/nitro/heartbeat.c b/hw/nitro/heartbeat.c new file mode 100644 index 00000000000..dc413232667 --- /dev/null +++ b/hw/nitro/heartbeat.c @@ -0,0 +1,115 @@ +/* + * Nitro Enclave Heartbeat device + * + * Copyright =C2=A9 2026 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: + * Alexander Graf + * + * The Nitro Enclave init process sends a heartbeat byte (0xB7) to + * CID 3 (parent) port 9000 on boot to signal it reached initramfs. + * The parent must accept the connection, read the byte, and echo it + * back. If the enclave init cannot reach the listener, it exits. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "chardev/char.h" +#include "chardev/char-fe.h" +#include "hw/nitro/heartbeat.h" +#include "trace.h" + +#define HEARTBEAT_PORT 9000 +#define VMADDR_CID_ANY_STR "4294967295" + +static int nitro_heartbeat_can_read(void *opaque) +{ + NitroHeartbeatState *s =3D opaque; + + /* One-shot protocol: stop reading after the first heartbeat */ + return s->done ? 0 : 1; +} + +static void nitro_heartbeat_read(void *opaque, const uint8_t *buf, int siz= e) +{ + NitroHeartbeatState *s =3D opaque; + + if (s->done || size < 1) { + return; + } + + /* Echo the heartbeat byte back and disconnect */ + qemu_chr_fe_write_all(&s->vsock, buf, 1); + s->done =3D true; + qemu_chr_fe_deinit(&s->vsock, true); + + trace_nitro_heartbeat_done(); +} + +static void nitro_heartbeat_event(void *opaque, QEMUChrEvent event) +{ + trace_nitro_heartbeat_event(event); +} + +static void nitro_heartbeat_realize(DeviceState *dev, Error **errp) +{ + NitroHeartbeatState *s =3D NITRO_HEARTBEAT(dev); + g_autofree char *chardev_id =3D NULL; + Chardev *chr; + ChardevBackend *backend; + ChardevSocket *sock; + + chardev_id =3D g_strdup_printf("nitro-heartbeat"); + + backend =3D g_new0(ChardevBackend, 1); + backend->type =3D CHARDEV_BACKEND_KIND_SOCKET; + sock =3D backend->u.socket.data =3D g_new0(ChardevSocket, 1); + sock->addr =3D g_new0(SocketAddressLegacy, 1); + sock->addr->type =3D SOCKET_ADDRESS_TYPE_VSOCK; + sock->addr->u.vsock.data =3D g_new0(VsockSocketAddress, 1); + sock->addr->u.vsock.data->cid =3D g_strdup(VMADDR_CID_ANY_STR); + sock->addr->u.vsock.data->port =3D g_strdup_printf("%u", HEARTBEAT_POR= T); + sock->server =3D true; + sock->has_server =3D true; + sock->wait =3D false; + sock->has_wait =3D true; + + chr =3D qemu_chardev_new(chardev_id, TYPE_CHARDEV_SOCKET, + backend, NULL, errp); + if (!chr) { + return; + } + + if (!qemu_chr_fe_init(&s->vsock, chr, errp)) { + return; + } + + qemu_chr_fe_set_handlers(&s->vsock, + nitro_heartbeat_can_read, + nitro_heartbeat_read, + nitro_heartbeat_event, + NULL, s, NULL, true); +} + +static void nitro_heartbeat_class_init(ObjectClass *oc, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + + dc->realize =3D nitro_heartbeat_realize; +} + +static const TypeInfo nitro_heartbeat_info =3D { + .name =3D TYPE_NITRO_HEARTBEAT, + .parent =3D TYPE_NITRO_VSOCK_DEVICE, + .instance_size =3D sizeof(NitroHeartbeatState), + .class_init =3D nitro_heartbeat_class_init, +}; + +static void nitro_heartbeat_register(void) +{ + type_register_static(&nitro_heartbeat_info); +} + +type_init(nitro_heartbeat_register); diff --git a/hw/nitro/Kconfig b/hw/nitro/Kconfig index ce24c09c218..d3fbc7b683c 100644 --- a/hw/nitro/Kconfig +++ b/hw/nitro/Kconfig @@ -4,3 +4,7 @@ config NITRO_VSOCK_BUS config NITRO_SERIAL_VSOCK bool depends on NITRO_VSOCK_BUS + +config NITRO_HEARTBEAT + bool + depends on NITRO_VSOCK_BUS diff --git a/hw/nitro/meson.build b/hw/nitro/meson.build index 76399d4265d..381c1ee6c15 100644 --- a/hw/nitro/meson.build +++ b/hw/nitro/meson.build @@ -1,2 +1,3 @@ system_ss.add(when: 'CONFIG_NITRO_VSOCK_BUS', if_true: files('nitro-vsock-= bus.c')) system_ss.add(when: 'CONFIG_NITRO_SERIAL_VSOCK', if_true: files('serial-vs= ock.c')) +system_ss.add(when: 'CONFIG_NITRO_HEARTBEAT', if_true: files('heartbeat.c'= )) diff --git a/hw/nitro/trace-events b/hw/nitro/trace-events index 20617a024a9..311ab78e699 100644 --- a/hw/nitro/trace-events +++ b/hw/nitro/trace-events @@ -2,3 +2,7 @@ =20 # serial-vsock.c nitro_serial_vsock_event(int event) "event %d" + +# heartbeat.c +nitro_heartbeat_event(int event) "event %d" +nitro_heartbeat_done(void) "enclave heartbeat received" --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441917; cv=none; d=zohomail.com; s=zohoarc; b=WGiNC+rP4wJCQO8xPfR5BiU1sQ9zyVT1q2ozXlYflR53Oe8KPn3rxVcFZQjU9Po06A0DUrWrYaIYK3wGI30PhEJU7mr7BalRQmi4Un+ZI5Pwv6TEqD8sgFUhkf3dxNrJOhjn4bEhTwqpBosnm27sDvlaVZNe3uQBH9eSMIlhbfY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441917; 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=DpvlDRKo/WcstLe6ivw1YblVzY0NV6VzUPEXuT9Sw70=; b=k5PUDd3PBJP7YH8C1PdkmnAWDhMV/Nwivey6CxBz93vBZEQT8/KIBzbzZg2Ney2Pn2JqxWJe1TUw+rJGfXyaDWWR5TNLrY0tl6kYLxrHrMeom9+CXDhL9z77V9GX+3Pm3AjhwRopb8nBJqG7X5dNLzUcYBnEE8Yr8hKD9oau7gM= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177244191784248.34514481289102; Mon, 2 Mar 2026 00:58:37 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyut-0005JG-Ce; Mon, 02 Mar 2026 03:46:15 -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 1vwyu9-0004hu-SE for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:33 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyu4-0001sx-Os for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:26 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-107-ZGWgjcEsNbOi8Kmm_VVgjA-1; Mon, 02 Mar 2026 03:45:21 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-48071615686so32871745e9.1 for ; Mon, 02 Mar 2026 00:45:21 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b770e7sm288907155e9.9.2026.03.02.00.45.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441123; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DpvlDRKo/WcstLe6ivw1YblVzY0NV6VzUPEXuT9Sw70=; b=fiy2IAOoFsTS3nmJ2jfXgOe22rA0KjfEBqCKkNl68QFuacsm1LKLWA0E6BUoMaNtTdPm6X CFL9Bh3F7aKRQWJegBH2q3PKhCpBX+60avmLJtYfTIKgx7TyS6jWnJdtZmekj7A+qtDnmR C7m4gICh0oEqfBGYtseoikl89P4oA0U= X-MC-Unique: ZGWgjcEsNbOi8Kmm_VVgjA-1 X-Mimecast-MFC-AGG-ID: ZGWgjcEsNbOi8Kmm_VVgjA_1772441121 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441120; x=1773045920; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DpvlDRKo/WcstLe6ivw1YblVzY0NV6VzUPEXuT9Sw70=; b=looCP+ug9a6mSt/wZFlFAfag/xlD46pMRy5dY3rGrgOy01NUWIS+ge0BztirY1zzS1 NZFqoa5uXuHDbh+73OvhfRdMEOXqp3RrRoPq3JTwIVFG/WJnFq1e8pY8lPA1ncft/HO8 zDCqMY0gB5DAXdalPk2kgoAcCNa0BCUygg2DJVxnquRZOsNv0958v0VcUS7R8XCHpV8K FcJWgcclXO5Da+IkWuHmi4B82ssRLxq9PBn8qmV22yqGJJG57LSDQM8Z22cqJgt8EiSh LHjggvkm3rkXzoZVAgVdN6B5KKPBf4u/Rcs6GFfSJ6reL1lMkZVAZnexXXAlR46tkGam /tdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441120; x=1773045920; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=DpvlDRKo/WcstLe6ivw1YblVzY0NV6VzUPEXuT9Sw70=; b=B/l0IIqSxrd+drVnEbTmDOAa3w+qhRFTiWVqfaGUPd5yO4VtDC6mSFTWIb4SJ83n2m +WlEp6t4Z+y9Rh1RNleaBJTaHAApNoI63OJjnctCSdQ+LxfVND+ulT7Tlb69Ijer9p3d YugqobyV5y2xw0MLWnvu6Lz+j/NgMNQipenxJcTSEx5b+gc5bHUOU1cTrB26H19klEE4 U8sjpyHzC6FJXzv5aYF3XrrAwj3J46dQreypCgkFklG+aY7EtJ08o1ka/l/cr/Z+npmC xmjvDRyIbSp97g9KRhgRGVYuoRkYT+kJO5vloeZ1Ggf5Um2IzmMTvjEZMAa0qMzy8Ats 6YXQ== X-Gm-Message-State: AOJu0YysJYn9VM9JZLPmKI3OlUz6HgcaIYkgv5yDQ5MlXhlugVXxnvTy ZMPZvwxwq8wo6JsT4Rs266yd3WKDEQadzqDtJ2J4c9/ZUN6bmhFkOXVW40YL7OmKNwvrmYLhjTo hO1odnoxklTDd3T0rd9883pOy3qhuUeTxkQJCKrzXMkf5Rm2B+XCcpzT1+G5AGQdhGP/w8NNdNT RrIz+PWMIZsSQroQgsKeX4LzUyQE1rLWLpU+310SCz X-Gm-Gg: ATEYQzwwOoGz2yrY0abAUh+itWXP6PZJ/CK2aNsim42d8bSAiwJn1qCryZ3hPGFCpQx LlvvzL9Pam91l41TavWedaMnnHzhu7CeZ2VC2N16ecD0yQkLkY6oj0dLqtYSR9nrkLD0Z4bs1LT NxPIvIA3z5ioOZQ/wm1L8s8ghbcAH7402S2OCBBQStTqpf73RTwU7V7W/Yi39dna7LmVoI2pMb4 Dr6qBhDf75o+mfOHJy+fPJyQ8TgClYQq1XXaOoeiGbZnKFxtmhOnq5CA32Gnw/B1YZkOoOfRCUg 2XVUsONLa4hTp35L0yZc1P+ZD4H8S4bCY7gFHy3G1lFPlvSv9ZawLnAj1DC2CO36XUJ9untdYqQ 95WhlQz2Hwd3tzVKSzxg4tadTjsJrU6sXXigtrr4HjMImKqBzkmQlIvXw7C7mByNZhfieY79vLZ eWPu/CYA0UEOQPdmOmpx/6Od/h4Xc= X-Received: by 2002:a05:600c:8289:b0:483:6a8d:b2fc with SMTP id 5b1f17b1804b1-483c9babda5mr184977005e9.8.1772441120023; Mon, 02 Mar 2026 00:45:20 -0800 (PST) X-Received: by 2002:a05:600c:8289:b0:483:6a8d:b2fc with SMTP id 5b1f17b1804b1-483c9babda5mr184976575e9.8.1772441119434; Mon, 02 Mar 2026 00:45:19 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf Subject: [PULL 037/102] target/arm/cpu64: Allow -host for nitro Date: Mon, 2 Mar 2026 09:42:32 +0100 Message-ID: <20260302084338.473368-38-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441919436158500 Content-Type: text/plain; charset="utf-8" From: Alexander Graf The nitro accel does not actually make use of CPU emulation or details: It always uses the host CPU regardless of configuration. Machines for the nitro accel select the host CPU type as default to have a clear statement of the above and to have a unified cpu type across all supported architectures. The arm64 logic on Linux currently only allows -cpu host for KVM based virtual machines. Add a special case for nitro so that when the nitro accel is active, it allows use of the host cpu type. Signed-off-by: Alexander Graf Link: https://lore.kernel.org/r/20260225220807.33092-8-graf@amazon.com Signed-off-by: Paolo Bonzini --- target/arm/cpu64.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c index 58215216c55..d6feba220e8 100644 --- a/target/arm/cpu64.c +++ b/target/arm/cpu64.c @@ -813,6 +813,14 @@ static void aarch64_a53_initfn(Object *obj) static void aarch64_host_initfn(Object *obj) { ARMCPU *cpu =3D ARM_CPU(obj); + +#if defined(CONFIG_NITRO) + if (nitro_enabled()) { + /* The nitro accel uses -cpu host, but does not actually consume i= t */ + return; + } +#endif + #if defined(CONFIG_KVM) kvm_arm_set_cpu_features_from_host(cpu); aarch64_add_sve_properties(obj); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441205; cv=none; d=zohomail.com; s=zohoarc; b=McIiihl88Mqz9T6dYaixLviSHejvbscmBax75uJzKWKk1fjr1D+GRMbIbE3pgZYdDpwtCjvZ7mWZK9qy/Pq9fXOPOA/M0B7kDXO2lFb2eqbJfS58PxxXJmf1TP9El4p1iqXqzK6R7fpPeJcEkBfv8k6/k5nLQH44oEmOb+A8QBU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441205; 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=6kNPuPLo+kDu65wNHg/Ys8gL0oDKZMPcdkl4aAZoh3w=; b=ag56XJ9q6Vl3Ct/IR5akXOnT8I38QvwEv9wr4QR+uUTRgOUZiDeUGSQOK2n6PR6yuiIa0arnCxUrrnOkd0EMTdUH+RAamZATbMJSAl6Zmz8XD9FYofQmxltlkMw4t0GyTAnY79Rf3y23lLC3vdVkASkVTeY5pfqGh7CIX0MICfw= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441204907927.37541081017; Mon, 2 Mar 2026 00:46:44 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvB-0005rP-7T; Mon, 02 Mar 2026 03:46:35 -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 1vwyuI-0004wl-Ua for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyu8-0001tS-6k for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:33 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-637--vYheo4kOPWIBu-qx0vv0w-1; Mon, 02 Mar 2026 03:45:24 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4836cf00787so48181225e9.1 for ; Mon, 02 Mar 2026 00:45:24 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c765c67sm27722423f8f.32.2026.03.02.00.45.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441125; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6kNPuPLo+kDu65wNHg/Ys8gL0oDKZMPcdkl4aAZoh3w=; b=g4jFgN3G6eJFInyh0bddZsFosBnKhsn7VjlL69646b/l2U1Y31g5uMPxkdi0lcJNxQ9ihG MwBt7SkTGf1h5BIz728gDbHXZbQjCfSq+Hs1GTl8M4/GVsCZ1C0bh5008xLFevRwUrOHD6 fHIpVMYz/uRjWRntbqSUtQMRTolquAM= X-MC-Unique: -vYheo4kOPWIBu-qx0vv0w-1 X-Mimecast-MFC-AGG-ID: -vYheo4kOPWIBu-qx0vv0w_1772441123 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441122; x=1773045922; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=6kNPuPLo+kDu65wNHg/Ys8gL0oDKZMPcdkl4aAZoh3w=; b=CycVzrnsyEMtXthMv0ObKP7cjULg2zCytODMVjTEmaHDS5e61KTC/EqEPYhqExQZcr W07gC05jNSTGvD+cnfUPsblLtFZ7V2v6bOBWm7PC4pzeWhxN1sAp7TzLvAZxW7Ublgwn XJE1qD7NAaokKV3RYJAvwOyrJKvZIu8zAjBbFRw/c37NfExL+Qo53HeS0M5RLorgasQm YR0ipvdpe9BwkACiB65P0yFo7AxSaMTkkC2F6D5gbIPzKQ/vmPUBw4LT+6j9Gb+cnla7 cMDk7J2rOovqNp4Xw7ypu8w6u/PldQk03+jZSHi+FsENXZs34/g/FnNBo8PbK5ZlTFNM 15RA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441122; x=1773045922; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=6kNPuPLo+kDu65wNHg/Ys8gL0oDKZMPcdkl4aAZoh3w=; b=RMNXiHq22IMLYgMdSWtbiQAZNPVpa5C8waSj5PzBPsvNu3n8PlzsVuM9pSGHi0lYPj xb2nxgNwgX/2U2dssduMwDHAH0g4xODoBwwrAOHPs3aKjxrIj+OXFe2/mJXFq+6JO0C0 YFJO04MtWcmzBRIz9WTH3wSwHvVGjGqjyHJHrJ/iL0KF4ehPUJWLatkULqvJ03weLnNO DEqkXOefpkseEVMvog8xLrSZ1rjlPJ20KDkEyZUYzBs9G+dMwAts5kvhTRVrOIgYkyHJ z37Sw0xXgnJL6rRU9Kp7rmaIVId6M6eWDB3AjxvN4Me/kJ018g27GzRbxJgtIlL5G/7+ BPrQ== X-Gm-Message-State: AOJu0Ywnb41OinLzXXDo6DyR+tIDD0BP5AJo3uibpkT6ChemMqopj/3q 1jDEQBdfJb3ATgxxGLmmfj9Fz6pUJ8tBH5A3GJ6eZEwyCIoB7eixOt+DpjqVf/qU/ow7f3pi3SB 4VwxC0n7mzO33CRvaZYUcH9/NkW9AA0ombZ/rqUafMwSwioo6DQUJjBSmUW33Dr4OJ3xKVpey/3 WpfF3XDVBGp/BuzAmCIN6RoH4oQ7NZ+3JnccvXxEFH X-Gm-Gg: ATEYQzzmOAsjhJ1Qpjwtju74sX5JYUXXyBm+s1EzqyQ+s8M6FC0Fi54Te4w2JvKxnuI W6qr17GSyC47sdMXo0Wh/e0q5w/2xfp/yj0BtIc9xEL/Opy03Kd5zgO7Lo7RdbTYtuyHqQTAG3W TUovFlE9AuSX7Nog5Zc3U53ZR46jTHEgxHhMZcnSn3h9GL9GdDlF1CuPQ0jil4JDIRjDDByYaQb vdJgz/y1LrwiwkT3nGyNOBrS+F1PEBE6h/oXrUEG48PodSI3nbv7tZUd6uX6TnXKVYpUQ72So6S VaD44lhY7ZaQsXsOcKONmfV6EZ8tpqKbmWyMCtv9FZE8jPdvRMSd9wcRlXTC8VBb1iUTO0TAjCc q/0bJxBCRJuN8zR5azyPzf81NkOqlocoLehgJsWzGm0q4Hvhr/HLMwipfvy0FpVaLboXkjSGFED HHc+kQKf9uvqsjwS0s7NOs3E78OlI= X-Received: by 2002:a05:600c:8183:b0:483:7eeb:4558 with SMTP id 5b1f17b1804b1-483c33c1e04mr258789845e9.2.1772441122266; Mon, 02 Mar 2026 00:45:22 -0800 (PST) X-Received: by 2002:a05:600c:8183:b0:483:7eeb:4558 with SMTP id 5b1f17b1804b1-483c33c1e04mr258789225e9.2.1772441121715; Mon, 02 Mar 2026 00:45:21 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf Subject: [PULL 038/102] hw/nitro: Add nitro machine Date: Mon, 2 Mar 2026 09:42:33 +0100 Message-ID: <20260302084338.473368-39-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441207997158500 From: Alexander Graf Add a machine model to spawn a Nitro Enclave. Unlike the existing -M nitro-enclave, this machine model works exclusively with the -accel nitro accelerator to drive real Nitro Enclave creation. It supports memory allocation, number of CPU selection, both x86_64 as well as aarch64, implements the Enclave heartbeat logic and debug serial console. To use it, create an EIF file and run $ qemu-system-x86_64 -accel nitro,debug-mode=3Don -M nitro -nographic \ -kernel test.eif or $ qemu-system-aarch64 -accel nitro,debug-mode=3Don -M nitro -nographic \ -kernel test.eif Signed-off-by: Alexander Graf Link: https://lore.kernel.org/r/20260225220807.33092-9-graf@amazon.com Signed-off-by: Paolo Bonzini --- include/hw/nitro/machine.h | 20 +++++ hw/nitro/machine.c | 161 +++++++++++++++++++++++++++++++++++++ tests/qtest/libqtest.c | 1 + hw/nitro/Kconfig | 8 ++ hw/nitro/meson.build | 1 + 5 files changed, 191 insertions(+) create mode 100644 include/hw/nitro/machine.h create mode 100644 hw/nitro/machine.c diff --git a/include/hw/nitro/machine.h b/include/hw/nitro/machine.h new file mode 100644 index 00000000000..d78ba7d6dc3 --- /dev/null +++ b/include/hw/nitro/machine.h @@ -0,0 +1,20 @@ +/* + * Nitro Enclaves (accel) machine + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef HW_NITRO_MACHINE_H +#define HW_NITRO_MACHINE_H + +#include "hw/core/boards.h" +#include "qom/object.h" + +#define TYPE_NITRO_MACHINE MACHINE_TYPE_NAME("nitro") +OBJECT_DECLARE_SIMPLE_TYPE(NitroMachineState, NITRO_MACHINE) + +struct NitroMachineState { + MachineState parent; +}; + +#endif /* HW_NITRO_MACHINE_H */ diff --git a/hw/nitro/machine.c b/hw/nitro/machine.c new file mode 100644 index 00000000000..e28c8e9bf50 --- /dev/null +++ b/hw/nitro/machine.c @@ -0,0 +1,161 @@ +/* + * Nitro Enclaves (accel) machine + * + * Copyright =C2=A9 2026 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: + * Alexander Graf + * + * Nitro Enclaves machine model for -accel nitro. This machine behaves + * like the nitro-enclave machine, but uses the real Nitro Enclaves + * backend to launch the virtual machine. It requires use of the -accel + * nitro. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "qapi/error.h" +#include "qom/object_interfaces.h" +#include "chardev/char.h" +#include "hw/core/boards.h" +#include "hw/core/cpu.h" +#include "hw/core/qdev-properties-system.h" +#include "hw/nitro/heartbeat.h" +#include "hw/nitro/machine.h" +#include "hw/nitro/nitro-vsock-bus.h" +#include "hw/nitro/serial-vsock.h" +#include "system/address-spaces.h" +#include "system/hostmem.h" +#include "system/system.h" +#include "system/nitro-accel.h" +#include "qemu/accel.h" +#include "hw/arm/machines-qom.h" + +#define EIF_LOAD_ADDR (8 * 1024 * 1024) + +static void nitro_machine_init(MachineState *machine) +{ + const char *eif_path =3D machine->kernel_filename; + const char *cpu_type =3D machine->cpu_type; + g_autofree char *eif_data =3D NULL; + gsize eif_size; + + if (!nitro_enabled()) { + error_report("The 'nitro' machine requires -accel nitro"); + exit(1); + } + + if (!cpu_type) { + ObjectClass *oc =3D cpu_class_by_name(target_cpu_type(), "host"); + + if (!oc) { + error_report("nitro: no 'host' CPU available"); + exit(1); + } + cpu_type =3D object_class_get_name(oc); + } + + if (!eif_path) { + error_report("nitro: -kernel is required"); + exit(1); + } + + /* Expose memory as normal QEMU RAM. Needs to be huge page backed. */ + memory_region_add_subregion(get_system_memory(), 0, machine->ram); + + /* + * Load EIF (-kernel) as raw blob at the EIF_LOAD_ADDR into guest RAM. + * The Nitro Hypervisor will extract its contents and bootstrap the + * Enclave from it. + */ + if (!g_file_get_contents(eif_path, &eif_data, &eif_size, NULL)) { + error_report("nitro: failed to read EIF '%s'", eif_path); + exit(1); + } + address_space_write(&address_space_memory, EIF_LOAD_ADDR, + MEMTXATTRS_UNSPECIFIED, eif_data, eif_size); + + if (defaults_enabled()) { + NitroVsockBridge *bridge =3D nitro_vsock_bridge_create(); + + /* Nitro Enclaves require a heartbeat device. Provide one. */ + qdev_realize(qdev_new(TYPE_NITRO_HEARTBEAT), + BUS(&bridge->bus), &error_fatal); + + /* + * In debug mode, Nitro Enclaves expose the guest's serial output = via + * vsock. When the accel is in debug mode, wire the vsock serial to + * the machine's serial port so that -nographic automatically works + */ + if (object_property_get_bool(OBJECT(current_accel()), "debug-mode"= , NULL)) { + Chardev *chr =3D serial_hd(0); + + if (chr) { + DeviceState *dev =3D qdev_new(TYPE_NITRO_SERIAL_VSOCK); + + qdev_prop_set_chr(dev, "chardev", chr); + qdev_realize(dev, BUS(&bridge->bus), &error_fatal); + } + } + } +} + +static bool nitro_create_memfd_backend(MachineState *ms, const char *path, + Error **errp) +{ + MachineClass *mc =3D MACHINE_GET_CLASS(ms); + Object *root =3D object_get_objects_root(); + Object *obj; + bool r =3D false; + + obj =3D object_new(TYPE_MEMORY_BACKEND_MEMFD); + + /* Nitro Enclaves require huge page backing */ + if (!object_property_set_int(obj, "size", ms->ram_size, errp) || + !object_property_set_bool(obj, "hugetlb", true, errp)) { + goto out; + } + + object_property_add_child(root, mc->default_ram_id, obj); + + if (!user_creatable_complete(USER_CREATABLE(obj), errp)) { + goto out; + } + r =3D object_property_set_link(OBJECT(ms), "memory-backend", obj, errp= ); + +out: + object_unref(obj); + return r; +} + +static void nitro_machine_class_init(ObjectClass *oc, const void *data) +{ + MachineClass *mc =3D MACHINE_CLASS(oc); + + mc->desc =3D "Nitro Enclave"; + mc->init =3D nitro_machine_init; + mc->create_default_memdev =3D nitro_create_memfd_backend; + mc->default_ram_id =3D "ram"; + mc->max_cpus =3D 4096; +} + +static const TypeInfo nitro_machine_info =3D { + .name =3D TYPE_NITRO_MACHINE, + .parent =3D TYPE_MACHINE, + .instance_size =3D sizeof(NitroMachineState), + .class_init =3D nitro_machine_class_init, + .interfaces =3D (const InterfaceInfo[]) { + /* x86_64 and aarch64 only */ + { TYPE_TARGET_AARCH64_MACHINE }, + { } + }, +}; + +static void nitro_machine_register(void) +{ + type_register_static(&nitro_machine_info); +} + +type_init(nitro_machine_register); diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c index 794d8700857..051faf31e14 100644 --- a/tests/qtest/libqtest.c +++ b/tests/qtest/libqtest.c @@ -1815,6 +1815,7 @@ void qtest_cb_for_every_machine(void (*cb)(const char= *machine), g_str_equal("xenpv", machines[i].name) || g_str_equal("xenpvh", machines[i].name) || g_str_equal("vmapple", machines[i].name) || + g_str_equal("nitro", machines[i].name) || g_str_equal("nitro-enclave", machines[i].name)) { continue; } diff --git a/hw/nitro/Kconfig b/hw/nitro/Kconfig index d3fbc7b683c..cfae85920a0 100644 --- a/hw/nitro/Kconfig +++ b/hw/nitro/Kconfig @@ -8,3 +8,11 @@ config NITRO_SERIAL_VSOCK config NITRO_HEARTBEAT bool depends on NITRO_VSOCK_BUS + +config NITRO_MACHINE + bool + default y + depends on NITRO + select NITRO_VSOCK_BUS + select NITRO_HEARTBEAT + select NITRO_SERIAL_VSOCK diff --git a/hw/nitro/meson.build b/hw/nitro/meson.build index 381c1ee6c15..e3f18958906 100644 --- a/hw/nitro/meson.build +++ b/hw/nitro/meson.build @@ -1,3 +1,4 @@ system_ss.add(when: 'CONFIG_NITRO_VSOCK_BUS', if_true: files('nitro-vsock-= bus.c')) system_ss.add(when: 'CONFIG_NITRO_SERIAL_VSOCK', if_true: files('serial-vs= ock.c')) system_ss.add(when: 'CONFIG_NITRO_HEARTBEAT', if_true: files('heartbeat.c'= )) +system_ss.add(when: 'CONFIG_NITRO_MACHINE', if_true: files('machine.c')) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441826; cv=none; d=zohomail.com; s=zohoarc; b=ObTeI9MsJ28wy+XkKZoxaAzeO0xiM1RHs86ahkupfgNCYexTjFSIn2zkumjQKCQo7DLRRTWdcCPzeSshmQFVJCPG1cyddmk8iS5Db0fVtUSOWDogxiQsc1ISnU3eb5AES0aMORhiXPGGxUqvXwlAlxdE3YZJ4OCSuWdJij7mrHQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441826; 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=Ph5r2s5vTC46MydMfLvvFmtPkIBHn0GG6bfe8Rxs+j0=; b=W4+9tDByWHB4WNtHd7Q4PynlQS6zbvUTBasQWwaCbUx49aGVpmZpCQF3pSI0BDkLLU4irbWUWAFMwljRTKRA8Zvn3Qial9YL9NH9OVvitClJuUSr1GY8AAfOedkhACSg6XLV+nAc2+H4EQcRaI59h9pCtVFg0cj3lE9gehGd2y8= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441826889754.659897343597; Mon, 2 Mar 2026 00:57:06 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvs-0001Df-62; Mon, 02 Mar 2026 03:47:16 -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 1vwyuI-0004wj-Tz for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyu9-0001tj-QT for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:33 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-478-adoxjV4zPYS0nUHvKGeJbQ-1; Mon, 02 Mar 2026 03:45:26 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-482d8e6e13aso32801395e9.3 for ; Mon, 02 Mar 2026 00:45:26 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b3ce8fsm272486425e9.4.2026.03.02.00.45.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441127; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Ph5r2s5vTC46MydMfLvvFmtPkIBHn0GG6bfe8Rxs+j0=; b=Jqh0PkrwvEezRfc0aTJ+PwqPN9RkQaQYNWcB6+A8fJXNAAfd5zheESAQ3nJ94Fi+z+Cm3q stMhsFcRuIhXZKiVDnSwdKpnzTvA2WWIskWhVJPCHQRl/vq7EkBEOml1M28TGt606wXCkm 0+n0qQD1VhUiYGLZYBtC/oKKl/8w8sA= X-MC-Unique: adoxjV4zPYS0nUHvKGeJbQ-1 X-Mimecast-MFC-AGG-ID: adoxjV4zPYS0nUHvKGeJbQ_1772441125 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441125; x=1773045925; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ph5r2s5vTC46MydMfLvvFmtPkIBHn0GG6bfe8Rxs+j0=; b=li/cwU4Bs6Etq7lvO3aQKna+tr3fGuqHpYRfCjZ+laBCJSbf5mOYiqvjkU4R7FEPdD 2PzSBc7sKkTuBZznHVKXsltbWRDx6/ejQt1jWCODJJfEOtfscqXB1Feph58CquJ0EMj0 oWztEmg7XfO/PLdxdC4I1bsa2Avw+XlScpl8++JOV7kKzQmvSGXm7GSsksssXdgdVP/q 8NUzZ3D+wzD52fUIUox4GDUyGfhuqV5u6JQMyD37kNo5xEM8q+Zx2CuFxOazfaPH9DCj 0Y0xvDT5Odhnt51E6LEC4zLWu6DkyyFXGkBJdIQrjXZI8XOE5nZCxlNGsKB/FsD83Bxu CS1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441125; x=1773045925; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Ph5r2s5vTC46MydMfLvvFmtPkIBHn0GG6bfe8Rxs+j0=; b=xIZ3M7dQHIk2lkK+75CuRfr28LAVyhqQ0hcB2rTwdfWXvsuY65Mpqth8RKUg0UXUjt HDFlusERTWHhk7Lg3RukJQ8NaBUotDXuyggu8MuruyAuupvm3s3cwXxYz+AIdA6V57AC bRg8zdfgMMpzuH3/WFfx9c74fLCkI841Wv37CA2e1ZjszxLQm67BXTW8sVbVEA7taO+n iZXdw7rHtf0zd9swpBeOWixxc1rBKzLzS9DaNAALz6YTrQ92Od0QQHfFE08dAkqFwXj2 vjVxRe5LWlK34mX/Zhy1Qt8TtoFSEVu+LVUpuI9qJQ1wLMfCgVLVUtJyNn5ffnIHAdaY PIjw== X-Gm-Message-State: AOJu0YyjGy9H67NH/PWhplvxSnEfEyBDro0LbtluwdP0M1l4rK82jKFL 9YmDS46w952CjOmNo2qI0DodjQysWjDywlIUHhC3LA7eF9UFivcMgwKCFJ8+0gk/6F54/hw/vOD mYce3Qz9OHcl/Ps47VZ97xXqRm2NWptPp9TC+aI0fsmaujJNUVIlPK2bU6DGxZkrenBmc963O3F JL3lCbWnp7TdTIN6zOL3MEn58VX2VG6JjQ2DPrhxad X-Gm-Gg: ATEYQzzPzFTn6Inc1uzxoRqytz8GT5lcLrGmczRZjnAO3E3HOv3Tk72idZ26a939URt IVkoUg5rCBGrENSRQQO09atuKaiKiuV3LBiYB/XHs20b9VMREbzQ20ij8g+Ham6QyCSZZGbCJpZ pjvpJgDCkDj7ACPhoBUAy8h2THc+MtcMlStUwBrNIdeOiIb277R7OQSDS6X+Fk0uf9zuUG6H0RS G4ITTh7BA9AEXDOpGIsNQtNEgGzSxA/U0eu1NZ74zUSdWZ20fng05TBi8iKZBfGc3hfoE5WTnmd rotmz05rD0a5KT/dR8+nkCbupcA9s7q+jIDt3xEMRpYLG3BJiYs8ZACBiN0RcLNdlTeiqO7MIS0 pB0NXrmS3aLhTiBiiP+rjOswL3/8LMw7XKYx3KG/O6T7njkTGbMTUSmL509tiNM7XBQSi3ztN/s JxTH9WND4cx5Ej+tr4anwJbssAAN8= X-Received: by 2002:a05:600c:a086:b0:483:a895:9d85 with SMTP id 5b1f17b1804b1-483c9ba3ae6mr211453425e9.2.1772441124884; Mon, 02 Mar 2026 00:45:24 -0800 (PST) X-Received: by 2002:a05:600c:a086:b0:483:a895:9d85 with SMTP id 5b1f17b1804b1-483c9ba3ae6mr211452885e9.2.1772441124352; Mon, 02 Mar 2026 00:45:24 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf , Dorjoy Chowdhury Subject: [PULL 039/102] hw/core/eif: Move definitions to header Date: Mon, 2 Mar 2026 09:42:34 +0100 Message-ID: <20260302084338.473368-40-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441829028158500 Content-Type: text/plain; charset="utf-8" From: Alexander Graf In follow-up patches we need some EIF file definitions that are currently in the eif.c file, but want to access them from a separate device. Move them into the header instead. Signed-off-by: Alexander Graf Reviewed-by: Dorjoy Chowdhury Link: https://lore.kernel.org/r/20260225220807.33092-10-graf@amazon.com Signed-off-by: Paolo Bonzini --- hw/core/eif.h | 38 ++++++++++++++++++++++++++++++++++++++ hw/core/eif.c | 38 -------------------------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/hw/core/eif.h b/hw/core/eif.h index fed3cb55140..a3412377a90 100644 --- a/hw/core/eif.h +++ b/hw/core/eif.h @@ -11,6 +11,44 @@ #ifndef HW_CORE_EIF_H #define HW_CORE_EIF_H =20 +#define MAX_SECTIONS 32 + +/* members are ordered according to field order in .eif file */ +typedef struct EifHeader { + uint8_t magic[4]; /* must be .eif in ascii i.e., [46, 101, 105, 102] = */ + uint16_t version; + uint16_t flags; + uint64_t default_memory; + uint64_t default_cpus; + uint16_t reserved; + uint16_t section_cnt; + uint64_t section_offsets[MAX_SECTIONS]; + uint64_t section_sizes[MAX_SECTIONS]; + uint32_t unused; + uint32_t eif_crc32; +} QEMU_PACKED EifHeader; + +/* members are ordered according to field order in .eif file */ +typedef struct EifSectionHeader { + /* + * 0 =3D invalid, 1 =3D kernel, 2 =3D cmdline, 3 =3D ramdisk, 4 =3D si= gnature, + * 5 =3D metadata + */ + uint16_t section_type; + uint16_t flags; + uint64_t section_size; +} QEMU_PACKED EifSectionHeader; + +enum EifSectionTypes { + EIF_SECTION_INVALID =3D 0, + EIF_SECTION_KERNEL =3D 1, + EIF_SECTION_CMDLINE =3D 2, + EIF_SECTION_RAMDISK =3D 3, + EIF_SECTION_SIGNATURE =3D 4, + EIF_SECTION_METADATA =3D 5, + EIF_SECTION_MAX =3D 6, +}; + bool read_eif_file(const char *eif_path, const char *machine_initrd, char **kernel_path, char **initrd_path, char **kernel_cmdline, uint8_t *image_sha384, diff --git a/hw/core/eif.c b/hw/core/eif.c index 513caec6b49..96f1d765785 100644 --- a/hw/core/eif.c +++ b/hw/core/eif.c @@ -18,44 +18,6 @@ =20 #include "hw/core/eif.h" =20 -#define MAX_SECTIONS 32 - -/* members are ordered according to field order in .eif file */ -typedef struct EifHeader { - uint8_t magic[4]; /* must be .eif in ascii i.e., [46, 101, 105, 102] = */ - uint16_t version; - uint16_t flags; - uint64_t default_memory; - uint64_t default_cpus; - uint16_t reserved; - uint16_t section_cnt; - uint64_t section_offsets[MAX_SECTIONS]; - uint64_t section_sizes[MAX_SECTIONS]; - uint32_t unused; - uint32_t eif_crc32; -} QEMU_PACKED EifHeader; - -/* members are ordered according to field order in .eif file */ -typedef struct EifSectionHeader { - /* - * 0 =3D invalid, 1 =3D kernel, 2 =3D cmdline, 3 =3D ramdisk, 4 =3D si= gnature, - * 5 =3D metadata - */ - uint16_t section_type; - uint16_t flags; - uint64_t section_size; -} QEMU_PACKED EifSectionHeader; - -enum EifSectionTypes { - EIF_SECTION_INVALID =3D 0, - EIF_SECTION_KERNEL =3D 1, - EIF_SECTION_CMDLINE =3D 2, - EIF_SECTION_RAMDISK =3D 3, - EIF_SECTION_SIGNATURE =3D 4, - EIF_SECTION_METADATA =3D 5, - EIF_SECTION_MAX =3D 6, -}; - static const char *section_type_to_string(uint16_t type) { const char *str; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441595; cv=none; d=zohomail.com; s=zohoarc; b=C8NgX3Pb04lN7ZfEF60Q2gTjGKrnyqXo4q/LIxxqO/VUNnZSwKirTFTtmPX1vXk0z/MhWKyhtAFqrdc9VzbfztBfsfyhiAkGxlEwp2kHKV/LLD1KbmihhBYOWZt6TQXuGXCVy9TZpTLA6/hoI+h2Fjf3M+KTaOagmcrLQzJY0LM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441595; 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=2T5dA1FgY/TpoQcQTw9NSmZNEHPoqxFKitjpjHx9UvQ=; b=YZzCY+aSg7bIkySf5/mn9eEw697wNaklkg1Jl2g/zLMzPuQ2bN+NjZcSW2FoNaw5hWodRhsjhl7vUTlSY4RMANXg2FqgMw/r9LazH62erf+ssNvH6fEc2PBmjDzlNeKZ8IAj20NcZU5rShQ/1Wqo7nYZyfilAg42kqLhd1o1lVE= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441595453146.16587313919854; Mon, 2 Mar 2026 00:53:15 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvg-0007w5-5L; Mon, 02 Mar 2026 03:47:04 -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 1vwyuZ-00055z-H1 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:02 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuS-0001v0-0x for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:49 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-530-RiIhaZndPu6lQN4n2P8VFQ-1; Mon, 02 Mar 2026 03:45:29 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4832c4621c2so46274685e9.3 for ; Mon, 02 Mar 2026 00:45:29 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd75dfaasm355126635e9.12.2026.03.02.00.45.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441135; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2T5dA1FgY/TpoQcQTw9NSmZNEHPoqxFKitjpjHx9UvQ=; b=FvckcAxFHDo4CGhDY6Oz/00FDye9bzqy2oMdy93qX23vKCIrJJBrMZGBnFz2rFW49YU+xY u7UPHB0Jeg6lIRJLb2fYFSTwxW0IEWj+JMG7iubZUJJFzEWDnP2b72kOxs6wkibRLgCfoh MvrKGq+QgySEZVE38JBcNxX4F6MGhUE= X-MC-Unique: RiIhaZndPu6lQN4n2P8VFQ-1 X-Mimecast-MFC-AGG-ID: RiIhaZndPu6lQN4n2P8VFQ_1772441128 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441128; x=1773045928; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2T5dA1FgY/TpoQcQTw9NSmZNEHPoqxFKitjpjHx9UvQ=; b=uHkgJwXtosmuUFQ7rZMr8ImT4IhDok10veSRt1Sb8Sxro7gGEgqD6ea2XRMGrvXCs+ Ohg6ElXBaoJX5s1U2K8dWjJGdlTl+KFlDRlZvW3ZBhs0E7Yq+b5cc3XGEZlDccMMI6UH 59HUOiHl2hptW99xgbrwERIsn36xMgZeWkEkZzOGL+7Dp7U+dRaOEYw7em26TDGBip25 k5i4X6/couk1GSrFEKrenLo1gaxtEl2Pprzh4Aq5+0YivXti9cMfl5JxTTz86pFaS3Ax Qye9lD8lJie+3Lkyjq/9u7uEkJrFM5q7IMn0jjzbR32cLWCLxSdjqybR8EYc0wzllj9J EpKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441128; x=1773045928; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2T5dA1FgY/TpoQcQTw9NSmZNEHPoqxFKitjpjHx9UvQ=; b=mKkuK0ZwWGi6w5RVVVEYRH7fLOUUWNy7eawPLVHCNQpSmWr5y3p25ioDG6Lo6hNsh5 B/uSB0pZ94Jady6S0at9vJ964t58a9k9PjFzzWaQmDeAP9hV+LX9imSYgG0SIMEjGw6Y Ow2QU5k9pTfPhZ1fxkqz7lW6eHdX6LiQEylk6zmuXrR41JUV9MjJtfZ7DDZSI2fPIHtm +MC9VaoJWkVfrw6qmJsJOu5Af3vsx5DB4w6Hgdplmvk/R87Gis8x5yXP8wko/U/IcjFd GO/IE5o2nmrxXA+G+alBQ3EBLce/CW1Q1GXMM9DeZ6EY+L42VlvQOjgiymJOcULrT1fo 33yA== X-Gm-Message-State: AOJu0Yz+tcHELo81NqMYZ8UFm0jc1stLFAtpWFD4+IGbsbUjDvrpzCWb t3jEsvTG9t5NDsLx75gyAR4sW546YQ4VxIoxsGdLNVB3j/Ply8liBu9aGLSvQKbytGASnH2uk9i g+KKTBjc3PgW82zOQvxmRvFpJNP1lb+D5bZqs3q73n6Jc05g1i5n3MHCRkIIF8tgagmVnDqYZ0A sRpvJv7tV6xzU0DZxO+I7S8F1/+k1f6yWgsDAhbwpL X-Gm-Gg: ATEYQzwK8dIq9FxubV8MhunVEOCiuOon/YqNgB2sQxhvzUpvMNP0Ce1ER9rdyw+1Vv7 1yxrP7/FrbN3nipQlR41+6knFXK/av+asXQ7R3xpdwcYA5v7ur+F/ifnALkBmTQpZY1YzaMhQq5 K2d57PgqGa2xUqAwO6eGhMSRy3s9wN9dhUrDehGboiClMREQsfmNXwJASD0f/pz7Uu/mbTqBFMp tSC0tLeedvxdMy5WwCuEkBOCjo1RFdFTqMrblLnLTXLO07E9e9d/J05q4OOaxMHP6EK05+PYdBh f2VEE+vpqH2z33fPI94i2c1H8s4BsMg1RyyL5fjnvtPULm3IXA00HlLet0xcnN4mi1s+NwR45vL yxRtUI+dUTJwTNuMlyRROjPyNUQnXNF84MmCModhTWrutlR+sAz8kATW6DVEQo9EntI9jI4rmLO 6hyFVmoG91jvA1xwG698/5IlPdcis= X-Received: by 2002:a05:600c:6994:b0:477:c478:46d7 with SMTP id 5b1f17b1804b1-483c9c0b88amr194515825e9.22.1772441127838; Mon, 02 Mar 2026 00:45:27 -0800 (PST) X-Received: by 2002:a05:600c:6994:b0:477:c478:46d7 with SMTP id 5b1f17b1804b1-483c9c0b88amr194515415e9.22.1772441127275; Mon, 02 Mar 2026 00:45:27 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf , Dorjoy Chowdhury Subject: [PULL 040/102] hw/nitro: Enable direct kernel boot Date: Mon, 2 Mar 2026 09:42:35 +0100 Message-ID: <20260302084338.473368-41-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441595940158500 Content-Type: text/plain; charset="utf-8" From: Alexander Graf Nitro Enclaves can only boot EIF files which are a combination of kernel, initramfs and cmdline in a single file. When the kernel image is not an EIF, treat it like a kernel image and assemble an EIF image on the fly. This way, users can call QEMU with a direct kernel/initrd/cmdline combination and everything "just works". Signed-off-by: Alexander Graf Reviewed-by: Dorjoy Chowdhury Link: https://lore.kernel.org/r/20260225220807.33092-11-graf@amazon.com Signed-off-by: Paolo Bonzini --- hw/core/eif.h | 3 ++ hw/nitro/machine.c | 116 +++++++++++++++++++++++++++++++++++++++++++ hw/nitro/meson.build | 2 +- 3 files changed, 120 insertions(+), 1 deletion(-) diff --git a/hw/core/eif.h b/hw/core/eif.h index a3412377a90..0c432dbc2dc 100644 --- a/hw/core/eif.h +++ b/hw/core/eif.h @@ -12,6 +12,7 @@ #define HW_CORE_EIF_H =20 #define MAX_SECTIONS 32 +#define EIF_HDR_ARCH_ARM64 0x1 =20 /* members are ordered according to field order in .eif file */ typedef struct EifHeader { @@ -49,6 +50,8 @@ enum EifSectionTypes { EIF_SECTION_MAX =3D 6, }; =20 +#define EIF_MAGIC { '.', 'e', 'i', 'f' } + bool read_eif_file(const char *eif_path, const char *machine_initrd, char **kernel_path, char **initrd_path, char **kernel_cmdline, uint8_t *image_sha384, diff --git a/hw/nitro/machine.c b/hw/nitro/machine.c index e28c8e9bf50..8849959359c 100644 --- a/hw/nitro/machine.c +++ b/hw/nitro/machine.c @@ -32,9 +32,104 @@ #include "system/nitro-accel.h" #include "qemu/accel.h" #include "hw/arm/machines-qom.h" +#include "hw/core/eif.h" +#include /* for crc32 */ =20 #define EIF_LOAD_ADDR (8 * 1024 * 1024) =20 +static bool is_eif(char *eif, gsize len) +{ + const char eif_magic[] =3D EIF_MAGIC; + + return len >=3D sizeof(eif_magic) && + !memcmp(eif, eif_magic, sizeof(eif_magic)); +} + +static void build_eif_section(EifHeader *hdr, GByteArray *buf, uint16_t ty= pe, + const char *data, uint64_t size) +{ + uint16_t section =3D be16_to_cpu(hdr->section_cnt); + EifSectionHeader shdr =3D { + .section_type =3D cpu_to_be16(type), + .flags =3D 0, + .section_size =3D cpu_to_be64(size), + }; + + hdr->section_offsets[section] =3D cpu_to_be64(buf->len); + hdr->section_sizes[section] =3D cpu_to_be64(size); + + g_byte_array_append(buf, (const uint8_t *)&shdr, sizeof(shdr)); + if (size) { + g_byte_array_append(buf, (const uint8_t *)data, size); + } + + hdr->section_cnt =3D cpu_to_be16(section + 1); +} + +/* + * Nitro Enclaves only support loading EIF files. When the user provides + * a Linux kernel, initrd and cmdline, convert them into EIF format. + */ +static char *build_eif(const char *kernel_data, gsize kernel_size, + const char *initrd_path, const char *cmdline, + gsize *out_size, Error **errp) +{ + g_autofree char *initrd_data =3D NULL; + static const char metadata[] =3D "{}"; + size_t metadata_len =3D sizeof(metadata) - 1; + gsize initrd_size =3D 0; + GByteArray *buf; + EifHeader hdr; + uint32_t crc =3D 0; + size_t cmdline_len; + + if (initrd_path) { + if (!g_file_get_contents(initrd_path, &initrd_data, + &initrd_size, NULL)) { + error_setg(errp, "Failed to read initrd '%s'", initrd_path); + return NULL; + } + } + + buf =3D g_byte_array_new(); + + cmdline_len =3D cmdline ? strlen(cmdline) : 0; + + hdr =3D (EifHeader) { + .magic =3D EIF_MAGIC, + .version =3D cpu_to_be16(4), + .flags =3D cpu_to_be16(target_aarch64() ? EIF_HDR_ARCH_ARM64 : 0), + }; + + g_byte_array_append(buf, (const uint8_t *)&hdr, sizeof(hdr)); + + /* Kernel */ + build_eif_section(&hdr, buf, EIF_SECTION_KERNEL, kernel_data, kernel_s= ize); + + /* Command line */ + build_eif_section(&hdr, buf, EIF_SECTION_CMDLINE, cmdline, cmdline_len= ); + + /* Initramfs */ + build_eif_section(&hdr, buf, EIF_SECTION_RAMDISK, initrd_data, initrd_= size); + + /* Metadata */ + build_eif_section(&hdr, buf, EIF_SECTION_METADATA, metadata, metadata_= len); + + /* + * Patch the header into the buffer first (with real section offsets + * and sizes), then compute CRC over everything except the CRC field. + */ + memcpy(buf->data, &hdr, sizeof(hdr)); + crc =3D crc32(crc, buf->data, offsetof(EifHeader, eif_crc32)); + crc =3D crc32(crc, &buf->data[sizeof(hdr)], buf->len - sizeof(hdr)); + + /* Finally write the CRC into the in-buffer header */ + ((EifHeader *)buf->data)->eif_crc32 =3D cpu_to_be32(crc); + + *out_size =3D buf->len; + return (char *)g_byte_array_free(buf, false); +} + static void nitro_machine_init(MachineState *machine) { const char *eif_path =3D machine->kernel_filename; @@ -74,6 +169,27 @@ static void nitro_machine_init(MachineState *machine) error_report("nitro: failed to read EIF '%s'", eif_path); exit(1); } + + if (!is_eif(eif_data, eif_size)) { + char *kernel_data =3D eif_data; + gsize kernel_size =3D eif_size; + Error *err =3D NULL; + + /* + * The user gave us a non-EIF kernel, likely a Linux kernel image. + * Assemble an EIF file from it, the -initrd and the -append argum= ents, + * so that users can perform a natural direct kernel boot. + */ + eif_data =3D build_eif(kernel_data, kernel_size, machine->initrd_f= ilename, + machine->kernel_cmdline, &eif_size, &err); + if (!eif_data) { + error_report_err(err); + exit(1); + } + + g_free(kernel_data); + } + address_space_write(&address_space_memory, EIF_LOAD_ADDR, MEMTXATTRS_UNSPECIFIED, eif_data, eif_size); =20 diff --git a/hw/nitro/meson.build b/hw/nitro/meson.build index e3f18958906..b9bd0d43002 100644 --- a/hw/nitro/meson.build +++ b/hw/nitro/meson.build @@ -1,4 +1,4 @@ system_ss.add(when: 'CONFIG_NITRO_VSOCK_BUS', if_true: files('nitro-vsock-= bus.c')) system_ss.add(when: 'CONFIG_NITRO_SERIAL_VSOCK', if_true: files('serial-vs= ock.c')) system_ss.add(when: 'CONFIG_NITRO_HEARTBEAT', if_true: files('heartbeat.c'= )) -system_ss.add(when: 'CONFIG_NITRO_MACHINE', if_true: files('machine.c')) +system_ss.add(when: 'CONFIG_NITRO_MACHINE', if_true: [files('machine.c'), = zlib]) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441790; cv=none; d=zohomail.com; s=zohoarc; b=SlVuoCNp3Es0Vc6zyL+mQbsaxQIw4mhxOV0t94Wx1/pICtBT63unyn4mkZdVtX+doIxvfLhgeUdO4oPKSnLE4ewNPZcfHvy0lmEBrMWCGPmulFQRgUoiC/pQtVdgd+IG2YavgK0xGWocfd0JxxkYAFDX7287w7cT8iTDoCkYB8M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441790; 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=E1b0JYdWTmUMjfXhJgLYKJmJjYVhz92C9EWnenw/nwQ=; b=Ua6kYtFGOWFcBmBzcyEcQ4RBlyVNkLnq/S3MF4Gq6+b5NFaELofE3eSDWqAgY1aEb5OZiG77sQeuQcMeNN20PIlFfULpyzBT6CKJGNt352iQGA/tKPWNxnBu3geBwJAO6JUMsIGoUCeevLPY83Rsb6bHuiMSOgVwO4bPEG/Ojcc= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441790882417.8218790821495; Mon, 2 Mar 2026 00:56:30 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvr-0001AR-PP; Mon, 02 Mar 2026 03:47:15 -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 1vwyuS-000534-8o for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:55 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuI-0001uw-Ky for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:44 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-517-ktoWASXnNZSn1GTtQvDPRQ-1; Mon, 02 Mar 2026 03:45:33 -0500 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-439b50dfca1so586231f8f.0 for ; Mon, 02 Mar 2026 00:45:32 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b1116698sm11757410f8f.16.2026.03.02.00.45.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441134; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=E1b0JYdWTmUMjfXhJgLYKJmJjYVhz92C9EWnenw/nwQ=; b=ZppBesEHRopsWkJofDjYjTIUGQZjvRx0TTePqEha1GSPL8KIZ8p6/yW4obbzrnN/q9Kvai ZGaHGt3iMZ6X8KSQdb+/4MgwFtDLJfICwRscDwUc25u8yasiK6TYxNd8RDG26sbcsW1LUA VoEIPTGf6A2w/0o7/bhY4J286KjuFN0= X-MC-Unique: ktoWASXnNZSn1GTtQvDPRQ-1 X-Mimecast-MFC-AGG-ID: ktoWASXnNZSn1GTtQvDPRQ_1772441132 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441130; x=1773045930; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=E1b0JYdWTmUMjfXhJgLYKJmJjYVhz92C9EWnenw/nwQ=; b=EOxtsOx40ZPOLWpf60bP1AqYh5L9UXk2UJPrtw1EW4/nvCuGsER+ioJMGq8FxMTtsC LB26HJj40O0MrXSyASzSuC9Qq+oT8GEEUfMmrx1x1uDR4D0r3hYBhqVscTG/hSrqcMA+ jRL8nui/eZDrG7Ubcm3aze7EmCITa0zHzCmqUJb6fPEQHc/AIjJUyOEb1ss4FNYenKcf pD+KpyZdWlhzfwt9lz0D/DsgsKMpUgMafsDV2GQ78jbgLEOhqiVR07u7puQxWBNO4WM7 zc2RSzav6k0lE3geojLuj/ninDWarVZhdZrRFCcIs2VljXAsin+bHGV5M1Vau9DaARba I1ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441130; x=1773045930; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=E1b0JYdWTmUMjfXhJgLYKJmJjYVhz92C9EWnenw/nwQ=; b=r+7ZqZZJTTHKlR71Tozu3a0et/evax60Dg43tCHhNl/2exFPOYPHYfGuYZzfA7W7HM uruew4XaxdO5EgZ3m9eXaaf0pZ2Rt2mhwfgFJduzHfsTANm+eGcBb2Ej7aaKsNKNbOgQ eAC3ooE0sCDk7S+Lob9qsL/qoEfPimbBtE0O0OjUC/l8SPO3JDgMusvfZ+pgbVMtYGGf 26TfXt5LBeXAq/DUtOPijjwtcdYsI+ofU9KD2KLd64iBueiELmze0xGkY0vW1P847O6F 5inUWyM+hj/O7ihTIQady7ZeqvoKu6DIUDUBmb1CJCYmSnQ4KsnQIbP14E+Lsene5rSC yCZw== X-Gm-Message-State: AOJu0Yw4L5f3sIbkuy5Gz0uOC2vpQu7/lUnFjiP/6ru7/ti/KkshjeHI ekOGfLkDa1E9sqo1Q1D+4BqKSpQ+EmIBPFKiLXt6tkXJYQauTGo5JhsM8r1rGrnWF3UVQi1VOQx 24zeatUeYJFriIkFql3CCq+PSGe+loT2fdbztMhmgWCBS3wFUFVs8n6DS5MijbNavH711amUkst kzRJsKTGfk/gtlvZPH5IWu2jVaIF975Cd4zPMKTb6a X-Gm-Gg: ATEYQzwy1JMIfkhWoFxM9DQsGaA7Jyoungv0fKhpTmvVROW8N5HA0gL1i0p5t31A3T1 lDpXoNEJr1/r9o4gz6W4RCkxvXu81j5nBCTVfFI1/UF91JFD0ms5+sL1TBez/j/ABawDyJwA4Ax GxPxRYMK0ZoZdI5keNjm4a3se3vsMSstXgeGIURccHmmFwPKusHldby8qME+BAlH1/ntXazQBHJ ZWebE19ENqNKUIAWCdNDBcUZ7M0gAlYDsEOR7UKBx8lPDT3UzdFBg+gycSGAKmBRZheRxIeNtH/ 07T9zYYlWVqVf54fGnFHR/aWSdupqhU2ZGK2u4jb2ACQvgKvoGxoawspAYOhm45dwO+Nw4YH4Bd fIGs9AbXHymD2dMLCp1J/YDMInT9pPrJgZHd26SDCMaad2aK+HadNe9gFaT5BtLC/pxTtLRIgi0 A0egMye6Fif6rfwBBvqwRnL7aiCQM= X-Received: by 2002:a5d:5d06:0:b0:435:e3bd:5838 with SMTP id ffacd0b85a97d-4399de00428mr20275686f8f.25.1772441130419; Mon, 02 Mar 2026 00:45:30 -0800 (PST) X-Received: by 2002:a5d:5d06:0:b0:435:e3bd:5838 with SMTP id ffacd0b85a97d-4399de00428mr20275630f8f.25.1772441129829; Mon, 02 Mar 2026 00:45:29 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Alexander Graf Subject: [PULL 041/102] docs: Add Nitro Enclaves documentation Date: Mon, 2 Mar 2026 09:42:36 +0100 Message-ID: <20260302084338.473368-42-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441792973158500 Content-Type: text/plain; charset="utf-8" From: Alexander Graf Now that all pieces are in place to spawn Nitro Enclaves using a special purpose accelerator and machine model, document how to use it. Signed-off-by: Alexander Graf Link: https://lore.kernel.org/r/20260225220807.33092-12-graf@amazon.com Signed-off-by: Paolo Bonzini --- MAINTAINERS | 1 + docs/system/confidential-guest-support.rst | 1 + docs/system/index.rst | 1 + docs/system/nitro.rst | 133 +++++++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 docs/system/nitro.rst diff --git a/MAINTAINERS b/MAINTAINERS index 0458980d434..72153288c53 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3031,6 +3031,7 @@ M: Alexander Graf S: Maintained F: hw/nitro/ F: include/hw/nitro/ +F: docs/system/nitro.rst =20 Subsystems ---------- diff --git a/docs/system/confidential-guest-support.rst b/docs/system/confi= dential-guest-support.rst index 66129fbab64..562a7c3c285 100644 --- a/docs/system/confidential-guest-support.rst +++ b/docs/system/confidential-guest-support.rst @@ -41,5 +41,6 @@ Currently supported confidential guest mechanisms are: * Intel Trust Domain Extension (TDX) (see :doc:`i386/tdx`) * POWER Protected Execution Facility (PEF) (see :ref:`power-papr-protected= -execution-facility-pef`) * s390x Protected Virtualization (PV) (see :doc:`s390x/protvirt`) +* AWS Nitro Enclaves (see :doc:`nitro`) =20 Other mechanisms may be supported in future. diff --git a/docs/system/index.rst b/docs/system/index.rst index 427b0204831..d297a952823 100644 --- a/docs/system/index.rst +++ b/docs/system/index.rst @@ -39,5 +39,6 @@ or Hypervisor.Framework. multi-process confidential-guest-support igvm + nitro vm-templating sriov diff --git a/docs/system/nitro.rst b/docs/system/nitro.rst new file mode 100644 index 00000000000..5907d6153eb --- /dev/null +++ b/docs/system/nitro.rst @@ -0,0 +1,133 @@ +AWS Nitro Enclaves +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +`AWS Nitro Enclaves `_ +are isolated compute environments that run alongside EC2 instances. +They are created by partitioning CPU and memory resources from a parent +instance and launching a signed Enclave Image Format (EIF) file inside +a confidential VM managed by the Nitro Hypervisor. + +QEMU supports launching Nitro Enclaves on EC2 instances that have +enclave support enabled, using the ``nitro`` accelerator and the +``nitro`` machine type. + +Prerequisites +------------- + +* An EC2 instance with Nitro Enclaves enabled +* The ``nitro_enclaves`` kernel module loaded (provides ``/dev/nitro_encla= ves``) +* CPU cores allocated to the Nitro Enclaves pool via ``nitro-enclaves-allo= cator`` +* Huge pages allocated for Nitro Enclaves via ``nitro-enclaves-allocator`` + +Quick Start +----------- + +Launch a Nitro Enclave from a pre-built EIF file:: + + $ qemu-system-x86_64 -accel nitro,debug-mode=3Don -M nitro -nographic \ + -smp 2 -m 512M -kernel enclave.eif + +Launch an enclave from individual kernel and initrd files:: + + $ qemu-system-x86_64 -accel nitro,debug-mode=3Don -M nitro -nographic \ + -smp 2 -m 512M -kernel vmlinuz -initrd initrd.cpio \ + -append "console=3DttyS0" + +The same commands work with ``qemu-system-aarch64`` on Graviton based EC2 +instances. + +Accelerator +----------- + +The ``nitro`` accelerator (``-accel nitro``) drives the +``/dev/nitro_enclaves`` device to create and manage a Nitro Enclave. +It handles: + +* Creating the enclave VM slot +* Donating memory regions (must be huge page backed) +* Adding vCPUs (must be full physical cores) +* Starting the enclave +* Notifying vsock bus devices of the enclave CID + +Accelerator options: + +``debug-mode=3Don|off`` + Enable debug mode. When enabled, the Nitro Hypervisor exposes the + enclave's serial console output via a vsock port that the machine + model automatically connects to. In debug mode, PCR values are zero. + Default is ``off``. + +Machine +------- + +The ``nitro`` machine (``-M nitro``) is a minimal, architecture-independent +machine that provides only what a Nitro Enclave needs: + +* RAM (huge page backed via memfd) +* vCPUs (defaults to ``host`` CPU type) +* A Nitro vsock bus with: + + - A heartbeat device (vsock server on port 9000) + - A serial console bridge (vsock client, debug mode only) + +Communication to the Nitro Enclave is limited to virtio-vsock. The Enclave +is allocated a CID at launch at which it is reachable. A specific CID can +be requested with ``-accel nitro,enclave-cid=3D`` (0 lets the hypervisor +choose). The assigned CID is readable from the vsock bridge device:: + + (qemu) qom-get /machine/peripheral/nitro-vsock enclave-cid + +EIF Image Format +^^^^^^^^^^^^^^^^ + +Nitro Enclaves boot from EIF (Enclave Image Format) files. When +``-kernel`` points to an EIF file (detected by the ``.eif`` magic +bytes), it is loaded directly into guest memory. + +When ``-kernel`` points to a regular kernel image (e.g. a bzImage or +Image), the machine automatically assembles a minimal EIF on the fly +from ``-kernel``, ``-initrd``, and ``-append``. This allows standard +direct kernel boot without external EIF tooling. + +CPU Requirements +^^^^^^^^^^^^^^^^ + +Nitro Enclaves require full physical CPU cores. On hyperthreaded +systems, this means ``-smp`` must be a multiple of the threads per +core (typically 2). + +Nitro Enclaves can only consume cores that are donated to the Nitro Enclave +CPU pool. You can configure the CPU pool using the ``nitro-enclaves-alloca= tor`` +tool or manually by writing to the nitro_enclaves cpu pool parameter. To +allocate vCPUs 1, 2 and 3, you can call:: + + $ echo 1,2,3 | sudo tee /sys/module/nitro_enclaves/parameters/ne_cpus + +Beware that on x86-64 systems, hyperthread siblings are not consecutive +and must be added in pairs to the pool. Consult tools like ``lstopo`` +or ``lscpu`` for details about your instance's CPU topology. + +Memory Requirements +^^^^^^^^^^^^^^^^^^^ + +Enclave memory must be huge page backed. The machine automatically +creates a memfd memory backend with huge pages enabled. To make the +huge page allocation work, ensure that huge pages are reserved in +the system. To reserve 1 GiB of memory on a 4 KiB PAGE_SIZE system, +you can call:: + + $ echo 512 | sudo tee /proc/sys/vm/nr_hugepages + +Emulated Nitro Enclaves +----------------------- + +In addition to the native Nitro Enclaves invocation, you can also use +the emulated nitro-enclave machine target (see :doc:`i386/nitro-enclave`) +which implements the x86 Nitro Enclave device model. While -M nitro +delegates virtual machine device emulation to the Nitro Hypervisor, -M +nitro-enclave implements all devices itself, which means it also works +on non-EC2 instances. + +If you require NSM based attestation backed by valid AWS certificates, +you must use -M nitro. The -M nitro-enclave model does not provide +you with an AWS signed attestation document. --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441392; cv=none; d=zohomail.com; s=zohoarc; b=l8D/H1rPHSNjm8XjX65qFlXX0ojvkBSDCrOch6nA6RnUWDdATlM+diWjyDqYD4MBADtzyYWcWKj+YjiEadsajtVvnAT/NygDgJVMrxp0tswdFgFiLgm84YEoIgvGPvnchVAHTB0qr7MOJcvdZyleZGzSCDLiwiHzVimb5KiM7tU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441392; 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=nUiCCppSXUrj6OvmEjf1mYs/b824NOK2nmd/Wogyixc=; b=XtDEpk1yGRm0+cKHMbZYAjJCeSmbtSykBomhj4ZDulumxkUwEVepqQQJsBLBrln5/wl6QI9RlpPiCXs0eDRMJJFgdpFMsQeNXSh4AY57LWmgWZj9hzVjfGbU6AKW6EaqeLQSf7bhfCRibEL1UoS3sML+FRmahPkn1Nb9StEwuD0= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441392211363.1983474875906; Mon, 2 Mar 2026 00:49:52 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvJ-0006QF-0s; Mon, 02 Mar 2026 03:46:41 -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 1vwyub-000593-9E for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:06 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuS-0001v9-25 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:51 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-516-mfzfasL9PoWYTn-OdoPJ8Q-1; Mon, 02 Mar 2026 03:45:35 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-43992a50893so2799897f8f.3 for ; Mon, 02 Mar 2026 00:45:35 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439ba2a58dasm3386241f8f.27.2026.03.02.00.45.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441137; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nUiCCppSXUrj6OvmEjf1mYs/b824NOK2nmd/Wogyixc=; b=ESevOJknQveCR3Haga8k9DKiV1GtkeDNUyz4L0Tlz1AU3OWqnZ48SZu7RG4rm7tbOs+ehN 5uC7YisTK969DaDK01C4Yu1Viezq3uihbpCawS/L1e4eiCEIHWGjq3rJa6qEhIdn2GXG/R vhvlyl3rT3tKmPKv9ME47OTT+VStjms= X-MC-Unique: mfzfasL9PoWYTn-OdoPJ8Q-1 X-Mimecast-MFC-AGG-ID: mfzfasL9PoWYTn-OdoPJ8Q_1772441134 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441133; x=1773045933; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nUiCCppSXUrj6OvmEjf1mYs/b824NOK2nmd/Wogyixc=; b=pCiHPvzloEzTTTdEEqxxzV6yz+zOL6+QbeSF/zP3mCGUcEgh1R1fx4zWPAcpaPcesA B6C8z8Fa7ufiB4J5oGk+9gu5Wsj96Z5VEoVm9NqL2upk2++AjuleldyOYqg1Vu3QARcF kvmLvWIgwlSzOeCS7y6O1Yys2iW5KlTAm5gvcP+YP1qkJhdaTLmNlh9mqBQeHrq3hs+F QgNrRkBCtR+USGMyypOcloZSzrn2BuPF6YfZjQnpoZkKRyTrJW6Eee/7QQhS42wZzRzD njhgdA6g+54xHwS7qxOHEr8UrwMtzqmJZHk3BOVDq5nZA5GIMOGmniikDoEUOw7f2JcA no4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441133; x=1773045933; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=nUiCCppSXUrj6OvmEjf1mYs/b824NOK2nmd/Wogyixc=; b=KAFMD8o9eSJwR380nA+uWRxmH06LwCpeTQcmZlsfCOk13aWry2B0Z3Z+0ksTf0h1ab Vz2jBUyrc8Xp2hCZ2EBcAGHWJOlwX6UvMG6uZsiWdpVrDBYD0Bwnw1IyL/JcqzfqtBaU SDRRkvFkkUJppk/gkzGpCK72yp2+dtaJBkVoPDT+Yguu0XkDV9oKKvv0RT5G9EDl6Xy7 XktLU+qKSozLMQHQa5f/waV5w+1Div157M2zTmvJxcssX3lQDBpWn9g5rVkC+GNQA/+I xjx5cDyiRxm15IFa7AgY5Jk1M1RC+KM9Yf6d93IPqNeCBkFR78d46Up7HaK7WHK1mijs ozKQ== X-Gm-Message-State: AOJu0YxbjkPM074TkBapK3fJtElXowVPRn83DDb0yDdg+VevCDK8OEt9 YnM4XL4kt1lM+G4bdL5GDwB0ZNoi/gjzrUvicaHpaiUKO4LEKxjbA4W8JGU+Jtvyt92dilTMz2y j+fUCgr+I6FvZKLEATyxB5nTRGGbWKLs/g43JVbbpvzS1yU+jrbTsRMZOjC3FOWNXiV16KmO4TA DxHbzjfJicycHeP6i1sTzjcrFON+QjxXS+t8Aer3Ng X-Gm-Gg: ATEYQzwGgdX5d1Es8mAAcO/uTLKkwuBB9naKBE+Re5Cs7Preks5xs4OzLJVc+XzZGAZ PbaDcKP81cQy9LfPHsiFcxdbDTxTUfhLiE3QIkljMSQLtHV7kehFEVLyFgL1zMGJtJBWbt+IIxr lYdgXzxgpwDbP5Yd7BILRUaFQnKGciw9UqiOELzlk8C11tZ6tMlMbYbuOXxxObuG04hmgIZH745 WrmpTc9T6orLxTeUxbnevT6gMJQNJLI/8uWzz63HvpC0YBmpFEX4jkQ6ArPr4ubQJGvmyfeA1Nx PWAvcT4gRZuI6LhknlFviIIdTz4Up/Vm95BBqXmepkUxkmhl6EJR23MpixRjlLypmLCNgZyeHt0 jewIifEBxT8zCp/JvxVT/if46B6y9i1b7+fz+cD+tf3IJrXjq8OKK4uHh2LrqYjuTaGMWM2XMkP 1LYAByhVCg6f2sDZ6jwYBXvLrhd7o= X-Received: by 2002:a05:6000:178d:b0:432:aa61:a06e with SMTP id ffacd0b85a97d-4399de2b577mr20486854f8f.32.1772441133291; Mon, 02 Mar 2026 00:45:33 -0800 (PST) X-Received: by 2002:a05:6000:178d:b0:432:aa61:a06e with SMTP id ffacd0b85a97d-4399de2b577mr20486800f8f.32.1772441132715; Mon, 02 Mar 2026 00:45:32 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 042/102] i386/kvm: avoid installing duplicate msr entries in msr_handlers Date: Mon, 2 Mar 2026 09:42:37 +0100 Message-ID: <20260302084338.473368-43-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441392819158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha kvm_filter_msr() does not check if an msr entry is already present in the msr_handlers table and installs a new handler unconditionally. If the funct= ion is called again with the same MSR, it will result in duplicate entries in t= he table and multiple such calls will fill up the table needlessly. Fix that. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-2-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/kvm.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index bb8303c39fe..c0be2e932da 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -6273,27 +6273,33 @@ static int kvm_install_msr_filters(KVMState *s) static int kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdm= sr, QEMUWRMSRHandler *wrmsr) { - int i, ret; + int i, ret =3D 0; =20 for (i =3D 0; i < ARRAY_SIZE(msr_handlers); i++) { - if (!msr_handlers[i].msr) { + if (msr_handlers[i].msr =3D=3D msr) { + break; + } else if (!msr_handlers[i].msr) { msr_handlers[i] =3D (KVMMSRHandlers) { .msr =3D msr, .rdmsr =3D rdmsr, .wrmsr =3D wrmsr, }; - - ret =3D kvm_install_msr_filters(s); - if (ret) { - msr_handlers[i] =3D (KVMMSRHandlers) { }; - return ret; - } - - return 0; + break; } } =20 - return -EINVAL; + if (i =3D=3D ARRAY_SIZE(msr_handlers)) { + ret =3D -EINVAL; + goto end; + } + + ret =3D kvm_install_msr_filters(s); + if (ret) { + msr_handlers[i] =3D (KVMMSRHandlers) { }; + } + + end: + return ret; } =20 static int kvm_handle_rdmsr(X86CPU *cpu, struct kvm_run *run) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441205; cv=none; d=zohomail.com; s=zohoarc; b=BwitqW2ThwioZorD2KnzTZLlu+loOKR3zsRhAj1hxFVeR/IWQde2inKWbfZTbt6o6SG3aPH2/LnVnRrlrUbXBycaj+ZWwTKK5kQIPHoXL+0oydAZo919frI9HZd1Sfp8xR32zYYSNSn+3lTHjEPQ4FCdSzW6ibki5F7sS10LGes= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441205; 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=HYqjAK7qOdvm/hJDVYV3EiWpflw4secDuvQP3hCMmE0=; b=JJ9W+5Y86OVcZSit3Fle2/5fob0ibJ8JXhmmEUTYEtlvaCYIooQ8MJrgBzJeoGcuLEZZPIf9uWZgp1xM92hQ7W270lJA9/TlzDXjlJqWQ2zP3A6dZc2BGYsubVmxtLm1EV9hf0Ajw1ijxtj/u7n53wUfohu+eAQmLEFFsdD8TRU= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441205013920.361251125094; Mon, 2 Mar 2026 00:46:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvF-00066I-NU; Mon, 02 Mar 2026 03:46:37 -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 1vwyug-0005Bf-RG for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:07 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuV-0001vS-Li for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:56 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-628-ERlBvC_GOfmL3STi48W5fw-1; Mon, 02 Mar 2026 03:45:38 -0500 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-4363333c102so2852427f8f.1 for ; Mon, 02 Mar 2026 00:45:38 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c765c67sm27724110f8f.32.2026.03.02.00.45.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441139; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HYqjAK7qOdvm/hJDVYV3EiWpflw4secDuvQP3hCMmE0=; b=GAGQzH3JNeRsI/D8QApLNjkXW+JtkVUoUf1+XrKA1D0kvwDp/0Gs8c4CFsV/EeGJbsYheW MFarMZHS7CE3dK+HAQ2E1lW7KnwC6wX8j07iHm1idw511/WNUJLVdBJzPIuHuV5G2N2YAA HPWj9IOvN83jzH9H6qbtUIBYXhVeZeQ= X-MC-Unique: ERlBvC_GOfmL3STi48W5fw-1 X-Mimecast-MFC-AGG-ID: ERlBvC_GOfmL3STi48W5fw_1772441137 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441136; x=1773045936; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HYqjAK7qOdvm/hJDVYV3EiWpflw4secDuvQP3hCMmE0=; b=i+P5/wR4ev25C92zkvkWJ1I3O+uecuUp3Q4M9EeopwBD8XDn0TXYOazUJSmYPtI8JG v95iAWyYdaQiTBfQQSxXOtTSQ+XOR3n9YWxklQColn8DN7i1QG4nl6BXmusQnQkpCrG4 RHiXsczL6z6h8rPzwpsdXJs6QV6FFJY/YQchY0BRat3VgrPONrGagu6Ek+dLeXFy3vdz 0PW0qDAAwgffcbzL2LkUDHspVHidcahuuH88T8QOOBBe+R4yRCgnFfoS5fpTmlllDKIY eshXa365PdMt1egaGqM7RA3+kvhLJnAoxj8JSepJLgrlx/L3Wg9AEF3zvbBIaF6crj2D s/Lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441136; x=1773045936; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=HYqjAK7qOdvm/hJDVYV3EiWpflw4secDuvQP3hCMmE0=; b=WMRdkanFIRSxinYvdhDppUlFUpd0X3WtKC4N1WNRXmqbaLyFBxttcUtdIADfIlD141 7yVWpnoSZHgk+J8ch0yfs5cblllywA0iVTxgGNhpNOegU7gCC/u7Kw2GadpfANL8fKr7 cuV6QE5WTJFjWwVwWdlTZwlq3WcC3SxxwIWYaevUqvuoHU7Y4GaYYyRdzIxVlzGqmD0k 2gnW3oAlG2KHrS3KBfasC10i3IiXXiOfot32lfpTQbZmGOIeRSOIX6xND+yqVEsEDgwX RiImejto1x8uKMd2F88DkyrYxzHkv9ulOiD0y/1jljxg0v91ZmQIrGp5nrFuY7aD4Dow bxLg== X-Gm-Message-State: AOJu0Yx1x1yb84qgDnv5euxCfAAcDV2zWEyy3tj/awlFyVZI1wxjXvae pYv00hc505au9wOVC/rRTbH3Ej3fKmDNkmCQRvkkyBR+PqOprloziYyuif5Fi3uGEQpbsjKHOfs TTJRIWebBejXogCSvwD0qoBRvOzX9xnBEiub5OaIou64ym6mLg0xE8UP1fx6wAVt+tnelu2w5pN vDPdfVhBslMvyZEdvrFafMFZeLu96m69fc8Dhazju8 X-Gm-Gg: ATEYQzw8CzS4m45NWZqeOOAI099r/Igxu+hAmhmZCIQB58sMTqFdCP4wzmRqpl/4wi9 gM21fsJOT82rPfKupVTKipNa7q+WBnORfgRzAz66SfvdWGM8+xHBL8HdZvSrtuPUA6kyZW3NS4a dkF5uZWiZvl4BzU+d6ETiaFs1Yzd9e9vT8hDY8A3nUC0EffoI5AotAxByp283Wx3E8qsKod2pon GRQ2QK1plVH/KwhPiYpgEejFGSiBClZT1XBTZ8oAP0p19qhMM1xWTobWECWPsP2x99cD/stmRXP VumOZ6fBr88put828rgsJYCXoCcqj3h1ucOIYe0ttB8Ip5Ki4huhksyrDaSbO23dgPFyQDTAZEW FRXpM1gOif/Ty8j0pv+8xqT8OnPsp0Cgy7z5KX/jUigPyAH9aJM4dTmrqEg1uvUbPrHRj2hh3JV Nq4jRZ0q0HP4GESnLGww/fEEQVp5U= X-Received: by 2002:a05:600c:34cf:b0:480:690e:f14a with SMTP id 5b1f17b1804b1-483c9bb6744mr184864485e9.14.1772441136334; Mon, 02 Mar 2026 00:45:36 -0800 (PST) X-Received: by 2002:a05:600c:34cf:b0:480:690e:f14a with SMTP id 5b1f17b1804b1-483c9bb6744mr184864155e9.14.1772441135801; Mon, 02 Mar 2026 00:45:35 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 043/102] accel/kvm: add confidential class member to indicate guest rebuild capability Date: Mon, 2 Mar 2026 09:42:38 +0100 Message-ID: <20260302084338.473368-44-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441205965158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha As a part of the confidential guest reset process, the existing encrypted g= uest state must be made mutable since it would be discarded after reset. A new encrypted and locked guest state must be established after the reset. To th= is end, a new boolean member per confidential guest support class (eg, tdx or sev-snp) is added that will indicate whether its possible to rebuild guest state: bool can_rebuild_guest_state; This is true if rebuilding guest state is possible, false otherwise. A KVM based confidential guest reset is only possible when the existing state is locked but its possible to rebuild guest state. Otherwise, the guest is not resettable. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-3-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- include/system/confidential-guest-support.h | 20 ++++++++++++++++++++ system/runstate.c | 6 +++--- target/i386/kvm/tdx.c | 1 + target/i386/sev.c | 1 + 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/include/system/confidential-guest-support.h b/include/system/c= onfidential-guest-support.h index 0cc8b26e644..5dca7173088 100644 --- a/include/system/confidential-guest-support.h +++ b/include/system/confidential-guest-support.h @@ -152,6 +152,11 @@ typedef struct ConfidentialGuestSupportClass { */ int (*get_mem_map_entry)(int index, ConfidentialGuestMemoryMapEntry *e= ntry, Error **errp); + + /* + * is it possible to rebuild the guest state? + */ + bool can_rebuild_guest_state; } ConfidentialGuestSupportClass; =20 static inline int confidential_guest_kvm_init(ConfidentialGuestSupport *cg= s, @@ -167,6 +172,21 @@ static inline int confidential_guest_kvm_init(Confiden= tialGuestSupport *cgs, return 0; } =20 +static inline bool +confidential_guest_can_rebuild_state(ConfidentialGuestSupport *cgs) +{ + ConfidentialGuestSupportClass *klass; + + if (!cgs) { + /* non-confidential guests */ + return true; + } + + klass =3D CONFIDENTIAL_GUEST_SUPPORT_GET_CLASS(cgs); + return klass->can_rebuild_guest_state; + +} + static inline int confidential_guest_kvm_reset(ConfidentialGuestSupport *c= gs, Error **errp) { diff --git a/system/runstate.c b/system/runstate.c index d091a2bdddb..13f32bed8cb 100644 --- a/system/runstate.c +++ b/system/runstate.c @@ -57,6 +57,7 @@ #include "system/reset.h" #include "system/runstate.h" #include "system/runstate-action.h" +#include "system/confidential-guest-support.h" #include "system/system.h" #include "system/tpm.h" #include "trace.h" @@ -543,8 +544,6 @@ void qemu_system_reset(ShutdownCause reason) */ if (cpus_are_resettable()) { cpu_synchronize_all_post_reset(); - } else { - assert(runstate_check(RUN_STATE_PRELAUNCH)); } =20 vm_set_suspended(false); @@ -697,7 +696,8 @@ void qemu_system_reset_request(ShutdownCause reason) if (reboot_action =3D=3D REBOOT_ACTION_SHUTDOWN && reason !=3D SHUTDOWN_CAUSE_SUBSYSTEM_RESET) { shutdown_requested =3D reason; - } else if (!cpus_are_resettable()) { + } else if (!cpus_are_resettable() && + !confidential_guest_can_rebuild_state(current_machine->cgs)= ) { error_report("cpus are not resettable, terminating"); shutdown_requested =3D reason; } else { diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c index 01619857685..a3e81e1c0cc 100644 --- a/target/i386/kvm/tdx.c +++ b/target/i386/kvm/tdx.c @@ -1543,6 +1543,7 @@ static void tdx_guest_class_init(ObjectClass *oc, con= st void *data) X86ConfidentialGuestClass *x86_klass =3D X86_CONFIDENTIAL_GUEST_CLASS(= oc); =20 klass->kvm_init =3D tdx_kvm_init; + klass->can_rebuild_guest_state =3D true; x86_klass->kvm_type =3D tdx_kvm_type; x86_klass->cpu_instance_init =3D tdx_cpu_instance_init; x86_klass->adjust_cpuid_features =3D tdx_adjust_cpuid_features; diff --git a/target/i386/sev.c b/target/i386/sev.c index acdcb9c4e68..66e38ca32e1 100644 --- a/target/i386/sev.c +++ b/target/i386/sev.c @@ -2760,6 +2760,7 @@ sev_common_instance_init(Object *obj) cgs->set_guest_state =3D cgs_set_guest_state; cgs->get_mem_map_entry =3D cgs_get_mem_map_entry; cgs->set_guest_policy =3D cgs_set_guest_policy; + cgs->can_rebuild_guest_state =3D true; =20 QTAILQ_INIT(&sev_common->launch_vmsa); } --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441961; cv=none; d=zohomail.com; s=zohoarc; b=NO15qX8cUFDg4xwGVZFTNhrYAflcXl70ptnVzuSMN8rHnRlxJpUAd9LdPxKsLeBzsd2m0Hxkxi6Z+c+AfSCAvwRLN3tQWIvmu6oygBms1KQZeBEftQVZ2Q2T0uCF98F6TBdSXZ9zpKxgIXseVB88n/t8fNjwpJm4LB3V9Z0Y56M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441961; 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=OkqEARvLlHBGX6rcIoTK2/5rB5MizOkytAb1OeGUb4Q=; b=EDLcwYPNJVxo5F5x+zuV62kvugRGQfOHmyEF+TiWeKnQ38g757SuJPE1yDBe0r7jcwetNwgYEfe47qn1jQwL7AmCNYW7xeg7nbu0FM4ylyIY0Kje6aQ8TjV01WSZLkkfhMo7mnXGY8yP/zT71cXlv617F1LgusttOiMgRm3/E2Y= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441961518817.4307000991561; Mon, 2 Mar 2026 00:59:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvs-0001CR-32; Mon, 02 Mar 2026 03:47:16 -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 1vwyuX-00055H-O7 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:01 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuQ-0001vd-HO for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:49 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-652-k3qWNIvZOwmpPuLj4BlYow-1; Mon, 02 Mar 2026 03:45:40 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4836c819456so28172995e9.3 for ; Mon, 02 Mar 2026 00:45:40 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b55d15besm8971971f8f.30.2026.03.02.00.45.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441141; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OkqEARvLlHBGX6rcIoTK2/5rB5MizOkytAb1OeGUb4Q=; b=GEDst9SwxtUhOib6HJN6ypn1ejTNazPE4GTsdcJ5N/Rjk5gt/G1m+z7LTnX2e3TOHKWoj5 LdwIgGlPjm0VVltlRWh2WyL+riH9mDnXeCjVVl1lBuHfUjq5WkBosiNHdJj7U7cmcXtDP/ 6yl8znh8MYvYn9M/H2b+uNTNjtARQXE= X-MC-Unique: k3qWNIvZOwmpPuLj4BlYow-1 X-Mimecast-MFC-AGG-ID: k3qWNIvZOwmpPuLj4BlYow_1772441140 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441139; x=1773045939; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OkqEARvLlHBGX6rcIoTK2/5rB5MizOkytAb1OeGUb4Q=; b=djGK90pzXBQIbFsqN2zQXHRju6YrES6lc8AMNFBT9PoBijywZmKkK06prvmmtTrkCf 8oXr6uqxWAP9F48TIlnbB8gJkdsZuWKLjmsqJIsT1VbZEvnH2mli25YOjrm+UaVj2zQy x0u3WOqt3C4t5sjrpLMXA+EfPitW9Fp1jm27RI8UpFf08uS9evUUhlvelR7DyfzMLMpt /hAOIimVq4ljAD8PX/itvcaNdLtR7iyS48ndRkgtjOeB5lS6iJ/id2qkA8pmLvRa/M+g jm309+u7XuFHH+CGSwc6miBPLly4wSyjDdGe2DBfg4MPtIstC5xYj16u/tif8jt4VXCC Qaiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441139; x=1773045939; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=OkqEARvLlHBGX6rcIoTK2/5rB5MizOkytAb1OeGUb4Q=; b=iBoMGI8NDB/Kp8jBr2ciXH5/muQ+jGh45SO0pxo9uhfY17yEMgosySeP5pNgdG86DX piHFBgKVX7ISVP3kn14rdLfQU7lKNjkNts+8h4r6UyEDTxeEXnbseH9vDctGjAHXYzX7 ILakrGL6N0oRPPQTDTR9kM6/tEih/LND3uEHw0itPTAYoCm8nMEd07jPH8HWyL7J0DCt 6fmOO5yLIX2C8VTnnm1o2kLWUL9kioPS35tT5asrxV+k56pVZ15wHfvAgEnBsCVUlalo 1ybVdLaJCamGX2fhQeM1+lMbhPbVW5/S3K8LUupxjjvh/1Vb8RV81vcWm+qoYyOFN6ue N/cw== X-Gm-Message-State: AOJu0YxmJtc1heyjkXvRPS9ynt87YHC0g0pBmQA8BkLgLfawdwYRvPU8 CXdu1Q3L7UjMguBX1XhX6CK0FglHR5ygnvgdS6/tkxhzILOmysMIZke3eUuAY8CxYub7dlb9by6 ubxPbG/69QYWjN+JDWj0T+WxCKGkxnTjpPoeKgRl3Y8u9sZTiFWvBM1/0pZKkJIbrK6ZjaKguh9 gnfpDirbMXxgyeB7HHnJ0UXM7aZ2VI0aKKv8uo2T26 X-Gm-Gg: ATEYQzz2Z503qMtzTihEsZzBRanLDkpDZ6u5+FuYxCrMtnl4NgYPYJipy7EzxWKj+0+ 4szjojAsHxnAvURYK6ZG9HOzlkmqdMGWm+jRSkIXLoma32j3R0aqokB5mOOKUosU2t4EvomofcU eYWydKOIf9b1PFXI5FJNRhszOJEmNaIzC4j9VxMf3USXa5bxoModWA3zkjZFBQRXjhHSXqfiP+N mWRkamaWBbrhO8n2wZ0FERKgoVeTXJMFUGkOKInxt/t2lBc87UNvjmfDg/c+T3epqaBrTVvYURv PPbw04ReNRkNUjL15IPNC24i3D1Jp63i8+1AotXqWlgLhfWSCSFxTNPOqrYqzJy8oaU5fM697jl qc4vSuzOYCQTDDh7qJyal6C5m15TdGaWbLssIo/1MnKXzrivR47cy11KBPxEH+ckrLz0tK4N/+2 hW4YwYMUoi+BgPnuOl7j4pq8AkaGg= X-Received: by 2002:a05:600c:8207:b0:480:39ad:3b7c with SMTP id 5b1f17b1804b1-483c9c1bb0amr228974125e9.16.1772441138871; Mon, 02 Mar 2026 00:45:38 -0800 (PST) X-Received: by 2002:a05:600c:8207:b0:480:39ad:3b7c with SMTP id 5b1f17b1804b1-483c9c1bb0amr228973465e9.16.1772441138355; Mon, 02 Mar 2026 00:45:38 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 044/102] hw/accel: add a per-accelerator callback to change VM accelerator handle Date: Mon, 2 Mar 2026 09:42:39 +0100 Message-ID: <20260302084338.473368-45-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441961774158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha When a confidential virtual machine is reset, a new guest context in the accelerator must be generated post reset. Therefore, the old accelerator gu= est file handle must be closed and a new one created. To this end, a per-accele= rator callback, "rebuild_guest" is introduced that would get called when a confid= ential guest is reset. Subsequent patches will introduce specific implementation of this callback for KVM accelerator. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-4-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- include/accel/accel-ops.h | 2 ++ system/runstate.c | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/include/accel/accel-ops.h b/include/accel/accel-ops.h index 23a8c246e15..f46492e3fe1 100644 --- a/include/accel/accel-ops.h +++ b/include/accel/accel-ops.h @@ -23,6 +23,8 @@ struct AccelClass { AccelOpsClass *ops; =20 int (*init_machine)(AccelState *as, MachineState *ms); + /* used mainly by confidential guests to rebuild guest state upon rese= t */ + int (*rebuild_guest)(MachineState *ms); bool (*cpu_common_realize)(CPUState *cpu, Error **errp); void (*cpu_common_unrealize)(CPUState *cpu); /* get_stats: Append statistics to @buf */ diff --git a/system/runstate.c b/system/runstate.c index 13f32bed8cb..e7b50e6a3b1 100644 --- a/system/runstate.c +++ b/system/runstate.c @@ -42,6 +42,7 @@ #include "qapi/qapi-commands-run-state.h" #include "qapi/qapi-events-run-state.h" #include "qemu/accel.h" +#include "accel/accel-ops.h" #include "qemu/error-report.h" #include "qemu/job.h" #include "qemu/log.h" @@ -509,6 +510,9 @@ void qemu_system_reset(ShutdownCause reason) { MachineClass *mc; ResetType type; + AccelClass *ac =3D ACCEL_GET_CLASS(current_accel()); + bool guest_state_rebuilt =3D false; + int ret; =20 mc =3D current_machine ? MACHINE_GET_CLASS(current_machine) : NULL; =20 @@ -521,6 +525,29 @@ void qemu_system_reset(ShutdownCause reason) default: type =3D RESET_TYPE_COLD; } + + if (!cpus_are_resettable() && + (reason =3D=3D SHUTDOWN_CAUSE_GUEST_RESET || + reason =3D=3D SHUTDOWN_CAUSE_HOST_QMP_SYSTEM_RESET)) { + if (ac->rebuild_guest) { + ret =3D ac->rebuild_guest(current_machine); + if (ret < 0) { + error_report("unable to rebuild guest: %s(%d)", + strerror(-ret), ret); + vm_stop(RUN_STATE_INTERNAL_ERROR); + } else { + info_report("virtual machine state has been rebuilt with n= ew " + "guest file handle."); + guest_state_rebuilt =3D true; + } + } else if (!cpus_are_resettable()) { + error_report("accelerator does not support reset!"); + } else { + error_report("accelerator does not support rebuilding guest st= ate," + " proceeding with normal reset!"); + } + } + if (mc && mc->reset) { mc->reset(current_machine, type); } else { @@ -543,7 +570,16 @@ void qemu_system_reset(ShutdownCause reason) * it does _more_ than cpu_synchronize_all_post_reset(). */ if (cpus_are_resettable()) { - cpu_synchronize_all_post_reset(); + if (guest_state_rebuilt) { + /* + * If guest state has been rebuilt, then we + * need to sync full cpu state for non confidential guests post + * reset. + */ + cpu_synchronize_all_post_init(); + } else { + cpu_synchronize_all_post_reset(); + } } =20 vm_set_suspended(false); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441252; cv=none; d=zohomail.com; s=zohoarc; b=QHE3kt1FM4cHBcp5gR1fFFlhpargWX71lDsPSQg5Fqp1aGPrXcW55wNWnx13WaTZUBtHVA+ePY56yBnZM12HfLlt5Ng/eN+tSqLBkSoGlhMBi6zKQgIg3Q2BYyakQD6rEBI5c0+nqLrCVUqjsaZ8BuCuvN7IfC/W8D0/3uAOaTM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441252; 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=7M/zJBnp0CFgI6to1PfNFpWyTEZ/2AsbsDLwiqyg5wE=; b=bb1VXeXcf+U8ZNatTx1Gg5XTrP4L0s4HEFWViV1HncHZUs6Tu2i8dpmq4nSHMN975ao4OgJy/jqZDFd13ypDoQq5nWtI1TgPsSQDMtqV1HXM13ZGq7X7tYrlQk0lYL8M80dmOWKrh4x5kEMvBYet+J+n9xhxChkOKIXTK/yyx8I= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441252778469.2118928882702; Mon, 2 Mar 2026 00:47:32 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvF-00069s-Q9; Mon, 02 Mar 2026 03:46:39 -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 1vwyud-00059f-4y for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:04 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuS-0001vl-1q for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:45:52 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-219-8-HEBw5lNKCN8340nWhlew-1; Mon, 02 Mar 2026 03:45:43 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4836b7c302fso42656295e9.1 for ; Mon, 02 Mar 2026 00:45:43 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfb789efsm205306465e9.2.2026.03.02.00.45.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441144; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7M/zJBnp0CFgI6to1PfNFpWyTEZ/2AsbsDLwiqyg5wE=; b=INesZFozVcULRI8wneFuWGOAtngDteqHPLyaHpjKUhOFhEdLWKeL5Ouc301mF8MrABYLrj UcBMwXJrjYYz4GuHbQw/1JEq7ODCYqFTkMrmi7SPhryImtbUvBfMPL4RzCFgm5hMWHfm2w 6BHO13yeV6O7AMDlH4X3rLivMh0N2yE= X-MC-Unique: 8-HEBw5lNKCN8340nWhlew-1 X-Mimecast-MFC-AGG-ID: 8-HEBw5lNKCN8340nWhlew_1772441142 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441141; x=1773045941; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7M/zJBnp0CFgI6to1PfNFpWyTEZ/2AsbsDLwiqyg5wE=; b=Vu2nJmdynGwiuxI+8kp/W7AtEiUzxgCO4yZ46DXBHSgzthILSLX7tgRM3zTNkfW6CR PSo0V2RHUPLgAKAZEsDQsz4yX7W9CSSSN4hZCKY5bRksNt900vkjH4NUZN9Xcu4qXtFS uT0uLA0YLC2bG/Gip/kd2NOy2/rSk2e8sfCnLHuydzMADDxYWNA5zDdfKafipAxUHubF //lgt/r7safKXqaU9K5X2wZOEo9Xh9JXwdGmaePhuGhd+mskvALIEZ7lmtZEU2XFo3UD Vf9OL15l0/OyWr47dmkCS8hgKxOiu7UxKj5E5MoNFfwHRz6cxItJX7MsJJz8pDuCj4wm vkUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441141; x=1773045941; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=7M/zJBnp0CFgI6to1PfNFpWyTEZ/2AsbsDLwiqyg5wE=; b=fG28nfF24its+P+VQd+7TQTK3zvl9i/kFSiPfG1FYwjhYaLsVP1tCBCOEUxYBqI2nu wmzKPeIRPWwNnNRqgZcQMrTpKOHG9AqHXR+VcSr7cltCRebCPBsX6oBJz3r08CQXLcPW A6pKrbzR4YTDOIaSbyjBbRt989cwpijRtFMApfHm5G0vqM20S3/beBnAnDqNsBexQHKC YXaDUyR631/xYwyba9RPv+LLZNMMwOxUu0G5MNt9771l+tsPZ9K86h0tdtg41AFApPzm Docxj1WgOASayjQLX3mljfDTq/Tas0I4mKUXtKkceLv124xUh7oFF0PXF3gDPewtXaf3 GZ0g== X-Gm-Message-State: AOJu0YxZB6h+1FPNBafeex5LY7ZWuNOEZBCZgBvSLml4u6bGVtqt1sn+ xMrxqoUK4rCq926mHYI1QS4dGp/eaqWkfiFkzcOH3CobyzWt9vaZRq7FDF/4eXKxMBf9zoDkLyj NRXYAaZbAIREkPlR9Nwlz2B8Yu/+NJbU/vRqT8COWEBJsJq6j8ikyVmKqEkW8+HpDFk7EieuMGg QH10VYJiu84hVQUv3f38bC/O47SrJFVq5OqTL2U0Z0 X-Gm-Gg: ATEYQzw2x/6yEqYaK9fXLSLLk/rn362yt0opWko7fltjnIfS1A9KVxpGzaDR60uHIoO eeDi4c4BjbL2OLiMBELaOjS4dhWdGdIB81JZq/H9ti062A0j9d0IzqFhdD4DuT0Hj+vRqXNI/a2 8oqe/cw9ffrcpzY62LedF9zOgLdINOx+Z74xn1SX9IenCoAPVYokdgicKpuRt/GmHiNQLNz598A PKFdX1exefgYwMOcjtwu1tofrnUduKZ/nGwCC6foWO8oRw/VNcvz4SPAE21W1b2asNzxBYmQa2A 6BICA/38Ej18awp3b5W5LxCnEsjHDotgaRyLGgeKDNFZw3zoQMxEvsSC4bsc3Ttw7xd3ndEfFIU WA10uPb4ADt0HGH8TAM45aPi8A/Dd0Z3jNJgwxm2iU4jwphqNXTxcvpIugjtgWjSwuZq1k0QK75 hvgnx4sIirVSou+fD/vPScxwXVpEU= X-Received: by 2002:a05:600c:37cf:b0:477:6d96:b3c8 with SMTP id 5b1f17b1804b1-483c9c23b6amr203555455e9.23.1772441141599; Mon, 02 Mar 2026 00:45:41 -0800 (PST) X-Received: by 2002:a05:600c:37cf:b0:477:6d96:b3c8 with SMTP id 5b1f17b1804b1-483c9c23b6amr203555065e9.23.1772441141141; Mon, 02 Mar 2026 00:45:41 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 045/102] system/physmem: add helper to reattach existing memory after KVM VM fd change Date: Mon, 2 Mar 2026 09:42:40 +0100 Message-ID: <20260302084338.473368-46-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441254180158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha After the guest KVM file descriptor has changed as a part of the process of confidential guest reset mechanism, existing memory needs to be reattached = to the new file descriptor. This change adds a helper function ram_block_rebin= d() for this purpose. The next patch will make use of this function. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-5-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- include/system/physmem.h | 1 + system/physmem.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/system/physmem.h b/include/system/physmem.h index 7bb7d3e1545..da91b77bd9b 100644 --- a/include/system/physmem.h +++ b/include/system/physmem.h @@ -51,5 +51,6 @@ physical_memory_snapshot_and_clear_dirty(MemoryRegion *mr= , hwaddr offset, bool physical_memory_snapshot_get_dirty(DirtyBitmapSnapshot *snap, ram_addr_t start, ram_addr_t length); +int ram_block_rebind(Error **errp); =20 #endif diff --git a/system/physmem.c b/system/physmem.c index 2fb0c25c93b..e5ff26acecd 100644 --- a/system/physmem.c +++ b/system/physmem.c @@ -2826,6 +2826,34 @@ found: return block; } =20 +/* + * Creates new guest memfd for the ramblocks and closes the + * existing memfd. + */ +int ram_block_rebind(Error **errp) +{ + RAMBlock *block; + + qemu_mutex_lock_ramlist(); + + RAMBLOCK_FOREACH(block) { + if (block->flags & RAM_GUEST_MEMFD) { + if (block->guest_memfd >=3D 0) { + close(block->guest_memfd); + } + block->guest_memfd =3D kvm_create_guest_memfd(block->max_lengt= h, + 0, errp); + if (block->guest_memfd < 0) { + qemu_mutex_unlock_ramlist(); + return -1; + } + + } + } + qemu_mutex_unlock_ramlist(); + return 0; +} + /* * Finds the named RAMBlock * --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441960; cv=none; d=zohomail.com; s=zohoarc; b=gAXdIF7voZLAZYIq5A7bN4niGudyogFr7IGPXGV4BSZ5VVtVabE126IDZ8uDm9mSK0EOE8wAtl57/0KnVQMqJY37clgouNvrwwNUFYzX5zQo+gvck9IF/ucggvn9J2Gm6ENiXwPvVnnHYnu+T/98QuYpxu4o21qBpmHlVJwJRvE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441960; 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=Bt+nbRcBAMd2MNgkvRjGu4iiwsMcXjA5Z4aoYzLKs8I=; b=nrxy5bePCbbnyQPx7DNjtlp8tC6x136WTQt5zpMWfoKC5pSyqmZYULdACR5U+ozIYuoudNAVyjRglKg5pc8YIW6iYY0Q51ySYOTQFPhOwTqxrRKmYQSUs/nmXhRmLjUpAmAYw0UQI++WWTbPYmyD3k7YRNsfRiO235Sd2eLXcFY= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441960367576.7886000930993; Mon, 2 Mar 2026 00:59:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvh-0008Bz-Ap; Mon, 02 Mar 2026 03:47: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 1vwyup-0005Nf-I0 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyug-0001vw-JC for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:10 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-257-34-Wx1IPMoOt0Da8TLAl7Q-1; Mon, 02 Mar 2026 03:45:46 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4832c4621c2so46277105e9.3 for ; Mon, 02 Mar 2026 00:45:46 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcbf673sm155205805e9.19.2026.03.02.00.45.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441147; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Bt+nbRcBAMd2MNgkvRjGu4iiwsMcXjA5Z4aoYzLKs8I=; b=LwdunB89hARXVO9wB790fpk3whgBuCGBDGLZ5zpfr+cookdsFOW/6acw2QLiI+iwap9UZt iKhcjB3nVkjxtbmP98/bEyXO83WBNwzs9c3U6K3YoE4ATkLflLTrlczqzW5RVPQ46VVSgx UlGPI7vXmtH8hfm42x6E1crF4LAIwSg= X-MC-Unique: 34-Wx1IPMoOt0Da8TLAl7Q-1 X-Mimecast-MFC-AGG-ID: 34-Wx1IPMoOt0Da8TLAl7Q_1772441145 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441144; x=1773045944; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Bt+nbRcBAMd2MNgkvRjGu4iiwsMcXjA5Z4aoYzLKs8I=; b=Q1CQR46R4gLM8a5CSuFhpQqcbvk02v9GDiFFMZa1L4dDR5DYIpVZ0tZfXqlbTN8iQI FBT68y4nASpR0uv3f7/iR1OVuPMAXtQZqftPCLCur+xorBkVxFVvaqKCsH0MCn9THyOt 8LzOrRSibAISjXTKnep5Z4dFkhYcC8C3SKYCrq6p0K+uPdCbvQZcgewSAE0OunH6JEBJ nf8QJ/Hcox6aOvaJareFkXMm2uEXXmIWqmM1zwaB0bANgTwp5yxiyHoMS+FbdXuEmFZ7 unorggX+hWPXBl69ae2GTVENU2LZMFCQzi6OdqTn9rrWPEyrrNlDaOrFSjtaF+rvM0uI 3bMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441144; x=1773045944; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Bt+nbRcBAMd2MNgkvRjGu4iiwsMcXjA5Z4aoYzLKs8I=; b=BeDBMGuIdWDTg7cNayiBNtqZCELGAEN41O8OJP1UXDZcudy81MQMrOOhET5Fdr8FhO 53qeECIabidsgpXIBfnq4jMmv31JLFZO2YFlO1oCpke2g68FHa7882CyA8V6V9jyaoPt MCIed03iOuS8eVcpQ4MQfqX+QX5x8PKGozSh7FOwRBepkxeMS+/kXHQlaMHjQV8Uw2S7 ozja21BTn0qzC8tfDIQ9ymC7UkSuzjiV1zIsa4i+EY9/43zOJ3cAtspMpBxQqg/Bbrbl Cct5vX+15r8iW0Re0PYC58IwaDM6D59tXl3bW+Kz5erxysTAEIWX/MwttRdmW9sxwZpg M7WQ== X-Gm-Message-State: AOJu0YzsajQC3vUSHvGjVaQCvcUcnVWnf1+pa0MTiVwWtVrFYQra34Lt NB4Jg8Bx1zolNtkJWzKziTqK8bu61NszDScHezdqhqFdNV3dagaePwW9+f7D4fGzjBRA36VFqnf B/NYfqt6bCisnveZRmknoTFwe53gwgrS4Tu0AWQ5a/RkrK/ydDOQzx+A8QM+6VfI3cnu4qH6EGJ Sy26u7iqhJ+CzWStpOkdSrrFEGblijYnTwFw2GZCla X-Gm-Gg: ATEYQzwPaU/0pJcPvIfdKplxEl1jv0tNuW52bHQPMUTEeGf2yTbVQJDqPnubm2E+35l OfvZxPWPZZi5P+lbbgig8NHWWf0TqwwisExLWZta7tSBFDuBpUsJd8+mMwDl8HWNUulbLtYfRA8 ttcTHSxmvxDsDq8EvTWFU+yzVAJy4gTKnE0Usnehr2U2bYeCgVil2PuZYrGggRMLZHOzSzMfUi1 yOuyPugn1YNXzA4NEO0wFfmgyZ/C4Y5bIPPIBqvKezmCOIWYr4w/+FndFHJ7gnyDszHIR+rCAQt bD2C5AxVxe0v12NTBMVgklYsPwZe0fY1+xRn5p5isecvmnrCvUf9uVJ0Grh++PbyZLyZ1Pi4Oh1 pqHEYvP/WKU638EszrBtTEBwFYnlb+8n4DdOW9YZvWfmMPATbTQqpOFX5RotTFHplY9kB61hRKb F7Oau/nuE/8dHHzPiCQPyxlTm9/qg= X-Received: by 2002:a05:600c:3108:b0:483:709e:f238 with SMTP id 5b1f17b1804b1-483c9c1d177mr199954985e9.29.1772441144161; Mon, 02 Mar 2026 00:45:44 -0800 (PST) X-Received: by 2002:a05:600c:3108:b0:483:709e:f238 with SMTP id 5b1f17b1804b1-483c9c1d177mr199954465e9.29.1772441143587; Mon, 02 Mar 2026 00:45:43 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 046/102] accel/kvm: add changes required to support KVM VM file descriptor change Date: Mon, 2 Mar 2026 09:42:41 +0100 Message-ID: <20260302084338.473368-47-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441961827158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha This change adds common kvm specific support to handle KVM VM file descript= or change. KVM VM file descriptor can change as a part of confidential guest r= eset mechanism. A new function api kvm_arch_on_vmfd_change() per architecture platform is added in order to implement architecture specific changes required to support it. A subsequent patch will add x86 specific implementation for kvm_arch_on_vmfd_change() as currently only x86 supports confidential guest reset. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-6-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- MAINTAINERS | 6 +++ include/system/kvm.h | 3 ++ accel/kvm/kvm-all.c | 88 ++++++++++++++++++++++++++++++++++++++++-- stubs/kvm.c | 22 +++++++++++ target/i386/kvm/kvm.c | 10 +++++ accel/kvm/trace-events | 1 + stubs/meson.build | 1 + 7 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 stubs/kvm.c diff --git a/MAINTAINERS b/MAINTAINERS index 72153288c53..a8e1546de1e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -152,6 +152,12 @@ F: tools/i386/ F: tests/functional/i386/ F: tests/functional/x86_64/ =20 +X86 VM file descriptor change on reset test +M: Ani Sinha +M: Paolo Bonzini +S: Maintained +F: stubs/kvm.c + Guest CPU cores (TCG) --------------------- Overall TCG CPUs diff --git a/include/system/kvm.h b/include/system/kvm.h index 8f9eecf044c..5fc7251fd94 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -456,6 +456,9 @@ int kvm_physical_memory_addr_from_host(KVMState *s, voi= d *ram_addr, =20 #endif /* COMPILING_PER_TARGET */ =20 +bool kvm_arch_supports_vmfd_change(void); +int kvm_arch_on_vmfd_change(MachineState *ms, KVMState *s); + void kvm_cpu_synchronize_state(CPUState *cpu); =20 void kvm_init_cpu_signals(CPUState *cpu); diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 0d8b0c43470..cc5c42ce4de 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -2415,11 +2415,9 @@ void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_i= rq irq, int gsi) g_hash_table_insert(s->gsimap, irq, GINT_TO_POINTER(gsi)); } =20 -static void kvm_irqchip_create(KVMState *s) +static void do_kvm_irqchip_create(KVMState *s) { int ret; - - assert(s->kernel_irqchip_split !=3D ON_OFF_AUTO_AUTO); if (kvm_check_extension(s, KVM_CAP_IRQCHIP)) { ; } else if (kvm_check_extension(s, KVM_CAP_S390_IRQCHIP)) { @@ -2452,7 +2450,13 @@ static void kvm_irqchip_create(KVMState *s) fprintf(stderr, "Create kernel irqchip failed: %s\n", strerror(-re= t)); exit(1); } +} =20 +static void kvm_irqchip_create(KVMState *s) +{ + assert(s->kernel_irqchip_split !=3D ON_OFF_AUTO_AUTO); + + do_kvm_irqchip_create(s); kvm_kernel_irqchip =3D true; /* If we have an in-kernel IRQ chip then we must have asynchronous * interrupt delivery (though the reverse is not necessarily true) @@ -2607,6 +2611,83 @@ static int kvm_setup_dirty_ring(KVMState *s) return 0; } =20 +static int kvm_reset_vmfd(MachineState *ms) +{ + KVMState *s; + KVMMemoryListener *kml; + int ret =3D 0, type; + Error *err =3D NULL; + + /* + * bail if the current architecture does not support VM file + * descriptor change. + */ + if (!kvm_arch_supports_vmfd_change()) { + error_report("This target architecture does not support KVM VM " + "file descriptor change."); + return -EOPNOTSUPP; + } + + s =3D KVM_STATE(ms->accelerator); + kml =3D &s->memory_listener; + + memory_listener_unregister(&kml->listener); + memory_listener_unregister(&kvm_io_listener); + + if (s->vmfd >=3D 0) { + close(s->vmfd); + } + + type =3D find_kvm_machine_type(ms); + if (type < 0) { + return -EINVAL; + } + + ret =3D do_kvm_create_vm(s, type); + if (ret < 0) { + return ret; + } + + s->vmfd =3D ret; + + kvm_setup_dirty_ring(s); + + /* rebind memory to new vm fd */ + ret =3D ram_block_rebind(&err); + if (ret < 0) { + return ret; + } + assert(!err); + + ret =3D kvm_arch_on_vmfd_change(ms, s); + if (ret < 0) { + return ret; + } + + if (s->kernel_irqchip_allowed) { + do_kvm_irqchip_create(s); + } + + /* these can be only called after ram_block_rebind() */ + memory_listener_register(&kml->listener, &address_space_memory); + memory_listener_register(&kvm_io_listener, &address_space_io); + + /* + * kvm fd has changed. Commit the irq routes to KVM once more. + */ + kvm_irqchip_commit_routes(s); + /* + * for confidential guest, this is the last possible place where we + * can call synchronize_all_post_init() to sync all vcpu states to + * kvm. + */ + if (ms->cgs) { + cpu_synchronize_all_post_init(); + } + trace_kvm_reset_vmfd(); + return ret; +} + static int kvm_init(AccelState *as, MachineState *ms) { MachineClass *mc =3D MACHINE_GET_CLASS(ms); @@ -4015,6 +4096,7 @@ static void kvm_accel_class_init(ObjectClass *oc, con= st void *data) AccelClass *ac =3D ACCEL_CLASS(oc); ac->name =3D "KVM"; ac->init_machine =3D kvm_init; + ac->rebuild_guest =3D kvm_reset_vmfd; ac->has_memory =3D kvm_accel_has_memory; ac->allowed =3D &kvm_allowed; ac->gdbstub_supported_sstep_flags =3D kvm_gdbstub_sstep_flags; diff --git a/stubs/kvm.c b/stubs/kvm.c new file mode 100644 index 00000000000..2db61d89a73 --- /dev/null +++ b/stubs/kvm.c @@ -0,0 +1,22 @@ +/* + * kvm target arch specific stubs + * + * Copyright (c) 2026 Red Hat, Inc. + * + * Author: + * Ani Sinha + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "qemu/osdep.h" +#include "system/kvm.h" + +int kvm_arch_on_vmfd_change(MachineState *ms, KVMState *s) +{ + abort(); +} + +bool kvm_arch_supports_vmfd_change(void) +{ + return false; +} diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index c0be2e932da..524b5276a68 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -3389,6 +3389,16 @@ static int kvm_vm_enable_energy_msrs(KVMState *s) return 0; } =20 +int kvm_arch_on_vmfd_change(MachineState *ms, KVMState *s) +{ + abort(); +} + +bool kvm_arch_supports_vmfd_change(void) +{ + return false; +} + int kvm_arch_init(MachineState *ms, KVMState *s) { int ret; diff --git a/accel/kvm/trace-events b/accel/kvm/trace-events index e43d18a8692..e4beda01488 100644 --- a/accel/kvm/trace-events +++ b/accel/kvm/trace-events @@ -14,6 +14,7 @@ kvm_destroy_vcpu(int cpu_index, unsigned long arch_cpu_id= ) "index: %d id: %lu" kvm_park_vcpu(int cpu_index, unsigned long arch_cpu_id) "index: %d id: %lu" kvm_unpark_vcpu(unsigned long arch_cpu_id, const char *msg) "id: %lu %s" kvm_irqchip_commit_routes(void) "" +kvm_reset_vmfd(void) "" kvm_irqchip_add_msi_route(char *name, int vector, int virq) "dev %s vector= %d virq %d" kvm_irqchip_update_msi_route(int virq) "Updating MSI route virq=3D%d" kvm_irqchip_release_virq(int virq) "virq %d" diff --git a/stubs/meson.build b/stubs/meson.build index 8a07059500d..6ae478bacc1 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -74,6 +74,7 @@ if have_system if igvm.found() stub_ss.add(files('igvm.c')) endif + stub_ss.add(files('kvm.c')) stub_ss.add(files('target-get-monitor-def.c')) stub_ss.add(files('target-monitor-defs.c')) stub_ss.add(files('win32-kbd-hook.c')) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441822; cv=none; d=zohomail.com; s=zohoarc; b=PZCTIYaY+V0ai52k5a1Y+QIh1fk8/E/60vKDsQ+Q5AyaMLaX1PXMESwifQc4yTTvSfdeQhdpZnYlcQI9pWsSv8ncoH/5+s1le6Zkzvv5lXps/baW3NZEi3YYnzRojxRPTPbuQP/4YLiW5exT6ox4T6mvnWDQywy91jGjd06lYHc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441822; 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=7AROvJv5T7divz4u09Cm1O0cyo+YUynxqWVLfSDj/jQ=; b=RZwzFHGDnAN/82X/wARdv3yKJFxl2oJDYEE5iKljs96yvSmjMt1kxJPyB2DEmj7QSh38fvzEYZcz+azAFSTX2ZqTtGTq2AxythlUz1xoJw751y25Vvr4vzzi8/82yPY20IhWx1L9QgQcASQbBH9TqWJ6ffvGQHocBf2gJwoqBik= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441822712571.9132692362591; Mon, 2 Mar 2026 00:57:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvg-0007tq-0D; Mon, 02 Mar 2026 03:47:04 -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 1vwyup-0005Ne-Hc for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyul-0001w4-Jy for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:09 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-443-Hd_0i9PCMUayFAgHqMwgDQ-1; Mon, 02 Mar 2026 03:45:47 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4837bfcfe0dso53791275e9.1 for ; Mon, 02 Mar 2026 00:45:47 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3addb3asm334398835e9.0.2026.03.02.00.45.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441148; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7AROvJv5T7divz4u09Cm1O0cyo+YUynxqWVLfSDj/jQ=; b=O16tE3Hntc9zUXI7BFdgmQVXwaJCrzWHeS6n0Bg2gNAPd+kEsG95YVAMNcfajALMC7076g 0fKwpefIO8I0lHTFOCmBY9QXu3oYlijWUixLA6DtinBnWbjYJ6rx6qDulLn54k+lN3dZFr yzIzFe8fUaHiZAggZyE2v74KWfpg6uw= X-MC-Unique: Hd_0i9PCMUayFAgHqMwgDQ-1 X-Mimecast-MFC-AGG-ID: Hd_0i9PCMUayFAgHqMwgDQ_1772441146 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441145; x=1773045945; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7AROvJv5T7divz4u09Cm1O0cyo+YUynxqWVLfSDj/jQ=; b=Dt/0j4WLqwQEfD5+USYb+HQlasoTeJdM8rsNHziiFzH2Wch9Exiqgjtkfo2OE4U7cT WJPslNdLZeoRbrq40FszQ1ayBACrChI1zC0Xc0u6v+ukKVDtS2a+G+GSNBH3+mCOMjDJ EV+vuN51uxg4KQ7dBhEuptsjKi4pLMFH+ViNWjUKnbh9iFBag9KDVI882Lsz+2W45itf vr0w5xOFh0TKbTr5vbNduDt74P/5rFRmQPhhqLn/nEygYzAujKjnBy1SwWqBbppVLf4G mJDrjiknbZTDlypBO94F5mlF2+b8XgZhitoyz6oUBA2Wjz3Q17E3QorgrVpEuiW4zLzn gQUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441145; x=1773045945; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=7AROvJv5T7divz4u09Cm1O0cyo+YUynxqWVLfSDj/jQ=; b=jgo04Zeh/Lrrlby/2LnFY2ri3rWurtJQsYhWXKJiA+vdgiaU1Co/mDqLRMOCjJZyoj aujqt1ksMoZUggL45kgi8P5vrOFRg+FazA57Ux5CRPqzukba05ss0+Cz9wG1MyDFLCbN jy/XAnhl3IujsBoM7AaraoEwFZlbYAbFYtSUE8O5vukQzCrL/kdjWZ/ssp9OmszD/RkE k34GDxkfxo7fIm54T1RVcw7aiSiL+TcSSbAtaU/IPrC+luNTzU1c77DwUfKbgiS8ZtCm WP8kW/+WCiD0KjCaIXZnqSWJUqjJfUQJcbH4zHWqYVsLZy+kDGnXX0DzP3Kmdug5zwSD ikcQ== X-Gm-Message-State: AOJu0Yzwt/b8boDGpHA/yTVqfJs8l3HCZyx+hqidvsw6UpfocZz+smg1 JCc24OoNXUvETHJG2kFlebAeNXZqOG5xy7xuh3+QhH5thpU9JCRSpXvJ30g08JOKuFj8IpCIWl+ 0WulxUoXIRCfCvaHcu07t+veiQgIx82zVPlbm8r7H0Dc1GAdUKxRdqQxeXScW8gMPoXVIBCg163 A+pjFn37TprB0W+wdzOMVCTGBgf8IdzDfwwZ8mgkOZ X-Gm-Gg: ATEYQzyXQoC5+OggPYnbVtuzf1+7bKNh78ZVVfXZVYSxDGEAUaIx/o2K/IS4rRtUDzB lVJ4r9ATxRjpDtVcBHRHhVb9B20ylAPiwG1v0KhY6aOl3xvHQ9MJcRk6kkkoh2MLZaDNSfJ9Y+8 lYuKIUsELQ1YqSv3uIo9bMIm/eajlDro+iY8DwVBh4xHBubGguFahyZ7cqHCJIHJfUWOHq2uB3F DRpMtqBlUSYXgqXR4yu5jtPmtAjNe/pS3dyj5+4VhfYwb2xC+jjamELS6Si+ZRi+VR3ab9QmQYQ 2+m9N6j/3s/cGeCdZLj3I3o8aeub8OZllBfYKC/CvSGkEY5xEmOrqYTMap4eT00RB0uV0QpCwII qCdVBCDdKRzdnLobd+5jrjN6hU6V48G5xnRTuJl49XZBu63kSdJ6z4VTiU7AJBOUrLnKWd6QxrV 7LuR75OWEnN55UcwaeUqy+PPfqkUA= X-Received: by 2002:a05:600c:458b:b0:483:43da:6c87 with SMTP id 5b1f17b1804b1-483c9bdb71amr195845405e9.33.1772441145458; Mon, 02 Mar 2026 00:45:45 -0800 (PST) X-Received: by 2002:a05:600c:458b:b0:483:43da:6c87 with SMTP id 5b1f17b1804b1-483c9bdb71amr195844995e9.33.1772441144945; Mon, 02 Mar 2026 00:45:44 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 047/102] accel/kvm: mark guest state as unprotected after vm file descriptor change Date: Mon, 2 Mar 2026 09:42:42 +0100 Message-ID: <20260302084338.473368-48-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441822977158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha When the KVM VM file descriptor has changed and a new one created, the guest state is no longer in protected state. Mark it as such. The guest state becomes protected again when TDX and SEV-ES and SEV-SNP mark it as such. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-7-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- accel/kvm/kvm-all.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index cc5c42ce4de..096edb5e198 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -2650,6 +2650,9 @@ static int kvm_reset_vmfd(MachineState *ms) =20 s->vmfd =3D ret; =20 + /* guest state is now unprotected again */ + kvm_state->guest_state_protected =3D false; + kvm_setup_dirty_ring(s); =20 /* rebind memory to new vm fd */ --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772442057; cv=none; d=zohomail.com; s=zohoarc; b=RI37sgDvh4j9pWgmPAq4uaeFENSekiXxeFPCz1hLyh/lcEWG7Hxx/V8oubrl3aidhMSdddBBdQFX9zmo4viXUnmmCUBobCDQeSud0heplZERPXn60tstHkE3bDJqIC6GBnGQ0z03SF3mX+OICENLpJx29dCBbO2frsZhXxP5t3U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772442057; 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=l5ILIOhHq6Bf+THYvRqVzoWxL42vyxsfaFfm2JegWsM=; b=HCpgrPPRPPTpwE5QMIogFrScNpmT/I0txD29jX8Hn0UQL1w4Pqy3wgsudO6iUrJySVvSMKIEEQitaIPIHttYh4RNcH92FfhwbsEGBHP4qvYrGE1T3t2NVuXrxnAj4DHTI2T7dUMXmiFlSKY1fQscGHxGQHsoKF8saf6Q4qVBuOk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17724420573301019.1780498359833; Mon, 2 Mar 2026 01:00:57 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvn-0000YQ-I2; Mon, 02 Mar 2026 03:47:11 -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 1vwyui-0005FI-Kj for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:07 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuY-0001wI-I7 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:02 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-122-_JZrdxsOMnSsqXbRUs43cw-1; Mon, 02 Mar 2026 03:45:51 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4836bf1a920so44019375e9.3 for ; Mon, 02 Mar 2026 00:45:50 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfba9a5esm269712625e9.4.2026.03.02.00.45.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441152; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=l5ILIOhHq6Bf+THYvRqVzoWxL42vyxsfaFfm2JegWsM=; b=SadXA+VaYaS9lpqpHhupK9aUrOXUZs7HwcecA47+W6GnJLA5Q6MLbIMmi8bmxxXRnxyB+K ADZWCw2fntTtF8SS4EByYkcb4VFnGFG/tLC5lhSciJcbQ3r2gt/0I3iF+ZbplClE2jMjrX Es5Hy9Li7veYu4wJS9RUmYWQgfoZdlk= X-MC-Unique: _JZrdxsOMnSsqXbRUs43cw-1 X-Mimecast-MFC-AGG-ID: _JZrdxsOMnSsqXbRUs43cw_1772441150 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441149; x=1773045949; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=l5ILIOhHq6Bf+THYvRqVzoWxL42vyxsfaFfm2JegWsM=; b=EMPd+OCSe8/E1FYQp8dRrPxi/DOgLf7bjzk1w7ORYQBSITyD7sRrQtp4VBU1WqTW/6 3uImlgv236SE9YBkqCdwAjq11vJD/GX+jURY0jqWeB8lTlyATnm58jvTUiGJoFFigdzA Fb+CrQYUWODUKYuSlWT+R3uczvZYHAv2URhH5PGM1KD1M4ZFaN6Hvsvgf5PEJlgm4F5s rLPKH619kAr9kwSxmClY64HBmeSGdxbfcZdtub5IKV1iM7meLpC1aRDNwmhHJ0mLwQnC y2MJjJGkxQ9u2fFGChbeCV6kJ51ZAtBJDF8fkPUKmQ1OjCpRMTWAsCDvh1GBKVvXoqIK n1+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441149; x=1773045949; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=l5ILIOhHq6Bf+THYvRqVzoWxL42vyxsfaFfm2JegWsM=; b=D2cl0ULZ8JlIsA13Npiql6VObwaSgFAGOnyavt3fddLc5W9V4odfBN2dJz0xSmny4S rSTAO8ajL/CLTjSN1nWH57SHC9AFiOUli/AZIq7cViryJ6Cnx0NrFTwLq/6kCZ49LwkW CHPkWp89P8VKI97ZoRFRgC8ChLOLWQnsgNio6djkjJgMBPSLyj1pi31CIXYRkXBSPRXC dpry64LuTdRPI78JqxLL9ZZJEv9AS2i1Q6IpzJNmjgKFMqSjy8+jGbVr8sOtJxwOdFUx s01vd7u/KrxPIQ3ihZcoRBVwMcF1U9Bg1x+fJ50MiNzcOCZuLVGEygQrH8Z0byvAkb0S eTjw== X-Gm-Message-State: AOJu0YxQjhQCwpybFdPA9fD7Fz1Vl7eJ25BsoxNu8bkFcdSgMbM7+7bD T9SJOhR9FgwFnNL9E+cV3rY8bV8B4hQlqZitOZOaObvcTkHYoV9hqZLCkbI2HLpzrC7Z/sSo4hB 6u5rCpByMX/GPrnSxZHnAc7c0NNcWlYB3aZRXcltcqySzwEYS3k7jSF+gxGzDB6PlFxPckz53Cy S6zA3pZ12Tp8sMeiZ5lkQICNoi/yNKDhx/KNkXwI4n X-Gm-Gg: ATEYQzxZuedzEGDXxtLrWNAC+izivfetWgykqeQ3u4IDOGR9XzDCkK0cJUjxI1JDhEH OC5cyCYuy0IqW/amSBFE/MYXhHsohbt5mPWEczIQy+9pSHxdRWQRLTBdWwLm9TVyAbPi4llYuVX JKvW7leljcuz+6Vu24XIAKj+8ELuvkQ6uC+QzenUmc4xKzIHvFdYLDyaYTN8erDBBvh/AQwq3ra ObsayHvnV67nHS8f91/0+N1nWFiYaet3VIAi2NUFwl5w48Tm2LPuGsm8mJUTWwEciAR/2jOitpJ FVkxjzKca9+pMybt5suu3SAbR4SzRLE/L3oxfcpWIzPYL9B+viCV5uBo3U+r+oDxh2HW4M3RcxX dFj3YH03RfojU2n8CWbkMSJt6D6tu8XXD9TJq+dK/A8Vl4t3JUNA322kz1pMhiR2s/6ddAnd8dj LG11a8ZnZaOvrbqM4op64WsYkYAik= X-Received: by 2002:a05:600c:5395:b0:483:bcff:7948 with SMTP id 5b1f17b1804b1-483c9b9eaf4mr197723545e9.10.1772441148724; Mon, 02 Mar 2026 00:45:48 -0800 (PST) X-Received: by 2002:a05:600c:5395:b0:483:bcff:7948 with SMTP id 5b1f17b1804b1-483c9b9eaf4mr197722745e9.10.1772441147611; Mon, 02 Mar 2026 00:45:47 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 048/102] accel/kvm: add a notifier to indicate KVM VM file descriptor has changed Date: Mon, 2 Mar 2026 09:42:43 +0100 Message-ID: <20260302084338.473368-49-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772442063168158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha A notifier callback can be used by various subsystems to perform actions wh= en KVM file descriptor for a virtual machine changes as a part of confidential guest reset process. This change adds this notifier mechanism. Subsequent patches will add specific implementations for various notifier callbacks corresponding to various subsystems that need to take action when KVM VM fi= le descriptor changed. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-8-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- include/system/kvm.h | 21 +++++++++++++++++++++ accel/kvm/kvm-all.c | 30 ++++++++++++++++++++++++++++++ accel/stubs/kvm-stub.c | 8 ++++++++ 3 files changed, 59 insertions(+) diff --git a/include/system/kvm.h b/include/system/kvm.h index 5fc7251fd94..f11729f432c 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -181,6 +181,7 @@ DECLARE_INSTANCE_CHECKER(KVMState, KVM_STATE, =20 extern KVMState *kvm_state; typedef struct Notifier Notifier; +typedef struct NotifierWithReturn NotifierWithReturn; =20 typedef struct KVMRouteChange { KVMState *s; @@ -567,4 +568,24 @@ int kvm_set_memory_attributes_shared(hwaddr start, uin= t64_t size); =20 int kvm_convert_memory(hwaddr start, hwaddr size, bool to_private); =20 +/* argument to vmfd change notifier */ +typedef struct VmfdChangeNotifier { + int vmfd; +} VmfdChangeNotifier; + +/** + * kvm_vmfd_add_change_notifier - register a notifier to get notified when + * a KVM vm file descriptor changes as a part of the confidential guest "r= eset" + * process. Various subsystems should use this mechanism to take actions s= uch + * as creating new fds against this new vm file descriptor. + * @n: notifier with return value. + */ +void kvm_vmfd_add_change_notifier(NotifierWithReturn *n); +/** + * kvm_vmfd_remove_change_notifier - de-register a notifer previously + * registered with kvm_vmfd_add_change_notifier call. + * @n: notifier that was previously registered. + */ +void kvm_vmfd_remove_change_notifier(NotifierWithReturn *n); + #endif diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 096edb5e198..3b57d2f9769 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -90,6 +90,7 @@ struct KVMParkedVcpu { }; =20 KVMState *kvm_state; +VmfdChangeNotifier vmfd_notifier; bool kvm_kernel_irqchip; bool kvm_split_irqchip; bool kvm_async_interrupts_allowed; @@ -123,6 +124,9 @@ static const KVMCapabilityInfo kvm_required_capabilites= [] =3D { static NotifierList kvm_irqchip_change_notifiers =3D NOTIFIER_LIST_INITIALIZER(kvm_irqchip_change_notifiers); =20 +static NotifierWithReturnList register_vmfd_changed_notifiers =3D + NOTIFIER_WITH_RETURN_LIST_INITIALIZER(register_vmfd_changed_notifiers); + struct KVMResampleFd { int gsi; EventNotifier *resample_event; @@ -2173,6 +2177,22 @@ void kvm_irqchip_change_notify(void) notifier_list_notify(&kvm_irqchip_change_notifiers, NULL); } =20 +void kvm_vmfd_add_change_notifier(NotifierWithReturn *n) +{ + notifier_with_return_list_add(®ister_vmfd_changed_notifiers, n); +} + +void kvm_vmfd_remove_change_notifier(NotifierWithReturn *n) +{ + notifier_with_return_remove(n); +} + +static int kvm_vmfd_change_notify(Error **errp) +{ + return notifier_with_return_list_notify(®ister_vmfd_changed_notifie= rs, + &vmfd_notifier, errp); +} + int kvm_irqchip_get_virq(KVMState *s) { int next_virq; @@ -2671,6 +2691,16 @@ static int kvm_reset_vmfd(MachineState *ms) do_kvm_irqchip_create(s); } =20 + /* + * notify everyone that vmfd has changed. + */ + vmfd_notifier.vmfd =3D s->vmfd; + ret =3D kvm_vmfd_change_notify(&err); + if (ret < 0) { + return ret; + } + assert(!err); + /* these can be only called after ram_block_rebind() */ memory_listener_register(&kml->listener, &address_space_memory); memory_listener_register(&kvm_io_listener, &address_space_io); diff --git a/accel/stubs/kvm-stub.c b/accel/stubs/kvm-stub.c index 68cd33ba973..a6e8a6e16cf 100644 --- a/accel/stubs/kvm-stub.c +++ b/accel/stubs/kvm-stub.c @@ -79,6 +79,14 @@ void kvm_irqchip_change_notify(void) { } =20 +void kvm_vmfd_add_change_notifier(NotifierWithReturn *n) +{ +} + +void kvm_vmfd_remove_change_notifier(NotifierWithReturn *n) +{ +} + int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n, EventNotifier *rn, int virq) { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441875; cv=none; d=zohomail.com; s=zohoarc; b=REy3Zt2Atc9OomLpc54ah18TK/sLztKPJrSPc15LRS2Ct2622zvFqptDXJpq6SFMIhnX9rtnjopFC7mBwH9Cd0kmLd90JYg+B08eeZH3C7w+g5EYI4L+rPldZ21/1olBOKd7bgVL8jIRujgVIu7jNYQsnroZZ4LlFLawJD7JMu0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441875; 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=lrh321sUlZncTweQpqmP4/PZMRj0UiAkskbKxK9u3DA=; b=AHrVOEcbrJKL59SXKSq27pqdE+wZLNFVfbScdWQF1Uuh8kC9/kFxt5WpHRRwzI3DbFh5deuFvCLijk2VrmsKYvVENwVZb76Jv/uNB7Ym3JIiuIlDEWoeyOnp37U+4WLOKHgw/KrMB6lEeqa/xM7waG0TKeKqLi3/QSoioAF+xx4= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441875507320.635891002471; Mon, 2 Mar 2026 00:57:55 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvI-0006Pf-Gf; Mon, 02 Mar 2026 03:46:40 -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 1vwyum-0005Kf-1n for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuc-0001wT-U7 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:03 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-78-Qz8YSp4BP5GA47Vv1wExAA-1; Mon, 02 Mar 2026 03:45:53 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4837f288194so30283315e9.2 for ; Mon, 02 Mar 2026 00:45:53 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b130abfasm10471304f8f.34.2026.03.02.00.45.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441154; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lrh321sUlZncTweQpqmP4/PZMRj0UiAkskbKxK9u3DA=; b=SyherBEgXAMfA5CRJINxatSTQdGHOz11aReGIS0wNkQUGmd+wKzXr36itWPrS+W4IyJBdG 2s0auBDf0JzY46iLAwbv4BS1EjckKp1OakEboyvcV9aTFEH2DuWZnxxsKKdsYfZNf/33VE Kn8V2xTqIToBg4evicCUeMbNOt059eI= X-MC-Unique: Qz8YSp4BP5GA47Vv1wExAA-1 X-Mimecast-MFC-AGG-ID: Qz8YSp4BP5GA47Vv1wExAA_1772441152 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441151; x=1773045951; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lrh321sUlZncTweQpqmP4/PZMRj0UiAkskbKxK9u3DA=; b=L0AWapcNXkJN/DH0SxFYAH6hbKdzyu1OCcXBvW7/O2/Qki6LSlL6sOWjVC9hObU3Hn S648THADS1PhxuGuHbCa9jMT0Krh69wpZGD4wM8Z+O72dc2bsgUpSOKFtT1B9k2UvYBd NJK9aOCwwNVowOQ3qrqHmNLx5njdSgciYbdEbc28iKREoYT8RNaljivAu4n6SdX5c+f5 hSyQmhyOVjC/Ki2htJfXqtcBEre1kAtiwd7TwXE1iK60u4SkyK519XGxC5XP1BFjxhiU Mre7iq+4t2A6oXB33yT9OrbdGHHcAyidQ0ETQF1BPq1S7Ph63CE71dMucVWsGcFB78+x nkOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441151; x=1773045951; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lrh321sUlZncTweQpqmP4/PZMRj0UiAkskbKxK9u3DA=; b=TyScpwkg3oOXSmSM5lRUScIC3dvNGg3Em0VXurruqUlrJeKXXmFtZGFnFJpFQld/+a 74CLbE5dtshYjwnQff53azSG6N68G4sAwpIbVVNyMzZUnceHoivLv12v4a8IsURim4gK 8YA9vvIG1/E5iyuJvlTkHiGf05MzxCNwK8gOw1M+Z1SaBQzPOJWU51PwWDbDKb4bvs7I qPBc9J/CjSNdQbB7VzRShMzsVD2LD/E9kBdhlxykoTGT67t8sCFq3cghXpYJtOW+c6NO ZBFdaa2vNQZKt4zM8akOm/8ZHPWMfAMswey8JeqW8UzjtYiEkmuD7aimtV6ZkE8r/oQh KO4A== X-Gm-Message-State: AOJu0YzLxCsfw93WbOfFVuQ4rrb9nve7od+lXr2Q+Hx1Xni9fsaJ7XPZ o2NQ53GNo7Mczu76e0meUoKvKEydFKRzQEKJr4GXIwH9kB399pLkQu8yurEBoNIvyAuxRyqsWej Y6MTY/H1FJdiJMgNXHgpDLW+DpWtKL1I5R5aP0r0j9WnlS6j+sBdKG2qDL0gxD5ww1Dd1tZol4r WOj9NGAWY0g4KKA3pP3E5vmnpBA9Xau4bRCIHYXNyA X-Gm-Gg: ATEYQzxHzRUHsd58wJEKfDfHQemGhOOmXWVf+t4r5+AKVP/aCAABLbXuBOKtErSVfiA qf/QSlatXP0NpBw37ulyv93F8O8DqCNwPr725ZuhPiilpTaQ0JgNZvudu1vl/XKSUfsIvd/YVHJ A6an0/nPaAxh2hPLWOsrIIdQ76Ue6uqfAGHy2AF8aJ43C2yeF5X9HFqJvThuwoN5KC/oGWyNIEl XwNELhPSYytdwYg3/Gu/kgBqJolpMz/qt8cY6D/m2bvgRHnn4OnVYRCALQVHsGldqLZJSiCpL7n X+63IBMsnglHpyEvhnokx+ZN7yKIvprJ4EX0QpCzodgyc5Bbe4VmelFBTU1uurE8L8FvPwcYJ4S FjF3h8rkD8DSEtAu7ekTaQEZHoJXmk3ujiB9QsNkQ2i7Hp9aJmR3hnYbMjnesXMlNRmU8bE/Mev T52Hyu3bMxsKrZgLBdYiSknQZ50DE= X-Received: by 2002:a05:600c:350c:b0:480:4a8f:2d5c with SMTP id 5b1f17b1804b1-483c9c2c2b8mr184252495e9.29.1772441150516; Mon, 02 Mar 2026 00:45:50 -0800 (PST) X-Received: by 2002:a05:600c:350c:b0:480:4a8f:2d5c with SMTP id 5b1f17b1804b1-483c9c2c2b8mr184252025e9.29.1772441149840; Mon, 02 Mar 2026 00:45:49 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 049/102] accel/kvm: notify when KVM VM file fd is about to be changed Date: Mon, 2 Mar 2026 09:42:44 +0100 Message-ID: <20260302084338.473368-50-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441877255158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha Various subsystems might need to take some steps before the KVM file descri= ptor for a virtual machine is changed. So a new boolean attribute is added to the vmfd_notifier structure which is passed to the notifier callbacks. vmfd_notifer.pre is true for pre-notification of vmfd change and false for post notification. Notifier callback implementations can simply check the boolean value for (vmfd_notifer*)->pre and can take actions for pre or post vmfd change based on the value. Subsequent patches will add callback implementations for specific components that need this pre-notification. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-9-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- include/system/kvm.h | 6 ++++-- accel/kvm/kvm-all.c | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/system/kvm.h b/include/system/kvm.h index f11729f432c..fbe23608a16 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -571,12 +571,14 @@ int kvm_convert_memory(hwaddr start, hwaddr size, boo= l to_private); /* argument to vmfd change notifier */ typedef struct VmfdChangeNotifier { int vmfd; + bool pre; } VmfdChangeNotifier; =20 /** * kvm_vmfd_add_change_notifier - register a notifier to get notified when - * a KVM vm file descriptor changes as a part of the confidential guest "r= eset" - * process. Various subsystems should use this mechanism to take actions s= uch + * a KVM vm file descriptor changes or about to be changed as a part of the + * confidential guest "reset" process. + * Various subsystems should use this mechanism to take actions such * as creating new fds against this new vm file descriptor. * @n: notifier with return value. */ diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 3b57d2f9769..d244156f6f4 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -2654,6 +2654,13 @@ static int kvm_reset_vmfd(MachineState *ms) memory_listener_unregister(&kml->listener); memory_listener_unregister(&kvm_io_listener); =20 + vmfd_notifier.pre =3D true; + ret =3D kvm_vmfd_change_notify(&err); + if (ret < 0) { + return ret; + } + assert(!err); + if (s->vmfd >=3D 0) { close(s->vmfd); } @@ -2695,6 +2702,8 @@ static int kvm_reset_vmfd(MachineState *ms) * notify everyone that vmfd has changed. */ vmfd_notifier.vmfd =3D s->vmfd; + vmfd_notifier.pre =3D false; + ret =3D kvm_vmfd_change_notify(&err); if (ret < 0) { return ret; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441759; cv=none; d=zohomail.com; s=zohoarc; b=eYtGBYn1upsQ6LxjtyAZQ5LG8LDZWCgYF6uXv3xTdOJ42zVHkiJyQ7Ta96BjywatTeDMJgDbuubIiQpLsFOSWYjowflg4Zpxc4Yy6m+49LkJ9IlfAxZBxO/qO13osPd3rn9aWqQPIqJ3tOnm0MrUDxnLB/4JEPAdx+RECGDe+50= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441759; 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=KGbW5Lswy3D/DLPTw7v4xtq/OZ5sriiLYtlBVzlRKco=; b=TUrc3uVuuyGtz3ukMLfDjFm4shn1wYB/UBws8GQ+axbVIIDzRkajd8pR1YckEKLEw/n54RMlWmsELcB4GWoudX6P0x/KFJ9KLr5DOSGGxtPHwQ0tJ6Gj8QguQRQ1zwSvm3+HOhz1mbSd1piDJzYxMk/h3ed+gPoL3tyeTR5TiwI= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441759088903.31173547982; Mon, 2 Mar 2026 00:55:59 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvh-00088E-4I; Mon, 02 Mar 2026 03:47: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 1vwyuq-0005Ny-2v for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyun-0001wg-13 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:11 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-457-jBcBIU5GMzuc_0VK_BmxiQ-1; Mon, 02 Mar 2026 03:45:55 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-48071615686so32875165e9.1 for ; Mon, 02 Mar 2026 00:45:55 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b770c2sm262546525e9.10.2026.03.02.00.45.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441157; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KGbW5Lswy3D/DLPTw7v4xtq/OZ5sriiLYtlBVzlRKco=; b=LsjRlqpr/ZbkMj9/+NFfslF8ixGnlvVZNIoCrgk8U0o4ws6pGn9qK22bKmc0Yld274TUTE 7uEnRPC/zHXBVXBM/gr93jxGOnWmciYNfbAVYrMTTQzLTb3pEVjBXkXc+qfLqYO0kxeMfS +lAhahzekMYbCrfXkm1YTcw3zmVxmfM= X-MC-Unique: jBcBIU5GMzuc_0VK_BmxiQ-1 X-Mimecast-MFC-AGG-ID: jBcBIU5GMzuc_0VK_BmxiQ_1772441154 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441153; x=1773045953; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KGbW5Lswy3D/DLPTw7v4xtq/OZ5sriiLYtlBVzlRKco=; b=hUDLbgDZprcBG5u8Os5HCc+O6708BPVk65+ntvo/q8XkQsud94mo2ryhWDdWzUkN65 ehxOATb1umSO1Y/BxZe3vrZHRVucbfnjk33aW38TE09er0+FmKNsf5UpAi6TyhMCJtK1 FhtoTKNnI5SomWh2DO4nl+GffPtfDlD3QO0/d4X/bRtBxrevXakkjIIFq0nZ8Yt2YS17 rk70Llgu0moKetbsMnmuanw4u0bTQKNnq+r55I+7CEI8mH2yIjXsxxt0frJSwA/JAYag +D+/vcMIDNNDCD/uMQ9a9QXe0xSjRGHVGnQ7EzkDYHwRLE7lQ3nbIYNK/8CgUE6YGcOP jkzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441153; x=1773045953; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=KGbW5Lswy3D/DLPTw7v4xtq/OZ5sriiLYtlBVzlRKco=; b=XFqNPacBauLCRHgwFzUDYj7sdutpq9EAxLcXMiOwfyrEtZ1J3tiVWxL9F07EKE+dce uYKpVg3SvzLV9SA+OrMX4CohGRCglxZEggHnILPtKJMsum74UBTSAtFy5unQci+/IKBq zHYJGltCD79EP5dK0RR668nDHN/gsCxLSnXw82FNOhcLpF3dSIAwfETxtDy3d20ZDiM7 ycCW5aiYG1YfYsH6X4QaGBfQNUQAWwO7Fy7WsCgFRUxMFVC0EiMakikttUBLRF+OwL5t 4Gso38nTTAsiJlfi6TosJRoA6qY+9oDjl2qvD/Yt4VfnjCoF6yZ6CtWDj6p3yYYP4bkU z0Zg== X-Gm-Message-State: AOJu0YyPDFo6tr5jbL4W0JJyAYu832U/mm1V18nMlLniXINJT8KyFViK 0Ygww7V6logZFLPCZGApzEZ7K4i6AjTkVne078HPaXamzpMgi5zyE1COzonVwTQeV3/cEy1YI1h ZWM3Fi2TZ2/G0ymJPgR6rtDoz3jtCoaDdNAhsBONf6klWauRemfhTd6dB5vbGYbK5Agz7QxQuai uAKpfW1rDbO7rfku/sBQkeh7qtUHhElFU7CSkgt0RV X-Gm-Gg: ATEYQzyBWkp0j2HsrCqC3Pa90bc/oH9rvb/wVfCjpgIEXK6b6NSonf/aAM/gQf9cq/1 0NrZuF6PuZrKgVsYQsOAErmhOjZg4rJPrgOLkGIkrnGkV9ZfI5foW5yv8WafQpBbm0G1SLnnTyp AbSaJdTUn7wmeQfdWinJjOLcMSii2k1FFWupte4I5PyZ7v8qq8Q53HUZe/6kEC6+rlUab2t64kQ SqJUTWgJ5eqTKPGK4XhlLGv4Vt+z53hLLb3uQORrYCyjGcuYLBZwTPkq96/ftB13cpf5qQHtR4S cLxU1iXYT/gV+E4tefPha0t/yrqQdW3KahK1/g7nX6UodX5nyUdoVIC0W4+W12eRF46sNaKjf7E pwzYNOJRinEb/u5/+/2F/qpJj1Vec36SY7O27RprZZxuS6BlK1JplJUgGsil56om6Do05owDl4Q BrmX7WrsfBIsArbgTcOLycv4fTGYU= X-Received: by 2002:a05:600c:621b:b0:47e:e076:c7a5 with SMTP id 5b1f17b1804b1-483c9babe69mr198735745e9.11.1772441153592; Mon, 02 Mar 2026 00:45:53 -0800 (PST) X-Received: by 2002:a05:600c:621b:b0:47e:e076:c7a5 with SMTP id 5b1f17b1804b1-483c9babe69mr198735385e9.11.1772441153081; Mon, 02 Mar 2026 00:45:53 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 050/102] i386/kvm: unregister smram listeners prior to vm file descriptor change Date: Mon, 2 Mar 2026 09:42:45 +0100 Message-ID: <20260302084338.473368-51-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441760620158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha We will re-register smram listeners after the VM file descriptors has chang= ed. We need to unregister them first to make sure addresses and reference count= ers work properly. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-10-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/kvm.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 524b5276a68..8edfbb834c6 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -112,6 +112,11 @@ typedef struct { static void kvm_init_msrs(X86CPU *cpu); static int kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdm= sr, QEMUWRMSRHandler *wrmsr); +static int unregister_smram_listener(NotifierWithReturn *notifier, + void *data, Error** errp); +NotifierWithReturn kvm_vmfd_change_notifier =3D { + .notify =3D unregister_smram_listener, +}; =20 const KVMCapabilityInfo kvm_arch_required_capabilities[] =3D { KVM_CAP_INFO(SET_TSS_ADDR), @@ -2885,6 +2890,17 @@ static void register_smram_listener(Notifier *n, voi= d *unused) } } =20 +static int unregister_smram_listener(NotifierWithReturn *notifier, + void *data, Error** errp) +{ + if (!((VmfdChangeNotifier *)data)->pre) { + return 0; + } + + memory_listener_unregister(&smram_listener.listener); + return 0; +} + /* It should only be called in cpu's hotplug callback */ void kvm_smm_cpu_address_space_init(X86CPU *cpu) { @@ -3538,6 +3554,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s) } =20 pmu_cap =3D kvm_check_extension(s, KVM_CAP_PMU_CAPABILITY); + kvm_vmfd_add_change_notifier(&kvm_vmfd_change_notifier); =20 return 0; } --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441207; cv=none; d=zohomail.com; s=zohoarc; b=fOeA39+lKg0yVmE9wPAgwApKm9iQHVKO3mQp8yeKuw4EJhDnGGHuMNXpj53d3yamr0WSHcsnlxkrV2jXqqTyhvQ/Re9lYWFFJ6T9CPE1z7bC6arpUGMlwUTQYc2sKbdK60YAx5xgOHF0rcZFJtzvDTYJWndQrH3ARiE7jeRzRi4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441207; 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=ux3ZnPMEDtYfBdP2aeSQqPPs5FTXOfyYnyLyR49twAs=; b=V3AV0bjoj0OAeIe0qSPYWnfVowrWG9/4jup8a4sgnp9OPMlMJViHTXvUNflOPwiAouGI8rT++LCXTUZRBiRpuNKjDpQc1UklPvK4hTiIyljR+QTGc2b2xfqvmm4OM4dWgFnzJdJQyA4M8YbdIruBMqO6IXJSXR1rxQQaq+JuvwU= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177244120720668.6426400975887; Mon, 2 Mar 2026 00:46:47 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvL-0006lK-N7; Mon, 02 Mar 2026 03:46:43 -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 1vwyup-0005ND-FM for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyug-0001x0-LH for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:09 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-13-qDQbRtwfNZGsIcCSL89sqA-1; Mon, 02 Mar 2026 03:45:59 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439b50320a0so676545f8f.1 for ; Mon, 02 Mar 2026 00:45:58 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b130abfasm10471900f8f.34.2026.03.02.00.45.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441160; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ux3ZnPMEDtYfBdP2aeSQqPPs5FTXOfyYnyLyR49twAs=; b=L3EJBUtcTuWbMltmEQBT3mhuCEdULIukR88VwGAX06OjaFMJq6hPjqmS+BuU1PYWVwh08u xo52UgdOgx2wTohbHuOyrm016dbhriNZX7BI1lNGrbtbAyLPgL6zLCZOodtfBjxXzPu2yn 12RSiT/E8T3nDnwvuXp3E+/w8njp+90= X-MC-Unique: qDQbRtwfNZGsIcCSL89sqA-1 X-Mimecast-MFC-AGG-ID: qDQbRtwfNZGsIcCSL89sqA_1772441158 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441156; x=1773045956; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ux3ZnPMEDtYfBdP2aeSQqPPs5FTXOfyYnyLyR49twAs=; b=Oo9wqoc/4j4apNXoc5mZHXnurPQYpBGPG8GwT3y3i66LDp0YlwmeZjjx31H8002T2b cjLvtNl5Akalq4zty0FOgPCz3WLK3T7su02Jlx1Lcgk3wmTOpXdx1F1iEOjOf0XD5/6I DhYJjmWOpsru9Wqzs5BBWj0fQGrFcYXPgTTLEhe3e3rbuoTeQF/KtqTd7kbm0vRaLL56 SYxSNpEqWdd1RdnYhEHrLR+4X7tl+UTP7/lSHDzc/SrsGq7nPPTWSXuIQK0dErXDWOBm maLRVoeGx7umGiWXC1MRW4NXNz7Wmp76KpdRbNXusxkLVoN6bxrAG0TXEYhswf+5SEMp yxxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441156; x=1773045956; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ux3ZnPMEDtYfBdP2aeSQqPPs5FTXOfyYnyLyR49twAs=; b=KktemO0eX5vxJyhJMJlC7HiyOPAXRh+PkWhzfor+I1F6z/uFykuDGHJH+JeH+mLoKs TyUba32DkoLlynuNtfOZKp3THdS22xFePqaMb8ttEo4TBzgpinfJF3aygFDEfXXaagsC yhono5EMyfJuSlXk2H5oNKLxfl+2CqkeQTRXJTDeH8LuNvnCy4g1u5hscdevQ5fTmKd+ l/BfNm3QN6oQdA0fOFEt+qtO6w7weU4/J+xEVYL23AyL97xRb2YbloAAivX4FDHIy3yP uLI8eGR5FZccVJ7gWzx0tlhhoRQiId9G9P+/33NtASagFD88sZqimm+NcSK0ZuOU28H5 E2qg== X-Gm-Message-State: AOJu0Yxo714zUUqVXFBAdKzY4pALNwkFXNCtgMwKNX7s0HxMN/LKEoAd mRRP23uDBOYZk2MmTMsLPdYCrIDcqyxVjIYOrgTHbwCYENSJ3d0qxs82CIdjBg+kaYMUzz3/7Zf GMTwVTt0SlS6us1ZSAmwNzoACBkRH9vvJsCyhN4XNQe4hTfi/dqZBTs7G+m3t3sfnZkXKPGQ+cx jtZiZmkWbEZjoONJYeM+HnI93xRUoSTS2FovUidb6e X-Gm-Gg: ATEYQzzEUvV+9Ee7ZQNnUIo2qfaNft+fiKVHCGjilU1im8VebhMs242H6qpRpOaa8AJ 2o3Dlzzg4EXLVnUDnNRLGclrfX2V/nxn/iSOqB/S2Cq+SassRN+s6ODuiuYTmYpVwD+3beE1lvD vrdr+38a2XzO7vqXfqAaD7Ec9mq1X26k21ioe0O2ZOqiQpdbJmh4iLF5klYOHH2qUEEb7gdNqPO yTLgr3012OykncuIowEG10pIf419PKyTxiRJnczoEu/9XZbLShCZ5DusRLB8EXJusHdE48xnceS FjtZhax3rNDpb0lrod8fZ3DCSKR1RuByQwVYKA+q55evYyGDrbpYe0QOcCm/TsGKYKywUKtl66E UReuJJwJwBiNvwSzaiNGKseR/oAKCA0nB/IgPZU3/g8GLft+LTp+bnk1qpNOoAD3+HVzOm/SFF4 WMOM2rx7TB4GC5yC7ccBi6N9jlf5Q= X-Received: by 2002:a05:6000:2c06:b0:439:8559:98b with SMTP id ffacd0b85a97d-4399d97f826mr18661065f8f.9.1772441156015; Mon, 02 Mar 2026 00:45:56 -0800 (PST) X-Received: by 2002:a05:6000:2c06:b0:439:8559:98b with SMTP id ffacd0b85a97d-4399d97f826mr18661028f8f.9.1772441155513; Mon, 02 Mar 2026 00:45:55 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 051/102] kvm/i386: implement architecture support for kvm file descriptor change Date: Mon, 2 Mar 2026 09:42:46 +0100 Message-ID: <20260302084338.473368-52-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441207931158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha When the kvm file descriptor changes as a part of confidential guest reset, some architecture specific setups including SEV/SEV-SNP/TDX specific setups needs to be redone. These changes are implemented as a part of the kvm_arch_on_vmfd_change() callback which was introduced previously. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-11-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/kvm.c | 49 ++++++++++++++++++++++++++++-------- target/i386/kvm/trace-events | 1 + 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 8edfbb834c6..40e4b3f1283 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -3407,12 +3407,30 @@ static int kvm_vm_enable_energy_msrs(KVMState *s) =20 int kvm_arch_on_vmfd_change(MachineState *ms, KVMState *s) { - abort(); + int ret; + + ret =3D kvm_arch_init(ms, s); + if (ret < 0) { + return ret; + } + + if (object_dynamic_cast(OBJECT(ms), TYPE_X86_MACHINE)) { + X86MachineState *x86ms =3D X86_MACHINE(ms); + + if (x86_machine_is_smm_enabled(x86ms)) { + memory_listener_register(&smram_listener.listener, + &smram_address_space); + } + kvm_set_max_apic_id(x86ms->apic_id_limit); + } + + trace_kvm_arch_on_vmfd_change(); + return 0; } =20 bool kvm_arch_supports_vmfd_change(void) { - return false; + return true; } =20 int kvm_arch_init(MachineState *ms, KVMState *s) @@ -3420,6 +3438,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s) int ret; struct utsname utsname; Error *local_err =3D NULL; + static bool first =3D true; =20 /* * Initialize confidential guest (SEV/TDX) context, if required @@ -3489,16 +3508,17 @@ int kvm_arch_init(MachineState *ms, KVMState *s) return ret; } =20 - /* Tell fw_cfg to notify the BIOS to reserve the range. */ - e820_add_entry(KVM_IDENTITY_BASE, 0x4000, E820_RESERVED); - + if (first) { + /* Tell fw_cfg to notify the BIOS to reserve the range. */ + e820_add_entry(KVM_IDENTITY_BASE, 0x4000, E820_RESERVED); + } ret =3D kvm_vm_set_nr_mmu_pages(s); if (ret < 0) { return ret; } =20 if (object_dynamic_cast(OBJECT(ms), TYPE_X86_MACHINE) && - x86_machine_is_smm_enabled(X86_MACHINE(ms))) { + x86_machine_is_smm_enabled(X86_MACHINE(ms)) && first) { smram_machine_done.notify =3D register_smram_listener; qemu_add_machine_init_done_notifier(&smram_machine_done); } @@ -3545,16 +3565,23 @@ int kvm_arch_init(MachineState *ms, KVMState *s) return ret; } =20 - ret =3D kvm_msr_energy_thread_init(s, ms); - if (ret < 0) { - error_report("kvm : error RAPL feature requirement not met= "); - return ret; + if (first) { + ret =3D kvm_msr_energy_thread_init(s, ms); + if (ret < 0) { + error_report("kvm : " + "error RAPL feature requirement not met"); + return ret; + } } } } =20 pmu_cap =3D kvm_check_extension(s, KVM_CAP_PMU_CAPABILITY); - kvm_vmfd_add_change_notifier(&kvm_vmfd_change_notifier); + + if (first) { + kvm_vmfd_add_change_notifier(&kvm_vmfd_change_notifier); + } + first =3D false; =20 return 0; } diff --git a/target/i386/kvm/trace-events b/target/i386/kvm/trace-events index 74a6234ff7f..2d213c9f9b6 100644 --- a/target/i386/kvm/trace-events +++ b/target/i386/kvm/trace-events @@ -6,6 +6,7 @@ kvm_x86_add_msi_route(int virq) "Adding route entry for vir= q %d" kvm_x86_remove_msi_route(int virq) "Removing route entry for virq %d" kvm_x86_update_msi_routes(int num) "Updated %d MSI routes" kvm_hc_map_gpa_range(uint64_t gpa, uint64_t size, uint64_t attributes, uin= t64_t flags) "gpa 0x%" PRIx64 " size 0x%" PRIx64 " attributes 0x%" PRIx64 "= flags 0x%" PRIx64 +kvm_arch_on_vmfd_change(void) "" =20 # xen-emu.c kvm_xen_hypercall(int cpu, uint8_t cpl, uint64_t input, uint64_t a0, uint6= 4_t a1, uint64_t a2, uint64_t ret) "xen_hypercall: cpu %d cpl %d input %" P= RIu64 " a0 0x%" PRIx64 " a1 0x%" PRIx64 " a2 0x%" PRIx64" ret 0x%" PRIx64 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441922; cv=none; d=zohomail.com; s=zohoarc; b=lpblXbN4EhYXScuGLuArViIedMGovOs1OgrdAcbWWtOZcfoZfyHIt9AokE2K5B0i+D7dYQV01u8IZjsLh+xv7ir6uRVQ+BQFE9Gfwsti9rxULXxUrxMYHmOwhlzlq8b4zYQjipoqV5DdZHaBoheVrdNjuGeHO0ngDek+5Dq+1iA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441922; 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=fgpTnmDlQrNYYO6m4642qCf1swsSA8ghfzunh+4QPMQ=; b=dohViQfosHHP5cJEjCRM36R3UTHEgXtEKMQ3ulVWG9lmCQoASwnpNKD4yKeC2GYGD+X8ySoPyZxJvN1N0FkHqAVgpmdjiykeRouZUL7tAwwPMXGW5yAcTUaK1MKEfJzbSFcbGuS7pRvCsV5Pyb7YSRu7IqL/lJIGHfsRi5TG2QQ= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441922076269.27269517342984; Mon, 2 Mar 2026 00:58:42 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvh-00088h-5R; Mon, 02 Mar 2026 03:47: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 1vwyup-0005NC-Eh for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyul-0001xV-QK for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:10 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-694-4bPiVrZxMLyh0n5Rb96pqg-1; Mon, 02 Mar 2026 03:46:02 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4837246211bso54869455e9.0 for ; Mon, 02 Mar 2026 00:46:02 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfb29715sm289527035e9.0.2026.03.02.00.45.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:45:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441164; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fgpTnmDlQrNYYO6m4642qCf1swsSA8ghfzunh+4QPMQ=; b=CMp/33DqdO1Il2BRR3hmU9J41xsm2U6JU2/EkaN4URT9CaVGYXI7uzqfIQUseKXrZaRoAQ wInB21UnPAUcIqwEbco/edBBvsKjRIEV33IPnvUuRQzAx4I7RFa2SPUD/wg17dylwbMpJb OVLYWdZBhXF/pxpeZedDsS3O8XrMSFM= X-MC-Unique: 4bPiVrZxMLyh0n5Rb96pqg-1 X-Mimecast-MFC-AGG-ID: 4bPiVrZxMLyh0n5Rb96pqg_1772441161 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441160; x=1773045960; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fgpTnmDlQrNYYO6m4642qCf1swsSA8ghfzunh+4QPMQ=; b=QQQhxZHWfy1ifrt/czxQbSSFejaCxHTVn+pVyw36Pv7/byY/qTWVgjYxWBZblOL6iJ qDAChqdqBynYuigk5ouWnvjPMLXzudl0G4hpx3sV6X56MoX2C95fSRUoZ4VbfTSkWPKh d0/Gvw2o9BjYMagwldJ028GsOuzM2hahyJBO3ARKTnRkyspyJsMjjbPor55GKk+DpwFZ eTBllbn4qxGWNskQKLsS21VglkfxMlYHMGhRwk65JVqhsOBUdGO1/7MtiGRqSmV8A4nT IArgCUgCKYimcIxHGEEy8GgozbqF1EdK5/l8WpjTHFoiQMi/VLM0MdeZzT/Z0AgTndpY lcZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441160; x=1773045960; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=fgpTnmDlQrNYYO6m4642qCf1swsSA8ghfzunh+4QPMQ=; b=dsI/mXhHbfInAPEEJy0cUT1atENY3P0GDx8AICOkmN8TF339ToJQH1HPVfphnBQ3Ex v6U8MPqDGbh9Q7UkYlaThI03xeO/cPKz8uTfuZTlZ0xsZZBQckz7RYRdzy1tBsSu040D HYUTkr+RGxUQsOQ9aIqoBwIne4EFUT1Zih6YvG4ord91/W4Xm6Wi07pPwQoWdR+ycL+o 3FLqHPXR8uzTcBlZCJeo6VcjJ36iesVWvpZ/AjJzAks+64I1ZoFcqtIU7QdABQSFS1XS 28efCx3MyD3dmQP8/Pmj1Q1rF6VdWrghwoS6qpbSVrJIGsL5AOWTSAtC5kYZyhXMNzUB jf8A== X-Gm-Message-State: AOJu0YxcVhmSxuVnzacy/7YdyT09FizY8AjlpfDDjq7PlWDP4bn+0R2Z GLefqc4cpPd00S7cLnBpGArXDQUjpYXqwlUSpd62BqJv/gL2VrbMcblBREKCbPfZ7EAjlTSVHOf EztdMsQExfkr7vZlIEWKQOtyJIkFctwwsZDwTpaKr1wl4F1uej1v007F3WpCKGZiW3jSbfniyrk KuTz0AT/Gqhd7Gh82gIs6Tiwq4nvSLin7dCKrAKHTu X-Gm-Gg: ATEYQzyxrLUQb+hHgP4efKIkatUDm4vNlR7DVIqJEAIgkADtlDh1i0eT3B15R9hF3+r UllrjOBD6ZePF7kki45wj6TuhDoHj5MRgw0U90/H4v9p77z/Homyb4WOdrTMRI6Ehzb+3vvu/0Q sQAlPluLE9xuweXLJ3BWVyZeTyAfIuUc4Vqw/Woo7Zv1WicavkDv7xmBGOVGCK9p0vGc85cDmX5 V/kOp9Tizlg0/zWQ9X2EA7KUXi/eZxzsAMSxjUvGAzSshKQkXF6kOUJikgeTiZulk577RcNW4y7 8sz1QOMd6EHMKzH5f+gP+ig+MOSOhrWhr2+8LzqvJv4lX+eurQln140qfPAuUfsrdrqsdgY8fMf 69cBYBIEmMNNU9VuC0joemBOcwfrGzYKW7Hme2tjTHaunFaclJuW8B6e3t+h2DJF16Nh7aPbB4u Gb5+jsfhWPs/7OZUnVsa4gjPVo5n4= X-Received: by 2002:a05:600c:8106:b0:483:afbb:a064 with SMTP id 5b1f17b1804b1-483c9bb7b7emr192748625e9.1.1772441160003; Mon, 02 Mar 2026 00:46:00 -0800 (PST) X-Received: by 2002:a05:600c:8106:b0:483:afbb:a064 with SMTP id 5b1f17b1804b1-483c9bb7b7emr192748155e9.1.1772441159444; Mon, 02 Mar 2026 00:45:59 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 052/102] i386/kvm: refactor xen init into a new function Date: Mon, 2 Mar 2026 09:42:47 +0100 Message-ID: <20260302084338.473368-53-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441923455158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha Cosmetic - no new functionality added. Xen initialisation code is refactored into its own function. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-12-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/kvm.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 40e4b3f1283..cc98cc961b7 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -3433,6 +3433,24 @@ bool kvm_arch_supports_vmfd_change(void) return true; } =20 +static int xen_init(MachineState *ms, KVMState *s) +{ +#ifdef CONFIG_XEN_EMU + int ret =3D 0; + if (!object_dynamic_cast(OBJECT(ms), TYPE_PC_MACHINE)) { + error_report("kvm: Xen support only available in PC machine"); + return -ENOTSUP; + } + /* hyperv_enabled() doesn't work yet. */ + uint32_t msr =3D XEN_HYPERCALL_MSR; + ret =3D kvm_xen_init(s, msr); + return ret; +#else + error_report("kvm: Xen support not enabled in qemu"); + return -ENOTSUP; +#endif +} + int kvm_arch_init(MachineState *ms, KVMState *s) { int ret; @@ -3467,21 +3485,10 @@ int kvm_arch_init(MachineState *ms, KVMState *s) } =20 if (s->xen_version) { -#ifdef CONFIG_XEN_EMU - if (!object_dynamic_cast(OBJECT(ms), TYPE_PC_MACHINE)) { - error_report("kvm: Xen support only available in PC machine"); - return -ENOTSUP; - } - /* hyperv_enabled() doesn't work yet. */ - uint32_t msr =3D XEN_HYPERCALL_MSR; - ret =3D kvm_xen_init(s, msr); + ret =3D xen_init(ms, s); if (ret < 0) { return ret; } -#else - error_report("kvm: Xen support not enabled in qemu"); - return -ENOTSUP; -#endif } =20 ret =3D kvm_get_supported_msrs(s); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441494; cv=none; d=zohomail.com; s=zohoarc; b=Pljy/QLDPM2wuPQdc/eyHjILqmB6MU50RJgUQ8yvSiN13dhspibsjGY7vHA2IxXsmcN4OmeYibycCBRqGiN1rtdJ/BT6dgNOQasvLfULWsUcMcgAADUHm/Mn+ahMGtMSZFSlvikoNyWVAI2Q0qkDBNgZFZTfIOaINcTJAhRcwvY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441494; 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=Y4dK4avivBNGeqYlI88vyCawkYYLzQKNasCQb8HtPUA=; b=JcUTYvt63JBzK6WJqDVHnpppfVbRyc0dFgGYZ6iljtZ+w9Xn2tPe/RtCYbJ3DStKrRLuFwgnsoT+kk9eMAYB9sMGbUZTLlFsZ+9njSznHze0AMkeO1UmYVS7ANZkOCROP4s3G4GM7s/SNhIu35bIOULKlcpTe3IJd6G1RBgdE/A= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441494552923.3394417574573; Mon, 2 Mar 2026 00:51:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvk-0000BG-1D; Mon, 02 Mar 2026 03:47:08 -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 1vwyup-0005NP-H1 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyul-0001xh-QP for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:11 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-561-6FrVXIwiPJCoEQbvOQt_OQ-1; Mon, 02 Mar 2026 03:46:04 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4837bfcfe0dso53794955e9.1 for ; Mon, 02 Mar 2026 00:46:04 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcbd781sm233582865e9.8.2026.03.02.00.46.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441165; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Y4dK4avivBNGeqYlI88vyCawkYYLzQKNasCQb8HtPUA=; b=iPXXpCRdUCgPbaQu1KcBlkdwQ4MJuLWjZF7azRwVXwznxG/mGTyPsFfjCXWKhdPk7oyw/W wz+SjHEEjlmvpAV29H6vvzGETclz+kA8YWzJWiH4utCWRW2LaJZsKBWOPrXndlR0Cv7h2k FppcyR5eIMBB57M2zyS/xI6bSE/uhMw= X-MC-Unique: 6FrVXIwiPJCoEQbvOQt_OQ-1 X-Mimecast-MFC-AGG-ID: 6FrVXIwiPJCoEQbvOQt_OQ_1772441163 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441162; x=1773045962; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Y4dK4avivBNGeqYlI88vyCawkYYLzQKNasCQb8HtPUA=; b=H0uhkgEms3fTRycgeaKoq75uytbmu4GA4laxj0aJJivAHn6A9MaujYcgR7l5TzlF1T vFucduPYcCa0+MixoqzD3dOBsT4me+NIKAWc9g0DrL+c6+gj92I5jg1XFE+gRs/noS53 ozJRZl+aW/3bbcXwiPiWYzSdjD9zbBt+ScGqbu/kPUsJMhzOmZtr0ZFPNoz/ZBz/Fsc6 mcuHGesj4RSxOHJk0wqQWkdMaQQN0bxJhScOwyRYr/q7RZ/ZZ9jxAjwceztapm5TtjjI ae8K3dPUvdyoSg+Z4rzBogVr0RiojZiaeIIf6KiOTxKkrR//fDfxHjPJJG9BvFk/rfya nTPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441162; x=1773045962; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Y4dK4avivBNGeqYlI88vyCawkYYLzQKNasCQb8HtPUA=; b=QwCRqBmW+/WuEM4edsn18zqiml6+zIy00RbJpEupciaLwnoZjnLafnzW5BwYatagjz PiTkFes/uvIEUTLSlliVP07NonAOdbpHb+U1lulepNwhhWPTCiCWr8BUhnQQev6BvA28 ioEZZ/3aT9xT/XqHfP6V7uk0vIKzrt06Tpuvte17YfYiEGq2LwBI64Cq+2ZRLGLKHRps tLSO6lNMXYm1c3PFe1IM9htv9KHQGQvgfS7IsR1rBiIf1zczPGQM30F5Tvt93bWlHjtA G8ELNqDscn0j1DxIV6BouLycgpCqMqK0Qj7SPq754fZ1Azzrut+Ej1WSsjf7nfgoVK0O OAyg== X-Gm-Message-State: AOJu0YzTf2zEfebzsM2L/4KRtNOvrwPFX9lmqCDBOesa5RrdWDLnwYj9 aQ7k8EB3BJXLTKhVNc5Gc5iFoPWiMBEVHLE3+5Gyjdyu8VvF4iL86ZRfyh+UKCxW6Gj/zGQFLty s/BrLjYIaiR4Vuv9KJNZiRzhd0hGy1S2Zvx+gxmWYeWeYYSacxcHCBvNGW6LgbVHMEOmPAgr28l 15hGmawONYAIr+Aj8P5rLD73/H/7HUBZ0UYQQ0nguj X-Gm-Gg: ATEYQzzkUViWJcNlGUwaJOxUfilhGf0y6Tj1MrIxU10U8Y0t3rZcUFgeGbxUFrIKvLf NHN9a/YAlrx5ewcuYnYt8JReid6fuO1SsE5QZsSpO+dOLfH8F4gu2ureKPweLCaJTl6WlG7lzHm mopVD4IhP99z8xn6jo6efPxDmFCm4G+qBjLMLlixYJHxhYMN5Iuvne0niNbxel+CTbLpdAesdPC M6WOvMfOYsI6FLwFvWmbCyWd1eIOKRziUOV1878uNzfyd9miWH0PBAy3i/WeeVK3WaQWG2E7R0M EvgLT9WuhYxgZfhPCjScU/wV5++0AOyAsRmZkIiia52au4kGeepMPQR8krBnBt/DsTz4LrWr1VU roUSZPuWFRpCtdbqJWITJPw4bF3ngQFsGOVUUQ9Rkred6+8jel5I0SJXjvQvreGTtXi7H8h/fSm fzJr4vSW/oh8QXR7oq2jDKF+N/Gxc= X-Received: by 2002:a05:600c:a4b:b0:483:71f7:2797 with SMTP id 5b1f17b1804b1-483c9ba3785mr216754755e9.14.1772441162319; Mon, 02 Mar 2026 00:46:02 -0800 (PST) X-Received: by 2002:a05:600c:a4b:b0:483:71f7:2797 with SMTP id 5b1f17b1804b1-483c9ba3785mr216754425e9.14.1772441161851; Mon, 02 Mar 2026 00:46:01 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , "Michael S. Tsirkin" Subject: [PULL 053/102] hw/i386: refactor x86_bios_rom_init for reuse in confidential guest reset Date: Mon, 2 Mar 2026 09:42:48 +0100 Message-ID: <20260302084338.473368-54-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441495320158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha For confidential guests, bios image must be reinitialized upon reset. This is because bios memory is encrypted and hence once the old confidential kvm context is destroyed, it cannot be decrypted. It needs to be reinitiliz= ed. Towards that, this change refactors x86_bios_rom_init() code so that parts of it can be called during confidential guest reset. No functional chnage. Acked-by: Michael S. Tsirkin Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-13-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- hw/i386/x86-common.c | 50 ++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c index de4cd7650a4..c98abaf3689 100644 --- a/hw/i386/x86-common.c +++ b/hw/i386/x86-common.c @@ -1020,17 +1020,11 @@ void x86_isa_bios_init(MemoryRegion *isa_bios, Memo= ryRegion *isa_memory, memory_region_set_readonly(isa_bios, read_only); } =20 -void x86_bios_rom_init(X86MachineState *x86ms, const char *default_firmwar= e, - MemoryRegion *rom_memory, bool isapc_ram_fw) +static int get_bios_size(X86MachineState *x86ms, + const char *bios_name, char *filename) { - const char *bios_name; - char *filename; int bios_size; - ssize_t ret; =20 - /* BIOS load */ - bios_name =3D MACHINE(x86ms)->firmware ?: default_firmware; - filename =3D qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); if (filename) { bios_size =3D get_image_size(filename, NULL); } else { @@ -1040,6 +1034,21 @@ void x86_bios_rom_init(X86MachineState *x86ms, const= char *default_firmware, (bios_size % 65536) !=3D 0) { goto bios_error; } + + return bios_size; + + bios_error: + fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name); + exit(1); +} + +static void load_bios_from_file(X86MachineState *x86ms, const char *bios_n= ame, + char *filename, int bios_size, + bool isapc_ram_fw) +{ + ssize_t ret; + + /* BIOS load */ if (machine_require_guest_memfd(MACHINE(x86ms))) { memory_region_init_ram_guest_memfd(&x86ms->bios, NULL, "pc.bios", bios_size, &error_fatal); @@ -1068,7 +1077,26 @@ void x86_bios_rom_init(X86MachineState *x86ms, const= char *default_firmware, goto bios_error; } } - g_free(filename); + + return; + + bios_error: + fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name); + exit(1); +} + +void x86_bios_rom_init(X86MachineState *x86ms, const char *default_firmwar= e, + MemoryRegion *rom_memory, bool isapc_ram_fw) +{ + int bios_size; + const char *bios_name; + g_autofree char *filename; + + bios_name =3D MACHINE(x86ms)->firmware ?: default_firmware; + filename =3D qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); + + bios_size =3D get_bios_size(x86ms, bios_name, filename); + load_bios_from_file(x86ms, bios_name, filename, bios_size, isapc_ram_f= w); =20 if (!machine_require_guest_memfd(MACHINE(x86ms))) { /* map the last 128KB of the BIOS in ISA space */ @@ -1081,8 +1109,4 @@ void x86_bios_rom_init(X86MachineState *x86ms, const = char *default_firmware, (uint32_t)(-bios_size), &x86ms->bios); return; - -bios_error: - fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name); - exit(1); } --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441301; cv=none; d=zohomail.com; s=zohoarc; b=aDJY+fZjFppTkztaaFDmTUVdnQLTV9/sHL+HVN0aUXePqqtK4H0zVToDndmOVhU5iwPMjJImyorKLS+wSSkFlwA7SfVejFAkkT6zjS8qEcP90n7Ek13Y08Dd91lG+f7AJm80zey53LjHRHc/sa6c7+R+csjp+iY8jyNyWxDg5es= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441301; 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=u45VlP6nLQP4FVKRSzMkP4BNLjBizhtLpJZtVE2DTlg=; b=lUaN7bBWp8wOCgOirxBj7qh/6GAJT0JAsZ+2/2N1BDdH20tpUH2eYJ4lijO5t4/t95T9eoLs1GXokUTSvPBbfbMmVZGZGGK4xYz0p/YcO2lc5uONP4d18KUA069yJXSWPnb8rUJ7dpnrmX0OqA0iIbtd3E4l+uFV1EP7AOsytIw= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441301597730.3362339936164; Mon, 2 Mar 2026 00:48:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvK-0006ci-1I; Mon, 02 Mar 2026 03:46:42 -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 1vwyuq-0005O9-Qb for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyun-0001y3-N0 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:12 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-145-V-stZMg2MmWpRS-__aHq4A-1; Mon, 02 Mar 2026 03:46:06 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4836e35292cso35579085e9.1 for ; Mon, 02 Mar 2026 00:46:06 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfabb84esm387539115e9.0.2026.03.02.00.46.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441167; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=u45VlP6nLQP4FVKRSzMkP4BNLjBizhtLpJZtVE2DTlg=; b=HfBZik5bhqfGAXmiI23uteVqVX4+LMsKv182cAMT3EAESBR++dvWsJZQtY9qUT436nJjeb n8t/J1bh8OlXop/1WxSwufbnuL7tuPh72otne/u1VaWjGnjkx1VgTWcZvnbt0b4szvGk21 zWnSvfmcVqY4B5erort12v19rIcXSOI= X-MC-Unique: V-stZMg2MmWpRS-__aHq4A-1 X-Mimecast-MFC-AGG-ID: V-stZMg2MmWpRS-__aHq4A_1772441165 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441164; x=1773045964; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=u45VlP6nLQP4FVKRSzMkP4BNLjBizhtLpJZtVE2DTlg=; b=bXqO8hxHP0nbWunoeTRn/zUn2paOKSlgblZKHR8saIlbI0+I0I7j+YPFvErzprbdyh eR3BJw217KyNRnkCDBAq1Fxc8uPT2aVt8KGNN92rm0ifreWhTLPOlOx9jjz0Yl8z+JXP QVBFWaDZVpbDGJUUm0UJqyZE/0PRv/61Qy+5VY6txo7XwZ6/WncPVKd0EV9VCYNEP8wu ZZECpo7cxHm4t0qk6hzUgqDMJRg5fputVh5v4y3Psrerk9mLttAlbUfpOUl3JH1ku03N dMQ4ZB2R8XG2dsQ4XTtmdM5c2V36IBKmSesVOblehRVYafwj8m26tiepIttbxLIfstE6 JoIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441164; x=1773045964; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=u45VlP6nLQP4FVKRSzMkP4BNLjBizhtLpJZtVE2DTlg=; b=fMyCTb98JZApxNdcm+BuTPcx+3lGEkd3fkCPwzxByfcoCn0eoHBsMOSFwkhpUzeb8F l9dSWRtiamJF56uvLV1l+BcaNITNimfafgSktLtuuTaKoAhxBHYjBKW/qNkWZRNOtYOx pGlGxSDMz2kBIO2Y9IKGbW6qs1HVL0izUmgGRMvCfWIEjUHXyEYXCDHPCW9gg+Ie3w0q 6RxIl8vmRM9sOXYIX0mnUdCLNK29xEjQSpJVI+mZCcrYdJ5muZhxpBnZQcLpPVHjGwk4 Ji0hGX201HgiPWhE5UMHvbSd6tfobZVUf8hq1WSbqb9BIJ0iIGe1Ceve4uGXBlLfwula pbYg== X-Gm-Message-State: AOJu0YxvmI7PT9c55ESd0Xr6mhrw/shVFPku6P81bGTcXgFXM4DwGmXR ulG/fFF7Umt1OALgKAFuRKZfm6YAkmmt3OREhX0ZZtntNSNIu3nAzz0l66dHPknLpgYOu7z7/Jv h40xc1Kjwfbn95JA4CVx/UABTXtJSP6rxRINq3X2Zm0qWKBjePLfCAPCzfYakBH9iWXBHaY6X8S xJcmMUPw5wKSF2zqFzPZm1o+SDL48vGu1LG2nr2jMA X-Gm-Gg: ATEYQzyheuOypfRyCNtmeaZTSHtmqmn4uMVsY01VVJ9enu6EyW+IE6EuG/8GT0bGfP+ Crb0t9rorggTwnWuqrkh2TIpvMMTNHHj1QqtHd63T8r/b8LrgQU6Z87x/sNoz2VYQ1rgFC8vFQ5 Z60NXN4n6ci7tHdDb65/QMInYCY7Icxknof5r2WLQ3lvqtNUSkxHh67ZzJmimb8IYqU51/QjX/p AzzEnbDwA9POAo1+k0yLxElZ60t+U0zG99wUHjoipV8iQG8tnufZLmypiG/ql8nkj26nCn2Z4UU psN0d6S7FKzmM8wxvGRxgqYLmp0VKXaZgB8J2xMmGyTbQ2seUE4abPDGhqfx7sCIqp1w0TiXs3K Co33s7c8ppMw/Fzx+VB5KWcpwpjocTnAahgT+LMcmU9FNQDr5ajcNLK/YtEdopC3EiSaL0vknAy P4ISSMhl77uoCftaHtK/VfJhCwpzg= X-Received: by 2002:a05:600c:64cf:b0:480:4b59:932e with SMTP id 5b1f17b1804b1-483c9bc0370mr198206065e9.11.1772441164580; Mon, 02 Mar 2026 00:46:04 -0800 (PST) X-Received: by 2002:a05:600c:64cf:b0:480:4b59:932e with SMTP id 5b1f17b1804b1-483c9bc0370mr198205745e9.11.1772441164127; Mon, 02 Mar 2026 00:46:04 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Bernhard Beschow Subject: [PULL 054/102] hw/i386: export a new function x86_bios_rom_reload Date: Mon, 2 Mar 2026 09:42:49 +0100 Message-ID: <20260302084338.473368-55-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441302414158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha Confidential guest smust reload their bios rom upon reset. This is because bios memory is encrypted and upon reset, the contents of the old bios memory is lost and cannot be re-used. To this end, export a new x86 function x86_bios_rom_reload() to reload the bios again. This function will be used = in the subsequent patches. Reviewed-by: Bernhard Beschow Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-14-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- include/hw/i386/x86.h | 1 + hw/i386/x86-common.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h index 23be6274377..a85a5600ce9 100644 --- a/include/hw/i386/x86.h +++ b/include/hw/i386/x86.h @@ -125,6 +125,7 @@ void x86_isa_bios_init(MemoryRegion *isa_bios, MemoryRe= gion *isa_memory, MemoryRegion *bios, bool read_only); void x86_bios_rom_init(X86MachineState *x86ms, const char *default_firmwar= e, MemoryRegion *rom_memory, bool isapc_ram_fw); +void x86_bios_rom_reload(X86MachineState *x86ms); =20 void x86_load_linux(X86MachineState *x86ms, FWCfgState *fw_cfg, diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c index c98abaf3689..a420112666a 100644 --- a/hw/i386/x86-common.c +++ b/hw/i386/x86-common.c @@ -1085,6 +1085,27 @@ static void load_bios_from_file(X86MachineState *x86= ms, const char *bios_name, exit(1); } =20 +void x86_bios_rom_reload(X86MachineState *x86ms) +{ + int bios_size; + const char *bios_name; + char *filename; + + if (memory_region_size(&x86ms->bios) =3D=3D 0) { + /* if -bios is not used */ + return; + } + + bios_name =3D MACHINE(x86ms)->firmware ?: "bios.bin"; + filename =3D qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); + + bios_size =3D get_bios_size(x86ms, bios_name, filename); + + void *ptr =3D memory_region_get_ram_ptr(&x86ms->bios); + load_image_size(filename, ptr, bios_size); + x86_firmware_configure(0x100000000ULL - bios_size, ptr, bios_size); +} + void x86_bios_rom_init(X86MachineState *x86ms, const char *default_firmwar= e, MemoryRegion *rom_memory, bool isapc_ram_fw) { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441847; cv=none; d=zohomail.com; s=zohoarc; b=hhdK/x7wahcHrFyVeT1Y03+j92zPXAQuAjwrNAz5qDcnvqMf652mqX3mTK3bN1TNpoezaOjqWvNe8iRMce1Iv6Vii2OKIYYygdnYbA64ykqhJat7d+EZKVVQf5L6N9ikG1mvtyOvHp6ILfN082wTnSRlZgiY6JW1s8Cv1CcMP5k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441847; 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=f6cNwZnhJx1VcdrBJs0C0lpGvsSbYS0DjVCzqGMIKXM=; b=Z37FZySUuakVf9q7JLnBnVEvKJlyLWVGl5Q5swzeTLx4BjX0aZkk34mKtTcm3gL+EQlw/zyo7Iop7tooWshNk0uS5wWeFzVRZlSp5Gjd7+MtYzYTtR1qJYCcZjVobT8wTj40auueiRIkqKCX+7fvLwC3ZGjYBqclGQzwNVBlPyk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441847944674.8695955517804; Mon, 2 Mar 2026 00:57:27 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvj-0008Vc-9e; Mon, 02 Mar 2026 03:47:07 -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 1vwyuq-0005OA-Vg for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyup-0001yT-3L for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:12 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-510-AwfCWtgPMoSoiTnkn_U7iQ-1; Mon, 02 Mar 2026 03:46:09 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-483786a09b1so41294305e9.3 for ; Mon, 02 Mar 2026 00:46:09 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b4a121sm265288555e9.8.2026.03.02.00.46.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441170; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=f6cNwZnhJx1VcdrBJs0C0lpGvsSbYS0DjVCzqGMIKXM=; b=BHuaFBHvfArO2UJ/NmymXciN2tV7+ALU9P4Opimu0NZRwcEgab21ZNKT1rKKUFYQfUbhpu LjKXPFblZTFIAMpEpqNrZH8sYauzbsBYchld7waSRWOfazqNPTZHt5EfbLmjZHE11tgj59 hYlB8ZjmmJzbmqIkFHVTudf1Ie0Mc24= X-MC-Unique: AwfCWtgPMoSoiTnkn_U7iQ-1 X-Mimecast-MFC-AGG-ID: AwfCWtgPMoSoiTnkn_U7iQ_1772441168 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441167; x=1773045967; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=f6cNwZnhJx1VcdrBJs0C0lpGvsSbYS0DjVCzqGMIKXM=; b=E6g3a8k2OLco6T1nzGLXzxEIexQNsnowAtSqLoZ7TwDWEg+VbymNiv5CM1sV6Y7Osy xUlLXBDrxuRFWpR4cO2nVwJusn83orczfoRefACgd1fNyYCkIcBmt5HfEfPx76Ne29O/ VpG430Z5/5oNFSuQrAFZEREqRkq5LGJ+fwto+cCFUez0fNLhzDkWvvo3PEHEivQFTVR5 h3ey93WK82YYjDc0Jhd/kyLbLuftLFmL0hMK5GRR3JWP0nNISBWJUK5b6/xsDMeSn+cU ojy8rK+NeYxagbcoxyKUH4RNv59bZnOaxCs/R784DmkTxbhsnxuDrfqTvZ9W0FGGBHiy UPZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441167; x=1773045967; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=f6cNwZnhJx1VcdrBJs0C0lpGvsSbYS0DjVCzqGMIKXM=; b=GxozOZKUZjbPEbF0Ld5yr8SK//qVqd31Byo4TBS7GnccaIFXPPrz0O6oxWUp2sHO0k Uu8EiY5iGnZsJlc1nq8pGQOkq7lsCuxIQQmRI093z32C6Vt4XN20dtRg68nvwFmzkVez riazOGP2rsNKbNkK+GO9hlwbEA30MjPUk5kbCC2Z4tnTu3UWgBI0OvD66tPHBQ6fKjqM 0xWi9pXGq/fK2CpDcXV1f+FuXXJx0INkkrSfcU6npW5XsRvJxA1uOPvnzJVKLBzZft9n OhDAA2XxJS4BCi56Ymd8FB3sTlkjPO4AYpNFImWOqdcGVKzy4taTfJa1Acb3NwUQIA45 sU4w== X-Gm-Message-State: AOJu0YymjzmdDdxqUaMdZ9d9safmSws1uwE7rtKz0wYFtfoJGvQaRrHg Bea1gZ+aMqbQHBe7QceyTltr4jssHFkFrk96mam3eupVXCf9tlNOeq5+c9wXNQuPgPkbU0GO7kx INydjXCJKKcHqYIrMZiIaCDXZdEz6F5BaUK8Qc04ply8IW95F1lc7Eo9dF28JFVkID8Htori8Sj WPhsC7Sa8wGa7hGuH9kX9mxW5i69IyHZCEdRxmdVyU X-Gm-Gg: ATEYQzyrsvphLRzDZyqf1b/YfUzSvuOta1vhkbG1lwADlLnOpY6lAF5T8oa2dm6R18w 93AYY3/zQnrcayH3rDuFvFCcCcvKmsp8k4sPtDRR8zMaRxZEjxHv2wFjnAMPvkiBk1LixeJbabB 7q3kI+2ogccI8bHbs2XrCPd4wQEy/8QFdAnBS5pEtcBFi1Ug7oAJxGhFBKG42W+RXd0RrJkaNIY fTVJGVuHFZpLIKiOJqEQZDsKbRjLydOBwnjoKwjjQ2xUXOqpxB15uFSB50YXVBY8+jCL1fukdNX CI+JX7klpsVsjhD2dWGZzoJT6y7nJpEkwwrXeFtOj5PF2OGA4OKBxtHy28IJ/9mLH74/EwXyjZY zzgtnQBKcpRpHTlgV4xqOFqStJyb3EwYk10uX81YRXerl592Z5AK/wtHfEWKfLPEBhLby5naVZD 1qMSNhhDjkxEY5NLmgMp8cM/E6XrY= X-Received: by 2002:a05:600c:8108:b0:46e:761b:e7ff with SMTP id 5b1f17b1804b1-483c9c0baf4mr189616025e9.28.1772441167264; Mon, 02 Mar 2026 00:46:07 -0800 (PST) X-Received: by 2002:a05:600c:8108:b0:46e:761b:e7ff with SMTP id 5b1f17b1804b1-483c9c0baf4mr189615325e9.28.1772441166524; Mon, 02 Mar 2026 00:46:06 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 055/102] kvm/i386: reload firmware for confidential guest reset Date: Mon, 2 Mar 2026 09:42:50 +0100 Message-ID: <20260302084338.473368-56-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441852550158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha When IGVM is not being used by the confidential guest, the guest firmware h= as to be reloaded explicitly again into memory. This is because, the memory in= to which the firmware was loaded before reset was encrypted and is thus lost upon reset. When IGVM is used, it is expected that the IGVM will contain the guest firmware and the execution of the IGVM directives will set up the gue= st firmware memory. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-15-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/kvm.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index cc98cc961b7..9d7a9ffceb8 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -3416,7 +3416,14 @@ int kvm_arch_on_vmfd_change(MachineState *ms, KVMSta= te *s) =20 if (object_dynamic_cast(OBJECT(ms), TYPE_X86_MACHINE)) { X86MachineState *x86ms =3D X86_MACHINE(ms); - + /* + * For confidential guests, reload bios ROM if IGVM is not specifi= ed. + * If an IGVM file is specified then the firmware must be provided + * in the IGVM file. + */ + if (ms->cgs && !x86ms->igvm) { + x86_bios_rom_reload(x86ms); + } if (x86_machine_is_smm_enabled(x86ms)) { memory_listener_register(&smram_listener.listener, &smram_address_space); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441268; cv=none; d=zohomail.com; s=zohoarc; b=YKORjv2mPYKL+kYfcUGJxNEqJchdwYRVIVRRhfSR+KW4owk9vWHSzap/g4dyv00vRnmFnwwtNAs2FMNZS9GK7k7mXbybTxzeTgiuQkgTNc5JTqz4u32P0tyVD2gpkMHTVAcjGCTZ8TPCXTX6Mo4xrE5Ery2EH0XXgEZ3jQ+gQak= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441268; 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=yqrLIwIWG7O7AT3AslNieYmXs84EPYo0zTvBpgEa0sY=; b=cxDqz5E95V9MtY5vf50UaWwVQQdBNDDDJkRTks/MeloU9ZwLzW5cgeCcJfK1RpdKPjRMKqF88RZAFZO8WQdMCFZ0C3q2L0D/YX1GGO9oU0OyA3oQ15rwe0KhOA2GuPeGiP7HaIK0iHHPA5MNZBlzbXRTIKBC+VOOWl2T6MonGwY= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441268435155.62832958085164; Mon, 2 Mar 2026 00:47:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvJ-0006WE-FT; Mon, 02 Mar 2026 03:46:41 -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 1vwyut-0005TX-PG for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyur-0001zd-Ge for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:15 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-52-S25YKvJcM0WnffjXI6xthw-1; Mon, 02 Mar 2026 03:46:11 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4836b7fbf4fso28198465e9.2 for ; Mon, 02 Mar 2026 00:46:11 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfb77444sm122075565e9.4.2026.03.02.00.46.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441172; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yqrLIwIWG7O7AT3AslNieYmXs84EPYo0zTvBpgEa0sY=; b=igDDPWX/5txuT6zPevhd/uc/RrD51aRbiRKq4oX0JQyumanUEsjk0d0nPi1FV1DVRjW6Y+ mv0ORr1IBX1naNj+vsYye7aT0bVsTT4KrmHk2fptRiCnTsp4j10Fh40aEUSXdiR5NzwAyX QmNMXNbWTsI0mlYlOmsKhn32U13Go1M= X-MC-Unique: S25YKvJcM0WnffjXI6xthw-1 X-Mimecast-MFC-AGG-ID: S25YKvJcM0WnffjXI6xthw_1772441171 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441170; x=1773045970; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yqrLIwIWG7O7AT3AslNieYmXs84EPYo0zTvBpgEa0sY=; b=VQeS+ZE8EPcbbGEDIDD+j2BiZJvh5r4etXPg5JvwdpU1vkJ62uefRSaXFVi8jhAGK4 2SLt8YiY4DFYBcq49qCD+dGw3LQuvaPHGswcBVSsFi3dLh2szie1Rt7DZb1/3PMKOFZK 2mvQOBkFmDCC97PajAL6kMjqNZhaSKuEZeP9UsdSPvRrPE050FVZRjErxczPOGm49M9g 2XVytM7bJs1kKBoZYU6Ek1Ie136MwgZS6xmLMD2k59SPylhXBKMaODVUppoWJTFsgp0i M7qHrhMz3dN5e7pZ0icGZeGyysr94BPKqAl4g8D/CGXAfCAx9DmNgWY1JTL/WuS1lq8l SR1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441170; x=1773045970; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=yqrLIwIWG7O7AT3AslNieYmXs84EPYo0zTvBpgEa0sY=; b=pB95/spNWevYqCHxfSoaBip5NWw6XQR8umXPhriG0KeVjCJFF/f7rx1wg7X94DRwRH H7jywW465lR4jyjPrhRSfFsvfmkDhHcR4Pgsl26G4oK0qSuHPZs7etM0xt10DrpPJdOz /WCmz/K77X3j9UDHntwMrPkB8akpyE24bpnsAZz5KoQVgPP/z+2Y8DzyxXgAKCoFBbmj Zf62v6B/HFqWRmi+3g+m3uwJzaGnk8rbgiLnCEZjeJhNLMw0QxC+9hLyOzS7Fka+oIGy qwwyl/c950T1GSG2lEbO79HSe7ovjBT+NAtBg1gsjv7Y6dPtsN+6KLbg7lT0dgEmnwe4 3g5g== X-Gm-Message-State: AOJu0YwXFNFt8mKEwssb51+Rsa7jmPRkZ8uDOsaXJcaE/B49TNRiWE1O b330MCsVu8zo3ipIDVMffrXRebHu4J0LT52lC2nytiNez9AHE+8pOU3ISDcrNxm+SjISMeM5xR1 ARWD8d9tvXc5B91WPmOFJBr7vS40CbZCNwKJLDGaTh43CXBG24cJaNVMVkpx4Cm3M+RcJB7JIdJ vkuzx3/Dufn3lsUIYEnjepZ1sT70rfL+kbLY/5g8Mh X-Gm-Gg: ATEYQzxRGsTP08i6twJfwiHXxnA9aMclZoYiCN1GxdXRi/1nu5sr/BD4SEqplUcy/fb nsnrG91eAdfU2/clGsoc1iC+4tHQGsKu+VCw+vxTk+njqESHOaCXKIpWJP8sMR4CNjPFMSin/xR mNVkK042akoxMQh/AlYDNBmqXh5/cYZFphVBukbBPLKjMHUZF9qWk4w1OAGm7pxDcHyoZPPMbY9 Ht1zJNtbqTWZSXkVeQiuwi1SlkkBMq3jVe4IJj1+Z11bPwZZtT9Ml+JnOFMmYHVGEvxvkZMFsR3 7EmwyixJMgwRB5zDlfJKtS/LN3OHID77dGoI/JAgf17krDWl2q7RHx7kk/MIA/eLzFP2DmQ9Y8B tUwBYAjP4yoiM4AB6UCHqBJvjSoQacM5eQnD0JAqQT9t1AaQZWeKDeDtTK+Jj2hpu+4SuN5vgk0 7RsJ+tmdoieNvkly5xfSvK04vljug= X-Received: by 2002:a05:600c:a086:b0:483:a895:9d85 with SMTP id 5b1f17b1804b1-483c9ba3ae6mr211490655e9.2.1772441169654; Mon, 02 Mar 2026 00:46:09 -0800 (PST) X-Received: by 2002:a05:600c:a086:b0:483:a895:9d85 with SMTP id 5b1f17b1804b1-483c9ba3ae6mr211490155e9.2.1772441169088; Mon, 02 Mar 2026 00:46:09 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 056/102] accel/kvm: rebind current VCPUs to the new KVM VM file descriptor upon reset Date: Mon, 2 Mar 2026 09:42:51 +0100 Message-ID: <20260302084338.473368-57-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441270355158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha Confidential guests needs to generate a new KVM file descriptor upon virtual machine reset. Existing VCPUs needs to be reattached to this new KVM VM file descriptor. As a part of this, new VCPU file descriptors against this new KVM VM file descriptor needs to be created and re-initialized. Resources allocated against the old VCPU fds needs to be released. This cha= nge makes this happen. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-16-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- accel/kvm/kvm-all.c | 215 +++++++++++++++++++++++++++++++++-------- accel/kvm/trace-events | 1 + 2 files changed, 174 insertions(+), 42 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index d244156f6f4..a347a71a2ee 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -127,6 +127,10 @@ static NotifierList kvm_irqchip_change_notifiers =3D static NotifierWithReturnList register_vmfd_changed_notifiers =3D NOTIFIER_WITH_RETURN_LIST_INITIALIZER(register_vmfd_changed_notifiers); =20 +static int map_kvm_run(KVMState *s, CPUState *cpu, Error **errp); +static int map_kvm_dirty_gfns(KVMState *s, CPUState *cpu, Error **errp); +static int vcpu_unmap_regions(KVMState *s, CPUState *cpu); + struct KVMResampleFd { int gsi; EventNotifier *resample_event; @@ -420,6 +424,90 @@ err: return ret; } =20 +static void kvm_create_vcpu_internal(CPUState *cpu, KVMState *s, int kvm_f= d) +{ + cpu->kvm_fd =3D kvm_fd; + cpu->kvm_state =3D s; + if (!s->guest_state_protected) { + cpu->vcpu_dirty =3D true; + } + cpu->dirty_pages =3D 0; + cpu->throttle_us_per_full =3D 0; + + return; +} + +static int kvm_rebind_vcpus(Error **errp) +{ + CPUState *cpu; + unsigned long vcpu_id; + KVMState *s =3D kvm_state; + int kvm_fd, ret =3D 0; + + CPU_FOREACH(cpu) { + vcpu_id =3D kvm_arch_vcpu_id(cpu); + + if (cpu->kvm_fd) { + close(cpu->kvm_fd); + } + + ret =3D kvm_arch_destroy_vcpu(cpu); + if (ret < 0) { + goto err; + } + + if (s->coalesced_mmio_ring =3D=3D (void *)cpu->kvm_run + PAGE_SIZE= ) { + s->coalesced_mmio_ring =3D NULL; + } + + ret =3D vcpu_unmap_regions(s, cpu); + if (ret < 0) { + goto err; + } + + ret =3D kvm_arch_pre_create_vcpu(cpu, errp); + if (ret < 0) { + goto err; + } + + kvm_fd =3D kvm_vm_ioctl(s, KVM_CREATE_VCPU, vcpu_id); + if (kvm_fd < 0) { + error_report("KVM_CREATE_VCPU IOCTL failed for vCPU %lu (%s)", + vcpu_id, strerror(kvm_fd)); + return kvm_fd; + } + + kvm_create_vcpu_internal(cpu, s, kvm_fd); + + ret =3D map_kvm_run(s, cpu, errp); + if (ret < 0) { + goto err; + } + + if (s->kvm_dirty_ring_size) { + ret =3D map_kvm_dirty_gfns(s, cpu, errp); + if (ret < 0) { + goto err; + } + } + + ret =3D kvm_arch_init_vcpu(cpu); + if (ret < 0) { + error_setg_errno(errp, -ret, + "kvm_init_vcpu: kvm_arch_init_vcpu failed (%l= u)", + vcpu_id); + } + + close(cpu->kvm_vcpu_stats_fd); + cpu->kvm_vcpu_stats_fd =3D kvm_vcpu_ioctl(cpu, KVM_GET_STATS_FD, N= ULL); + kvm_init_cpu_signals(cpu); + } + trace_kvm_rebind_vcpus(); + + err: + return ret; +} + static void kvm_park_vcpu(CPUState *cpu) { struct KVMParkedVcpu *vcpu; @@ -483,13 +571,7 @@ static int kvm_create_vcpu(CPUState *cpu) } } =20 - cpu->kvm_fd =3D kvm_fd; - cpu->kvm_state =3D s; - if (!s->guest_state_protected) { - cpu->vcpu_dirty =3D true; - } - cpu->dirty_pages =3D 0; - cpu->throttle_us_per_full =3D 0; + kvm_create_vcpu_internal(cpu, s, kvm_fd); =20 trace_kvm_create_vcpu(cpu->cpu_index, vcpu_id, kvm_fd); =20 @@ -508,19 +590,11 @@ int kvm_create_and_park_vcpu(CPUState *cpu) return ret; } =20 -static int do_kvm_destroy_vcpu(CPUState *cpu) +static int vcpu_unmap_regions(KVMState *s, CPUState *cpu) { - KVMState *s =3D kvm_state; int mmap_size; int ret =3D 0; =20 - trace_kvm_destroy_vcpu(cpu->cpu_index, kvm_arch_vcpu_id(cpu)); - - ret =3D kvm_arch_destroy_vcpu(cpu); - if (ret < 0) { - goto err; - } - mmap_size =3D kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0); if (mmap_size < 0) { ret =3D mmap_size; @@ -548,6 +622,31 @@ static int do_kvm_destroy_vcpu(CPUState *cpu) cpu->kvm_dirty_gfns =3D NULL; } =20 + err: + return ret; +} + +static int do_kvm_destroy_vcpu(CPUState *cpu) +{ + KVMState *s =3D kvm_state; + int ret =3D 0; + + trace_kvm_destroy_vcpu(cpu->cpu_index, kvm_arch_vcpu_id(cpu)); + + ret =3D kvm_arch_destroy_vcpu(cpu); + if (ret < 0) { + goto err; + } + + /* If I am the CPU that created coalesced_mmio_ring, then discard it */ + if (s->coalesced_mmio_ring =3D=3D (void *)cpu->kvm_run + PAGE_SIZE) { + s->coalesced_mmio_ring =3D NULL; + } + + ret =3D vcpu_unmap_regions(s, cpu); + if (ret < 0) { + goto err; + } kvm_park_vcpu(cpu); err: return ret; @@ -561,26 +660,9 @@ void kvm_destroy_vcpu(CPUState *cpu) } } =20 -int kvm_init_vcpu(CPUState *cpu, Error **errp) +static int map_kvm_run(KVMState *s, CPUState *cpu, Error **errp) { - KVMState *s =3D kvm_state; - int mmap_size; - int ret; - - trace_kvm_init_vcpu(cpu->cpu_index, kvm_arch_vcpu_id(cpu)); - - ret =3D kvm_arch_pre_create_vcpu(cpu, errp); - if (ret < 0) { - goto err; - } - - ret =3D kvm_create_vcpu(cpu); - if (ret < 0) { - error_setg_errno(errp, -ret, - "kvm_init_vcpu: kvm_create_vcpu failed (%lu)", - kvm_arch_vcpu_id(cpu)); - goto err; - } + int mmap_size, ret =3D 0; =20 mmap_size =3D kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0); if (mmap_size < 0) { @@ -605,14 +687,53 @@ int kvm_init_vcpu(CPUState *cpu, Error **errp) (void *)cpu->kvm_run + s->coalesced_mmio * PAGE_SIZE; } =20 + err: + return ret; +} + +static int map_kvm_dirty_gfns(KVMState *s, CPUState *cpu, Error **errp) +{ + int ret =3D 0; + /* Use MAP_SHARED to share pages with the kernel */ + cpu->kvm_dirty_gfns =3D mmap(NULL, s->kvm_dirty_ring_bytes, + PROT_READ | PROT_WRITE, MAP_SHARED, + cpu->kvm_fd, + PAGE_SIZE * KVM_DIRTY_LOG_PAGE_OFFSET); + if (cpu->kvm_dirty_gfns =3D=3D MAP_FAILED) { + ret =3D -errno; + } + + return ret; +} + +int kvm_init_vcpu(CPUState *cpu, Error **errp) +{ + KVMState *s =3D kvm_state; + int ret; + + trace_kvm_init_vcpu(cpu->cpu_index, kvm_arch_vcpu_id(cpu)); + + ret =3D kvm_arch_pre_create_vcpu(cpu, errp); + if (ret < 0) { + goto err; + } + + ret =3D kvm_create_vcpu(cpu); + if (ret < 0) { + error_setg_errno(errp, -ret, + "kvm_init_vcpu: kvm_create_vcpu failed (%lu)", + kvm_arch_vcpu_id(cpu)); + goto err; + } + + ret =3D map_kvm_run(s, cpu, errp); + if (ret < 0) { + goto err; + } + if (s->kvm_dirty_ring_size) { - /* Use MAP_SHARED to share pages with the kernel */ - cpu->kvm_dirty_gfns =3D mmap(NULL, s->kvm_dirty_ring_bytes, - PROT_READ | PROT_WRITE, MAP_SHARED, - cpu->kvm_fd, - PAGE_SIZE * KVM_DIRTY_LOG_PAGE_OFFSET); - if (cpu->kvm_dirty_gfns =3D=3D MAP_FAILED) { - ret =3D -errno; + ret =3D map_kvm_dirty_gfns(s, cpu, errp); + if (ret < 0) { goto err; } } @@ -2710,6 +2831,16 @@ static int kvm_reset_vmfd(MachineState *ms) } assert(!err); =20 + /* + * rebind new vcpu fds with the new kvm fds + * These can only be called after kvm_arch_on_vmfd_change() + */ + ret =3D kvm_rebind_vcpus(&err); + if (ret < 0) { + return ret; + } + assert(!err); + /* these can be only called after ram_block_rebind() */ memory_listener_register(&kml->listener, &address_space_memory); memory_listener_register(&kvm_io_listener, &address_space_io); diff --git a/accel/kvm/trace-events b/accel/kvm/trace-events index e4beda01488..4a8921c632b 100644 --- a/accel/kvm/trace-events +++ b/accel/kvm/trace-events @@ -15,6 +15,7 @@ kvm_park_vcpu(int cpu_index, unsigned long arch_cpu_id) "= index: %d id: %lu" kvm_unpark_vcpu(unsigned long arch_cpu_id, const char *msg) "id: %lu %s" kvm_irqchip_commit_routes(void) "" kvm_reset_vmfd(void) "" +kvm_rebind_vcpus(void) "" kvm_irqchip_add_msi_route(char *name, int vector, int virq) "dev %s vector= %d virq %d" kvm_irqchip_update_msi_route(int virq) "Updating MSI route virq=3D%d" kvm_irqchip_release_virq(int virq) "virq %d" --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441959; cv=none; d=zohomail.com; s=zohoarc; b=ciqrIJrl1u2T5mskmHs1JHe1qGtOuS5x5A6iiJCt4ZWznBsKd5Grx+ctbykohRWTIlVdwp2XiXJFk8ARh+dYCP23mJsoAdKPXmxxX1hqAIUfunaTQLTMzVDXmH9lYRRkC/ANCOvB2q6Z0YKfVaCZsuYfj7UsXuoyIRwN7z3fC+k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441959; 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=cf6isYD+OolPZbS6pv/sewBMZtuQ2D0QF8qlsf4NjRU=; b=eSNuHsgC7LII0Z1JA3jaAPPrugfsfNfXoTLRx4OuKgLmji8/2+sYWNJZQtwxWJdFyzfK7g9TLO1OVUKcD4/bAWYIqw9Bz8BfN9i8vnVWkNkaq4M66XbZiEzdrtysB9H23eMJafBWzwybaRi2WtCDjArYKXn29wpfeyfz+K1vTD8= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441959332258.8120318614401; Mon, 2 Mar 2026 00:59:19 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvt-0001JB-Gf; Mon, 02 Mar 2026 03:47:17 -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 1vwyuz-0005jI-6P for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:26 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuu-0001zt-I9 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:17 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-306-nRWxzq54PmaeGW50_HkAZA-1; Mon, 02 Mar 2026 03:46:14 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-48069a43217so41051455e9.1 for ; Mon, 02 Mar 2026 00:46:14 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcbd781sm233589295e9.8.2026.03.02.00.46.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441175; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cf6isYD+OolPZbS6pv/sewBMZtuQ2D0QF8qlsf4NjRU=; b=BjEVKlP8r4gAdAX07t3Q1E6UJvk2VtMUKVqptu0yhoLD9NOcpuXR6gp+VPozDw0fNyR36n UWCeH8coh1V2DEEIszRoYPZDADxwXa+lBhHgvmrbdA3lxhIZBH+ZU7CO2n0ykglVDYBMYm SJk08jckdkI+nXRYFYeVnQik5r6JMrA= X-MC-Unique: nRWxzq54PmaeGW50_HkAZA-1 X-Mimecast-MFC-AGG-ID: nRWxzq54PmaeGW50_HkAZA_1772441174 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441172; x=1773045972; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cf6isYD+OolPZbS6pv/sewBMZtuQ2D0QF8qlsf4NjRU=; b=o0F0ajA5BtY6TZPpG4tY9JYY+7T26rqDG9byIzr0Kswt6s/iuJMdtdQrjrTDg/RQll W10XkCzEYU1S/D98PcCL5aPlIGAXp861uxTBvfEd9w5PlNF76+M/rl7h9h7pE+Ucr3Ke VUMHbiiP3cofo8kmbxV1Y+V0P9n9phQoiAf5u41D15kBawTkM2rtNVtbfpeAKeNuAL+V 9z/aKAn0PKGs1698qtIrR7NMnMJItG58tpmuK+sJAcwHFQhpxfpAkmuM+OkheP9+ENul Px0WtJTuihOGuMXGga0y+999PQoosmMbuhbeeC43eZlZ3qZhOhOvbQwrzpeEDBpOALKu 7Wug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441172; x=1773045972; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=cf6isYD+OolPZbS6pv/sewBMZtuQ2D0QF8qlsf4NjRU=; b=FU53nYlikAophS/+wmoT2VmObfjn27D/W7eMYHtpIiWNB+pnCBzivkNdHDx0lPitK9 JKliOxZhJifM9+P72o0/aJOvbcXhzSoQe2m5cGcO+hZPB9+d1TzppzVnIPwyVvpT07/o pwgi+pm1fuuDxCi5D4wVuK+46EdYR+jxrVf/R8bk9R6mn/DdyBrUpBwjMyaGLVPSdY2a +eStbvD5uDiFIi4MajyBZzQMX783rJzVhWGJ7LaMfHGE4u1mHbcUARabGINM2uSa5c38 jxBGUbgYzTZhy0OtwEHveMs6DhfvbnbaoPsCsr2xhH8YOAZPANemAm3f+tj0UrMI+7e0 2P7Q== X-Gm-Message-State: AOJu0YwCVlp07qxCKbQlcgxRnReDOhEXpeZaFHyWT5IOyavtO5rbU9Wp G3bnJvY8cjiBmX6d1043qtkwLpbTARqrDZCKhDNxFJ/l0A2C2z+0lLF7rLym86qLLl6pc54TVVV UwxLZqvciSAUsSHWy+lADOHIEQ4jmJ0pRxvxmybCCuZT02hy4C9y0qsDWvt3ce6Bey8J3aRLSEZ rM5yjCy+HMDx8rxS2kYFvqRrhAf86FtQdtu9jP1H4s X-Gm-Gg: ATEYQzwPzTGIyMILulsKpwhINwDKfkroveQrFE/Psi2RU72Nr6axhHATHgcKRyP6Hxn YxICiUHEToj4B9y0ZDiC6iflTGlKqgc9BVocG4AqyIu+9Vpxf6v2gHiNRD2bb3cFGLKto2Cd8/b 9ZHxj5FZSJ2d+z3iFFTzJmwQCc4HrYotE9FN4wTigvB1ljVkWAx9rk1ByKJ5YL80+OSUqPTA13j b1Kwg6lm8t5qHpM9NFL6kWW0uLhPHk2iis3O0j3gBbGXOrKafGl3SJ7f6xYxItH8+m6I+ZghK0L 280zR5oLulsNnDgk4HMXt59wYjjKx6isua9lacJjSIme1wCruswDPvA5RYPAxj8xumka2cUOEC2 88DwxODM/5PL33SkcXXDSPwLkzn2tI6KKKnBMLegGCuqkTotRYuD7XM2MiQyVr7O+dqt3qHlWuc U1R8YCKfyAj0QXwfQXdvZTgce52n0= X-Received: by 2002:a05:600c:818e:b0:480:1b65:b741 with SMTP id 5b1f17b1804b1-483c9ba3aadmr208018235e9.15.1772441172306; Mon, 02 Mar 2026 00:46:12 -0800 (PST) X-Received: by 2002:a05:600c:818e:b0:480:1b65:b741 with SMTP id 5b1f17b1804b1-483c9ba3aadmr208017735e9.15.1772441171828; Mon, 02 Mar 2026 00:46:11 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 057/102] i386/tdx: refactor TDX firmware memory initialization code into a new function Date: Mon, 2 Mar 2026 09:42:52 +0100 Message-ID: <20260302084338.473368-58-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441959665158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha A new helper function is introduced that refactors all firmware memory initialization code into a separate function. No functional change. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-17-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/tdx.c | 73 ++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c index a3e81e1c0cc..fd8e3de9693 100644 --- a/target/i386/kvm/tdx.c +++ b/target/i386/kvm/tdx.c @@ -295,13 +295,50 @@ static void tdx_post_init_vcpus(void) } } =20 +static void tdx_init_fw_mem_region(void) +{ + TdxFirmware *tdvf =3D &tdx_guest->tdvf; + TdxFirmwareEntry *entry; + Error *local_err =3D NULL; + int r; + + for_each_tdx_fw_entry(tdvf, entry) { + struct kvm_tdx_init_mem_region region; + uint32_t flags; + + region =3D (struct kvm_tdx_init_mem_region) { + .source_addr =3D (uintptr_t)entry->mem_ptr, + .gpa =3D entry->address, + .nr_pages =3D entry->size >> 12, + }; + + flags =3D entry->attributes & TDVF_SECTION_ATTRIBUTES_MR_EXTEND ? + KVM_TDX_MEASURE_MEMORY_REGION : 0; + + do { + error_free(local_err); + local_err =3D NULL; + r =3D tdx_vcpu_ioctl(first_cpu, KVM_TDX_INIT_MEM_REGION, flags, + ®ion, &local_err); + } while (r =3D=3D -EAGAIN || r =3D=3D -EINTR); + if (r < 0) { + error_report_err(local_err); + exit(1); + } + + if (entry->type =3D=3D TDVF_SECTION_TYPE_TD_HOB || + entry->type =3D=3D TDVF_SECTION_TYPE_TEMP_MEM) { + qemu_ram_munmap(-1, entry->mem_ptr, entry->size); + entry->mem_ptr =3D NULL; + } + } +} + static void tdx_finalize_vm(Notifier *notifier, void *unused) { TdxFirmware *tdvf =3D &tdx_guest->tdvf; TdxFirmwareEntry *entry; RAMBlock *ram_block; - Error *local_err =3D NULL; - int r; =20 tdx_init_ram_entries(); =20 @@ -339,37 +376,7 @@ static void tdx_finalize_vm(Notifier *notifier, void *= unused) tdvf_hob_create(tdx_guest, tdx_get_hob_entry(tdx_guest)); =20 tdx_post_init_vcpus(); - - for_each_tdx_fw_entry(tdvf, entry) { - struct kvm_tdx_init_mem_region region; - uint32_t flags; - - region =3D (struct kvm_tdx_init_mem_region) { - .source_addr =3D (uintptr_t)entry->mem_ptr, - .gpa =3D entry->address, - .nr_pages =3D entry->size >> 12, - }; - - flags =3D entry->attributes & TDVF_SECTION_ATTRIBUTES_MR_EXTEND ? - KVM_TDX_MEASURE_MEMORY_REGION : 0; - - do { - error_free(local_err); - local_err =3D NULL; - r =3D tdx_vcpu_ioctl(first_cpu, KVM_TDX_INIT_MEM_REGION, flags, - ®ion, &local_err); - } while (r =3D=3D -EAGAIN || r =3D=3D -EINTR); - if (r < 0) { - error_report_err(local_err); - exit(1); - } - - if (entry->type =3D=3D TDVF_SECTION_TYPE_TD_HOB || - entry->type =3D=3D TDVF_SECTION_TYPE_TEMP_MEM) { - qemu_ram_munmap(-1, entry->mem_ptr, entry->size); - entry->mem_ptr =3D NULL; - } - } + tdx_init_fw_mem_region(); =20 /* * TDVF image has been copied into private region above via --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441983; cv=none; d=zohomail.com; s=zohoarc; b=Pt46f+qOn8kvvatkXHGixeshxRD4hUM46eBYuiOWXNe3hlu0b7M4DUiq+OgcFHCXTzDiPk+3RSQYP8RJdcJB/o2jIAWh4yApcQZenUSjlpaca0JhdDwNj/aoEnYztVNw+lz3uMC9U657ocDmfBg8F6/DcpjWqtrhjPAdcoN64Rs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441983; 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=NY3ePzWlUb0GebemqhYkrEXwQ+wMFMJn6LRZG4Qy/0I=; b=a+8U2QR8FspHNOg/hheS05FJykun+C4r4m7j7zQ9hb6rpkNhpLgH8CisSkpMPM+slifQ8/9W3ZwL1pNH8ifT7Xz5oAO0oOYx/WK8A6VO0EMsOsQMd+8kLSjzjLd6FLgQX3cEsOa+3gif3SCiFjDTK3VXdAju34HzO4r/rNGkLow= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441983365706.5894182115393; Mon, 2 Mar 2026 00:59:43 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvs-0001GX-Le; Mon, 02 Mar 2026 03:47:16 -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 1vwyv4-0005n0-Rp for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:30 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyuy-00020B-9B for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:22 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-661-k5pkeFl6ND6hNKn_kKEHhA-1; Mon, 02 Mar 2026 03:46:16 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-483101623e9so39420655e9.3 for ; Mon, 02 Mar 2026 00:46:16 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439ba2a5970sm3360623f8f.33.2026.03.02.00.46.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441177; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NY3ePzWlUb0GebemqhYkrEXwQ+wMFMJn6LRZG4Qy/0I=; b=J2xOVBEpQPTLKj+YKTLmBlhravAeMm/QoBqmo2q8ugP1bYVhZcGitqdpRloorHkggWewwP 0cX/GZCBvDzvEAA8YmD1dBtcEeuwLUNTy43Uuim7FZTFfk7c20iSQ2ysZ38soBMEzeQsVU uzOXeO6aihor3iCLVASJ5MdSMuzUaI8= X-MC-Unique: k5pkeFl6ND6hNKn_kKEHhA-1 X-Mimecast-MFC-AGG-ID: k5pkeFl6ND6hNKn_kKEHhA_1772441175 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441173; x=1773045973; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NY3ePzWlUb0GebemqhYkrEXwQ+wMFMJn6LRZG4Qy/0I=; b=Zpq4/yUt8jsdAlc602REQCC5iYJFjLFQ1bI/5mTGlJc5+FjxrisqCj+a4++p7lu1T0 aH7pWzyOOH+bUZmGIOsrBALhzGRMz+t92WJxqmkfPug0x38heqObumDsd/+y9kot03T5 uop+w3/d9N65g9eZK8EjLNem6zUemm4VvYeTAGazHFQeQ9UerkEQo8Yv5MI2vcXREpvo cXNd14nwts2tubvNeAai3DHf3pQWrnHVT+EFHH5XwNKdJiigwEK7P8wtbfxyJWMhCZAn d6lhIsY9CqC6FlidoOrCr5rG1GTJJLQEHdwAn4QM+A7JWiuMbrVgwgxM69iGlljawOz1 05rg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441173; x=1773045973; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=NY3ePzWlUb0GebemqhYkrEXwQ+wMFMJn6LRZG4Qy/0I=; b=muT67JqDOGZ1bpQPJ12l05zErS/yWkdeumxeAFstCkuWBCCHgIQJOjUaudh7i0bCm4 JB4ZqPRJ0rACSJrnysG5wrb9gc8UoKlLqGYCmeiwIqOrCIy3Ldstyy1OqFdZDDVJbIt2 6GW2eTAwlv1+nZ2Onjj0A/QHy1TckHXHQZ9zs49wKiU1esRDxNDfPFBIgKLHZdoSAVYA rHeQgzDz0m2Nk0ME3s/0jsZSnrf2q5h6gsRlwA3QkEUPvzHVQkPw5IqvgmUIcUJlLwYZ Osy7B8ISJWOxxfzXFL2B6Bxc0PXX2h2dFdHrSfEZ9tQyVaNnFic5ahjkiHls5IVkRn3e vRPg== X-Gm-Message-State: AOJu0YzCvCJnT+VK6yXt+Iuc2KbFMSZTPvBxEvBx/4A2o9LseaW+nZnn /dVEZQwdvqYVuMHs7R68kUHyBE5Veh3wo2K/0M0ZSfr/XVxQwz5SHK1F2phD2NMSQvrRrMbTcRL 7OYg6G7PbgNNoJJMVTNcqgWetyQOXjTrWi5nWJdnUCo0H1hSD/n2A/u5dANZ7CQmasvxCmm5nwA wJeHc7cuDjzH0vtng2OdOudM7xZ3gOC3TjqOUuNjvO X-Gm-Gg: ATEYQzzCwZqAk8iyjpf1j+4YcgPGS/xf/IbrFQX1kX9EOE+gtTABIsRCVFap3YNqLeH 2W6LQdYudCP3iPrCZTBVkviiEsv/zvS46SoSCUGrTyRTq7/hh3znbfyh7hH59Jq8qkG0GbRRA5f +A1Sov9Tsx1yg+XwrlVbJ2MgIDV1aRIXQtrr6UQyk3iM4EsHqQ2T1ZzIyqVeJoB/d3X7x3+fLDc nc8M9J3PJFOHHIfp54/ccn5EbTmjk2/2aWygwjVYNkP9QP8xHQGKB+wUl51iLHNzdZO6lbAVy/C mIYZ2ccCijHQp32taJk0PyInUg2hxIXDBnj3Lm7+vFvBdxA0eeKK/4br/4lMvOn6Pm3Ny0nHn1e IWhRjHVKZSU71Bas9GrKLl7jOPhyJAbEZ4QBcbzDtL45EaynxXLF7TSVq9M/e2zvbymsDJ4zozN ExSzMV9nY3BiF6ASAnn84b87Alq/8= X-Received: by 2002:a05:600c:3f16:b0:477:79c7:8994 with SMTP id 5b1f17b1804b1-483c9c22e11mr198910375e9.30.1772441173538; Mon, 02 Mar 2026 00:46:13 -0800 (PST) X-Received: by 2002:a05:600c:3f16:b0:477:79c7:8994 with SMTP id 5b1f17b1804b1-483c9c22e11mr198909965e9.30.1772441173051; Mon, 02 Mar 2026 00:46:13 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 058/102] i386/tdx: finalize TDX guest state upon reset Date: Mon, 2 Mar 2026 09:42:53 +0100 Message-ID: <20260302084338.473368-59-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441983806158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha When the confidential virtual machine KVM file descriptor changes due to the guest reset, some TDX specific setup steps needs to be done again. This includes finalizing the initial guest launch state again. This change re-executes some parts of the TDX setup during the device reset phaze using= a resettable interface. This finalizes the guest launch state again and locks it in. Machine done notifier which was previously used is no longer needed = as the same code is now executed as a part of VM reset. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-18-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/tdx.h | 1 + target/i386/kvm/tdx.c | 38 +++++++++++++++++++++++++++++++----- target/i386/kvm/trace-events | 3 +++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/target/i386/kvm/tdx.h b/target/i386/kvm/tdx.h index 1c38faf9834..264fbe530cc 100644 --- a/target/i386/kvm/tdx.h +++ b/target/i386/kvm/tdx.h @@ -70,6 +70,7 @@ typedef struct TdxGuest { =20 uint32_t event_notify_vector; uint32_t event_notify_apicid; + ResettableState reset_state; } TdxGuest; =20 #ifdef CONFIG_TDX diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c index fd8e3de9693..37e91d95e1e 100644 --- a/target/i386/kvm/tdx.c +++ b/target/i386/kvm/tdx.c @@ -19,6 +19,7 @@ #include "crypto/hash.h" #include "system/kvm_int.h" #include "system/runstate.h" +#include "system/reset.h" #include "system/system.h" #include "system/ramblock.h" #include "system/address-spaces.h" @@ -38,6 +39,7 @@ #include "kvm_i386.h" #include "tdx.h" #include "tdx-quote-generator.h" +#include "trace.h" =20 #include "standard-headers/asm-x86/kvm_para.h" =20 @@ -389,9 +391,19 @@ static void tdx_finalize_vm(Notifier *notifier, void *= unused) CONFIDENTIAL_GUEST_SUPPORT(tdx_guest)->ready =3D true; } =20 -static Notifier tdx_machine_done_notify =3D { - .notify =3D tdx_finalize_vm, -}; +static void tdx_handle_reset(Object *obj, ResetType type) +{ + if (!runstate_is_running() && !phase_check(PHASE_MACHINE_READY)) { + return; + } + + if (!kvm_enable_hypercall(BIT_ULL(KVM_HC_MAP_GPA_RANGE))) { + error_setg(&error_fatal, "KVM_HC_MAP_GPA_RANGE not enabled for gue= st"); + } + + tdx_finalize_vm(NULL, NULL); + trace_tdx_handle_reset(); +} =20 /* * Some CPUID bits change from fixed1 to configurable bits when TDX module @@ -738,8 +750,6 @@ static int tdx_kvm_init(ConfidentialGuestSupport *cgs, = Error **errp) */ kvm_readonly_mem_allowed =3D false; =20 - qemu_add_machine_init_done_notifier(&tdx_machine_done_notify); - tdx_guest =3D tdx; return 0; } @@ -1505,6 +1515,7 @@ OBJECT_DEFINE_TYPE_WITH_INTERFACES(TdxGuest, TDX_GUEST, X86_CONFIDENTIAL_GUEST, { TYPE_USER_CREATABLE }, + { TYPE_RESETTABLE_INTERFACE }, { NULL }) =20 static void tdx_guest_init(Object *obj) @@ -1538,16 +1549,24 @@ static void tdx_guest_init(Object *obj) =20 tdx->event_notify_vector =3D -1; tdx->event_notify_apicid =3D -1; + qemu_register_resettable(obj); } =20 static void tdx_guest_finalize(Object *obj) { } =20 +static ResettableState *tdx_reset_state(Object *obj) +{ + TdxGuest *tdx =3D TDX_GUEST(obj); + return &tdx->reset_state; +} + static void tdx_guest_class_init(ObjectClass *oc, const void *data) { ConfidentialGuestSupportClass *klass =3D CONFIDENTIAL_GUEST_SUPPORT_CL= ASS(oc); X86ConfidentialGuestClass *x86_klass =3D X86_CONFIDENTIAL_GUEST_CLASS(= oc); + ResettableClass *rc =3D RESETTABLE_CLASS(oc); =20 klass->kvm_init =3D tdx_kvm_init; klass->can_rebuild_guest_state =3D true; @@ -1555,4 +1574,13 @@ static void tdx_guest_class_init(ObjectClass *oc, co= nst void *data) x86_klass->cpu_instance_init =3D tdx_cpu_instance_init; x86_klass->adjust_cpuid_features =3D tdx_adjust_cpuid_features; x86_klass->check_features =3D tdx_check_features; + + /* + * the exit phase makes sure sev handles reset after all legacy resets + * have taken place (in the hold phase) and IGVM has also properly + * set up the boot state. + */ + rc->phases.exit =3D tdx_handle_reset; + rc->get_state =3D tdx_reset_state; + } diff --git a/target/i386/kvm/trace-events b/target/i386/kvm/trace-events index 2d213c9f9b6..a3862345714 100644 --- a/target/i386/kvm/trace-events +++ b/target/i386/kvm/trace-events @@ -14,3 +14,6 @@ kvm_xen_soft_reset(void) "" kvm_xen_set_shared_info(uint64_t gfn) "shared info at gfn 0x%" PRIx64 kvm_xen_set_vcpu_attr(int cpu, int type, uint64_t gpa) "vcpu attr cpu %d t= ype %d gpa 0x%" PRIx64 kvm_xen_set_vcpu_callback(int cpu, int vector) "callback vcpu %d vector %d" + +# tdx.c +tdx_handle_reset(void) "" --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441840; cv=none; d=zohomail.com; s=zohoarc; b=b8agPIVrVHVhiXc+jE921jEcSHAAqJ0qT7y2tQSVa5fWszSuvaQnQwSKNIVysXCzTNssqTvO3h53zkjf8TNZTKpP6jc+TdZ7JfSTYJPIYzlEaw27GyynRbf2EfSHsvHKyETNzPJCmKeIzdh5hRl0GCEbv8ak1YVhGhStMhRjrP0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441840; 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=X9u53hMXx9IfJyrriLWgxmlEcqPjwDvz8vV2vMP3sM0=; b=OX+Sf5rFWyQKrn5CDNL/a02Yvm1zeTfRFuMsiYm2xSFomFeIo9JugXyDgg8AJ1olMV3/jTksiiD8wdF2Moype8Me+RLaoCOA0E+5HuRKgVgEmgze0V8Ie8V8tV4R95701PEDR83b9MJt41E+5sgpNEXilExY93wZFPHCPakFdL0= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441840466208.1412656790062; Mon, 2 Mar 2026 00:57:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvt-0001Kj-Ms; Mon, 02 Mar 2026 03:47:17 -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 1vwyv4-0005mz-Rv for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:30 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyv1-00020P-6x for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:26 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-450-vM0PCvQIMIqzSEB9SpglAg-1; Mon, 02 Mar 2026 03:46:20 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4836c819456so28177775e9.3 for ; Mon, 02 Mar 2026 00:46:19 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfb789efsm205325885e9.2.2026.03.02.00.46.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441181; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=X9u53hMXx9IfJyrriLWgxmlEcqPjwDvz8vV2vMP3sM0=; b=CZCCXZTuGAoT+Txr8Lz4TqFsuqBFcp7k5Z4luXq53mJBA4xwzr2ZvZunx8PeaTnQiXVxzc 3AYOGL6q1rV3S9JAIr6JFw4jXsWuTWarXHXt3HrGfFF103AGILX0lf/FIyUWveEZR3W7sG dbP+wrIFXmWjzG33k83m7TXaaE0EyW4= X-MC-Unique: vM0PCvQIMIqzSEB9SpglAg-1 X-Mimecast-MFC-AGG-ID: vM0PCvQIMIqzSEB9SpglAg_1772441179 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441178; x=1773045978; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=X9u53hMXx9IfJyrriLWgxmlEcqPjwDvz8vV2vMP3sM0=; b=GRyqjncXo6nwpcUsIL+qbNoyBdDJ/fgfUAB0KW+q2uFUPR7rVP52I6AHWbYbFzc8SR 7MxNbLf7hS9mULz2eofmqIXy8yl3NnBFLp3b+qJK4e1FT0qhU794jPxnZKFIENqhhQ3L 7xDEpu5Qa80Xs2BvchPeFe4b4/Tugk6LuottaXX1MZle0tqv+a+VuBJjY/swAsGYT5vg i8tbVq9+StuQiGVRLrFx3jYUzl8JUP5cvjfSTO2tjDrqOA65qk0ovesn5R7ZjMDD5LLW hxjwZxitUk21S1NBwxttDwaYgkv0OiP5mKDlEs28cSMzH8cJ+zPKpCSUxzv8CFaeABUq TwQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441178; x=1773045978; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=X9u53hMXx9IfJyrriLWgxmlEcqPjwDvz8vV2vMP3sM0=; b=qapKCR1YVBmz6RBUgRTHUeIUxi6u0/S+s2fIOvQchJZMhjeMe+zza5iaFu0IDbBH9V umMN7AAxZUsE2nbfZTb30XCs7tu8M8HqTpbswRyKD7Oi0lN1YajLhtQjBhuwCXLU6a25 P2BArrXBujTWPw5PYqogvJaxCnMuVCfSs0VeDBKGOoxDZuXENsVD9xImhew3UNomeouf PVU0rdyCsDf1dYFYulf3pCAlWNJcXKQBY5tZvm7ebT0j/yM5a9NfppF5ezoP2YqdYVOu vCGjcMFb1MOdJi1g17f3TFT53PNk23FrIWZddkh+DPaWnY1aLW5xGyIpLNPF5ZrcDe/M 83Rw== X-Gm-Message-State: AOJu0Ywdgi+kMRnnCTgixMmS0kbkabydqn+bQi+baYR1ICPAQWMO7nEM oMCKs5yQJJld6DdFg5IJsvaMOxB0xYk2LVgxHAfGyjsFKEzTSvx5T9UD/DZIrBeYOKHb1vf0TXD scAJSP4cIq45PBgl46HvCQhwKqRIRE+5mhQHbpQXhJSVBqg8W4hFmt236aagqjuvqIg/6QiF18h 6/iOXaSHsI8JMijhvirrUlWD+WLqgqgmxpz0GaCRt0 X-Gm-Gg: ATEYQzyTbjK2CWwFn1idtwZzzyKiZAymfdP0nSNF47aQQkSlmFxc0KqADTouSr/3N1x S0SLNmw+oYM45fxgsyAQX0RDqbCpFvrXgXEGRwvuybki4tAW+t3x1yldzIRfaYmsRAvEI5dmmUm q7zLMGd5kP0vQUCUWXIvVPDKB81Kk66jKF0E3Lh+Hjv8bS4QNgAEbMRyUStdbMCuwwk3X1Uy9Fi Zg2ECAiV5P+wfiViezRxTKZTQFsOf1HslISemCDm776+TF0ZdmOGlS/mlvNX2sr/86y2LElO6XN ELGSfzQuBPsFfgL6SWVjWTYTIrX2WDc65DOYEkUJMrsP4QvouXIWP0amBsqKf58YOF76uhdd91V Tk7vMuS6TngzXksYEWoR8yEvVCWHXkiv1BZjiqdAnISriYJhLHtfkMJaRY8Peqf4eRyY3qkuLPa K0peBgDrlbduzOaVUCGtO0+RAbFuM= X-Received: by 2002:a05:600c:1f91:b0:47e:e2ec:9947 with SMTP id 5b1f17b1804b1-483c9c2d7d6mr193328495e9.33.1772441178016; Mon, 02 Mar 2026 00:46:18 -0800 (PST) X-Received: by 2002:a05:600c:1f91:b0:47e:e2ec:9947 with SMTP id 5b1f17b1804b1-483c9c2d7d6mr193328025e9.33.1772441177458; Mon, 02 Mar 2026 00:46:17 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 059/102] i386/tdx: add a pre-vmfd change notifier to reset tdx state Date: Mon, 2 Mar 2026 09:42:54 +0100 Message-ID: <20260302084338.473368-60-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441841173158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha During reset, when the VM file descriptor is changed, the TDX state needs t= o be re-initialized. A notifier callback is implemented to reset the old state and free memory before the new state is initialized post VM file descriptor change. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-19-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/tdx.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c index 37e91d95e1e..4cae99c281a 100644 --- a/target/i386/kvm/tdx.c +++ b/target/i386/kvm/tdx.c @@ -405,6 +405,36 @@ static void tdx_handle_reset(Object *obj, ResetType ty= pe) trace_tdx_handle_reset(); } =20 +/* TDX guest reset will require us to reinitialize some of tdx guest state= . */ +static int set_tdx_vm_uninitialized(NotifierWithReturn *notifier, + void *data, Error** errp) +{ + TdxFirmware *fw =3D &tdx_guest->tdvf; + + if (!((VmfdChangeNotifier *)data)->pre) { + return 0; + } + + if (tdx_guest->initialized) { + tdx_guest->initialized =3D false; + } + + g_free(tdx_guest->ram_entries); + + /* + * the firmware entries will be parsed again, see + * x86_firmware_configure() -> tdx_parse_tdvf() + */ + fw->entries =3D 0; + g_free(fw->entries); + + return 0; +} + +static NotifierWithReturn tdx_vmfd_change_notifier =3D { + .notify =3D set_tdx_vm_uninitialized, +}; + /* * Some CPUID bits change from fixed1 to configurable bits when TDX module * supports TDX_FEATURES0.VE_REDUCTION. e.g., MCA/MCE/MTRR/CORE_CAPABILITY. @@ -1549,6 +1579,7 @@ static void tdx_guest_init(Object *obj) =20 tdx->event_notify_vector =3D -1; tdx->event_notify_apicid =3D -1; + kvm_vmfd_add_change_notifier(&tdx_vmfd_change_notifier); qemu_register_resettable(obj); } =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441448; cv=none; d=zohomail.com; s=zohoarc; b=QmicERzq/1NfI77waXk7oo7SDNLdqPKKIG8/F/kCe9CK3NwYJySOTGsamAByxvfiOtCOt9JrYFcA30/BDucSphdL4kaT69FZC+6t8y67BGkZ0+hy2CmfiKrZOiTcTc3L1J+Ov0enrguRlKBtIgPPGsJYJ2aEZE5qX3EUYpYK+G8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441448; 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=yC2reODZ02Lvi21uVjw0SLAfTQm+6tGilWRlG3DnSxM=; b=XEhpfj/9WFQG8UXJ5eZIovrisEwbxJifIuJxM7POEkug2eSX3mDfuLPTmP8YfaJi0MQYSH2mvxRSfIFiRHrBchaZFDvJ/BJS5CUOqCpvebJqrptcfSJADJWGtBFFeTPFmLwguOQsBsdjuZVWHYf71azXkfYBgvgGKpngosLp2Lo= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441448311387.6151623855145; Mon, 2 Mar 2026 00:50:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvK-0006iF-VA; Mon, 02 Mar 2026 03:46:43 -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 1vwyv8-0005pt-MU for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:32 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyv2-00020X-RF for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:27 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-636-7JB1SjtjOZawUo3lQiwXMg-1; Mon, 02 Mar 2026 03:46:22 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-48378df3469so28246945e9.1 for ; Mon, 02 Mar 2026 00:46:22 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfabb84esm387560935e9.0.2026.03.02.00.46.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441183; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yC2reODZ02Lvi21uVjw0SLAfTQm+6tGilWRlG3DnSxM=; b=f6BIcRuTOHfnFc199gMYk2efeR56HLBH3dvardx1hNRXLr4q9XV0A4qLR5vBoePIhYdUIt ZLYIaYAZJdgSB134QQNV3NseBfpQTsPvyHM+E9Ja+L3R3qf4gjtPWzrhavW566SftITg3F C3wM05/UE1canqv0w2VC6C2KhNJlC9o= X-MC-Unique: 7JB1SjtjOZawUo3lQiwXMg-1 X-Mimecast-MFC-AGG-ID: 7JB1SjtjOZawUo3lQiwXMg_1772441181 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441180; x=1773045980; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yC2reODZ02Lvi21uVjw0SLAfTQm+6tGilWRlG3DnSxM=; b=sBWTw95kFcif3qN97TJoqpB6lQ6Ng585NGTbnDlIy+at7F69/6p0ZhholCJu65UdTG gSbQZ9Rsa2KKomcEwNimwF2ZUIM+8WZXWle6U5OCPwvkVYaXitRtCaUEoc6xQeAci6mK RSx3s6SBljsUKD6nkJmCI3UwgxOE8vWYdP4512qXPWcDXyA0VRcdrFOSykiXM2N73qfA /L2rZDwLPjvsvgbFPlHjp6kemFoLEsBRcKCFIyZOXdKzgu7P+O1xbILtEq17Td7yQ8k9 Vr7Es9y1IANoB3AVQeUjkVxwRhnE99Lvs4WES6AV7BAc+bELyk5eBTtUk8bpkdVn+DWH gp1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441180; x=1773045980; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=yC2reODZ02Lvi21uVjw0SLAfTQm+6tGilWRlG3DnSxM=; b=FWpqdadJ41Uwgxdv1PtIyk9ResfwCjJBXu8G4nJ/kOz+BMB2cd2rRISsoxx2GVySIs oTRTnPdLj8+pY9d4tX0oJts2oZoz2tLhnvUI7GNErJwJoPtniuhygVzqhQ5h4tf3YW/z crYPkb1Ebrn0wc6nrPen2aGkB7GOUbNZlWlkavj17UcJ+bt+b1CXWkC5jfdhcIoFpz7d VfKF5nbWQRwxCI9HkCuEIBFbtc/ccReoiY3PDLfJc9d16/C+htdpzEuufQfPBHTA3/tt e5m7qv1g4GEGegIulOsKf5WwFE1JiKCGycn+9JCb0f2EQnQlzgVZwKQitS+WGx+4+873 XSZg== X-Gm-Message-State: AOJu0Yz0Z12xDFYfWZYvm5hjdnJLOm6CX0G7XACnb0qusWboOm8wyqh0 7kyqRX7XzfnUd2S9ggj0BFfocmfeZ47VNgTcAw51HbCm0C6PZotdEaUzwpAPNt9W2vUxOrJhi1d cZJrnEJGutPDw2A91gSqRleXLFgkjwP65O/9nM+q/O+rCUz7QjLymYRm7mL+95cQ0hzgZpDGO9/ spJS7IBwT1/MWH+22RHz7YU8sHxfQvJDrC7dY05Qtp X-Gm-Gg: ATEYQzwdK1Cub3SvAQIHwq3s/m7tnL2fLOhVvAHTro5ZEmUf7wsofTKjpB9BhOy01QS SnPhQyk7Dbg8RG4PZftH2g6FVufntkZTYCUPbNrKOpyETNI/LGsOCuzGRTvpomFEG+pmrm1Ei0O EAxM4IAgSH+aCbjL7d6rT2WJVWxLlzJcCeRdhDDRSE+tscVcFbooJGBF8iIcPr11jijLKKnk2Tw vh0KyJqod0JDkcM8QV5kIZLodRlJI3xM39/LMoQ/0fe+hh+uCzhSbeP9VWhxBgKRrYCPSI2VZvQ zuCMY7mM18rW2uNEyo74KYiINsmFdKPIPAB3w1pKm+o8V3qmsmZ8aLz8QBF0RQzoD25EMiBRzwp bY6whUAy2pR7PXZdNgx7hICNjuJlwzw0dtIYwERgvTqW4i5K8eYpMTjHvUhUl8EXsj0hcRaMAA3 OC2D1OAHOTihXEaSgiZRWDMIDEQYU= X-Received: by 2002:a05:600c:4e15:b0:483:29f4:26b3 with SMTP id 5b1f17b1804b1-483c9906a11mr211730575e9.1.1772441180299; Mon, 02 Mar 2026 00:46:20 -0800 (PST) X-Received: by 2002:a05:600c:4e15:b0:483:29f4:26b3 with SMTP id 5b1f17b1804b1-483c9906a11mr211730115e9.1.1772441179822; Mon, 02 Mar 2026 00:46:19 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Prasad Pandit Subject: [PULL 060/102] i386/sev: add migration blockers only once Date: Mon, 2 Mar 2026 09:42:55 +0100 Message-ID: <20260302084338.473368-61-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441449183158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha sev_launch_finish() and sev_snp_launch_finish() could be called multiple ti= mes when the confidential guest is being reset/rebooted. The migration blockers should not be added multiple times, once per invocation. This chan= ge makes sure that the migration blockers are added only one time by adding the migration blockers to the vm state change handler when the vm transitions to the running state. Subsequent reboots do not change the state of the vm. Reviewed-by: Prasad Pandit Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-20-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/sev.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/target/i386/sev.c b/target/i386/sev.c index 66e38ca32e1..260d8ef88bf 100644 --- a/target/i386/sev.c +++ b/target/i386/sev.c @@ -1421,11 +1421,6 @@ sev_launch_finish(SevCommonState *sev_common) } =20 sev_set_guest_state(sev_common, SEV_STATE_RUNNING); - - /* add migration blocker */ - error_setg(&sev_mig_blocker, - "SEV: Migration is not implemented"); - migrate_add_blocker(&sev_mig_blocker, &error_fatal); } =20 static int snp_launch_update_data(uint64_t gpa, void *hva, size_t len, @@ -1608,7 +1603,6 @@ static void sev_snp_launch_finish(SevCommonState *sev_common) { int ret, error; - Error *local_err =3D NULL; OvmfSevMetadata *metadata; SevLaunchUpdateData *data; SevSnpGuestState *sev_snp =3D SEV_SNP_GUEST(sev_common); @@ -1655,15 +1649,6 @@ sev_snp_launch_finish(SevCommonState *sev_common) =20 kvm_mark_guest_state_protected(); sev_set_guest_state(sev_common, SEV_STATE_RUNNING); - - /* add migration blocker */ - error_setg(&sev_mig_blocker, - "SEV-SNP: Migration is not implemented"); - ret =3D migrate_add_blocker(&sev_mig_blocker, &local_err); - if (local_err) { - error_report_err(local_err); - exit(1); - } } =20 =20 @@ -1676,6 +1661,11 @@ sev_vm_state_change(void *opaque, bool running, RunS= tate state) if (running) { if (!sev_check_state(sev_common, SEV_STATE_RUNNING)) { klass->launch_finish(sev_common); + + /* add migration blocker */ + error_setg(&sev_mig_blocker, + "SEV: Migration is not implemented"); + migrate_add_blocker(&sev_mig_blocker, &error_fatal); } } } --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441467; cv=none; d=zohomail.com; s=zohoarc; b=ZgQRREjs2NjwwpliK6B7ISQbbI2jMnxZ7xw9VRDz06JAeYKuuHuzJ1g/cfUQcz8FNSH/sHGpzrxm6xH7Qb+GdXdq2HM3Sxb7y2sgjvojTjDexr7Ml9q0S0Ll4Cu16UDLx8/IAkgv+dGgDYdjQYyjA2/NMlvgx9UK5097bdtYcWw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441467; 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=zptzdiIhn5oW9SnPOXdirIkkuvYnT1Lz9FHCyHx3ZYY=; b=V3DdQ1FdFyMisOeGI8RDW1bVoZ4Iv0zWsWLz7ZFY1/9L5SRf+hMePsKgpLKKg5maIPmAGXeaOSEo2EiJAO88UGtvaze9CQTefCfzPSR2IvXaK+WExD8nPGQgQzTTRJ+gB3hVEGWVIu4kFk/Yn2/S5Gvk7GoHLv28QtkJQbc41Cs= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441467258275.12370602224155; Mon, 2 Mar 2026 00:51:07 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvJ-0006aW-Nr; Mon, 02 Mar 2026 03:46:41 -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 1vwyvA-0005qR-Jr for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:33 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyv6-00020p-PY for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:31 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-57-Hph6q55BN3K4NQdL9Gkghw-1; Mon, 02 Mar 2026 03:46:25 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-483bcfdaf7dso39970825e9.0 for ; Mon, 02 Mar 2026 00:46:24 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd6f3124sm395134185e9.1.2026.03.02.00.46.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441186; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zptzdiIhn5oW9SnPOXdirIkkuvYnT1Lz9FHCyHx3ZYY=; b=cA+MYE+gL6kK7dupk6XxhyR45DUGqa3jTJyuOOOW2/sg7aAOIION4883r6ZKTfXZVMZyXL Os0OA4xZsGJD0PD62KEO1T+OlKuAZl3DraN7zhoT6RrrH8sJBH/UF4quQA5Olt9wTNpGrj nAMGxZT4yKpPUm7Gq8yzskK7R18qjwg= X-MC-Unique: Hph6q55BN3K4NQdL9Gkghw-1 X-Mimecast-MFC-AGG-ID: Hph6q55BN3K4NQdL9Gkghw_1772441184 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441183; x=1773045983; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zptzdiIhn5oW9SnPOXdirIkkuvYnT1Lz9FHCyHx3ZYY=; b=KNulbXnwnbLgRIxsIIvMKDG4kGV2q18UPRMXUHe7cz/IDsWoITPtPxhz9/WxHJEnpD nkDw8O4lDh9RQa6HrgruQ0J6p15lrq89vaz9uV34DF6JdNPZppP2fi+SvSvsDt6NL2r5 75YVKDqvy7Fazx87XGGDNoNZ1yJMdHX5t6b8/9QqeSgXNqvm5MZp2ULr6QbxrA6Ff98s MCnbPKpV2uXi3pcJt55+yutjWY5oCVqk6WxEnb5LueE8DqYjbDLwCtfSbvpyU5ue8UGL bzoqgrHHHZSYFGe8SOZJMTBJ4WxWSRKxCJoJ5m38yVd+pWtzwjnW6xBFS1D7HZaa7GVi tC/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441183; x=1773045983; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zptzdiIhn5oW9SnPOXdirIkkuvYnT1Lz9FHCyHx3ZYY=; b=Wr8B6CV63EmWaRJL63DuoX0Nwl+v4cRPQ13TjHcnlC6DvQ6GQ7VkE5lqMQs7mtnx62 Zm0x9WkPO4ykXMgV6Z48io1Yg97CuQAZU9T22PU/yxplB/tPGIBrqTFBJdy2VBcoof5T Kzu/K/msUAWCFtS9YipixH6dy5X90U0ZanLnFY5VqKcpd8rV7sHqaZqAUMhHdLZW3vlv z3DTF7GHgLb8NwFaBCFsdTVMUbjWwgBzQ+Lxbme/LYMrUawD6fgqXU0YUS50KbUJMSsj Nqdk9Ebl0ChRTVt5KxD1sXVaB8+fwbL5nL9EWj/oNot2X17JWrAkOqP4p0Wxy/qCqigi /RNA== X-Gm-Message-State: AOJu0YwzUEEYM8H5+Ud1R89dTfPitF4Pc8Gadrna/4Ts/dBQHB5seDt8 Bhk02CeO7qJwyAifHunLgDmO2xuHtZyZRFdqDHFXDob79i1xh7TxGUZURDW5qcHE6gHyGFAr+tb Io4fo0QgR0dKFMVabK6l70j/1mLunA55Vr/niL5pJHoEg5c6WjbNVKc9k3srXWa9OzGXI5vi2Qu B3VsBVJgI6PXrClCIZtnG71ipC9SiNDd1r7SAb9LVX X-Gm-Gg: ATEYQzxspumnJM9k7PeUgJRAzCyYcNcC+HU3xhfTBWnyybVatfhN7c92YM/Pjdd5oCp 2pR/frBjGTieNqKkGZjaS09yYIEV/xCr7E8jEZK1uVEAJv8lppO5JKNSqujLMvVW8z/3BZlHyYw TQSQcgt2imkp+9KeUX2rGMw8kLNd2wyZfoUKaydGXuymYh346ivzbUH0Zdb0gW23gGpRNeogSut THd+UgaCAxFnw9UKEO70TkNzo0zzODK8/cVzQ5RIFemuX1xXGguJfomn7TyFTcgeeP+Q9/Sy7iO 16twUA9FDs0oEXyePnhIxDfwSN9erFyFf9OiBY270/uxDnTF/sq8tH0XajWm0UcV3hOk5s1DVGy 2/RYPIlUt33vBbdx7rbtWasfPbSA724nFYqZfBTSvMZuH2q+TRlNllKpJXIB++pbEUkjgntNTwM h8SE7Q5zzbxOMw94cgHUsMTfvCGM0= X-Received: by 2002:a05:600c:190c:b0:477:9814:6882 with SMTP id 5b1f17b1804b1-483c9ba7d51mr208098585e9.5.1772441182922; Mon, 02 Mar 2026 00:46:22 -0800 (PST) X-Received: by 2002:a05:600c:190c:b0:477:9814:6882 with SMTP id 5b1f17b1804b1-483c9ba7d51mr208098205e9.5.1772441182378; Mon, 02 Mar 2026 00:46:22 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 061/102] i386/sev: add notifiers only once Date: Mon, 2 Mar 2026 09:42:56 +0100 Message-ID: <20260302084338.473368-62-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441469226158502 Content-Type: text/plain; charset="utf-8" From: Ani Sinha The various notifiers that are used needs to be installed only once not on every initialization. This includes the vm state change notifier and others. This change uses 'cgs->ready' flag to install the notifiers only one time, the first time. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-21-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/sev.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/target/i386/sev.c b/target/i386/sev.c index 260d8ef88bf..647f4bf63d5 100644 --- a/target/i386/sev.c +++ b/target/i386/sev.c @@ -1920,8 +1920,9 @@ static int sev_common_kvm_init(ConfidentialGuestSuppo= rt *cgs, Error **errp) return -1; } =20 - qemu_add_vm_change_state_handler(sev_vm_state_change, sev_common); - + if (!cgs->ready) { + qemu_add_vm_change_state_handler(sev_vm_state_change, sev_common); + } cgs->ready =3D true; =20 return 0; @@ -1943,22 +1944,23 @@ static int sev_kvm_init(ConfidentialGuestSupport *c= gs, Error **errp) return -1; } =20 - /* - * SEV uses these notifiers to register/pin pages prior to guest use, - * but SNP relies on guest_memfd for private pages, which has its - * own internal mechanisms for registering/pinning private memory. - */ - ram_block_notifier_add(&sev_ram_notifier); - - /* - * The machine done notify event is used for SEV guests to get the - * measurement of the encrypted images. When SEV-SNP is enabled, the - * measurement is part of the guest attestation process where it can - * be collected without any reliance on the VMM. So skip registering - * the notifier for SNP in favor of using guest attestation instead. - */ - qemu_add_machine_init_done_notifier(&sev_machine_done_notify); + if (!cgs->ready) { + /* + * SEV uses these notifiers to register/pin pages prior to guest u= se, + * but SNP relies on guest_memfd for private pages, which has its + * own internal mechanisms for registering/pinning private memory. + */ + ram_block_notifier_add(&sev_ram_notifier); =20 + /* + * The machine done notify event is used for SEV guests to get the + * measurement of the encrypted images. When SEV-SNP is enabled, t= he + * measurement is part of the guest attestation process where it c= an + * be collected without any reliance on the VMM. So skip registeri= ng + * the notifier for SNP in favor of using guest attestation instea= d. + */ + qemu_add_machine_init_done_notifier(&sev_machine_done_notify); + } return 0; } =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441524; cv=none; d=zohomail.com; s=zohoarc; b=gA5jHKgKaDBYzPRhkLruw3+DKwF0+q1eNKtXcqLwJcEeAL6qntxn1T6zyFwifDIvph582+5PVoQWJD68sE03/bOABzXQ2USnkLEABac5mSYdziKFDrw2WSOSq17a1gEnA66cn+BzpOxl6pLR8E8lFt1o8M2f3xDuNu5Gva/Pyaw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441524; 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=Ctp31faHRscLU5956r9Sxi2RU43/0uUnrBnub/aS7BQ=; b=JC47FvfgJJHVY3ZpMqYbnnR9T2vsxe1h+SOJlczMJucXHC0nBq07JPecVAvJGcyhiZdp4lKPgEzgMlMntplhvLhykrjGh0O4m8jrZUqithFJnnSLHYNMHNipuob8PhJcEd5y3/dBwOr63D4va8vqawk5zuEfUTGuhpLMfZ0MyCk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441523992557.7988202871657; Mon, 2 Mar 2026 00:52:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvN-0006us-Fr; Mon, 02 Mar 2026 03:46:45 -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 1vwyvB-0005w8-G6 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:34 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyv8-00021B-FF for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:33 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-650-CwYC17V1NgWeyabo8DVACA-1; Mon, 02 Mar 2026 03:46:27 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4839fc4cef6so47402805e9.0 for ; Mon, 02 Mar 2026 00:46:27 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd7030b9sm317786045e9.4.2026.03.02.00.46.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441188; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Ctp31faHRscLU5956r9Sxi2RU43/0uUnrBnub/aS7BQ=; b=glaLZzWJcPpdiibKa1xSWV/rCecMbbkYzlNiM/3l6//1V5gM4RiVxwxIgobSzCdvMyXuQ6 jZ2DJJR1IS49uzOzvOfC0pawtyducjBaRyGWErB3UG0zAfzJquYdmn4QIbqzohOLlCyZol 0i16LXY6GAWfgONn2IDj3lpRw0VjX5Y= X-MC-Unique: CwYC17V1NgWeyabo8DVACA-1 X-Mimecast-MFC-AGG-ID: CwYC17V1NgWeyabo8DVACA_1772441186 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441185; x=1773045985; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ctp31faHRscLU5956r9Sxi2RU43/0uUnrBnub/aS7BQ=; b=tLOTij5xC3jV+VaB8s8t1vnzMZ5Lm63qci69fiw03rxA1PXrwACImBml49yrIY9zNS 7G3ZiZyQNeHBCxPB8ztD9Kh9Ab9CmHvNkgTKYKbB61uJDUPJFe3wG0dD8iT3ckNEaOy0 ASdfSc+NaBB3qwWidaVxICvCj/mqe/XiLcCfUNgj9zrp3FpLIiMd29vk/xgQ3uWmMmCW TmpyOLXfDIRFxRHfLv5sQv3NRv0OuCQb8h1/08Tv+X4x4Laq8kBzxP7+ch45bMdJGZMv BAoBAVgAbFVKrArtjX9fKv7A8Q77ZrE84vPabJjTQFZFVOSatJiwscJ3FOjQrYyx+atm 024g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441185; x=1773045985; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Ctp31faHRscLU5956r9Sxi2RU43/0uUnrBnub/aS7BQ=; b=t9+L/MWoO+uaqhatt4xrzWUC0iBDFhY+nGTsAQb2vxz7SIWeyNQuxoEm/BscGsyH7c G3UAkw00Pk42Co8XnKo2bq2xesoLm12u4H+orXOtMJon3lz0AY3YNS5TF8Q/aWDrII3Z caAkFlZVHhPVOTxrMGEqGdJoPDcHpMEfBSo0D3e2ZgUV7yrLiAeK9+3E6QiL+uotBqXP gcByZuL0COe+XkhRRgE8PLA9GPvYlnm/+h0+u2I765f/ToyUu5PlHXALmYy1xFzdfCUN RoSKqRjNxWgRKSQeVCnoAfXQbV52nJNcDW/lIUMyIwBCclFn2sxczOnTLcbgdlI+djZJ sFcg== X-Gm-Message-State: AOJu0YxSQkOPZzdAsHqZTbqwCK7gwWNnEM+hJLJDkyUmH77JGuMNncmD rE9i+mR1++wJGwxN1+LzaMT9t0k23On+QZggm8XC56j4q5Ltm5iE8jk0qRpF2OJBCYWIIZaw7oC Z/dM01tnozUYNdKYf3e6xHBC2f6/eDH8+4k4qMlIysA8TVVJC4nvxHG1Uyaw/KwVp663NQdw9g4 sOQ+pxLti9H3Mzw/25yyHDaAUBCxl3Srh5Dlg2nJZ6 X-Gm-Gg: ATEYQzxYH+/RgrXSD15Yr30hSIQtZAnzVppcF14sZoLT7La3jDFFFn1pp8eov7UTiMB HchnAaIY6WWx4EOsK426H8UQVAeF+tZL8BLzMCpuzuAVxyEwYZQM55gavf9Fu+GSRXwUgfDgQMl apJrHFZUQqWoEBIxzMGODuLuW9rAEeLQmn5RTAOuP/w5nLC+iEu7kvddsHjA33KmDxMrj58RgMR WPirZyh5lX7wKuJ9GZJKiKAbu3CTZAidwWNTQo+k4MGCqT15tO1wMPqsBOmUmlcWmfMpe2WRVHU xbQzOdnG0/42zCE/oR8wFy7sM4o+WpV/ktHRlh9oNgAIjJj7WPMTLOMfw3tWZN8uYpwEt+4j7bU CrAFJ3bDa2iqJa7eL5tp+bErkuIdqhMEFgQuQSmhkSXsX+QvbD7opel1GbEu6+lwds4cHWVJndr OM7XZZfUZW9Tee1V/wd9SPihYkuOg= X-Received: by 2002:a05:600c:4ec7:b0:477:9a61:fd06 with SMTP id 5b1f17b1804b1-483c33cab41mr264453085e9.8.1772441185365; Mon, 02 Mar 2026 00:46:25 -0800 (PST) X-Received: by 2002:a05:600c:4ec7:b0:477:9a61:fd06 with SMTP id 5b1f17b1804b1-483c33cab41mr264452605e9.8.1772441184853; Mon, 02 Mar 2026 00:46:24 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 062/102] i386/sev: free existing launch update data and kernel hashes data on init Date: Mon, 2 Mar 2026 09:42:57 +0100 Message-ID: <20260302084338.473368-63-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441525642158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha If there is existing launch update data and kernel hashes data, they need t= o be freed when initialization code is executed. This is important for resettable confidential guests where the initialization happens once every reset. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-22-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/sev.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/target/i386/sev.c b/target/i386/sev.c index 647f4bf63d5..b3893e431c4 100644 --- a/target/i386/sev.c +++ b/target/i386/sev.c @@ -1773,6 +1773,7 @@ static int sev_common_kvm_init(ConfidentialGuestSuppo= rt *cgs, Error **errp) uint32_t ebx; uint32_t host_cbitpos; struct sev_user_data_status status =3D {}; + SevLaunchUpdateData *data, *next_elm; SevCommonState *sev_common =3D SEV_COMMON(cgs); SevCommonStateClass *klass =3D SEV_COMMON_GET_CLASS(cgs); X86ConfidentialGuestClass *x86_klass =3D @@ -1780,6 +1781,11 @@ static int sev_common_kvm_init(ConfidentialGuestSupp= ort *cgs, Error **errp) =20 sev_common->state =3D SEV_STATE_UNINIT; =20 + /* free existing launch update data if any */ + QTAILQ_FOREACH_SAFE(data, &launch_update, next, next_elm) { + g_free(data); + } + host_cpuid(0x8000001F, 0, NULL, &ebx, NULL, NULL); host_cbitpos =3D ebx & 0x3f; =20 @@ -1968,6 +1974,8 @@ static int sev_snp_kvm_init(ConfidentialGuestSupport = *cgs, Error **errp) { MachineState *ms =3D MACHINE(qdev_get_machine()); X86MachineState *x86ms =3D X86_MACHINE(ms); + SevCommonState *sev_common =3D SEV_COMMON(cgs); + SevSnpGuestState *sev_snp_guest =3D SEV_SNP_GUEST(sev_common); =20 if (x86ms->smm =3D=3D ON_OFF_AUTO_AUTO) { x86ms->smm =3D ON_OFF_AUTO_OFF; @@ -1976,6 +1984,10 @@ static int sev_snp_kvm_init(ConfidentialGuestSupport= *cgs, Error **errp) return -1; } =20 + /* free existing kernel hashes data if any */ + g_free(sev_snp_guest->kernel_hashes_data); + sev_snp_guest->kernel_hashes_data =3D NULL; + return 0; } =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441846; cv=none; d=zohomail.com; s=zohoarc; b=O3i4TUqKwEQ8GsTxLj8X2TAddB8QcnIVwujPAS8DTOIwgpW31Ty4n14Rvs5Jjtc9gDbApg6dlBrPLCbv/hW2tiNnr+Hgra3h0g05G33qo+YtiIR7jUnUz/UO/q4FrxWUmuuxyZgoZ4mrqbDnKL8tTDnbUr6eXr94TOjQLqQ2vvA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441846; 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=tn6Srd+QNDO0Z+G86AevNyEAI6wqEDDO6y+a5TKwDnk=; b=Ht5Qb/Nl5rzK/UzoVgSgSaCj6b250tERmk8AdZyb2VS9VPa303qxe+fZTPI2o/1mYXTXZ5Q5/sbH0sn+z1BCEihokrexx/5OMQO1bSQnN5xGW5LbLQDG4UZB8KbO74WJV5TgApJepo3ouxi6A6hAN4z1IR0Z/sBsVvSKO0wYcr0= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441846064702.3888842738621; Mon, 2 Mar 2026 00:57:26 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvT-0007Dp-EW; Mon, 02 Mar 2026 03:46: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 1vwyvC-0005wD-ST for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:35 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyvA-00021N-Ci for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:34 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-169-t-z68TusMF-RQLdzly06MA-1; Mon, 02 Mar 2026 03:46:29 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4806cfffca6so42274025e9.2 for ; Mon, 02 Mar 2026 00:46:29 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfb1390bsm237747895e9.1.2026.03.02.00.46.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441190; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tn6Srd+QNDO0Z+G86AevNyEAI6wqEDDO6y+a5TKwDnk=; b=dzRQLtRt8uzBwzc1sOcvkrWXCmC3wIejtfSvoMfVpUVGkH+j4koL/ImWnKXJBBT3bgMZUL xFGo66q+xK/uukLxyVxzArxWGnyYUxYCE0YGkxMYiEn9fsgA4y2QLH1tGO6Z9+sv84lsRN ZwmaE3KQL3nQeahUBLGfn2prkOZeMaA= X-MC-Unique: t-z68TusMF-RQLdzly06MA-1 X-Mimecast-MFC-AGG-ID: t-z68TusMF-RQLdzly06MA_1772441188 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441188; x=1773045988; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tn6Srd+QNDO0Z+G86AevNyEAI6wqEDDO6y+a5TKwDnk=; b=iQayjNkEoO7o9vsPaDNumYcEaowYKh62Y/dg5rwLVbPw28pzS6Mr3UhFhDiUzbNAHj +P+wfH/wvdCNgxjbAY6IFIkRViInF7+wWzejQEB4vNFGR+bHHYUtQG38dJCOHiDjAo0I NLkRkqik8BSa/j8DwYuTpijUh46QW6rES/nJV6+Du9UnEepOfQn32bUqQgY05jO6f1fc b3haiun3WroPzD0JzUggFvquTNYyJWZvCDQdvvJZ0hRr2TmgYDr2X6BSPPkrlsLY9/kJ PhsKJvufKI/r6D1Id+QLy6xmlrzkxTP3XY4yeIzAL00IcTHkb4gk7vgXToWozXICmdfe oY5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441188; x=1773045988; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=tn6Srd+QNDO0Z+G86AevNyEAI6wqEDDO6y+a5TKwDnk=; b=vsXeVLzq2NmjPGbppp8Re+D/Su6sBMpdupSFMPAZ00++hVfBQMbZtoPGWLli/T6ubs k+c6qrFBlaxvwz5VjxNgSYlECDmpBZcLOA4g5YkKslphtODEKGmuXtmPfI9SemkD74WE xpOcEvsD8YCNEcmqsH/DnTNdowl0fqqpSKO10oM9uDU/ZZros0qXz445iTVrnKDPEsQo yLlj8hZh7aHXqEePi37ADgnUDhWbWQCw+jzQ1xPxrjD7ESeUSP9q2kyvRTIcPryWhq7n Y7bVOaB+dcnMh8nt3D09HSBshsWk/06HBo/TJJFj/Jhm52CXPu74d7c/YFrn61Mrslqh nMcg== X-Gm-Message-State: AOJu0YxfA9/eDZQXTGZ9mNEt8H26PO1hbni/LZHjSKJ1fMQg8x2M9rz+ lnEPd9gC94OFE2Izf9cnYNh572qMs++1SWiZQ20hxaQPp05r/JWKNFNVEO0D+BKXO/gBphcwToG NPQDcM4h6CwO7ehSmLXbvbOS9IbkZZIdmqPgvg1tS75MSkSWwB4SAzAezMYetxf++BjGjC/8vRy B3UjUIIWvwHz5C6p2/kFf0ULmn5R8pjlVk8vDoSwB4 X-Gm-Gg: ATEYQzyfwt3cTxzjvEH4X/pluChC29P444WsiO3R3GGhG1C4sblXrbg9oWiBnKk6xlD b+9ArIf1b6y4zccFk8HtnGdav23eWuWmOqrjRzQf5VH0EOeZzY5Af2UXcCcrMg85gC5Gu7F7iE8 hrV3PyHcSpN9xiWCuPKbCaXq4bMQ2Hw6Er1T5SMDITjMEuuYkA+T2XbP3YZyx/Eb6vPX2H6Fz+y 7DxQDICXHDXjjUGRSiLjzbiRrNJGrzXjywrO+mDyn6TXEKQ6ZciJQJ0gq4q9JzpR5eKQwA4eY+6 Mfk04VaQMRxCo2Sz6ltEvrnDXVkCEcz5IBYcZUoTjazhArMgsjmLFHgoiB9HF7I0RGN0FPC7aLj AH7wgYB51bejp/xKOk71swuooIwJys+ErMWYKWetSpfTrrKZGG1zT82sH0LZaGBXabb4/TPqEqc wbXiCxzM1Or79kFMskiBluTR0Qhtg= X-Received: by 2002:a05:600c:1f91:b0:483:6ff1:18b with SMTP id 5b1f17b1804b1-483c9b7eac9mr210557725e9.0.1772441187589; Mon, 02 Mar 2026 00:46:27 -0800 (PST) X-Received: by 2002:a05:600c:1f91:b0:483:6ff1:18b with SMTP id 5b1f17b1804b1-483c9b7eac9mr210557245e9.0.1772441187136; Mon, 02 Mar 2026 00:46:27 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 063/102] i386/sev: add support for confidential guest reset Date: Mon, 2 Mar 2026 09:42:58 +0100 Message-ID: <20260302084338.473368-64-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441847079158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha When the KVM VM file descriptor changes as a part of the confidential guest reset mechanism, it necessary to create a new confidential guest context and re-encrypt the VM memory. This happens for SEV-ES and SEV-SNP virtual machi= nes as a part of SEV_LAUNCH_FINISH, SEV_SNP_LAUNCH_FINISH operations. A new resettable interface for SEV module has been added. A new reset callb= ack for the reset 'exit' state has been implemented to perform the above operat= ions when the VM file descriptor has changed during VM reset. Tracepoints has been added also for tracing purpose. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-23-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/sev.c | 58 ++++++++++++++++++++++++++++++++++++++++ target/i386/trace-events | 1 + 2 files changed, 59 insertions(+) diff --git a/target/i386/sev.c b/target/i386/sev.c index b3893e431c4..549e6241769 100644 --- a/target/i386/sev.c +++ b/target/i386/sev.c @@ -30,8 +30,10 @@ #include "system/kvm.h" #include "kvm/kvm_i386.h" #include "sev.h" +#include "system/cpus.h" #include "system/system.h" #include "system/runstate.h" +#include "system/reset.h" #include "trace.h" #include "migration/blocker.h" #include "qom/object.h" @@ -86,6 +88,10 @@ typedef struct QEMU_PACKED PaddedSevHashTable { uint8_t padding[ROUND_UP(sizeof(SevHashTable), 16) - sizeof(SevHashTab= le)]; } PaddedSevHashTable; =20 +static void sev_handle_reset(Object *obj, ResetType type); + +SevKernelLoaderContext sev_load_ctx =3D {}; + QEMU_BUILD_BUG_ON(sizeof(PaddedSevHashTable) % 16 !=3D 0); =20 #define SEV_INFO_BLOCK_GUID "00f771de-1a7e-4fcb-890e-68c77e2fb44e" @@ -129,6 +135,7 @@ struct SevCommonState { uint8_t build_id; int sev_fd; SevState state; + ResettableState reset_state; =20 QTAILQ_HEAD(, SevLaunchVmsa) launch_vmsa; }; @@ -1666,6 +1673,11 @@ sev_vm_state_change(void *opaque, bool running, RunS= tate state) error_setg(&sev_mig_blocker, "SEV: Migration is not implemented"); migrate_add_blocker(&sev_mig_blocker, &error_fatal); + /* + * mark SEV guest as resettable so that we can reinitialize + * SEV upon reset. + */ + qemu_register_resettable(OBJECT(sev_common)); } } } @@ -1991,6 +2003,41 @@ static int sev_snp_kvm_init(ConfidentialGuestSupport= *cgs, Error **errp) return 0; } =20 +/* + * handle sev vm reset + */ +static void sev_handle_reset(Object *obj, ResetType type) +{ + SevCommonState *sev_common =3D SEV_COMMON(MACHINE(qdev_get_machine())-= >cgs); + SevCommonStateClass *klass =3D SEV_COMMON_GET_CLASS(sev_common); + + if (!sev_common) { + return; + } + + if (!runstate_is_running()) { + return; + } + + sev_add_kernel_loader_hashes(&sev_load_ctx, &error_fatal); + if (sev_es_enabled() && !sev_snp_enabled()) { + sev_launch_get_measure(NULL, NULL); + } + if (!sev_check_state(sev_common, SEV_STATE_RUNNING)) { + /* this calls sev_snp_launch_finish() etc */ + klass->launch_finish(sev_common); + } + + trace_sev_handle_reset(); + return; +} + +static ResettableState *sev_reset_state(Object *obj) +{ + SevCommonState *sev_common =3D SEV_COMMON(obj); + return &sev_common->reset_state; +} + int sev_encrypt_flash(hwaddr gpa, uint8_t *ptr, uint64_t len, Error **errp) { @@ -2469,6 +2516,8 @@ bool sev_add_kernel_loader_hashes(SevKernelLoaderCont= ext *ctx, Error **errp) return false; } =20 + /* save the context here so that it can be re-used when vm is reset */ + memcpy(&sev_load_ctx, ctx, sizeof(*ctx)); return klass->build_kernel_loader_hashes(sev_common, area, ctx, errp); } =20 @@ -2729,8 +2778,16 @@ static void sev_common_class_init(ObjectClass *oc, const void *data) { ConfidentialGuestSupportClass *klass =3D CONFIDENTIAL_GUEST_SUPPORT_CL= ASS(oc); + ResettableClass *rc =3D RESETTABLE_CLASS(oc); =20 klass->kvm_init =3D sev_common_kvm_init; + /* + * the exit phase makes sure sev handles reset after all legacy resets + * have taken place (in the hold phase) and IGVM has also properly + * set up the boot state. + */ + rc->phases.exit =3D sev_handle_reset; + rc->get_state =3D sev_reset_state; =20 object_class_property_add_str(oc, "sev-device", sev_common_get_sev_device, @@ -2780,6 +2837,7 @@ static const TypeInfo sev_common_info =3D { .abstract =3D true, .interfaces =3D (const InterfaceInfo[]) { { TYPE_USER_CREATABLE }, + { TYPE_RESETTABLE_INTERFACE }, { } } }; diff --git a/target/i386/trace-events b/target/i386/trace-events index 51301673f0c..b320f655eeb 100644 --- a/target/i386/trace-events +++ b/target/i386/trace-events @@ -14,3 +14,4 @@ kvm_sev_attestation_report(const char *mnonce, const char= *data) "mnonce %s data kvm_sev_snp_launch_start(uint64_t policy, char *gosvw) "policy 0x%" PRIx64= " gosvw %s" kvm_sev_snp_launch_update(uint64_t src, uint64_t gpa, uint64_t len, const = char *type) "src 0x%" PRIx64 " gpa 0x%" PRIx64 " len 0x%" PRIx64 " (%s page= )" kvm_sev_snp_launch_finish(char *id_block, char *id_auth, char *host_data) = "id_block %s id_auth %s host_data %s" +sev_handle_reset(void) "" --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441447; cv=none; d=zohomail.com; s=zohoarc; b=WMH+OEXnxJcoIor8JwMJps2iddvx5dNSCG0xOCjYs2PVNxjtXUs07tKpxoBidQpqCBJuswsytuDkUkvz95jLW9R/c0Tj/L/ZKrYl9At/DVf1yxuzrozGfz/zbNmuC9KL24GCXU5cdzOas9ELyZlooJERG4ZE85HAnNrvknMGhY8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441447; 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=KDaYiHSlCecj9I4WEexLBfQYSrCu8gOFeRcdJGMIQVk=; b=WrqBCGcmtvxN4SbcVAy7jea0PSAMxMfgic5cqe+wUNEQNvnYd2GQiIh7HDyFQX8clf6QjJAurLAgatbwjW4rBOGwO9f4SWiTpkRR4KmsfhD0aIEDiyftKLaugpmT0pmGCHtK9hOgAoRMumZGd8S0z9mJjfa4bzYkChC011OUoVk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441447890539.4228842437014; Mon, 2 Mar 2026 00:50:47 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvi-0008Kp-G8; Mon, 02 Mar 2026 03:47:06 -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 1vwyvD-00066H-Ut for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:37 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyvC-00021q-5d for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:35 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-114-r9ylfT4pMRacNWunueZDmw-1; Mon, 02 Mar 2026 03:46:32 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-483a24db6ecso51426485e9.1 for ; Mon, 02 Mar 2026 00:46:32 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c75a523sm25598421f8f.19.2026.03.02.00.46.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441193; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KDaYiHSlCecj9I4WEexLBfQYSrCu8gOFeRcdJGMIQVk=; b=GfGaStv00b5qJA6nTggphyK6NRIP6E48Jw6DVyMT00c321wY9uSoyc5tWmp0sK3b38KnT6 2450H8FIOkcLWvRuqXE+oJxs1Qictvdwb0p7QvdReCJ+KKnRlcNdP5Z2VHCucK9rWfXFd9 vJdzuIZ06SjWRScBs/3lMRViudlVNG0= X-MC-Unique: r9ylfT4pMRacNWunueZDmw-1 X-Mimecast-MFC-AGG-ID: r9ylfT4pMRacNWunueZDmw_1772441191 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441190; x=1773045990; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KDaYiHSlCecj9I4WEexLBfQYSrCu8gOFeRcdJGMIQVk=; b=GP/2tIjhUPq3OTDbLHnFuQG5hlBIM9YF84BaUNbsS/NHm7BOdGod+gNWrcKHx5ELmn PDkv0sYTRJfGVc8ZMYa13qb6yFtdzjG38vqVaq+1Vu30HDCiDlPLjMAU7qf0WcsSRtYw zOUfhUhqreyFxV60fImdwmxWhCMyg3YhmAq93gL/HnVXbRAgyzr8+4MfAaSUJ468suy5 4o3arnXzP1AVdikQSaGLF4N4jV5hZzIu+g5cWtGGl43WGyuVRrR9GjF8qnpn8pSvKeFX 6mHfruNcP4zYEURQyY2MGjMyASrE4UlNZhkZAq7ykWO1NT890qKdVfjhWXpdTt96kum3 k/qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441190; x=1773045990; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=KDaYiHSlCecj9I4WEexLBfQYSrCu8gOFeRcdJGMIQVk=; b=t/4LkmD+bfSGN4inH3UA/DQEyLM+rCLEkN1jAiTsQUa6wbBsBWgpxv31/6gpOUJprh C7PPpTi72eBLvV5zW319JuG8QzXHYqiNMfycPFqF9Np1jwYV8iEDKikBWnzh8pndzNMX xH+B0vETvQOSUIihsP3VrPR5kABF2oVqSsqwzv+pm45fzqpyoGCecVj9TNcK2L3Jg5F7 iZ4nF99g7cnArIPR+Ux/qWZqbVRhR3ch4/W7wVN/4LSuBuWBSXRzJ6OW5Ei8N5N7PhOj YfeaywQjbCJhDHbjGQvf6gRS2DlivNQWSXfsG196IeCy5Sm9nEXSC1nkr/ZSFFfD7Ysf x+/w== X-Gm-Message-State: AOJu0YxWXJ95k61aMICGkA3S9E9Xnfrr0c7Iy1t6aU4c4qxfDBPySlMI KAe4D8kzlmN29LoHCaqBLAWGhCHXllup1TcxHjS6KS5W9raIljb2sZ4jcRU2wVywIAYPN9r+g9M nKZYPoZQ8eYX9/gmFahKRswdlKIVApbUfsE+J2u6sPLEq2nDEbfEr80S0zpCd/Jd+u1rNaBzIYf AjUPcTsHK26MvdoEDbUz+diim6yW73xYyOPjMfxgze X-Gm-Gg: ATEYQzyZ2U9w+tTsAZfGmaCBYpPBIGw09xf1AF4qAME2m6TvnAMKX0w4JrIb3ARVwVB ES5W68I0CjCw+GsAIAbzjN2tSW8OYkCCOp63flTPHJk9jdyGdftAI4Zk0LBTecwQHxrcy3Ke27R X9TWAuYEsb2tdZ7QC9rP1nu1/a/emw3CegltQI+bVPL66fQVotESYF7eX3fBIXxXElvYs8xtwIE /vs77V6AdSwm/htQUDXV6Wjmw7+G0UbjiuJ6t6HVsM4DGYceOTvF5Mf9jlDexLpt0fe4XJJwWar y4rvcut8mrDIrSFiyoCcqnjyVr1lpJb7SNyG50XcPQrMqGBiPJuv8i1uE5P8/eGZYXl4OoLq+/4 HzaWMmsBGlE4de0YeCIDHZxhe6jgBAUSzlKhZg8Aj4Nvhu30esR8vlY2SaiFuUoaUuPd2avd97K 0kI2UMn7e46Myh99IiN6JWMaGF0mU= X-Received: by 2002:a05:600c:4e08:b0:483:c12b:fe4a with SMTP id 5b1f17b1804b1-483c9bc1b64mr196113775e9.11.1772441190147; Mon, 02 Mar 2026 00:46:30 -0800 (PST) X-Received: by 2002:a05:600c:4e08:b0:483:c12b:fe4a with SMTP id 5b1f17b1804b1-483c9bc1b64mr196113425e9.11.1772441189554; Mon, 02 Mar 2026 00:46:29 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Subject: [PULL 064/102] hw/vfio: generate new file fd for pseudo device and rebind existing descriptors Date: Mon, 2 Mar 2026 09:42:59 +0100 Message-ID: <20260302084338.473368-65-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441449147158500 From: Ani Sinha Normally the vfio pseudo device file descriptor lives for the life of the V= M. However, when the kvm VM file descriptor changes, a new file descriptor for the pseudo device needs to be generated against the new kvm VM descript= or. Other existing vfio descriptors needs to be reattached to the new pseudo de= vice descriptor. This change performs the above steps. Tested-by: C=C3=A9dric Le Goater Reviewed-by: C=C3=A9dric Le Goater Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260227072445.406907-1-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- hw/vfio/helpers.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/hw/vfio/helpers.c b/hw/vfio/helpers.c index f68f8165d09..00d42d3b98e 100644 --- a/hw/vfio/helpers.c +++ b/hw/vfio/helpers.c @@ -116,6 +116,88 @@ bool vfio_get_info_dma_avail(struct vfio_iommu_type1_i= nfo *info, * we'll re-use it should another vfio device be attached before then. */ int vfio_kvm_device_fd =3D -1; + +/* + * Confidential virtual machines: + * During reset of confidential vms, the kvm vm file descriptor changes. + * In this case, the old vfio kvm file descriptor is + * closed and a new descriptor is created against the new kvm vm file + * descriptor. + */ + +typedef struct VFIODeviceFd { + int fd; + QLIST_ENTRY(VFIODeviceFd) node; +} VFIODeviceFd; + +static QLIST_HEAD(, VFIODeviceFd) vfio_device_fds =3D + QLIST_HEAD_INITIALIZER(vfio_device_fds); + +static void vfio_device_fd_list_add(int fd) +{ + VFIODeviceFd *file_fd; + file_fd =3D g_malloc0(sizeof(*file_fd)); + file_fd->fd =3D fd; + QLIST_INSERT_HEAD(&vfio_device_fds, file_fd, node); +} + +static void vfio_device_fd_list_remove(int fd) +{ + VFIODeviceFd *file_fd, *next; + + QLIST_FOREACH_SAFE(file_fd, &vfio_device_fds, node, next) { + if (file_fd->fd =3D=3D fd) { + QLIST_REMOVE(file_fd, node); + g_free(file_fd); + break; + } + } +} + +static int vfio_device_fd_rebind(NotifierWithReturn *notifier, void *data, + Error **errp) +{ + VFIODeviceFd *file_fd; + struct kvm_device_attr attr =3D { + .group =3D KVM_DEV_VFIO_FILE, + .attr =3D KVM_DEV_VFIO_FILE_ADD, + }; + struct kvm_create_device cd =3D { + .type =3D KVM_DEV_TYPE_VFIO, + }; + + /* we are not interested in pre vmfd change notification */ + if (((VmfdChangeNotifier *)data)->pre) { + return 0; + } + + if (kvm_vm_ioctl(kvm_state, KVM_CREATE_DEVICE, &cd)) { + error_setg_errno(errp, errno, "Failed to create KVM VFIO device"); + return -errno; + } + + if (vfio_kvm_device_fd !=3D -1) { + close(vfio_kvm_device_fd); + } + + vfio_kvm_device_fd =3D cd.fd; + + QLIST_FOREACH(file_fd, &vfio_device_fds, node) { + attr.addr =3D (uint64_t)(unsigned long)&file_fd->fd; + if (ioctl(vfio_kvm_device_fd, KVM_SET_DEVICE_ATTR, &attr)) { + error_setg_errno(errp, errno, + "Failed to add fd %d to KVM VFIO device", + file_fd->fd); + return -errno; + } + } + return 0; +} + +static struct NotifierWithReturn vfio_vmfd_change_notifier =3D { + .notify =3D vfio_device_fd_rebind, +}; + #endif =20 void vfio_kvm_device_close(void) @@ -153,6 +235,11 @@ int vfio_kvm_device_add_fd(int fd, Error **errp) } =20 vfio_kvm_device_fd =3D cd.fd; + /* + * If the vm file descriptor changes, add a notifier so that we can + * re-create the vfio_kvm_device_fd. + */ + kvm_vmfd_add_change_notifier(&vfio_vmfd_change_notifier); } =20 if (ioctl(vfio_kvm_device_fd, KVM_SET_DEVICE_ATTR, &attr)) { @@ -160,6 +247,8 @@ int vfio_kvm_device_add_fd(int fd, Error **errp) fd); return -errno; } + + vfio_device_fd_list_add(fd); #endif return 0; } @@ -183,6 +272,8 @@ int vfio_kvm_device_del_fd(int fd, Error **errp) "Failed to remove fd %d from KVM VFIO device", fd= ); return -errno; } + + vfio_device_fd_list_remove(fd); #endif return 0; } --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441595; cv=none; d=zohomail.com; s=zohoarc; b=lBF6xQ11eeeiWd5kL91sfC84IaAbpZLBqoOEj09c8X9wuHyEQPtbO53oQMSiPZT+zCOq/GZZs4t0rQmwFz8iZZXONdmqcJh46kaGP+l7d817ej3i0z9YjqCAQW94eT1pwf7+pc2F5hwUOndtDIT8liTaLvb9cV9SZbsVu39ETCQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441595; 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=4F01VEmQLNn4bhnf/pHKH/Ewq60YHHQIBflyPA7EaqY=; b=V2B+xsAFeZScbUq5Q+OZGnbEjPpzVahcV50jyAhXRqHksXxYOboExClJQ2GTEhdaWvXS++oUKQ/PumwRBtnGqFuet0oYejf4lO+F23Mj1IteBWJtRnSmlTz/7i2iHXmelCs5f9Kj/uLP9jZ0ZtSsX5Ip27iJLsZB1z4xpmd3gnI= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441595566850.1300713689883; Mon, 2 Mar 2026 00:53:15 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvu-0001Si-Ix; Mon, 02 Mar 2026 03:47:18 -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 1vwyvG-0006CF-1T for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:39 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyvE-00022D-Cf for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:37 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-564-QefkYCRgPIaY-dBqsUh9ZQ-1; Mon, 02 Mar 2026 03:46:34 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4806cfffca6so42275025e9.2 for ; Mon, 02 Mar 2026 00:46:34 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd750607sm391139275e9.10.2026.03.02.00.46.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441195; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4F01VEmQLNn4bhnf/pHKH/Ewq60YHHQIBflyPA7EaqY=; b=ccZenK00s+sY+tZnG52t0PIHAf41HsxsMQ3uO64wIVyZBkhLZuhr+iq5d1NVK9OCfOQUia IZaADWdFlc7USs2/03Ua4dxRfYK0G/I0GeecxlcR8l3LK9pp/Ncmxa9C0Y0V7GpxbybQKw ApRNljbwb8fnbXrbXb8jeEbr5ucpUls= X-MC-Unique: QefkYCRgPIaY-dBqsUh9ZQ-1 X-Mimecast-MFC-AGG-ID: QefkYCRgPIaY-dBqsUh9ZQ_1772441193 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441193; x=1773045993; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4F01VEmQLNn4bhnf/pHKH/Ewq60YHHQIBflyPA7EaqY=; b=TMMfCxzh9fn4kTx6RxrYgrzbP7ZcMXKAgSMmHm39J9UCnS9TvgaAR7d6W9Y7holVr6 KD9caeIFJX3/uPxNB4v3wYCfVt/PkTJ56zRql0+bxKeCFOtLq/MsvAuZvJYNzASq3hps 43mhfzKjJQKJ9+t7AbqNa2tfVD8+6raFHwAxTM9UDfsin31gqmrfAo0x+BqsM3MZr2g6 cP5Mxr5qWxnyw9OWy10oz+239uEUlqEzU1sMMswDCDnOn4fm2mLR61g/iJ9gEh5XPlUn ADFYhCC1y15XgSIe8S6fNaH2Mn6qRzJL64Knhl6/lx0PgfeRzLMnsJOzIFCF6QuL5XgQ Z7jQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441193; x=1773045993; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=4F01VEmQLNn4bhnf/pHKH/Ewq60YHHQIBflyPA7EaqY=; b=bXRQ+QswgKDCz+5GO6KwNxuxSZSosb0ugDm34TkAtC0mT2tyTCxzogwcFhEJARrP9+ xgiH4yb0JOkHlhICoO1YKFEKn7mv0iirOym7R6ff8Lag1jzM/GvP7qHcom7h20pXwcFv 1vjmIou1Fhxj1AyFfBBkz7vtaytJNb98ZpwRAIW+SLCbZp5SQsXa8wm1cgl6uNbvRqRY NeMkAHEo6oAwgkRQSNdh/utxel6OFOoBqOtmHrVpc854jbsFvFPWSrrqxtAiRSuCYHDi gN0LOHafhr2B/skbO/oHUvCvalq6cN77XxuhLDMlQAdK1i22AytlGBqZTBwNMK1i5PwN TyjQ== X-Gm-Message-State: AOJu0Yz/LqrJ1h8l7zoh71GnbI6vVgbVWFLGCGoKE7GPkSPzpyYGInbq KWTZs1jwmDvcUMC89yghHxkClZC/RekjGYsQ6ojgVreT0lkfW/R0eTcBYsotSnwIXhFVT+e/sWA U5t/4vowS+RAMX+UlaXSFAJPxXwp9IH+iky5uJqFPEAMGc5YvikxqmGIZKu4K01ybbmQLy819ki qv6HiBnS9NJkcgmiXAmWuQMGBEV4H2rN0r1DULBiUV X-Gm-Gg: ATEYQzxY0QO5Fu5KA4TsL3JF+LG9nzP8k2LwR8tgun3V6CnoZkc9puSfUA6pcki6M1h glbNnNpfYvCppon2JffzVpMMwWYPfsSnjEkuMKaVU7ESIXx21KBzMnHclDhrUnoiCcUER53g9YV dTzW2K62ULCHlaVISOezOdVBE7K+Pc7OoPhSSEedp+4Cr7lho2CPsP7I98hkxWpdn5pRfJWooDf RgR2bhQiHufnPbDfsmD7nR+IuceM0upJUDLv7fm4QFaVtBYfm4++8bSaSHdO9HO5xYf02H57Hch t6x2AXFAmARZwLfb547j0g9qp6ciGhznhgmJmSpZpBuR4NEzWO4c1Pf0WPAtZrvGd2ZLpVElJj4 vjkmaS79uMFD/HcHE/3grOmUq37g2S4M6hcDaU3MVsQFmMl3+Gb26ZyhNkYMwfUtDsKepC6BlVv QC8V5TJtkLdPVYeDDGDUtvxvr/Clc= X-Received: by 2002:a05:600c:c167:b0:47d:5e02:14e5 with SMTP id 5b1f17b1804b1-483c9bb660amr186784855e9.5.1772441192796; Mon, 02 Mar 2026 00:46:32 -0800 (PST) X-Received: by 2002:a05:600c:c167:b0:47d:5e02:14e5 with SMTP id 5b1f17b1804b1-483c9bb660amr186784375e9.5.1772441192319; Mon, 02 Mar 2026 00:46:32 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 065/102] kvm/i8254: refactor pit initialization into a helper Date: Mon, 2 Mar 2026 09:43:00 +0100 Message-ID: <20260302084338.473368-66-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441595895158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha The initialization code will be used again by VM file descriptor change notifier callback in a subsequent change. So refactor common code into a new helper function. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-25-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- hw/i386/kvm/i8254.c | 68 +++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/hw/i386/kvm/i8254.c b/hw/i386/kvm/i8254.c index 81e742f8667..255047458a8 100644 --- a/hw/i386/kvm/i8254.c +++ b/hw/i386/kvm/i8254.c @@ -60,6 +60,43 @@ struct KVMPITClass { DeviceRealize parent_realize; }; =20 +static void do_pit_initialize(KVMPITState *s, Error **errp) +{ + struct kvm_pit_config config =3D { + .flags =3D 0, + }; + int ret; + + ret =3D kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT2, &config); + if (ret < 0) { + error_setg(errp, "Create kernel PIC irqchip failed: %s", + strerror(-ret)); + return; + } + switch (s->lost_tick_policy) { + case LOST_TICK_POLICY_DELAY: + break; /* enabled by default */ + case LOST_TICK_POLICY_DISCARD: + if (kvm_check_extension(kvm_state, KVM_CAP_REINJECT_CONTROL)) { + struct kvm_reinject_control control =3D { .pit_reinject =3D 0 = }; + + ret =3D kvm_vm_ioctl(kvm_state, KVM_REINJECT_CONTROL, &control= ); + if (ret < 0) { + error_setg(errp, + "Can't disable in-kernel PIT reinjection: %s", + strerror(-ret)); + return; + } + } + break; + default: + error_setg(errp, "Lost tick policy not supported."); + return; + } + + return; +} + static void kvm_pit_update_clock_offset(KVMPITState *s) { int64_t offset, clock_offset; @@ -241,42 +278,13 @@ static void kvm_pit_realizefn(DeviceState *dev, Error= **errp) PITCommonState *pit =3D PIT_COMMON(dev); KVMPITClass *kpc =3D KVM_PIT_GET_CLASS(dev); KVMPITState *s =3D KVM_PIT(pit); - struct kvm_pit_config config =3D { - .flags =3D 0, - }; - int ret; =20 if (!kvm_check_extension(kvm_state, KVM_CAP_PIT_STATE2) || !kvm_check_extension(kvm_state, KVM_CAP_PIT2)) { error_setg(errp, "In-kernel PIT not available"); } =20 - ret =3D kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT2, &config); - if (ret < 0) { - error_setg(errp, "Create kernel PIC irqchip failed: %s", - strerror(-ret)); - return; - } - switch (s->lost_tick_policy) { - case LOST_TICK_POLICY_DELAY: - break; /* enabled by default */ - case LOST_TICK_POLICY_DISCARD: - if (kvm_check_extension(kvm_state, KVM_CAP_REINJECT_CONTROL)) { - struct kvm_reinject_control control =3D { .pit_reinject =3D 0 = }; - - ret =3D kvm_vm_ioctl(kvm_state, KVM_REINJECT_CONTROL, &control= ); - if (ret < 0) { - error_setg(errp, - "Can't disable in-kernel PIT reinjection: %s", - strerror(-ret)); - return; - } - } - break; - default: - error_setg(errp, "Lost tick policy not supported."); - return; - } + do_pit_initialize(s, errp); =20 memory_region_init_io(&pit->ioports, OBJECT(dev), NULL, NULL, "kvm-pit= ", 4); =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441395; cv=none; d=zohomail.com; s=zohoarc; b=hiJy5O+y5aG5jOKHdw+8E58KR3rSZW9oUBrEM5PJPTknSOQVK++SE1AOzKpmqybZ8pO2TVbdNH53i5ZGw7dMXRL7SPUlB9zDF2pIwAb8m0X8UVSQqFty8ssluhB3Q5RczbuXSYeSH5fczvkEnvMvkCyzGTaPTZhJIsCG9tNJZC8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441395; 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=rbeLcYv4ohkjdPq3n6XmS1TAfbnoqGUsUc4xgirKhzk=; b=D5QYk36LQbusEPUoUPVVpMBksVkH0XAuuJ9ZK6DIVZ9I6AapOGCRjDZedW3Erw1UNHTE5HtBdiTmAVQO5sbHkqQ0pMhVRlv+hMubb/HXNGg89j5R3604ZEdq5AfUhoEUI/UKcPa7llfJhuGnvLo9pkVE2euOvIil+kEeE2Jrx3s= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177244139515711.517610961556215; Mon, 2 Mar 2026 00:49:55 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyvU-0007KS-SO; Mon, 02 Mar 2026 03:46:53 -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 1vwyvJ-0006Xc-AT for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:41 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyvH-00022d-Hv for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:46:41 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-384-zo0JT0jmOEmuCUuUDFVI5g-1; Mon, 02 Mar 2026 03:46:37 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-48378df3469so28249745e9.1 for ; Mon, 02 Mar 2026 00:46:37 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfec46dbsm125560715e9.30.2026.03.02.00.46.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:46:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441199; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rbeLcYv4ohkjdPq3n6XmS1TAfbnoqGUsUc4xgirKhzk=; b=OHvySFDySIbrTtmYhTpafkieVShDEIgE7zd5Xh28ZgvJDQ0bp/1nFzejiYbXMgPK4VhU4q K6lbEenC2nBV9fATRFwDkwUnT2E23mPG01WD+dYIyXQMurGojNvDzfPNWdVBcxlEasQl4s M3m02R3We35cUglQE8gFKGhBM9PJUNM= X-MC-Unique: zo0JT0jmOEmuCUuUDFVI5g-1 X-Mimecast-MFC-AGG-ID: zo0JT0jmOEmuCUuUDFVI5g_1772441197 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441196; x=1773045996; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rbeLcYv4ohkjdPq3n6XmS1TAfbnoqGUsUc4xgirKhzk=; b=sOwn688FIaCxZRzJwbGD32Wvvt90+4ulYaQYzUoD6KnysGGqXZjkaNiheBOfM+aG9W +dEXrDqyn+XWIf21aguSvb9iv8YpCldExwvjP8k4hiC51J0Q63mEd/lw49m8vS8RUnPq nmx+eG3cdPOJjrsbtqio4q+j2rIYin0BNoBFh4tPpw/+TPFOOxoe/D4jP0rufZIJseNN R+0cA1X1sz14YXapWyXA8At69JhuuNGzk7ZRz+bDMwsDowQFeyozgcKdAhdP1iwFyd7v asiyFEwrH/zgekP0g6ON6hLouFljbH+HqLJR/Qx3dT7/Q19EOtbQX7ZmjBZ7XaBlA+VY OUfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441196; x=1773045996; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=rbeLcYv4ohkjdPq3n6XmS1TAfbnoqGUsUc4xgirKhzk=; b=wG7iL024uegFUiXFuDNXXX7qXc52yU3ppkPo9oJ/Ssgn/WsSBOkg6CM18qNcise6sY Tl9k+bUJGWsMfN3Nq0LUD1QfwwQlbWM7tqnj5yxbaUSX6j0TpK/KETUuawXhOtqseib6 ulmvb9F4b0tmDEpSBLXdFCLpQBUDk8pL2YdggRepD0ELkJJzTfgcKre/it2EdkCuYa7e Yi7/4uTg2l5Syu2pAxmO6f5dExNaqdQH9R/QRkYrs4elG38Nwl7GE/uBCmllfkw/8KO7 bq115LkRp8syAS29yJm1Q9jAUPKK1JsXKZBzgckHwCr3nuEWr9xqHeuTxFVVECo/5Qr8 UzKA== X-Gm-Message-State: AOJu0Yzo1y1qQY/t1H6IotWp3WKBme+SVXU4p6A3MFOOOZunNOVdkkVf JppTd3FsjKpx+CkS5feWKTyoS9Afu2NDbukmDTeJtvPONR4Mb7Ukd6dvzsAdg1X/afPjkAToz4B IzKp9TEVsqStY1JK7nNPDy0rjpI6M6JNVojnqVpC3q9+1QV85jVJln+vfH61k3VdPyYDy4Wlnc0 aMtjUJAkHZ5SKM4UrNzoLEYZcmLcDt+rD67nXit9DF X-Gm-Gg: ATEYQzxBaB6pG4D34MPY/9gYLM8UD7n8N9YYxYAsKWWjvONkuR70idTbyamqQMmyRbH NOhXaaZW7msnnCBPAg2XO6AmsClLnbNoH3Q6wGtuetgtYqjm26ZQcsPemLFid4a3rtaI5Yx88k2 P+ORFhliVoQeWStiQncquibMjD6Mzec+sGxAsviPb4K9hbzXxvq6GcQ82DAMXMwh8X1Vcdcb1Cy Hl33mje17rX5DL0xaGMIkFyY3ejR1Bx9ITvyZrERjRi61pFFMsmT7vuKZEgmhDh7oGYtFl9DnOC kEpzhHQTODE9nRrrm+KC6IHDNp+H2bPDiPFKO1NTsHuI9MQCRRJuNdrDPqgmgSzjAk+fZOnkN4n lagm06YJF38DePitNsGJSEhE6+upI6pbNK+zD44CTaDRKnhYVNxVLVU1OE4cB3qXJwozs35uaW6 RaBVmiB7joou0+N5u3F3wxMVKoDps= X-Received: by 2002:a05:600c:1549:b0:47e:e59c:67c5 with SMTP id 5b1f17b1804b1-483c990de68mr196761855e9.8.1772441195858; Mon, 02 Mar 2026 00:46:35 -0800 (PST) X-Received: by 2002:a05:600c:1549:b0:47e:e59c:67c5 with SMTP id 5b1f17b1804b1-483c990de68mr196761355e9.8.1772441195216; Mon, 02 Mar 2026 00:46:35 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 066/102] kvm/i8254: add support for confidential guest reset Date: Mon, 2 Mar 2026 09:43:01 +0100 Message-ID: <20260302084338.473368-67-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441396877158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha A confidential guest reset involves closing the old virtual machine KVM file descriptor and opening a new one. Since its a new KVM fd, PIT needs to be re-initialized again. This is done with the help of a notifier which is inv= oked upon KVM vm file descriptor change during the confidential guest reset proc= ess. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-26-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- hw/i386/kvm/i8254.c | 23 +++++++++++++++++++++++ hw/i386/kvm/trace-events | 1 + 2 files changed, 24 insertions(+) diff --git a/hw/i386/kvm/i8254.c b/hw/i386/kvm/i8254.c index 255047458a8..70e8fd83cd0 100644 --- a/hw/i386/kvm/i8254.c +++ b/hw/i386/kvm/i8254.c @@ -35,6 +35,7 @@ #include "hw/core/qdev-properties-system.h" #include "system/kvm.h" #include "target/i386/kvm/kvm_i386.h" +#include "trace.h" #include "qom/object.h" =20 #define KVM_PIT_REINJECT_BIT 0 @@ -52,6 +53,8 @@ struct KVMPITState { LostTickPolicy lost_tick_policy; bool vm_stopped; int64_t kernel_clock_offset; + + NotifierWithReturn kvmpit_vmfd_change_notifier; }; =20 struct KVMPITClass { @@ -203,6 +206,23 @@ static void kvm_pit_put(PITCommonState *pit) } } =20 +static int kvmpit_post_vmfd_change(NotifierWithReturn *notifier, + void *data, Error** errp) +{ + KVMPITState *s =3D container_of(notifier, KVMPITState, + kvmpit_vmfd_change_notifier); + + /* we are not interested in pre vmfd change notification */ + if (((VmfdChangeNotifier *)data)->pre) { + return 0; + } + + do_pit_initialize(s, errp); + + trace_kvmpit_post_vmfd_change(); + return 0; +} + static void kvm_pit_set_gate(PITCommonState *s, PITChannelState *sc, int v= al) { kvm_pit_get(s); @@ -292,6 +312,9 @@ static void kvm_pit_realizefn(DeviceState *dev, Error *= *errp) =20 qemu_add_vm_change_state_handler(kvm_pit_vm_state_change, s); =20 + s->kvmpit_vmfd_change_notifier.notify =3D kvmpit_post_vmfd_change; + kvm_vmfd_add_change_notifier(&s->kvmpit_vmfd_change_notifier); + kpc->parent_realize(dev, errp); } =20 diff --git a/hw/i386/kvm/trace-events b/hw/i386/kvm/trace-events index 67bf7f174ed..33680ff82bd 100644 --- a/hw/i386/kvm/trace-events +++ b/hw/i386/kvm/trace-events @@ -20,3 +20,4 @@ xenstore_reset_watches(void) "" xenstore_watch_event(const char *path, const char *token) "path %s token %= s" xen_primary_console_create(void) "" xen_primary_console_reset(int port) "port %u" +kvmpit_post_vmfd_change(void) "" --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441550; cv=none; d=zohomail.com; s=zohoarc; b=Is1LZAf7RxRbi8wudTY/LF6QqlSGmp+ZTYO2al4YtZKLanhxQjanPXjXXmhpfTF4wuCpcE8zFaFZ1/Ep+rLnZC4EiHQ7gCxm5mbvVpy64d4tuDUxN5+JgVyRMF7oW8MlbpOVK0QSC+LDlaXR61b/1a1NHgHWDFwdJ13D/rR2uII= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441550; 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=1r9QLGln9C+4G2u5qGPmBL69tbd+QKIMWgbB8spqDOA=; b=i4kXTNwH4veDNuok49hD8t96qBMlAR/P7T+CNa2PHRu1tSuND8IdBXSxNBgKQCSpRTfDG+BlrPFviqPkd+/baF9R09wYIypAZHxqUDsPHXVQs7isi2x/gt6W3XUE4nBKDDc+7x969yxcJziQ6ffUkHgELdWGAaapLiqfQ3wEZVU= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441550886424.4001281443906; Mon, 2 Mar 2026 00:52:30 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwywu-0003EI-6M; Mon, 02 Mar 2026 03:48:25 -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 1vwywX-0002xs-KH for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywV-0002AZ-6u for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:47:57 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-532-cRTb_gF8N3iLzBaLWCCj_A-1; Mon, 02 Mar 2026 03:47:52 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-483bcfdaf7dso39989085e9.0 for ; Mon, 02 Mar 2026 00:47:52 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcbf016sm199758555e9.5.2026.03.02.00.47.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:47:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441273; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1r9QLGln9C+4G2u5qGPmBL69tbd+QKIMWgbB8spqDOA=; b=DSKEhsuSJBRphOdD93PiRICTSdbPKX8+YIKj+lusxn+h7pOvrs8CFZBdFSUVQry0TOOwkM YHis9jrPOuMNv0B24OpzQUduTftjrAqBzYqPUKNcAyCkjBRNgjrPdfZ+snSYVSAqcJkTiG onP+BJwWSRDkVyj6knCcUR2ZK0OaCJA= X-MC-Unique: cRTb_gF8N3iLzBaLWCCj_A-1 X-Mimecast-MFC-AGG-ID: cRTb_gF8N3iLzBaLWCCj_A_1772441271 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441271; x=1773046071; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1r9QLGln9C+4G2u5qGPmBL69tbd+QKIMWgbB8spqDOA=; b=MR1wehTqUFee/z6PpBxC7jtNeoGbXYAkA+hAU8Qss858VjTKLVViHhV2UedapGoSan RIbSa/lS4JkAmPgZRFzDRGrUge20qnVkEK9OfnJfEbkT+kSpLqYrzDkN7eHL3DIDPJMn NIURxGmXCVeMdhY3C6bv7rbvBFSgFcKc1SJw3e2r/rPT1fn8tLaoVUyZMmJMeHgE4j7b xzfg/NjnyzYMRj39UucGBm4ZDTTXD8oJKpfFzsKdP0wkzAWU+pJwduweVhnrwaH1v5Mt s1ok0appBJJwTVqL/zyh7BJN30ayZaIN+eUJ9NhmHDl/XmY86D15wVEX1Fbo3OISbK+r Q6ZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441271; x=1773046071; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=1r9QLGln9C+4G2u5qGPmBL69tbd+QKIMWgbB8spqDOA=; b=Rata/VQ4d1dwl5f9BPE6nHLirrxXmAVUhtimy/46FDedIg9uZr+rho7eLVLwjKbNuM VWQtY2y3nRC6ku5TtVelbfU1cFRfKInuZVNEkZ3hbMaKci3GjPBkSzCGOvXRZ6S+GY/k ohtwAISjeP01MIUerqtpjGzvVgZ3UFkqBmfARrFQIhjxZu/W2qdcILTv7lkFQDiqevhr LbcmRaNeFZIWdXn/NEwkXbFkxKrV1/cb9XoXp3fy1y+nWWMNsWF5oruy+Y2HLhRiu88z Lq6zfNJc0t7WxkBaeH3ogy8QOgst+sqmbRffBR5BQrZZtvReBs/bjVrW/tHjZCQjby1Q kA4Q== X-Gm-Message-State: AOJu0Yx5HicVAk02teXHRrVdT5biTUCLWc3ZMmV6w2jBiu+sRptXSaJS 86JAV3NEpAUXAeU85LgWjxYrxih7uvcpXsrNdkmcpgiTdrJFJee8B84BlyOIYeww0N/0QfXmtDj //YNux2syOa572fppa7CbpZwDsWwK356F5bBUqX13YbbN8S/V7dXwIckhDNXIwkh/4Mlosp3CUV REhtl6GnUPiH4aLN7ijoOU4WToOjZvHbm/LhkZKdqj X-Gm-Gg: ATEYQzxvgXJGmGRiWnGTu5jHTparyAfHKKluz9nBNUfmdAz2sM7uqQI7+/cth+KDFj2 dp18sj2v8mGkPJrgnD0yiIZ+CRWSm67k5M45ZqjVhBCn6nYQi3V9SLVMJJewqeorD9X//TvMFuX wvLbgGNaA1+LXj2x5uh00ASCQckikF/R84aeU+4Zj9d2shn2ZsO95Ei5okdTgpFunQT4Y/bjQrj uCPr5tGKaStfu3IIYdz9SFMebyNOOKYggmPZKGqnrMyGK7I4/EN36uImIf0EnjWSJwaU0Am0um0 uFXeLTxyBhFpLJ+A5YvZWSvipccSxyxGsSR6mDLreTR8rqQRQYShZvYnv72Rs05RJ4EoHY9XS70 fqyB0+LauqhKQ9PUl500+SxmFxWKGPVbTNtPYo50LWGJinEhz8Z0ZnzuIQP2I+0pWUZqrMszk2R 0MhtJi7J0IPHiinjM3X0PE4FFSZe8= X-Received: by 2002:a05:600c:8b30:b0:483:afbb:a086 with SMTP id 5b1f17b1804b1-483c9c0e31amr188224395e9.29.1772441270959; Mon, 02 Mar 2026 00:47:50 -0800 (PST) X-Received: by 2002:a05:600c:8b30:b0:483:afbb:a086 with SMTP id 5b1f17b1804b1-483c9c0e31amr188223995e9.29.1772441270297; Mon, 02 Mar 2026 00:47:50 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 067/102] kvm/hyperv: add synic feature to CPU only if its not enabled Date: Mon, 2 Mar 2026 09:47:13 +0100 Message-ID: <20260302084749.474955-1-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441551628158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha We need to make sure that synic CPU feature is not already enabled. If it i= s, trying to enable it again will result in the following assertion: Unexpected error in object_property_try_add() at ../qom/object.c:1268: qemu-system-x86_64: attempt to add duplicate property 'synic' to object (ty= pe 'host-x86_64-cpu') So enable synic only if its not enabled already. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-27-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/kvm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 9d7a9ffceb8..7cfbc7832de 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -1761,7 +1761,7 @@ static int hyperv_init_vcpu(X86CPU *cpu) return ret; } =20 - if (!cpu->hyperv_synic_kvm_only) { + if (!cpu->hyperv_synic_kvm_only && !hyperv_is_synic_enabled()) { ret =3D hyperv_x86_synic_add(cpu); if (ret < 0) { error_report("failed to create HyperV SynIC: %s", --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441466; cv=none; d=zohomail.com; s=zohoarc; b=V4BlnxhOb2sNwsRct4UEbdHJseljH4+6Oxv4p8vNCKof9VjE+wtR7T2E8+4SmthwoqBJm7we8Znqh25bnghOMO7rBEzjSg0HM4LeG2PLoj/ozksTT+ZaraquI3DTQ9QofFE8bYJj7bmU/jiHRFMN3X5Bz74xFhXKYqFAlecXuL4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441466; 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=vsTvVrZLmqM52PWxCB6hO+fs/DKNlJZKBO6GuZlfP34=; b=MPIEcj2HKTklGM7TRVqf8f5q2UKeka5FmIGmP0EdmJ/KCR3ejBHEOzytKtkEJSIVlfE1zwKVRx34cd0xyrCNx55yjcz1mcoQ4khE3I+oZV2GvNJfj4xPUe+UoaJ5ldn3/t5NXkgGZrHRS7FSq8ta5y+W0D8N1RxVukLnPZQI02U= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441466145782.0855164758028; Mon, 2 Mar 2026 00:51:06 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyxB-0003GS-Ea; Mon, 02 Mar 2026 03:48:49 -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 1vwywY-0002xv-Vz for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywX-0002As-Eb for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:47:58 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-333-wUn_f-qcNOyIsEi_xmieOA-1; Mon, 02 Mar 2026 03:47:55 -0500 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-43997e095cdso2912616f8f.3 for ; Mon, 02 Mar 2026 00:47:55 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd68826asm631883135e9.0.2026.03.02.00.47.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:47:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441276; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vsTvVrZLmqM52PWxCB6hO+fs/DKNlJZKBO6GuZlfP34=; b=SDo6GpUPWBiqMS6kPqbvgWTF83CS9QemJb3NMlVhYdKsJTLxSFod012+PcbJ0FROKMQ9aT +KK6QrKT7FOnjsyiRgDE4bVz615dQiQyvwgDcuiU2MTXjxAvwlmOQy6eLZtFC3CQulDwCf Tzwm5Iy+Coiv+ED0YgquBawnHk94rBc= X-MC-Unique: wUn_f-qcNOyIsEi_xmieOA-1 X-Mimecast-MFC-AGG-ID: wUn_f-qcNOyIsEi_xmieOA_1772441274 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441273; x=1773046073; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vsTvVrZLmqM52PWxCB6hO+fs/DKNlJZKBO6GuZlfP34=; b=Wufefh9wr58mGS+UF5uwmdFIlQH15fQpPndNcAAbYzDOIJy0N6/F7HdVE0nBuFRbA5 QBJMFTHoyetbqy2FprHi2Y/6CDO3Ycvtag2QyhQei5Z71fLfUpHLWMKO642zrB4X97Po dwnseFRI53Gu2luQyOozOz6tDnEWwH7adDGVPyrP+R1xuizjHAYJ7/gJS321RJbfhFRd mTC86umkrLxpZWeH9nHVr5boY52bZDimWhZP2PrRwoRSWCHEE/f5Vr5U8oPewQeIY2oW ePO2wG+Tz2ne9iNr1FdxtooQ8OWFM88+6IMBsevDTQLLO7RW+m+cCuX/XbyCe8BMKFFm h1Mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441273; x=1773046073; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=vsTvVrZLmqM52PWxCB6hO+fs/DKNlJZKBO6GuZlfP34=; b=UgPbP4uune5AGUBQUPoGkoWNKWzyfc1KSWxw/W0aOh4bW/+EOS26+oV7ionyl5aQEo 2ShI+7PwRoUUejT6HX9g9FzSZE1FjJdhmyTxuiC7EmxNLJobrAb8AQRxRszrRVoPY6sw hMxWO0Tat5KfhAPTUoZpVh3v7UNHKC6oPE3q3YWYh5m+AfCzA+gkNynYd0OCSYyv+cO5 8gSHb6kbN9tFnqI+Kb58OG+e2vAIsZ6NtyxPI9b5TOUBDyiJruPlXeU3AstAj0LOYuit IlVVbNW1Tc9nmqVhSeeRnV+R/eMwS5GWPszgGt0Q2TFLEbjo+EACn/tynPDHwk9Cpo3z Ye5Q== X-Gm-Message-State: AOJu0YzShGcwzNADbmB82PDUu1+oNaUZFA2BmbaNmzGy5JZjSARwODBE cyF58G291nJ3nVY/yqGPerZoit6IN0S9gIYYVfuEp8YUGG7Db3EWaTDCbnXYzheE8YiIg8Ivbha JZfev1u6SM0t0/QYr7Z8MMHL1DHxh7BGZEntego4rXm6tKv4bNm5MnRO4vLBUx8H3cOKYv4jovB 5i5ZeqcUol/geeYPEPJzE8Me1uUUI+GZQT3St3BeYD X-Gm-Gg: ATEYQzzwLFgtA4YwyjIRRWaDq/5ErDoVISeOdP3Sy2NGoQkE3cc/sVpcUK52at0/ST6 4sEu+3cgBtJ8KjeXZWxb2PcDTqBKpBR2U7KocXKcclDtVXGUA0jFh4rQZ0mFUU3YL0DiNmyKEn0 HMjz0JfumsJU0MeW63xMglS5cZcQPtV1Hgkrd6KvcIRLpNPmWn/xFWFcEzDvNjA7nKyWbeQ7ceM uVKm2Y2T+9Ptjhh+v0zJyh8Cw85k8lQT15WuOQl0o4zKF4PPXq7vYM5RYWyfzlZvhCvQhRZ2D2R fll2zFSLG2ZijqrLBgMK8SMTKe0IeyhpSDTCWn0ADbIHke0lumBSmgNiz9RzuUmBusbNQ9S/b/j EcDxhaR0Qc4chji7dcwso1R8EwvU4rjh+6vxNP3s6RGOuy95JVEcH5auOL4FrirmBIUwT0Pvg1k AwIYj8jN9u6pd+rnbL9SLWKOAolNk= X-Received: by 2002:a05:600c:46c4:b0:483:7783:537b with SMTP id 5b1f17b1804b1-483c9c0f34cmr196582315e9.24.1772441273098; Mon, 02 Mar 2026 00:47:53 -0800 (PST) X-Received: by 2002:a05:600c:46c4:b0:483:7783:537b with SMTP id 5b1f17b1804b1-483c9c0f34cmr196581815e9.24.1772441272444; Mon, 02 Mar 2026 00:47:52 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , "Maciej S. Szmigiero" Subject: [PULL 068/102] hw/hyperv/vmbus: add support for confidential guest reset Date: Mon, 2 Mar 2026 09:47:14 +0100 Message-ID: <20260302084749.474955-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441467227158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha On confidential guests when the KVM virtual machine file descriptor changes= as a part of the reset process, event file descriptors needs to be reassociated with the new KVM VM file descriptor. This is achieved with the help of a callback handler that gets called when KVM VM file descriptor changes during the confidential guest reset process. This patch is tested on non-confidential platform only. Acked-by: Maciej S. Szmigiero Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-28-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- hw/hyperv/vmbus.c | 37 +++++++++++++++++++++++++++++++++++++ hw/hyperv/trace-events | 1 + 2 files changed, 38 insertions(+) diff --git a/hw/hyperv/vmbus.c b/hw/hyperv/vmbus.c index c5bab5d2452..64abe4c4c16 100644 --- a/hw/hyperv/vmbus.c +++ b/hw/hyperv/vmbus.c @@ -20,6 +20,7 @@ #include "hw/hyperv/vmbus-bridge.h" #include "hw/core/sysbus.h" #include "exec/cpu-common.h" +#include "system/kvm.h" #include "exec/target_page.h" #include "trace.h" =20 @@ -248,6 +249,12 @@ struct VMBus { * interrupt page */ EventNotifier notifier; + + /* + * Notifier to inform when vmfd is changed as a part of confidential g= uest + * reset mechanism. + */ + NotifierWithReturn vmbus_vmfd_change_notifier; }; =20 static bool gpadl_full(VMBusGpadl *gpadl) @@ -2347,6 +2354,33 @@ static void vmbus_dev_unrealize(DeviceState *dev) free_channels(vdev); } =20 +/* + * If the KVM fd changes because of VM reset in confidential guests, + * reassociate event fd with the new KVM fd. + */ +static int vmbus_handle_vmfd_change(NotifierWithReturn *notifier, + void *data, Error** errp) +{ + VMBus *vmbus =3D container_of(notifier, VMBus, + vmbus_vmfd_change_notifier); + int ret =3D 0; + + /* we are not interested in pre vmfd change notification */ + if (((VmfdChangeNotifier *)data)->pre) { + return 0; + } + + ret =3D hyperv_set_event_flag_handler(VMBUS_EVENT_CONNECTION_ID, + &vmbus->notifier); + /* if we are only using userland event handler, it may already exist */ + if (ret !=3D 0 && ret !=3D -EEXIST) { + error_setg(errp, "hyperv set event handler failed with %d", ret); + } + + trace_vmbus_handle_vmfd_change(); + return ret; +} + static const Property vmbus_dev_props[] =3D { DEFINE_PROP_UUID("instanceid", VMBusDevice, instanceid), }; @@ -2429,6 +2463,9 @@ static void vmbus_realize(BusState *bus, Error **errp) goto clear_event_notifier; } =20 + vmbus->vmbus_vmfd_change_notifier.notify =3D vmbus_handle_vmfd_change; + kvm_vmfd_add_change_notifier(&vmbus->vmbus_vmfd_change_notifier); + return; =20 clear_event_notifier: diff --git a/hw/hyperv/trace-events b/hw/hyperv/trace-events index 7963c215b1c..d8c96f18e98 100644 --- a/hw/hyperv/trace-events +++ b/hw/hyperv/trace-events @@ -16,6 +16,7 @@ vmbus_gpadl_torndown(uint32_t gpadl_id) "gpadl #%d" vmbus_open_channel(uint32_t chan_id, uint32_t gpadl_id, uint32_t target_vp= ) "channel #%d gpadl #%d target vp %d" vmbus_channel_open(uint32_t chan_id, uint32_t status) "channel #%d status = %d" vmbus_close_channel(uint32_t chan_id) "channel #%d" +vmbus_handle_vmfd_change(void) "" =20 # hv-balloon hv_balloon_state_change(const char *tostr) "-> %s" --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441718; cv=none; d=zohomail.com; s=zohoarc; b=HZJ6fZltkLJOB31gNq+VT4aCVY0AccuP3ZK+gK8PVaecIRrOzIm96jxZzPTzDpPv1ki8IOnLGLVwMnOzm2e6FrpzQ8doXvRYexrVB3nvL5BV+I6MeHYIIdQ8SbObbYRwWb2xB9G2kWxDJq6cQEheimhazUP/aCiZ6ZmFf12jicU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441718; 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=I7MpTZ6n0X6clHs3ciAfl46T8TcqxbVY4rtmYAJd8zU=; b=h3W3pkMwruPWK7oB5Lr4Fb7R4dNJCgz5xD4FO37q7J179hPJN+mui9vfBe5IxylfAZI5+XsPCcFuoAfWKiYAZFsJWqYf02cRBpILx2QUhNRu8GaFeDLWMERYjXHFlmsutJ5dqfhfQ9uUiRXa8y/9AxBpA8Myk6eCT9gQBWqsSJ4= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441718495510.19354198837254; Mon, 2 Mar 2026 00:55:18 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyxd-0003Ry-Da; Mon, 02 Mar 2026 03:49:06 -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 1vwywZ-0002y2-JC for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:10 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywX-0002Ay-Un for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:47:59 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-112-cbARj2anMoicMvLG2q6NLQ-1; Mon, 02 Mar 2026 03:47:56 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-483a2db68caso34677715e9.0 for ; Mon, 02 Mar 2026 00:47:55 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b34b6252sm9807533f8f.10.2026.03.02.00.47.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:47:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441277; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=I7MpTZ6n0X6clHs3ciAfl46T8TcqxbVY4rtmYAJd8zU=; b=jF86Y/xbO+Zeg8U7hTo/TuUi1YkXmxgc8kE0hONdOx393A0+KFB1RcEv1bl5yI53JAVpvV zAMNXDB0571zhQrmpzZV4/7q4r1pz+Bse61gQl65t0jAOO+9tY8DuJGz4F6bJ81kQXwwml vWbKvI+W/1A2mKiySbLUhF49Q7Oa3y0= X-MC-Unique: cbARj2anMoicMvLG2q6NLQ-1 X-Mimecast-MFC-AGG-ID: cbARj2anMoicMvLG2q6NLQ_1772441275 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441274; x=1773046074; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=I7MpTZ6n0X6clHs3ciAfl46T8TcqxbVY4rtmYAJd8zU=; b=qVhRbI08ir+/BM3Qnj25MePyWBhPiZRCof0nKMHI0BQSfM02sPOxfNQ/FhKm8AuuGq 6vwrNTB3SenPKEDw1j8aCgib1ugRj9SUyX60a9rTO5uxreFJ9wLt6SfTSCsKyq3x0Znx SPZakCP46Hu17dqDdhiCBC6nhyYtpHnf2x9gzncc9ygjT4O7Xqlk03MUhlxCET5S/DiG Sje3y3tVDkZ/P3OeW2AsmQq3dTJ715vXS3wUpZYtxPeheKfmR2sK+tygpVjJIW7KerDc JWhsPPI15gexmgTUtSUX68x13tn6UjKau6B90Zc8ImZJbca7YMnQX2r5ngdp7wxyFHYe 26zQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441274; x=1773046074; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=I7MpTZ6n0X6clHs3ciAfl46T8TcqxbVY4rtmYAJd8zU=; b=MMoC67Frq/ZVqY8fXo47bWDhZLF/zx7Ae8RqJcbKWh04foRZ5HYRA93MOKT/5TI0us +PxBAFXPF3Vbh9Q+z4X4yO2ZnSmfdngW7PAUIoxAnrlIA72C72EIIaburDI96Kmo++HE X+07A8Dyhb0UgUVQxdIQcGpG9b90C0nTCuvAaXpqBy0PD6eNSj4FlKz9bnpgsF6upbUz dzEAo5rrfGavz8y2LyKQaXkFa4f0xHIraG89TaBpziRxR6Rn+qjYBJRU2rzPlR9tkfBy TsSLTYyRJEVZZR9g4oW10iWnNJrc0059Ajnib2ekpCUuva2ZLaCsCJkRzLigDNHx1tBS nSzQ== X-Gm-Message-State: AOJu0Yx5b8I9VEmHg3wp0Q/Pd2YRLvZY3Q1fw+raNwNkHIxwI5Yf4LmQ 9NPv5tlCa3cvLbnVSU9lDlx9Z+GBHB/2wLCaMwR98dX/MV6Ul44wlll0mDEmI1vmoN5SNgSOvbB 642AOdCSq/Zgvtav4A1baQFzGCVArMBFZiSf751PfyfPrL4oOwy6Wbb/bYHnEOMau2/vzZg6GTN C4QKMM8rHXU0Qo5SpfYQdiRAjZKD0FcbglQ5Et38pG X-Gm-Gg: ATEYQzwYcD2U5DkIvQ6vgJjQn+VBAZzagOyln7A2HEbSz3X/UcArHVxKarlwCpQmYXC WODsBgoVKb7P0ji0Kgv4ZE13lI9xYrUbUaMCgwQDADW6nnOuz7lgn2jvbCPaX2p7Ba251HL6vk6 b7cT3R/3boFGwpsitaWEFI8TOZlJSun4htguAeGwD9c069u0PlHPfdojBqNKkylkXBKOc0x9PKz MMiV9jYb2tgCV4ktHj8UJdU7eovr1WhX/x3+Akxj85McmWv1q866qkP3/Wz2IMnfe2P3MJ+DwXx 5D79G7W0cnd0ZKoMT+O/t/QQv8tE85aO+T7erFbueHrWYiJT0BW/V4ljcV4H1pkWDguN9mjyWSM fonHrOBA4KVT0FDNYHiLEmxpEaC+RKrHtHsn+MxPxQxwTvRJ83ptMfU4R9MOVHXLI8Rh5ZVOHwt UMgLHPBvnt47TuOuMffJI7jEPkb70= X-Received: by 2002:a05:600c:3106:b0:483:6a8d:b2f9 with SMTP id 5b1f17b1804b1-483c9ba6165mr211725685e9.5.1772441274350; Mon, 02 Mar 2026 00:47:54 -0800 (PST) X-Received: by 2002:a05:600c:3106:b0:483:6a8d:b2f9 with SMTP id 5b1f17b1804b1-483c9ba6165mr211725215e9.5.1772441273866; Mon, 02 Mar 2026 00:47:53 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 069/102] kvm/xen-emu: re-initialize capabilities during confidential guest reset Date: Mon, 2 Mar 2026 09:47:15 +0100 Message-ID: <20260302084749.474955-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441720551158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha On confidential guests KVM virtual machine file descriptor changes as a part of the guest reset process. Xen capabilities needs to be re-initialize= d in KVM against the new file descriptor. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-29-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- target/i386/kvm/xen-emu.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 52de0198343..29364a92797 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -44,9 +44,12 @@ =20 #include "xen-compat.h" =20 +NotifierWithReturn xen_vmfd_change_notifier; +static uint32_t xen_msr; static void xen_vcpu_singleshot_timer_event(void *opaque); static void xen_vcpu_periodic_timer_event(void *opaque); static int vcpuop_stop_singleshot_timer(CPUState *cs); +static int do_initialize_xen_caps(KVMState *s, uint32_t hypercall_msr); =20 #ifdef TARGET_X86_64 #define hypercall_compat32(longmode) (!(longmode)) @@ -54,6 +57,23 @@ static int vcpuop_stop_singleshot_timer(CPUState *cs); #define hypercall_compat32(longmode) (false) #endif =20 +static int xen_handle_vmfd_change(NotifierWithReturn *n, + void *data, Error** errp) +{ + int ret; + + /* we are not interested in pre vmfd change notification */ + if (((VmfdChangeNotifier *)data)->pre) { + return 0; + } + + ret =3D do_initialize_xen_caps(kvm_state, xen_msr); + if (ret < 0) { + return ret; + } + return 0; +} + static bool kvm_gva_to_gpa(CPUState *cs, uint64_t gva, uint64_t *gpa, size_t *len, bool is_write) { @@ -111,7 +131,7 @@ static inline int kvm_copy_to_gva(CPUState *cs, uint64_= t gva, void *buf, return kvm_gva_rw(cs, gva, buf, sz, true); } =20 -int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) +static int do_initialize_xen_caps(KVMState *s, uint32_t hypercall_msr) { const int required_caps =3D KVM_XEN_HVM_CONFIG_HYPERCALL_MSR | KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL | KVM_XEN_HVM_CONFIG_SHARED_INF= O; @@ -143,6 +163,19 @@ int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) strerror(-ret)); return ret; } + return xen_caps; +} + +int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) +{ + int xen_caps; + + xen_caps =3D do_initialize_xen_caps(s, hypercall_msr); + if (xen_caps < 0) { + return xen_caps; + } + + xen_msr =3D hypercall_msr; =20 /* If called a second time, don't repeat the rest of the setup. */ if (s->xen_caps) { @@ -185,6 +218,9 @@ int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) xen_primary_console_reset(); xen_xenstore_reset(); =20 + xen_vmfd_change_notifier.notify =3D xen_handle_vmfd_change; + kvm_vmfd_add_change_notifier(&xen_vmfd_change_notifier); + return 0; } =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441400; cv=none; d=zohomail.com; s=zohoarc; b=cH74qYtMGoZS+jDPql8p/okkB8NzDHwu4Ykh6kZqoNbHLF8OBhzox25Cvfc01ANdcyg5SlFs6PZybCmEVK+mycSLn16mzQwTDKMP8SdB55qOoXSmrTUiSyr1oFo9dhSWkyfMNrg96Vs+NTPcnM0ivzbejfb2qUy+sSg4iD8Aed4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441400; 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=+pnyvYKCMWBnf4Ion4Ex8wWRWvcioehCx+DQUAzs2v8=; b=X4fAgF/cgWQfQdjzEtIQD/NY4OS9V4Y1qYOJ0dQNV6WP+quSpYOsUD83kUpyW18MrEzXchyKjkc2KC2vx+L1I2FEJVftx6Rb0IjaCi3vEGYMuQHrDbaskHTBQsjQsJ3zZ8W2VdJOp2xmHt/LMGQ5DvDEHiBIKAdu8VkeE33MQZY= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441400507104.6735071792815; Mon, 2 Mar 2026 00:50:00 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyxz-0003iD-4g; Mon, 02 Mar 2026 03:49:29 -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 1vwywc-0002zZ-VC for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:13 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywb-0002BW-7X for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:02 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-319-wivVyqvfMm-P_u_Qjc9UXw-1; Mon, 02 Mar 2026 03:47:59 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-48379489438so39512645e9.2 for ; Mon, 02 Mar 2026 00:47:59 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b89c99sm270202855e9.15.2026.03.02.00.47.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:47:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441280; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+pnyvYKCMWBnf4Ion4Ex8wWRWvcioehCx+DQUAzs2v8=; b=P8bAQ74H6vDYxn+aPQUSSTgca2t9UVnHJelRR06N8HdidxtpvUqZEWht8b1obw1d/+HfNR SDNAYEPOFlC5MlYDl9hzT1gxtXe0AR3EcTUl78yJek2ghzKKiwRtloxHJztctvsNtJ/jlg U9/h3UvE5GzGW6z7Ojw8ugIP4+BVml4= X-MC-Unique: wivVyqvfMm-P_u_Qjc9UXw-1 X-Mimecast-MFC-AGG-ID: wivVyqvfMm-P_u_Qjc9UXw_1772441278 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441277; x=1773046077; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+pnyvYKCMWBnf4Ion4Ex8wWRWvcioehCx+DQUAzs2v8=; b=DiQ7gueWdG2pJGaMtO7gkwu5DpFi2S/5fk2aCOsG/OOM2duUeSj/G3UNUJ2HdHjLle AIDyI5gsN3zQ/YA2BO6gJwRNQDvHZlIcdqNwbv9lMK7P6fpqVh28aVY9HWq6ih/TtXl0 QJvIYLlfUGJJhRq6qPadQaLfhJG38OGFtJuQ3wT10JDekBlaOLsQY6D5Q3EXh5TpP60w hCaia+xTz0HOjQlZdYpDCDmsYhsYrRgFIt7GCye2ofg/E/9OPolaqkspAl7+paZTHGvm zFQBXKTvgXD6nMs+mxZiiCFKUp2Vsm1561XAxEGpQpPtWgaTPu8NrtVh+0QjLTLIBvWj HAAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441277; x=1773046077; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+pnyvYKCMWBnf4Ion4Ex8wWRWvcioehCx+DQUAzs2v8=; b=H8LaTvLxlonGFYsD0+USv8G+g6xWXXHsedTJJl4B6u+HAQnkStGjtGadCaO33XYW7k 5JMXU66gRDMNznziTWleBTWMgjfIBsuKNgGybNefK437s+/VUIOKA4AVqBTYXKHEKruv tezitvVy0ljf9hqlX5DtZuYyliL5uZ6sxTEHuDod6qMCzgtyqCOklCJITKSYWT3hA8O8 ULMcURBzNZ57pQV6PtS3GiqHIkpYDzrnDdul9C+AhRPM0TeM8lrZdvKny8+T6SH5uumh wfExfUD2KY6PgaqLEbO5tmTcZSWO04Ms9Gq63VgMrVJOb0yS5q17O2gjRpQSFHJ9wb+y X/yg== X-Gm-Message-State: AOJu0YxKhS+CcxYz8mJMMutBDs06WCYguhrY8IY1hT6Ea0vDbnxj2+PG IzFPWFubNc98gCVOtgkA2zNDG+4/GVNPXbAq/FWNkMhcsVuCz9bHyRgKYUb5gw+YwR/1rqOou6I D6P5u+8VVpkZcXMalGeT8avdbQ46Bb9qBsQxtUQnAcU0iQtyuCc35y4Wv/qrg6sQ3ePRosOTCKA PvbAuIUEYAGcjh5EYWBqA3esJDm3lv4IPVY4A/+Hnr X-Gm-Gg: ATEYQzx8ZdeYZFlA/4/63bz2E4afpYTDvXO+pEPi1jOfKCVlGCR1wDiXIsMxEoXtrzD aP8LE+pJV5l6LOy5OJkoHw1Wj5zjWAQ4OlpSc4cEc0S0qiTn5ARZgeaYivInFh5frWeFuTKVteg OQu1v5b1oiuR4MXA0VkUFQFoZSxjHIHfjf9EZR+/THGReHeLhLiqsQRJV2clm5xlubm0inJh3uW CIcxTtYO2/EVGBpFZCpGqVoBdIgon/psUfcM4NJrfnOv7w6c85mPfahA114SSQ0TD3M6MN1NVs3 BSbUH80hxwn43+QG82FW6i2IhmJ8WgHa2dgr9Am9wS2iKMlPtuSVDEdxDi0uv0BZGT5tAMo6Kyz Aoe3reEJgoG2JwWP8W6MXAKicEv9qxxDQ/YqGsOK0JiSw5kGAaSui4yYk3cAPa3/U4BYqPVMc3W zcPIrU8jP1o1/9p8tNR+s6/oC3eqI= X-Received: by 2002:a05:600c:c04b:10b0:483:79a6:e7e1 with SMTP id 5b1f17b1804b1-483c9ba7e28mr143442945e9.7.1772441277156; Mon, 02 Mar 2026 00:47:57 -0800 (PST) X-Received: by 2002:a05:600c:c04b:10b0:483:79a6:e7e1 with SMTP id 5b1f17b1804b1-483c9ba7e28mr143442545e9.7.1772441276639; Mon, 02 Mar 2026 00:47:56 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Bernhard Beschow Subject: [PULL 070/102] ppc/openpic: create a new openpic device and reattach mem region on coco reset Date: Mon, 2 Mar 2026 09:47:16 +0100 Message-ID: <20260302084749.474955-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441400952158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha For confidential guests during the reset process, the old KVM VM file descriptor is closed and a new one is created. When a new file descriptor is created, a new openpic device needs to be created against this new KVM VM f= ile descriptor as well. Additionally, existing memory region needs to be reatta= ched to this new openpic device and proper CPU attributes set associating new fi= le descriptor. This change makes this happen with the help of a callback handl= er that gets called when the KVM VM file descriptor changes as a part of the confidential guest reset process. Reviewed-by: Bernhard Beschow Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-30-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- hw/intc/openpic_kvm.c | 112 +++++++++++++++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 24 deletions(-) diff --git a/hw/intc/openpic_kvm.c b/hw/intc/openpic_kvm.c index fbf0bdbe071..b099da20eb9 100644 --- a/hw/intc/openpic_kvm.c +++ b/hw/intc/openpic_kvm.c @@ -49,6 +49,7 @@ struct KVMOpenPICState { uint32_t fd; uint32_t model; hwaddr mapped; + NotifierWithReturn vmfd_change_notifier; }; =20 static void kvm_openpic_set_irq(void *opaque, int n_IRQ, int level) @@ -114,6 +115,88 @@ static const MemoryRegionOps kvm_openpic_mem_ops =3D { }, }; =20 +static int kvm_openpic_setup(KVMOpenPICState *opp, Error **errp) +{ + int kvm_openpic_model; + struct kvm_create_device cd =3D {0}; + KVMState *s =3D kvm_state; + int ret; + + switch (opp->model) { + case OPENPIC_MODEL_FSL_MPIC_20: + kvm_openpic_model =3D KVM_DEV_TYPE_FSL_MPIC_20; + break; + + case OPENPIC_MODEL_FSL_MPIC_42: + kvm_openpic_model =3D KVM_DEV_TYPE_FSL_MPIC_42; + break; + + default: + error_setg(errp, "Unsupported OpenPIC model %" PRIu32, opp->model); + return -1; + } + + cd.type =3D kvm_openpic_model; + ret =3D kvm_vm_ioctl(s, KVM_CREATE_DEVICE, &cd); + if (ret < 0) { + error_setg(errp, "Can't create device %d: %s", + cd.type, strerror(errno)); + return -1; + } + opp->fd =3D cd.fd; + + return 0; +} + +static int kvm_openpic_handle_vmfd_change(NotifierWithReturn *notifier, + void *data, Error **errp) +{ + KVMOpenPICState *opp =3D container_of(notifier, KVMOpenPICState, + vmfd_change_notifier); + uint64_t reg_base; + struct kvm_device_attr attr; + CPUState *cs; + int ret; + + /* we are not interested in pre vmfd change notification */ + if (((VmfdChangeNotifier *)data)->pre) { + return 0; + } + + /* close the old descriptor */ + close(opp->fd); + + if (kvm_openpic_setup(opp, errp) < 0) { + return -1; + } + + if (!opp->mapped) { + return 0; + } + + reg_base =3D opp->mapped; + attr.group =3D KVM_DEV_MPIC_GRP_MISC; + attr.attr =3D KVM_DEV_MPIC_BASE_ADDR; + attr.addr =3D (uint64_t)(unsigned long)®_base; + + ret =3D ioctl(opp->fd, KVM_SET_DEVICE_ATTR, &attr); + if (ret < 0) { + error_setg(errp, "%s: %s %" PRIx64, __func__, + strerror(errno), reg_base); + return -1; + } + + CPU_FOREACH(cs) { + ret =3D kvm_vcpu_enable_cap(cs, KVM_CAP_IRQ_MPIC, 0, opp->fd, + kvm_arch_vcpu_id(cs)); + if (ret < 0) { + return ret; + } + } + + return 0; +} + static void kvm_openpic_region_add(MemoryListener *listener, MemoryRegionSection *section) { @@ -197,36 +280,14 @@ static void kvm_openpic_realize(DeviceState *dev, Err= or **errp) SysBusDevice *d =3D SYS_BUS_DEVICE(dev); KVMOpenPICState *opp =3D KVM_OPENPIC(dev); KVMState *s =3D kvm_state; - int kvm_openpic_model; - struct kvm_create_device cd =3D {0}; - int ret, i; + int i; =20 if (!kvm_check_extension(s, KVM_CAP_DEVICE_CTRL)) { error_setg(errp, "Kernel is lacking Device Control API"); return; } =20 - switch (opp->model) { - case OPENPIC_MODEL_FSL_MPIC_20: - kvm_openpic_model =3D KVM_DEV_TYPE_FSL_MPIC_20; - break; - - case OPENPIC_MODEL_FSL_MPIC_42: - kvm_openpic_model =3D KVM_DEV_TYPE_FSL_MPIC_42; - break; - - default: - error_setg(errp, "Unsupported OpenPIC model %" PRIu32, opp->model); - return; - } - - cd.type =3D kvm_openpic_model; - ret =3D kvm_vm_ioctl(s, KVM_CREATE_DEVICE, &cd); - if (ret < 0) { - error_setg_errno(errp, errno, "Can't create device %d", cd.type); - return; - } - opp->fd =3D cd.fd; + kvm_openpic_setup(opp, errp); =20 sysbus_init_mmio(d, &opp->mem); qdev_init_gpio_in(dev, kvm_openpic_set_irq, OPENPIC_MAX_IRQ); @@ -235,6 +296,9 @@ static void kvm_openpic_realize(DeviceState *dev, Error= **errp) opp->mem_listener.region_del =3D kvm_openpic_region_del; opp->mem_listener.name =3D "openpic-kvm"; memory_listener_register(&opp->mem_listener, &address_space_memory); + opp->vmfd_change_notifier.notify =3D + kvm_openpic_handle_vmfd_change; + kvm_vmfd_add_change_notifier(&opp->vmfd_change_notifier); =20 /* indicate pic capabilities */ msi_nonbroken =3D true; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441801; cv=none; d=zohomail.com; s=zohoarc; b=J4+c0LBVBUlxI78Qyca9equ4jAF1mZCo6nyoTuvKkJ1qmeP/JSjdC8P3CV7eailnMbKRK7PyEPjoipEN2lawjcKqFVpjGtYOoFhwzQrE06Zi8RLCZTMlqdloOfuaW6ZO8wa0VC/OacsdAAYhwvKzU5fwFrMEd9pZ0K/Yk8VrxC0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441801; 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=vb8FQn3qqPMI5ex4Vc0fj/JZviKSQrKwDtnZxxtv6Kg=; b=WPtsmH4+5D7YqpVfjv1dRODceGnhnqVT8JdFgyrHx7x/7QNnV3xI0K9S5TejIHjrX5bRhJI4Pug/xY/c5kh2va9SZZcEg7vLnrBR9/XfBW6vHnsns+Ua/aNRUuOe0D6/FeUJDJSqqRLOEo+WLnM2T4P1n0TLiREzje4HtMmecG8= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441801738739.7591346956698; Mon, 2 Mar 2026 00:56:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyxg-0003WG-K7; Mon, 02 Mar 2026 03:49:09 -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 1vwywf-000304-5k for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:13 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywd-0002Bo-G5 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:04 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-270-VZYPpxb7NPaSm-qQXhPbWw-1; Mon, 02 Mar 2026 03:48:02 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4836bf1a920so44043445e9.3 for ; Mon, 02 Mar 2026 00:48:01 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c35910f1sm225380315e9.2.2026.03.02.00.47.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:47:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vb8FQn3qqPMI5ex4Vc0fj/JZviKSQrKwDtnZxxtv6Kg=; b=RnVhR9pwDnPN4344mWZ1zjxSLFcRi2gK4urQAJ6m1v83P9z2laPydsppFH87N+JUJOpCxC 96t7x0FWXa9LmMf2Ro3Dt8GVASKhfxF35YxtfKNOaeiXokSsdx19vn0qxp8UPoqdudcq/e pIcNuYI1oAmiwVm10intgioFIziNfSA= X-MC-Unique: VZYPpxb7NPaSm-qQXhPbWw-1 X-Mimecast-MFC-AGG-ID: VZYPpxb7NPaSm-qQXhPbWw_1772441281 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441280; x=1773046080; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vb8FQn3qqPMI5ex4Vc0fj/JZviKSQrKwDtnZxxtv6Kg=; b=qGZnWeWFnufY5St0/cS7JMhOgti243XDMzrPxgjs4zD5QTYWxMu0eS294U678/vk8Z zsGS2VC23hVL8k/wVcyR8c0SI3R4CeZ74a7BMEtq/G0kMD3hYphSQfC+knrFxNZN64nK MPP5k1dNEyDSbFyAC7qH7T3nM3+NGLPsTxbTn/zScylLcUxce7bJfjOGLo52YupnnOjZ UjeRDyw1pO7wCY7uItTQsc9hCpV264DJYltiyrMG6sZq4O/H1FejAM0m2eB0iWfCxWhx aOxLEeFKAIENPXGKq2BxDTXfv+zrY+ZhMJFEbVexZDV/N7UCWYzbu9fsnMZwDiTOEhA+ zuoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441280; x=1773046080; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=vb8FQn3qqPMI5ex4Vc0fj/JZviKSQrKwDtnZxxtv6Kg=; b=XSqA/Afc3krHsXC7DwA51KlRaUhJN6KNJ98ATMgEGXRyknzoaAJ8AzYdBICFPMoxnQ S56WerLzVLbnRXuFgGgxcpcsQYRPWcTUN5LrwQG4qiS/+BtTurcqGWiz2Nt5R6ZxAVvH 4uGDMqUCbseOG1K0lqoGa0/UQrhLCk6ZAgPE7xFYFZZm2sztJU52mApMF3hEgmGU8WXL O60RYCqIMJvKksWmJ/BNFKb5HGjYLEYY+d2EP/ywESJprWlsmOb+YC9emJeFliy+lUbk 9S6naFcr2+vFImltA9MtTHkRcQgWj4nqqnXvf6zhjW3bgrP7irT5D8odLkkngCA9bBqZ 7SeA== X-Gm-Message-State: AOJu0YzORn1Ikf4LUBLpSurSiTRRWPEu2wrSXkqebmQq6jm3YwOMEMlv /HBBYqW/OdpCPvLl79c3uC62uGIHpD3OlNEb1Tq9cpoXuf2Y+uaHF/gp9aR6e1/x0I30yQH8b14 top5iYwXFXDWwXr7k9IbctJP0dtVs6eBagar1WDYlLnsah6D0SEAAXHQMfCxs8NufvhLfwpaip9 q0K+QS3CE5vUDCXFV7CL3RD5G3YmXnxcytuOBMuqQr X-Gm-Gg: ATEYQzy8VrWRG47nqt1lLh/mxTrdvhJOHq1vHs8FTJK8FsfVHj7pP4SFZNplOqQTmQV 0nrbrg1hiY2z+8nCEvGdSDe+yNynWvW6/IjAZS5YtCu+JzXCSj8BxpuEgyzZMDd3XFV0o1IP77s pih3/p4u5+fjiCMc62ZHxV3ZBImyYNhn5n7t+pHLotbcHxsj1IZUB9HpOje8NO5WJuyTDeqoLFg M3qrbwgNod0ZYfXGM9xWL5Q1G3VtxRE2z5X8yWmjtu3CLeRYZOpR4sfO6/gDx6TvIk2z7Z8rK8U IRgXyCcyorFpmJSqs38ayBCCeN+VFrfPkVBiIm9TQXqBXlgblz3I0KNbQNI5GDMQj6BLx273BB/ XA/r8JbShP6WXzjRPJNY7CW2U1nnGcCR9YE9RcwRi7J09LXoSP+h9veCpu8YgyU/xAZZjxzwsV4 7TCUVTFeMxwjKtAQfrr/QUItdTtWM= X-Received: by 2002:a05:600c:4e56:b0:477:5cc6:7e44 with SMTP id 5b1f17b1804b1-483c9b9eaddmr204329335e9.11.1772441279721; Mon, 02 Mar 2026 00:47:59 -0800 (PST) X-Received: by 2002:a05:600c:4e56:b0:477:5cc6:7e44 with SMTP id 5b1f17b1804b1-483c9b9eaddmr204328775e9.11.1772441279110; Mon, 02 Mar 2026 00:47:59 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 071/102] kvm/vcpu: add notifiers to inform vcpu file descriptor change Date: Mon, 2 Mar 2026 09:47:17 +0100 Message-ID: <20260302084749.474955-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441802951158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha When new vcpu file descriptors are created and bound to the new kvm file descriptor as a part of the confidential guest reset mechanism, various subsystems needs to know about it. This change adds notifiers so that vario= us subsystems can take appropriate actions when vcpu fds change by registering their handlers to this notifier. Subsequent changes will register specific handlers to this notifier. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-31-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- include/system/kvm.h | 17 +++++++++++++++++ accel/kvm/kvm-all.c | 26 ++++++++++++++++++++++++++ accel/stubs/kvm-stub.c | 10 ++++++++++ 3 files changed, 53 insertions(+) diff --git a/include/system/kvm.h b/include/system/kvm.h index fbe23608a16..4b0e1b4ab14 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -590,4 +590,21 @@ void kvm_vmfd_add_change_notifier(NotifierWithReturn *= n); */ void kvm_vmfd_remove_change_notifier(NotifierWithReturn *n); =20 +/** + * kvm_vcpufd_add_change_notifier - register a notifier to get notified wh= en + * a KVM vcpu file descriptors changes as a part of the confidential guest + * "reset" process. Various subsystems should use this mechanism to take + * actions such as re-issuing vcpu ioctls as a part of setting up vcpu + * features. + * @n: notifier with return value. + */ +void kvm_vcpufd_add_change_notifier(NotifierWithReturn *n); + +/** + * kvm_vcpufd_remove_change_notifier - de-register a notifer previously + * registered with kvm_vcpufd_add_change_notifier call. + * @n: notifier that was previously registered. + */ +void kvm_vcpufd_remove_change_notifier(NotifierWithReturn *n); + #endif diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index a347a71a2ee..a1f910e9dff 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -127,6 +127,9 @@ static NotifierList kvm_irqchip_change_notifiers =3D static NotifierWithReturnList register_vmfd_changed_notifiers =3D NOTIFIER_WITH_RETURN_LIST_INITIALIZER(register_vmfd_changed_notifiers); =20 +static NotifierWithReturnList register_vcpufd_changed_notifiers =3D + NOTIFIER_WITH_RETURN_LIST_INITIALIZER(register_vcpufd_changed_notifier= s); + static int map_kvm_run(KVMState *s, CPUState *cpu, Error **errp); static int map_kvm_dirty_gfns(KVMState *s, CPUState *cpu, Error **errp); static int vcpu_unmap_regions(KVMState *s, CPUState *cpu); @@ -2314,6 +2317,22 @@ static int kvm_vmfd_change_notify(Error **errp) &vmfd_notifier, errp); } =20 +void kvm_vcpufd_add_change_notifier(NotifierWithReturn *n) +{ + notifier_with_return_list_add(®ister_vcpufd_changed_notifiers, n); +} + +void kvm_vcpufd_remove_change_notifier(NotifierWithReturn *n) +{ + notifier_with_return_remove(n); +} + +static int kvm_vcpufd_change_notify(Error **errp) +{ + return notifier_with_return_list_notify(®ister_vcpufd_changed_notif= iers, + &vmfd_notifier, errp); +} + int kvm_irqchip_get_virq(KVMState *s) { int next_virq; @@ -2841,6 +2860,13 @@ static int kvm_reset_vmfd(MachineState *ms) } assert(!err); =20 + /* notify everyone that vcpu fd has changed. */ + ret =3D kvm_vcpufd_change_notify(&err); + if (ret < 0) { + return ret; + } + assert(!err); + /* these can be only called after ram_block_rebind() */ memory_listener_register(&kml->listener, &address_space_memory); memory_listener_register(&kvm_io_listener, &address_space_io); diff --git a/accel/stubs/kvm-stub.c b/accel/stubs/kvm-stub.c index a6e8a6e16cf..c4617caac6b 100644 --- a/accel/stubs/kvm-stub.c +++ b/accel/stubs/kvm-stub.c @@ -87,6 +87,16 @@ void kvm_vmfd_remove_change_notifier(NotifierWithReturn = *n) { } =20 +void kvm_vcpufd_add_change_notifier(NotifierWithReturn *n) +{ + return; +} + +void kvm_vcpufd_remove_change_notifier(NotifierWithReturn *n) +{ + return; +} + int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n, EventNotifier *rn, int virq) { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441580; cv=none; d=zohomail.com; s=zohoarc; b=mVmfGUnWCftnhzU/FrozIQlIzHrnqqNZkJomHHNJnR7KzyuYUADKl9WtA4Vzsle9Ye89FcyjAog9ZeO9yh7v/uSWyctBOLva5xrqQcz/ml+g3hI7WwdMs8Pkr4oAduguFmzHiMlyoIT6oZ5V3ezhSBKS3Eq8yfu1VFG75o4r26U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441580; 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=lf9ln4fDB+klofdkPzt3BwiZ9o6T3crhXTHxnN7KCrQ=; b=m3m7Tko6O2tRaxtyP4PgsjGM49IkjF8qlcDVbL8bV4HK+o7kT9ef0HbnW9DCF9G2sE0WKjAcpCm04eHC8qTrDYBJDTxN7+2wPHcCE79wHToFhxCyGOFMol/fB+QjlMZcAy/LtTpBpxc/TmCmftL6Mkxf00gfcKd+0bXwFqeywX4= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441580243630.0381846823796; Mon, 2 Mar 2026 00:53:00 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyxd-0003S1-Dg; Mon, 02 Mar 2026 03:49:06 -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 1vwywm-00036F-AL for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywh-0002C4-DM for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:09 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-103-WOQBHiACPryIV4WU0iXEvw-1; Mon, 02 Mar 2026 03:48:05 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-483786a09b1so41313415e9.3 for ; Mon, 02 Mar 2026 00:48:05 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfbb6d16sm181606995e9.5.2026.03.02.00.47.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441286; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lf9ln4fDB+klofdkPzt3BwiZ9o6T3crhXTHxnN7KCrQ=; b=PT2FI+VYK+Hvu0He9fJOTkaSKiBUiQ7uPD4jfcqn2qgY40B8H384XBRAq1pq/P67DdEf+X ZqyYjWoPDiBT6sDPjRgraxkAiGXsc19PNeKiqME6TDl+FhJKr8UrAJbCo4Tk3B4DF8x1SM y4e75X3HjA1paD6fB9kYxgeVUeL0MOQ= X-MC-Unique: WOQBHiACPryIV4WU0iXEvw-1 X-Mimecast-MFC-AGG-ID: WOQBHiACPryIV4WU0iXEvw_1772441284 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441283; x=1773046083; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lf9ln4fDB+klofdkPzt3BwiZ9o6T3crhXTHxnN7KCrQ=; b=ocJgi3arzWoVUUH2aVQR2BtAhndwv3wdgoWumXY9TPy5VJs7i+OpG4yfQ+CHqrzlHJ BNcanCPJyXCMxKzskUCw2+eF7gGkRJvBE9YPaCyqfoH7EsNfMrRvChq9Er5Jhu4ZI+06 wpqix4OO7N1jR2A7lKi+ZIQiJZPRAMuWCqaFQgR/nw8s29Zs+PO8JEGbhm2Sff+7mWdY aEaS6IQ2cp7ZG9Av0+Dtk6Ak7ZkvGROgh4umJi/QYSboOjQ+6zmTvZcJcQUdjhBuHvLB GfJkrVIa6AJrkTbw0reAzdkhWpBGjN08CK8GZ3gTYz9c01kpaiU2Xt0gw9TajVp6FCS6 ZK1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441283; x=1773046083; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lf9ln4fDB+klofdkPzt3BwiZ9o6T3crhXTHxnN7KCrQ=; b=JPTbFJgzDFy7XILCzrfLoaL6hNxmlHLuuYpQVfSB2aMsrnvNX/ogCHy9J0jHpJLw2L 0Cdudqd9SY0Cgdtp6JigiLqOWBZHOnk4HBm7R3UW5ZwdBJHnAEk2mz+8VcYI55v+56xX vARg/qWq2CmWgplv2lS8ysIejHvQA6mj+sHJLv+CTFmDkFB4cKCNFyMnW1Ma9MqQ2Qdn qhjTZ2hZQ4ofB3aJKXB4GfZX1QuKe1Gogtf+DXP55EIGsleXKW1bn3Pj762xBFqF4D+b RD3IYQbhwmzXkl8prIv1q9XM35yHdBXv30DzlELHm99fFXVr9nz5tYIpMakVjKMqpLbc mLFA== X-Gm-Message-State: AOJu0Yy6YwRU0hUlDy42WiSvvgtiuksEY3qOfqHtG9kHAAxa/VBMxbeS Yl/EkfGzRgC8LCIhob+9bfboTmPc0pUHVJTuVXvjZEO4A/Bgkmie6yI1arX7Nr/Zfh4xHg1gsgf V3PiSQ8kmMU4tImLBESDP6TmsGGGIYqd4ljJ6o2V7KeH2azoIf+QNjDTaOPnqR3utSuLMl8qa43 SX7eZDi+/46JbP9v9hN13minTS9ByxkMH5CuRpCfAM X-Gm-Gg: ATEYQzxTLKrZEAl9cqrmbkpnL1/R97fWInvohMRAo5/AdqReuQ4fbQEaUk7h/61qqsf ADi9xlocv+QLPE9Yojwp5K9gKTy+vp+ASftWCpFOEemkLzUkhjz4ZMGze7zat1cV8W4byoiMcXe tnAGDPQZPpWG1AnzBYlH9mBg/++5mjJRU5LiqAOKpyPIHm2/gZ0I7/NL1sA8hDVqaeM/qyuK1zN 8zVKVohJX/sMuJFMS/Ne8QKot1gz9JYYgeZVjQRkAAxhrQbBQr1Cx+8UwoQ2WrU5vWyMe+KJSqS 9MSdrDqiXyouj1S+bKTqQck71Vq19T07fKcH9V5va3231cEJzEgJQIBp9EF8/XC5meC8oUHULC+ pETC7uD+kVAX1Wqqzz5hAmnRzt2/U1vByUXdKaSrlAPTRLj7JgYXVfoebiZ4V24nwPwLllH86Za DDGwLDAXO3VxVYj0nQRUt50ju0rIg= X-Received: by 2002:a05:600c:138d:b0:483:361b:deff with SMTP id 5b1f17b1804b1-483c9bb2c10mr200511835e9.14.1772441283274; Mon, 02 Mar 2026 00:48:03 -0800 (PST) X-Received: by 2002:a05:600c:138d:b0:483:361b:deff with SMTP id 5b1f17b1804b1-483c9bb2c10mr200511425e9.14.1772441282741; Mon, 02 Mar 2026 00:48:02 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 072/102] kvm/clock: add support for confidential guest reset Date: Mon, 2 Mar 2026 09:47:18 +0100 Message-ID: <20260302084749.474955-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441581820158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha Confidential guests change the KVM VM file descriptor upon reset and also c= reate new VCPU file descriptors against the new KVM VM file descriptor. We need to save the clock state from kvm before KVM VM file descriptor changes and res= tore it after. Also after VCPU file descriptors changed, we must call KVM_KVMCLOCK_CTRL on the VCPU file descriptor to inform KVM that the VCPU is in paused state. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-32-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- hw/i386/kvm/clock.c | 59 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c index aba6842a22c..10d34254f02 100644 --- a/hw/i386/kvm/clock.c +++ b/hw/i386/kvm/clock.c @@ -50,6 +50,9 @@ struct KVMClockState { /* whether the 'clock' value was obtained in a host with * reliable KVM_GET_CLOCK */ bool clock_is_reliable; + + NotifierWithReturn kvmclock_vcpufd_change_notifier; + NotifierWithReturn kvmclock_vmfd_change_notifier; }; =20 struct pvclock_vcpu_time_info { @@ -63,6 +66,9 @@ struct pvclock_vcpu_time_info { uint8_t pad[2]; } __attribute__((__packed__)); /* 32 bytes */ =20 +static int kvmclock_set_clock(NotifierWithReturn *notifier, + void *data, Error** errp); + static uint64_t kvmclock_current_nsec(KVMClockState *s) { CPUState *cpu =3D first_cpu; @@ -219,6 +225,54 @@ static void kvmclock_vm_state_change(void *opaque, boo= l running, } } =20 +static int kvmclock_save_clock(NotifierWithReturn *notifier, + void *data, Error** errp) +{ + if (!((VmfdChangeNotifier *)data)->pre) { + return 0; + } + KVMClockState *s =3D container_of(notifier, KVMClockState, + kvmclock_vmfd_change_notifier); + kvm_update_clock(s); + return 0; +} + +static int kvmclock_set_clock(NotifierWithReturn *notifier, + void *data, Error** errp) +{ + struct kvm_clock_data clock_data =3D {}; + CPUState *cpu; + int ret; + KVMClockState *s =3D container_of(notifier, KVMClockState, + kvmclock_vcpufd_change_notifier); + int cap_clock_ctrl =3D kvm_check_extension(kvm_state, KVM_CAP_KVMCLOCK= _CTRL); + + if (!s->clock_is_reliable) { + uint64_t pvclock_via_mem =3D kvmclock_current_nsec(s); + /* saved clock value before vmfd change is not reliable */ + if (pvclock_via_mem) { + s->clock =3D pvclock_via_mem; + } + } + + clock_data.clock =3D s->clock; + ret =3D kvm_vm_ioctl(kvm_state, KVM_SET_CLOCK, &clock_data); + if (ret < 0) { + fprintf(stderr, "KVM_SET_CLOCK failed: %s\n", strerror(-ret)); + abort(); + } + + if (!cap_clock_ctrl) { + return 0; + } + CPU_FOREACH(cpu) { + run_on_cpu(cpu, do_kvmclock_ctrl, RUN_ON_CPU_NULL); + } + + return 0; +} + + static void kvmclock_realize(DeviceState *dev, Error **errp) { KVMClockState *s =3D KVM_CLOCK(dev); @@ -230,7 +284,12 @@ static void kvmclock_realize(DeviceState *dev, Error *= *errp) =20 kvm_update_clock(s); =20 + s->kvmclock_vcpufd_change_notifier.notify =3D kvmclock_set_clock; + s->kvmclock_vmfd_change_notifier.notify =3D kvmclock_save_clock; + qemu_add_vm_change_state_handler(kvmclock_vm_state_change, s); + kvm_vcpufd_add_change_notifier(&s->kvmclock_vcpufd_change_notifier); + kvm_vmfd_add_change_notifier(&s->kvmclock_vmfd_change_notifier); } =20 static bool kvmclock_clock_is_reliable_needed(void *opaque) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441826; cv=none; d=zohomail.com; s=zohoarc; b=IhA8Tfx7BEenUWFOdoArUZNLHartyhHT+tyxZbGOhjItEuPjagv6g/l336/Xr3gMzZPqNcvUzsBaR2ECgYxv4xxjEoecvro4PDJkrhBtfg84NocNNin5z1cetlBlkuPk9wD8gaNZSVxxRXrpXxyDW1ZkMF2qHpyan9QV4/7za5w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441826; 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=kg1engNtyMV3kTVfmApLjzUVlhNQADpL4hckAHLG4iw=; b=IYojOFgSxILCBrIcPghaOah9rGW/tdiHQZbZiRjqvlo+o9nw58nBot+Yfn5Zds8XlJVxrCm2c6Go6ZgbuYk9hsAMnVVtMpannAzFBBoXzGvio8qekvYPXdkftYJAutq1ivdMeO3+HNt8BqDf9JrZOCv2Dyn0wGxwAK24Ih1Rrdo= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441826794126.09354901796064; Mon, 2 Mar 2026 00:57:06 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyyR-00041p-7N; Mon, 02 Mar 2026 03:49: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 1vwywn-00036K-Ph for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywl-0002CE-Ob for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:13 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-594-KuTQhitgPnOGPLx7lhbqHg-1; Mon, 02 Mar 2026 03:48:07 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4836cf00787so48208365e9.1 for ; Mon, 02 Mar 2026 00:48:07 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439ad3daf89sm26345480f8f.20.2026.03.02.00.48.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441288; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kg1engNtyMV3kTVfmApLjzUVlhNQADpL4hckAHLG4iw=; b=hNEQrfGQLO7Tci6/DvBRBhaY7i15o47jsF0mmJCHU0AZz6ldJxDrmM02gUaOSPu5Ts7ckN K4LkD7pI/JDQ164OLalC/9wnknNSfzmdbKpxgKKJi/TfKMQ5l4AyJwPSKSgcYTewXdHMVl 0edTWBTimBGVV93rE4hFyMCvFQ+tvV8= X-MC-Unique: KuTQhitgPnOGPLx7lhbqHg-1 X-Mimecast-MFC-AGG-ID: KuTQhitgPnOGPLx7lhbqHg_1772441286 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441285; x=1773046085; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kg1engNtyMV3kTVfmApLjzUVlhNQADpL4hckAHLG4iw=; b=r9KUAltFxfF4cyXFSHUslu6SojfeKCnox0h29uSNkeNXcyGRC0tdYXuDHefm3NanB4 X/sokjBRgu8PkU3HE9F4VBF9ty8VaDNgzjbmhP1Ml7v3c6ut1/xclchIMZwPa6dDQkKF HjHcU1/curoEllVSwN+5pdmL2xae57rYlZboo3rBTWZR9GFuVkSGg8k2+XbRCBaIm/w4 n4LJ7EL0FdARyeUC/0O6/RTHE5uKXENWqihD0P725/mlIxcZaLLVO9E6g7DbELWGzWum lVoDqywbnveMQu0jngeHTHQPENd/737fON2WqMbVydbzzPP5O/hW6dAiCoRmrb+e1E8E peqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441285; x=1773046085; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kg1engNtyMV3kTVfmApLjzUVlhNQADpL4hckAHLG4iw=; b=aFwxY13KEBFTUmy2uVF9AtOdp80RlA0R9OIjXAw+hQJu/A1DgNeHstOZ0/5bMnmPYk DwBAUSIBIJASBFGUiXk243h3oyRZvLPv/kbEB7g/yFwDnM6UIHx6mY7Oj7/gKic+iIK5 z3QF6t5iz3GuGjgcOAOu1W+gogwElUv7JJ3CEiJr0pH0yQ+9LFx+3X7lC46joRSnaGe3 G5vhmGI2utz60i0uoIVtnDwvOj/az7oumukTiAwfOzPmZHuvDKk7MxDbOXCsofKxh1oB +A20NuP3V/+rk1Jh2rjwCMHgMUCNDsYeFv4IIw8eHYard9GloBCdUPpY3FY8GlBFu5Xu jLVA== X-Gm-Message-State: AOJu0Yz0bOgRRqnWBNEtMjQQuStcozsWkEsRnI5q6QqpxhgaA+Y3S8pr GLT94udsnbSLvuGIbrGtEdqZXnlfQhNTAW5GZs05z7dRCcW3+oit9rRCaUwF+KcAkKJmbOcUEXC zQu1jgI6bTxZ+6YPCS/YuY79VeWSjdyWCT1DY3iOUSA899L4OjpFVpmEXnmNg/tzag+43cYgIo+ xxmofi1fW8V2DzMllwO+jV1pSM9KJOyTz1/t4dlbdl X-Gm-Gg: ATEYQzwyJ+v111Fgv8eVClXxI7YBelvdVmEQnSfVbB/vYger9d+0uGeu1uz0JbuhTb5 tVUMxQBxUY1s4HblYnqz+MfsqZD75VEaIYqeg3dEeHprErOTXcD0Rfs+dHv8jaP8kwTHapZvC2h ARkaCLUXiUCwc+78GonOMAg/KimLTkoQh0hIZ0Es/opgVK5ZwK6d4n3KA2QGXR24EaXHobQaT1W Xhyh8UlxxFCLEb2YYHWNdkj/eQMFms8/kGVqjJ8dbAqCwwosxj7raUYZHqvO7aZIdw3iTgGkrwo W6T1u/rrocSlqhXrSdUVpV4dMKcBticFvqapzqBBqiQfXxx37jfLB+B4NKEIkblBTRJwalA9pID 6T8Ai+YLkcEoaAuxzE5p7/zgD/a6LZ08gp1pu0BJ7Z+I7Aos98fa1PVD+6fvnVQTSC0XvYWlWBT ToxIO9pUqU/B1/8t50nk0rzeOGkm8= X-Received: by 2002:a05:600c:3544:b0:47a:8383:f2b2 with SMTP id 5b1f17b1804b1-483c33f3357mr257777595e9.17.1772441285513; Mon, 02 Mar 2026 00:48:05 -0800 (PST) X-Received: by 2002:a05:600c:3544:b0:47a:8383:f2b2 with SMTP id 5b1f17b1804b1-483c33f3357mr257777105e9.17.1772441284990; Mon, 02 Mar 2026 00:48:04 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 073/102] hw/machine: introduce machine specific option 'x-change-vmfd-on-reset' Date: Mon, 2 Mar 2026 09:47:19 +0100 Message-ID: <20260302084749.474955-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441827026158500 Content-Type: text/plain; charset="utf-8" From: Ani Sinha A new machine specific option 'x-change-vmfd-on-reset' is introduced for debugging and testing only (hence the 'x-' prefix). This option when enabled will force KVM VM file descriptor to be changed upon guest reset like in the case of confidential guests. This can be used to exercise the code changes that are specific for confidential guests on non-confidential guests as well (except changes that require hardware support for confidential guests). A new functional test has been added in the next patch that uses this new parameter to test the VM file descriptor changes. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-33-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- include/hw/core/boards.h | 6 ++++++ hw/core/machine.c | 22 ++++++++++++++++++++++ system/runstate.c | 6 +++--- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/include/hw/core/boards.h b/include/hw/core/boards.h index edbe8d03e56..12b21493789 100644 --- a/include/hw/core/boards.h +++ b/include/hw/core/boards.h @@ -448,6 +448,12 @@ struct MachineState { struct NVDIMMState *nvdimms_state; struct NumaState *numa_state; bool acpi_spcr_enabled; + /* + * Whether to change virtual machine accelerator handle upon + * reset or not. Used only for debugging and testing purpose. + * Set to false by default for all regular use. + */ + bool new_accel_vmfd_on_reset; }; =20 /* diff --git a/hw/core/machine.c b/hw/core/machine.c index d4ef620c178..eae1f6be8d5 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -435,6 +435,21 @@ static void machine_set_dump_guest_core(Object *obj, b= ool value, Error **errp) ms->dump_guest_core =3D value; } =20 +static bool machine_get_new_accel_vmfd_on_reset(Object *obj, Error **errp) +{ + MachineState *ms =3D MACHINE(obj); + + return ms->new_accel_vmfd_on_reset; +} + +static void machine_set_new_accel_vmfd_on_reset(Object *obj, + bool value, Error **errp) +{ + MachineState *ms =3D MACHINE(obj); + + ms->new_accel_vmfd_on_reset =3D value; +} + static bool machine_get_mem_merge(Object *obj, Error **errp) { MachineState *ms =3D MACHINE(obj); @@ -1183,6 +1198,13 @@ static void machine_class_init(ObjectClass *oc, cons= t void *data) object_class_property_set_description(oc, "dump-guest-core", "Include guest memory in a core dump"); =20 + object_class_property_add_bool(oc, "x-change-vmfd-on-reset", + machine_get_new_accel_vmfd_on_reset, + machine_set_new_accel_vmfd_on_reset); + object_class_property_set_description(oc, "x-change-vmfd-on-reset", + "Set on/off to enable/disable generating new accelerator guest han= dle " + "on guest reset. Default: off (used only for testing/debugging)."= ); + object_class_property_add_bool(oc, "mem-merge", machine_get_mem_merge, machine_set_mem_merge); object_class_property_set_description(oc, "mem-merge", diff --git a/system/runstate.c b/system/runstate.c index e7b50e6a3b1..eca722b43c6 100644 --- a/system/runstate.c +++ b/system/runstate.c @@ -526,9 +526,9 @@ void qemu_system_reset(ShutdownCause reason) type =3D RESET_TYPE_COLD; } =20 - if (!cpus_are_resettable() && - (reason =3D=3D SHUTDOWN_CAUSE_GUEST_RESET || - reason =3D=3D SHUTDOWN_CAUSE_HOST_QMP_SYSTEM_RESET)) { + if ((reason =3D=3D SHUTDOWN_CAUSE_GUEST_RESET || + reason =3D=3D SHUTDOWN_CAUSE_HOST_QMP_SYSTEM_RESET) && + (current_machine->new_accel_vmfd_on_reset || !cpus_are_resettable(= ))) { if (ac->rebuild_guest) { ret =3D ac->rebuild_guest(current_machine); if (ret < 0) { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441752; cv=none; d=zohomail.com; s=zohoarc; b=fhZVtt9mWn99MzpyttUaqP6jn/65C2jvlDr6LNPfWMCs+PyCY8VLHHIOgFv0qxdv+PvsW4gbRT0ZsFZkTUPk9qr+Z8Z/qPM81YE6+N1RSqrihQ4STNnW5h3RnbCLEabvK3GP2UsLj8N6ypIVe3iCsFflyskyVEyKCanMaM8C/RA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441752; 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=zZ/qzo7xeOri3mZOuD9YPGbqnowbEx4ah84LBZxa7wY=; b=Tvv6MAbp9N42ugpjPQ2M5VL8gEz9ec2sIaKotnctF1f5Ly9Y91KJk/025t71I3VAVLC6R5uPaarHZaT9oFkRMIx1sITixWx8JqXnLCValUzBivqWcB0Rt6rOBpMMGLd63+JmNbZ6dC77TC8a6uthsWZ5fhBpe7PF8w+dVg3o/OI= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441752401308.3570418053838; Mon, 2 Mar 2026 00:55:52 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyym-0004JB-RU; Mon, 02 Mar 2026 03:50:22 -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 1vwywo-00036V-H5 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywm-0002CP-08 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:14 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-207-DVhHb5VvM4yRqksDvYRj6g-1; Mon, 02 Mar 2026 03:48:10 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-48378c4a79fso35185615e9.0 for ; Mon, 02 Mar 2026 00:48:09 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd750607sm391240335e9.10.2026.03.02.00.48.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441291; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zZ/qzo7xeOri3mZOuD9YPGbqnowbEx4ah84LBZxa7wY=; b=E8P2i0clsfA2QwbMR2LNx0Gh14JmuCIbnwYot0geieBD9yjFk4Hho30omFN/+XJf8Ig/rf X9M87dURj1+J0rz4SrQYgwuglywBVreQdS5rbh75PdNjHaMdEDYWU7kA+W2goRJsTP/JDD rTRcNBzeLCiWc83an/pFnRaUStSztU8= X-MC-Unique: DVhHb5VvM4yRqksDvYRj6g-1 X-Mimecast-MFC-AGG-ID: DVhHb5VvM4yRqksDvYRj6g_1772441289 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441288; x=1773046088; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zZ/qzo7xeOri3mZOuD9YPGbqnowbEx4ah84LBZxa7wY=; b=RdkMO88uFIoLy8Sbv/ksWNbsYTq0/hwiEV/56L5pbB3Do9kgusbX0LP3DRYWJPtJz3 Mayds7qE6wTjTfQ/eHAmbARFOC9Wme8TXt0a4celfLI570N1W341G4mHVNR/VtI5Wrfr EKKd3Nzc50ryFWljzy5FFTc1GJRvEfH+9NjsA34wQUKcNRTIHMHHMClrv5w7Hy0Hr5vJ wvV0qtprCpbgSV3aDQeg+zzODW4R9CzGTZrEeXgzu/N+3E3i36Q5dyoPMIFUYt9XkNmW wUjUQd76VnW3lRYeruI3ygpGWoug0qETFWdQgoWgf9LP0oRxY7TXC2j4pTdF2dtr9/jH f44w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441288; x=1773046088; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zZ/qzo7xeOri3mZOuD9YPGbqnowbEx4ah84LBZxa7wY=; b=P9CE7viBOEfOG02IYBna31aedW38+gcPmPlKjbRXUnCMepN2IMXy3lNmuL1v5DpXO/ VEDJXwKCRzaSvDt8ei8ugQIiX0UzVFID01WDnOkVd0AvgAOPmJJ/PKAvBqMtxm5NZMMr O4eK9BvIU5c1e6n2gx9EV/LnbJWLrbf+fai/1V+HHO2cVWVfOQMBcAx2xqjUvQnT7yt8 H6LmKV1ynPlNlfALRWxdC5ONOFIPAqvhOoL1tl3TTeQ0ZeVueibwsIMV7yl+4SSCXSfm fsGWBkwcfpcx74ZI+Bb3PJVEND5e+ngqQ62M7NVxDQns/6gZhlJM/L8am+bFQjOZgSWj w7PA== X-Gm-Message-State: AOJu0Yw3Pq/n3Cgiq6W8hpIwF8Ckmk4myhae2jHYVfCOOmd5hMRpDa+9 yeGsdD2fYoLWU0TBZ4+taVWTfGzcJRRyWJclgwvKxxGLL+JDpkuPgb53mOf6UPMWKRBj1otBpSs NjLFF0GxoXMGNVATb5HA1l8SWZovZRFaZupjGqrzczfwaEyI1Djn2jGgyEB8GQ7MwXk2P5rgcUe WD77Xm+vY6XAvLUoD9dLzSaveFJ99EAwZ1KlWcpaYp X-Gm-Gg: ATEYQzwSrvq/17VqoE/dkKM/junHBUa1mdOYvGY8GvpF4+MIaiWDehPIb9QJWVauwtq xl6MXr8JTHD+6TLbraQbOYFouiRVguf4I6IuSz8CSbSFuZ3jtFVjIcIDqyOtqmoqq6OsEUUOkL1 PA11QQwEuDezqRsnQ+PXKSKqJQWtU0Wgo8TPOjr5l5rBP9kT0D/2JI8Jq0TF5Jk4wGMDr4tztMV O1UMe1LbKol6YKP+2mgfwUDNroX9OgVbdK26eBPupTMpwYPZ8/qtjuyDQIb5qdKcBIrzaPClq7A cThpR59vEfwBuJqz6dHy0/q+HzC7rapcUJ9vPCdwIsbsFHokIWaq0L3VP4kCW8Jg6S5mCRcjZ9g gKM4T11AKC2fbXqRwgOEsyYRwpQG3hkyD4zH9etjecNiXZZRsvGeLfN5cfQ2QdzF0TYe2vgLWbl 7X/3SbYA7aiwJ5KYUHJw3vRHikubk= X-Received: by 2002:a05:600c:6309:b0:47e:e87f:4bba with SMTP id 5b1f17b1804b1-483c9bc6164mr201626175e9.29.1772441288183; Mon, 02 Mar 2026 00:48:08 -0800 (PST) X-Received: by 2002:a05:600c:6309:b0:47e:e87f:4bba with SMTP id 5b1f17b1804b1-483c9bc6164mr201625465e9.29.1772441287481; Mon, 02 Mar 2026 00:48:07 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha Subject: [PULL 074/102] tests/functional/x86_64: add functional test to exercise vm fd change on reset Date: Mon, 2 Mar 2026 09:47:20 +0100 Message-ID: <20260302084749.474955-8-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441754809158500 From: Ani Sinha A new functional test is added that exercises the code changes related to closing of the old KVM VM file descriptor and opening a new one upon VM res= et. This normally happens when confidential guests are reset but for non-confidential guests, we use a special machine specific debug/test param= eter 'x-change-vmfd-on-reset' to enable this behavior. Only specific code changes related to re-initialisation of SEV-ES, SEV-SNP = and TDX platforms are not exercised in this test as they require hardware that supports running confidential guests. Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-34-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- MAINTAINERS | 1 + tests/functional/x86_64/meson.build | 1 + tests/functional/x86_64/test_rebuild_vmfd.py | 136 +++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100755 tests/functional/x86_64/test_rebuild_vmfd.py diff --git a/MAINTAINERS b/MAINTAINERS index a8e1546de1e..83c05112a33 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -157,6 +157,7 @@ M: Ani Sinha M: Paolo Bonzini S: Maintained F: stubs/kvm.c +F: tests/functional/x86_64/test_rebuild_vmfd.py =20 Guest CPU cores (TCG) --------------------- diff --git a/tests/functional/x86_64/meson.build b/tests/functional/x86_64/= meson.build index beab4f304ba..05e4914c772 100644 --- a/tests/functional/x86_64/meson.build +++ b/tests/functional/x86_64/meson.build @@ -37,4 +37,5 @@ tests_x86_64_system_thorough =3D [ 'vhost_user_bridge', 'virtio_balloon', 'virtio_gpu', + 'rebuild_vmfd', ] diff --git a/tests/functional/x86_64/test_rebuild_vmfd.py b/tests/functiona= l/x86_64/test_rebuild_vmfd.py new file mode 100755 index 00000000000..5a8e5fd89b4 --- /dev/null +++ b/tests/functional/x86_64/test_rebuild_vmfd.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +# +# Functional tests exercising guest KVM file descriptor change on reset. +# +# Copyright =C2=A9 2026 Red Hat, Inc. +# +# Author: +# Ani Sinha +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import os +from qemu.machine import machine + +from qemu_test import QemuSystemTest, Asset, exec_command_and_wait_for_pat= tern +from qemu_test import wait_for_console_pattern + +class KVMGuest(QemuSystemTest): + + # ASSET UKI was generated using + # https://gitlab.com/kraxel/edk2-tests/-/blob/unittest/tools/make-supe= rmin.sh + ASSET_UKI =3D Asset('https://gitlab.com/anisinha/misc-artifacts/' + '-/raw/main/uki.x86-64.efi?ref_type=3Dheads', + 'e0f806bd1fa24111312e1fe849d2ee69808d4343930a5' + 'dc8c1688da17c65f576') + # ASSET_OVMF comes from /usr/share/edk2/ovmf/OVMF.stateless.fd of a + # fedora core 43 distribution which in turn comes from the + # edk2-ovmf-20251119-3.fc43.noarch rpm of that distribution. + ASSET_OVMF =3D Asset('https://gitlab.com/anisinha/misc-artifacts/' + '-/raw/main/OVMF.stateless.fd?ref_type=3Dheads', + '58a4275aafa8774bd6b1540adceae4ea434b8db75b476' + '11839ff47be88cfcf22') + + def common_vm_setup(self, kvm_args=3DNone, cpu_args=3DNone): + self.set_machine('q35') + self.require_accelerator("kvm") + + self.vm.set_console() + if kvm_args: + self.vm.add_args("-accel", "kvm,%s" %kvm_args) + else: + self.vm.add_args("-accel", "kvm") + self.vm.add_args("-smp", "2") + if cpu_args: + self.vm.add_args("-cpu", "host,%s" %cpu_args) + else: + self.vm.add_args("-cpu", "host") + self.vm.add_args("-m", "2G") + self.vm.add_args("-nographic", "-nodefaults") + + + self.uki_path =3D self.ASSET_UKI.fetch() + self.ovmf_path =3D self.ASSET_OVMF.fetch() + + self.vm.add_args('-kernel', self.uki_path) + self.vm.add_args("-bios", self.ovmf_path) + # enable KVM VMFD change on reset for a non-coco VM + self.vm.add_args("-machine", "q35,x-change-vmfd-on-reset=3Don") + + # enable tracing of basic vmfd change function + self.vm.add_args("--trace", "kvm_reset_vmfd") + + def launch_vm(self): + try: + self.vm.launch() + except machine.VMLaunchFailure as e: + if "Xen HVM guest support not present" in e.output: + self.skipTest("KVM Xen support is not present " + "(need v5.12+ kernel with CONFIG_KVM_XEN)") + elif "Property 'kvm-accel.xen-version' not found" in e.output: + self.skipTest("QEMU not built with CONFIG_XEN_EMU support") + else: + raise e + + self.log.info('VM launched') + console_pattern =3D 'bash-5.1#' + wait_for_console_pattern(self, console_pattern) + self.log.info('VM ready with a bash prompt') + + def vm_console_reset(self): + exec_command_and_wait_for_pattern(self, '/usr/sbin/reboot -f', + 'reboot: machine restart') + console_pattern =3D '# --- Hello world ---' + wait_for_console_pattern(self, console_pattern) + self.vm.shutdown() + + def vm_qmp_reset(self): + self.vm.qmp('system_reset') + console_pattern =3D '# --- Hello world ---' + wait_for_console_pattern(self, console_pattern) + self.vm.shutdown() + + def check_logs(self): + self.assertRegex(self.vm.get_log(), + r'kvm_reset_vmfd') + self.assertRegex(self.vm.get_log(), + r'virtual machine state has been rebuilt') + + def test_reset_console(self): + self.common_vm_setup() + self.launch_vm() + self.vm_console_reset() + self.check_logs() + + def test_reset_qmp(self): + self.common_vm_setup() + self.launch_vm() + self.vm_qmp_reset() + self.check_logs() + + def test_reset_kvmpit(self): + self.common_vm_setup() + self.vm.add_args("--trace", "kvmpit_post_vmfd_change") + self.launch_vm() + self.vm_console_reset() + self.assertRegex(self.vm.get_log(), + r'kvmpit_post_vmfd_change') + + def test_reset_xen_emulation(self): + self.common_vm_setup("xen-version=3D0x4000a,kernel-irqchip=3Dsplit= ") + self.launch_vm() + self.vm_console_reset() + self.check_logs() + + def test_reset_hyperv_vmbus(self): + self.common_vm_setup(None, "hv-syndbg,hv-relaxed,hv_time,hv-synic," + "hv-vpindex,hv-runtime,hv-stimer") + self.vm.add_args("-device", "vmbus-bridge,irq=3D15") + self.vm.add_args("-trace", "vmbus_handle_vmfd_change") + self.launch_vm() + self.vm_console_reset() + self.assertRegex(self.vm.get_log(), + r'vmbus_handle_vmfd_change') + +if __name__ =3D=3D '__main__': + QemuSystemTest.main() --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441821; cv=none; d=zohomail.com; s=zohoarc; b=WBTsXeSUG9AQJie+dWYaqtIWBm5L+SvTqd/HyIgHU8cthXAcC/3R9L+OOdkSsmhP78rp0do0DfP5YR7KrhUmXr4dG8HwMRKEfSvvOgNXfUwIs7ZEn2OcGXtQekbkyrWui1Dil04CtkU3UypSFiLpTvYhebCHDnRtlfR6sIqv5wg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441821; 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=Cwmzy8ApbarQ0EKqSLibn6yOnXmpyRilOlMnlY+cVCY=; b=nPtHzFJ/9vnw/EUPR1+6RIvDN451P3zrwgx3MKjtirMeBxWv1zKIyK37JQvmpqgBc989sVM0TvPLhxVylD4GmXLH18vXyvAyg0/rADxFJsQcrOjL1BoeZfSXLCyMDn6w4FsrCq0RJTAKZZB+p7s0q/NxMv70AeU4ZfSmCq52B2I= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441821335643.6666047216544; Mon, 2 Mar 2026 00:57:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzC-0004mj-FH; Mon, 02 Mar 2026 03:50:42 -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 1vwywp-00036d-P8 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywo-0002Cf-2T for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:15 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-327-SrKTnsk4ONKQKABASD4XLQ-1; Mon, 02 Mar 2026 03:48:12 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-483a24db6ecso51445985e9.1 for ; Mon, 02 Mar 2026 00:48:11 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd765604sm343156315e9.15.2026.03.02.00.48.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441293; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Cwmzy8ApbarQ0EKqSLibn6yOnXmpyRilOlMnlY+cVCY=; b=IBJZFb1bxHLNsBw556tghCYyiqf4RLt4CNgNofmovzrBgyDT2GCnKsLqUhrDtNOZIhCRk1 SRrlSQcY1xoE1XsF8DAP7Z3e3Fpma+iBAH9AE97twtvjQeVFGFNhC5PnuB+xs06mAFMWoN lBeNl/CaioMR0pvVjliW68ktyUlciI8= X-MC-Unique: SrKTnsk4ONKQKABASD4XLQ-1 X-Mimecast-MFC-AGG-ID: SrKTnsk4ONKQKABASD4XLQ_1772441291 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441290; x=1773046090; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Cwmzy8ApbarQ0EKqSLibn6yOnXmpyRilOlMnlY+cVCY=; b=EAXOH2p9XV3kl2jNkr+PSwAEu8+X0zrSWRSabwXjfUyj5CoCXDEntXTHen0MrtvUrB WxUWaS60lFPY7zEZ0Z5hKkjzE86rkw9Z10mwWLmuc5ICbQCQUCvPMz5ZsYXNDrbUdoXg W/Zh5UhBaAyL6maN3evXPZU0caT2991jdfUbyBlCejL+MwT0bhN8FYiWyg7vSZme1YMu lrdZERBT1GLlQhgFBz3NIkDj7QmlNj7siSvifhnFzqqLB4FQ3VsRIdd58+kwLdh5eCfS K4riWKzXlri0/MtvTtixLXH0Sk5X1iVdpfRku+ZKkxGKHZGik1oD7Ea9CZbu203G3KLh 556w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441290; x=1773046090; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Cwmzy8ApbarQ0EKqSLibn6yOnXmpyRilOlMnlY+cVCY=; b=uLUD8DYY1BfW2YvJCwMgWAnL3ZTbz6RNcL/kud7vuZH2mqCBHPEReQWaM3j/T/bA7S EkOSejft2FtepSeObS5qCFaCZqcZqObIFxPKqFLDIpliOs/cet28b15GNfUycdAW+fPS uA5psXLZfVPwKiRykiSYWCEsfMeFJSUb8bwlk63FAcDEpI1TpTcqCkG8oXork3r6JSx8 FLyD+sSvbyzJQ7dLxEp9yO8qsIkUR7eUc7yEnXGK0nTKWqUkvK4RMFH3W4oE2yxOF4cl 005dz2uELIxQpx5PZUkIKnRIaiHqAaD3/gR1Agp7m7jm+GO0treIsU1WXUe5Oq68q3wO 6eug== X-Gm-Message-State: AOJu0YxhgSkG3rdVpn+S4b9kOyDEUErUpawDjTvkRLvdAsz0+MZmIswY fDIENvC94rAZvzWRIUYcXezyl6kr1Na7VSe65or6zGJN+fT+oqu5v5ve1hbm4ZKrGZguK8Z3CCv KyrhtsvU8hDwp/V5gC/qJdUt0j0kxxRgA903g5HTxCBR4QSwFxXnz83YQl+XneczWS/EHiCrJ5V YGDq8gDwShXqB/lnZkp/avttPBby5xspSZouP0cSpN X-Gm-Gg: ATEYQzyLnhExVshyAneELlRjFSkrQgc9Peo+HFMk+imIpHwQPwiAehHCirKY+awO91Z 6wyQkdL4M9yqEQBmxxMeq6vuQYgL1jHz/+taeIYxDKTBgj9GiA24CeX5U4x3Slj9yrBqPlLmJ+1 N/tt5GJta1ruiRIEQ+p0Sf+CcqBK100WbbtYCvDCE/meEm7eYevNYbnbUbJZBcsXvomITY1FAYk +YWVvi0HwkmL3zsXVdkFuAnfD1GjSO9hI5TOXZC+PO8iQGSFVNga1LLsqrt2vJdUjzfLVuHaSJN g7l8StQoR0A9OYOWBBRbaMw+KJATIs4uM9B55YAmabczdLuy/1HWOuBHM0M8YRSAa3lFS/zUx5F szbN6nxbjmI38CHNDZCOqAoFK+2RGpU7I1SQUttGSfLitATi+da/K4gOM36penfywnIwdkGUV2j hLiSEDcX/ZaivCqdpw/A2Hb7+OZoc= X-Received: by 2002:a05:600c:348a:b0:483:c12b:fe4b with SMTP id 5b1f17b1804b1-483c9bc19e9mr196756505e9.9.1772441290339; Mon, 02 Mar 2026 00:48:10 -0800 (PST) X-Received: by 2002:a05:600c:348a:b0:483:c12b:fe4b with SMTP id 5b1f17b1804b1-483c9bc19e9mr196755915e9.9.1772441289776; Mon, 02 Mar 2026 00:48:09 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Markus Armbruster Subject: [PULL 075/102] qom: add 'confidential-guest-reset' property for x86 confidential vms Date: Mon, 2 Mar 2026 09:47:21 +0100 Message-ID: <20260302084749.474955-9-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441852561158500 From: Ani Sinha Through the new 'confidential-guest-reset' property, control plane should be able to detect if the hypervisor supports x86 confidential guest resets. Ol= der hypervisors that do not support resets will not have this property populate= d. Suggested-by: Daniel P. Berrang=C3=A9 Reviewed-by: Markus Armbruster Reviewed-by: Daniel P. Berrang=C3=A9 Signed-off-by: Ani Sinha Link: https://lore.kernel.org/r/20260225035000.385950-35-anisinha@redhat.com Signed-off-by: Paolo Bonzini --- qapi/qom.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/qapi/qom.json b/qapi/qom.json index 6f5c9de0f0b..c653248f85d 100644 --- a/qapi/qom.json +++ b/qapi/qom.json @@ -1009,13 +1009,19 @@ # designated guest firmware page for measured boot with -kernel # (default: false) (since 6.2) # +# Features: +# +# @confidential-guest-reset: If present, the hypervisor supports +# confidential guest resets (since 11.0). +# # Since: 9.1 ## { 'struct': 'SevCommonProperties', 'data': { '*sev-device': 'str', '*cbitpos': 'uint32', 'reduced-phys-bits': 'uint32', - '*kernel-hashes': 'bool' } } + '*kernel-hashes': 'bool' }, + 'features': ['confidential-guest-reset']} =20 ## # @SevGuestProperties: @@ -1136,6 +1142,11 @@ # it, the guest will not be able to get a TD quote for # attestation. # +# Features: +# +# @confidential-guest-reset: If present, the hypervisor supports +# confidential guest resets (since 11.0). +# # Since: 10.1 ## { 'struct': 'TdxGuestProperties', @@ -1144,7 +1155,8 @@ '*mrconfigid': 'str', '*mrowner': 'str', '*mrownerconfig': 'str', - '*quote-generation-socket': 'SocketAddress' } } + '*quote-generation-socket': 'SocketAddress' }, + 'features': ['confidential-guest-reset']} =20 ## # @ThreadContextProperties: --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441840; cv=none; d=zohomail.com; s=zohoarc; b=kkRIEfQKk/I1K2i2qAMyCxh0GWhgrH0CEJdcPfWBwrvTbmuMuJzH3cL0EMdsSRFls1eIue+WbayjvMoWmjd+mjWszhMXvuz26B+CQbuFq9hBYvhyh6ju4dcEULKz8aRheMbWbojhpgtTvAasdG0KC0OiJCjXXvcln3ovWJYdIi8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441840; 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=xOgp1TyXySYCJXAWxrtyTkQClS+QjMqnGfrNC3gHDoU=; b=cYVW/0uKrDXs2bkQoVxYEMB/PWrE7W+pjfkpSg/y7gZvDnTDkRD80DYW8HqTbnNJNvH4Eg27OwFX2DUxDQh2EmInZmze5OQWCsQSZ0pvX8m38aKLIV3DWaxJpzFWBhsnuXdVWEJ4FX26NR178BPoxapy/kMaoAB0ySAd+2Et3wE= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441840516624.5291878468614; Mon, 2 Mar 2026 00:57:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyze-0007is-CI; Mon, 02 Mar 2026 03:51:10 -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 1vwyws-0003Ds-7i for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:19 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywq-0002DA-40 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:17 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-416-jEU0CwkePxmSc5d24YYveg-1; Mon, 02 Mar 2026 03:48:14 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4836c819456so28196515e9.3 for ; Mon, 02 Mar 2026 00:48:14 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcb318fsm194677365e9.6.2026.03.02.00.48.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441295; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xOgp1TyXySYCJXAWxrtyTkQClS+QjMqnGfrNC3gHDoU=; b=D+aLgtmZNhE/EL7bSFuA5QRazya5Rck2PcX+/QyuDVy7Pyhp/UP6cc67U3JYTIas8tjH6O /CUoLRqyA7WiBJFMXjnJ0pbr9jAS0L1sG4OOSXs/JYYgATB8E7sbRjXiuOil+RCTdWgdSW H3Rj7819y9EPcU/kWNei58Rs+ChUjHM= X-MC-Unique: jEU0CwkePxmSc5d24YYveg-1 X-Mimecast-MFC-AGG-ID: jEU0CwkePxmSc5d24YYveg_1772441293 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441292; x=1773046092; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xOgp1TyXySYCJXAWxrtyTkQClS+QjMqnGfrNC3gHDoU=; b=lExUTYvERMplugioUeJZpJ1ENSqIr19RM4yFWoxNBtKJpULRK7gIT64lwah8LK2Ve/ j6Rq4Eyg67WdPbkPCsxVaIbSez01TUrIWIgr5/7rcTXPDmOvIQUtg545+DPgT2OtNhrV 2W86tr2LQkvUJdNQYaexuC2QShyRUgC+xBSTUZ5WFw2MvhnSNU/xGA9swH6mshs1FT0+ rLP5iw+a1Zqshs6zNzWuUJBNWeCyV4KS5kot7/w/j3rrwTqFg2YfjM+4czw8KrSQSaGX lZ+s4BgPc8vLiFDtUOd73cbILStLU3u2HVQjfH+rMBaCIghiMvrXybBH5qnWeFibyOfD +FeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441292; x=1773046092; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=xOgp1TyXySYCJXAWxrtyTkQClS+QjMqnGfrNC3gHDoU=; b=UxXDlytUjcNDehi1FqT3jK29eN1Oxd91fzufqfV/HyLEeJ77Y+sIk+HpUx9RRMhQkq dUe10liieLI8wBvemnaFVUUlN+/RGBal0mOaH71u/dtT27h7coBFFq+TF1jhSEfc4dQ1 dE8ycFcTBHtT0Bz+Mb9IPl+UeP3F5TjGhLj1uIwgBLOe+Limk4+CxQthScb9oSoFL86m 3RVcdaa8IH4FenK7t/kA3j1crGs7ibaET2Pu4CFbPEJHgnsl7gJRplo+bMDKLum+KEGg eYSGEQ956auqloxyL5IiEyXRU7Js1OONF7C8Umn3PKu4lQdWbmGxPuGUoFxyK0W/bsms kmMQ== X-Gm-Message-State: AOJu0Yy5ta2jXAoV+RVE5NoRE1KP3/0qjcIzcpA3aOPmg4vodzIPhs9D DNkJ5Mwgd9zgMeLsKm2sb7onHTj6f88G04pSiuJJyWYSL8rcbI3QCRHoVNWnIBL44PpII2+kN/p WTS6Ka0YS8udbUwKATrLY7sXSFsUEJKcQZvS/d53HTsC5jEg6i8NVNgM38cVNT9MkXIXT7eDvdB 4VPOe7ZLH68QLiOgwhqrgX/HNgPRGxtMwop4G7cXu/ X-Gm-Gg: ATEYQzx2WS3d7bOFimlYGJvvA2qwP1qRyd4xC7UGq6SmyQeifjvTX1o/2vUrPUUIlJV BqgZDRzg4Z6N2cCAv/Q/AU6b6oJkSnFAseXa6HcCvhQIcJkmz3tSZjUlTrYxRWlZHxKkpHtk8Qp m5b/0mbqRkn7Bn7PNTlgN2k8GJN+aLgnapANSPAleW8pl75ZrfozZ8AbbHFjbZsVgv9IG1ukw/8 LlPUoF79qmHQ4NOLFW7ea9FKHeI8KoOzVctSCIHxT1plwq7XjxP6z/TqKTWXh0KcRc7pO+n+BUA LN4nZTXXb2bWT79N8dVWl7X3Wrq7tP6Ahh+wqzDBrN+AYuXLcRUjLs8zVaA0w/ashiWHdSeH/uo oE1XFXlBEMUXgoUERQPDk2T4M7rMvRPKI10WPLvp52O+ZO3zytL/3eyWKkI9NHHNJeacqw32LfD MC4/Gw1WdyGc8MHSp7kiJEiXiiml0= X-Received: by 2002:a05:600c:8b54:b0:47e:e20e:bbb4 with SMTP id 5b1f17b1804b1-483c9c24124mr187287545e9.26.1772441292454; Mon, 02 Mar 2026 00:48:12 -0800 (PST) X-Received: by 2002:a05:600c:8b54:b0:47e:e20e:bbb4 with SMTP id 5b1f17b1804b1-483c9c24124mr187287145e9.26.1772441292010; Mon, 02 Mar 2026 00:48:12 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Subject: [PULL 076/102] audio: fix nominal volume channel (cosmetic) Date: Mon, 2 Mar 2026 09:47:22 +0100 Message-ID: <20260302084749.474955-10-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441841141158500 From: Marc-Andr=C3=A9 Lureau Signed-off-by: Marc-Andr=C3=A9 Lureau Link: https://lore.kernel.org/r/20260211-cleanups-v1-1-e63c96572389@redhat.= com Signed-off-by: Paolo Bonzini --- audio/audio-mixeng-be.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audio/audio-mixeng-be.c b/audio/audio-mixeng-be.c index 37040450511..5878b23e04e 100644 --- a/audio/audio-mixeng-be.c +++ b/audio/audio-mixeng-be.c @@ -1649,7 +1649,7 @@ static void audio_mixeng_backend_set_volume_out(Audio= Backend *be, SWVoiceOut *sw =20 sw->vol.mute =3D vol->mute; sw->vol.l =3D nominal_volume.l * vol->vol[0] / 255; - sw->vol.r =3D nominal_volume.l * vol->vol[vol->channels > 1 ? 1 : = 0] / + sw->vol.r =3D nominal_volume.r * vol->vol[vol->channels > 1 ? 1 : = 0] / 255; =20 if (k->volume_out) { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441821; cv=none; d=zohomail.com; s=zohoarc; b=CC1GN2PJ/J5InyFEtvd1hZ/M2pxRsJhbCDWeBvOk9MaS8X4QNt4/VS/klmw78H913OOwtEtPrvTa83MSaedKXFC/thhNSM9MVj748ukqIuUx/aqFLfM5fij6OICT2XPSyr/bmGqeYFtzDTnuc+bSo3OAvCLuKuh0AQKqcfgAUAo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441821; 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=UvBaJAc1reb5s50SsgktReWQaLMq5cDCG+lsA+MuXgQ=; b=KX82A9/LkeCJAFd5VLSAH/HsDBGmqT31FSIThS+wPrIZjN1+CW433DYUNuz7c/kz97INqlPKgIT+LwjYA+oAHMqiC0fo8ogQZlxslXeyi88+OkoAq+Wk4PkQzPZg5b2IR1RRJlkCUz0OHgtMJEI5PW5R86/yHlW3nbbFyb0G84c= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441821397896.5291301604957; Mon, 2 Mar 2026 00:57:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzW-0006Ud-C7; Mon, 02 Mar 2026 03:51: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 1vwyxH-0003KO-QX for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:50 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyx9-0002FQ-2W for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:43 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-260-yEWaDHAcON2m7YF66BB0Tg-1; Mon, 02 Mar 2026 03:48:24 -0500 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-4398e939290so2783015f8f.3 for ; Mon, 02 Mar 2026 00:48:24 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b4175fd2sm9810824f8f.14.2026.03.02.00.48.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441314; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UvBaJAc1reb5s50SsgktReWQaLMq5cDCG+lsA+MuXgQ=; b=geEF/8qQMTKxFqKJOmcqguyTRE9hzEg2lB9Z7rT2HFwCEs5/b7noX/yhxrkyyHNNnJ3T/v AiceOJI/dQxqaUS6S5RoHEyRX9ZDDvoF6y3j2BcTjtEoWrc31VSOcsnsR5xUPMG3iw/yEV 1C/zQAaMSnLDCDicUR86ubzPVfocSao= X-MC-Unique: yEWaDHAcON2m7YF66BB0Tg-1 X-Mimecast-MFC-AGG-ID: yEWaDHAcON2m7YF66BB0Tg_1772441303 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441302; x=1773046102; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UvBaJAc1reb5s50SsgktReWQaLMq5cDCG+lsA+MuXgQ=; b=ENF2WlffharO7FV8U3prEQvLaOLjG3LE+CQVNAG8C1xQrpeCbzwGUAjI7yNgA97Fc8 MJA8XlWB5EPazW0ZakZVX+goInnoN1Ai6YNm4iRa44DDIK0mhe73Shdo6wYj+joLGPHZ Q6w09O7QQcy3ApdF1XIGzdWULqMf6DJlXmcTp+6Tg8heeNiXLYI4b/2mz8H/+TLuYPuv DKL0HrICFQuWlZYiMGKJ+FBg+x7Ec0ZDcPnB4TyTo+x5brzgIrWuPxMPf++wQ/BxjaS6 T1PxeDGtqw1GN/H9fnHEOyJ5J1/yt6+dLKmJvpfidalpNqYvX9V6BW/gw4oSoYtauC3B KfIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441302; x=1773046102; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=UvBaJAc1reb5s50SsgktReWQaLMq5cDCG+lsA+MuXgQ=; b=Q/vmaGnMIj0apBPx/+mTFaYnBbFOoVFwRzpaxfbmpWRVZ2C2omf53HMsoTi1ruMft5 zr7F4mAwrXSBalFAwFDkT6Nsk7rV7+0AJXZ6mss5phoPEMBYmqjgXzMHsUaLzJu21psa on2yk66b/c1Iomv4nLJRPOwDz9ndPhOuHPJ3K7dk7lcVSllXwLolX5+j4DDkYJ3rF97G HQIzekAxlykrDk9rMLGj7ZCPkPZ6sRureNWR2Wa/1Pt4RBeM/Jp0U/zEOJDT++hY6wOB 99W9YD8c/4+Ku8jKx1qEqwyoi3Y9KspSA9GN6E2UVEb2dKQENCRyNtqpNJWMWekIuk/H kRzA== X-Gm-Message-State: AOJu0Ywzu4sh9KzWDC6TOfw1PxyIRtc0AttMZKQrYZQs+JUMRhoOYIxj Ldv5qV1TMLZZHZtczGeUXdllH4O/R7y6mDkwaNfRxLAXaWTTNfjMYSnLe+FeUqHsVtNOdqAx4Ch X+W/uZX+D1+ZnE8uouD38DqtOZH6F/NjDUNQ2ICkn0h8ymiuGRVFje3Pxg8ESfDafPSyzYIABJC 2yREcTtNp97RBpfq402MQk5FdKN+QSEgWW2Sgoe6Rb X-Gm-Gg: ATEYQzwLMOTd3fyacQGDB6UJtXXXY+ohqSFksE/htL9fzfzcts7RZS7Giay5shQWak/ QuOH/A+BqvgNtyfc4i5nE92Fge0Uw8hgFKD+Y+EeX0eI/tgWUyuqTl/B/l1C1lJ6d/Sj525fVhr y3NiKzkeqXYJRE5x59Pk1NilY2Vqdb60/vMf8ujNwUV5nu5e79CYaiyILJe+0OgrMB8Fle9CPov O6M8/35lyCwZY4iTEPanylCbHDSgaeKEkd/Po3a+j/UGNMWWoVkf/Kf/MNhfgmhuL+YizlLG2VZ 84bHWS1hnOxhImd/y0nxR6IdiAP9QOXqqeGer3cHR+USzgwNExTVNY505oKQlqpEJHA5+JqF9ap Gs7mpsqivnfI9z2gvIpAm37BUK4Gwhiznro6xKZ8R1O0if5ew09rnA6O5jwufDncLftxT7x6mlO U/6k8rROYd0vY3uMgAmIN1vgKvSnA= X-Received: by 2002:a05:6000:420b:b0:437:8ff8:fea3 with SMTP id ffacd0b85a97d-4399ddf1e0amr19631484f8f.21.1772441299407; Mon, 02 Mar 2026 00:48:19 -0800 (PST) X-Received: by 2002:a05:6000:420b:b0:437:8ff8:fea3 with SMTP id ffacd0b85a97d-4399ddf1e0amr19631262f8f.21.1772441296701; Mon, 02 Mar 2026 00:48:16 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Thomas Huth Subject: [PULL 077/102] python/wheel: remove meson-1.9.0 Date: Mon, 2 Mar 2026 09:47:23 +0100 Message-ID: <20260302084749.474955-11-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, TVD_SPACE_RATIO=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441853981158500 From: Marc-Andr=C3=A9 Lureau Leftover from commit 8c04b6a48b15a478ff3f9d152592a0ba503a31e4. Signed-off-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Thomas Huth Link: https://lore.kernel.org/r/20260211-cleanups-v1-2-e63c96572389@redhat.= com Signed-off-by: Paolo Bonzini --- python/wheels/meson-1.9.0-py3-none-any.whl | Bin 1029634 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 python/wheels/meson-1.9.0-py3-none-any.whl diff --git a/python/wheels/meson-1.9.0-py3-none-any.whl b/python/wheels/mes= on-1.9.0-py3-none-any.whl deleted file mode 100644 index 57cc75cb13866054d42e3f37c895e4959ebe11b6..000000000000000000000000000= 0000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1029634 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/^<30`M1qGg7a;*sD(T!j29 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

`GwYCu#>oH1aU1k1a^OxwV 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ΝtTc>>p-1f)PUF;~E6$9w1Z6B!>Iece@T*T}n&U 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 =3D;tv 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� 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 TCo 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 z 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

}(6rvncOHs5oT-P>E(lPYN9xzW4Ld(~sh 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

ar1c`VlozFe^OzwUWL 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 %{V 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ν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 !?D(E!QsbF((t^>0wKHF)O_7*aEh)vY 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�d>gtUZGXN6=3DVjZ>Vn&#*Q`dFEAw(Otzr1?r#1 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 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441981; cv=none; d=zohomail.com; s=zohoarc; b=dz8ypm8aMbjnusWTVdAvRfeYcoxfZyGin8xgKZZ5I8habdH/Q9zpF89tuMGVzOOnBWp19lHUaIDglpN/cg3n2tV+/n6mrEi4prBsi6o87+GeUqx/SBtOT6mRj9colQ6YwYoXMGB+UUxT6cyHZs297t7iXErk0Vi6++sfnFDXvMk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441981; 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=aEovutUanaTMVZLmJhDrriEKNRGQaiFuuqtZvfjvSwg=; b=kIdsLaxl72PIQPAtFOKG2NitFVyWkCJDuyx4yaI8OzAnSe8rbjjUgs+5pWVSpeGntT/gC2YcL/Ok9QTmhT1OGmDKfI45R7Eh1T7axnwVVWP58KMVqNFczrP77ZjHeQq/sMuwSqjOAlFt6uQOw6Hhn2cuX+GN56SLXE9tQFML6Jo= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441981831368.75664860296297; Mon, 2 Mar 2026 00:59:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzD-0004y5-Oa; Mon, 02 Mar 2026 03:50:43 -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 1vwywy-0003I5-3s for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:32 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyww-0002E1-Jy for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:23 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-549--6As2UMBOqu4fJmXZ0vc6Q-1; Mon, 02 Mar 2026 03:48:20 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4837bfcfe0dso53826195e9.1 for ; Mon, 02 Mar 2026 00:48:20 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b03db76bsm11002060f8f.18.2026.03.02.00.48.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441301; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aEovutUanaTMVZLmJhDrriEKNRGQaiFuuqtZvfjvSwg=; b=GILCPwQ+oF2X68ueKZlIokOU3yCQMFAsMyVFyXzaVS2WqUNJ5yoKn7ljVvDFVsLSKc04Fo zGfBxxaCUS/B7VA2o7Z81p+ubsrnFAarHGAPJIWLXur5ao4LIJyWF3fVFXROTuLFV5VHEH t8cCPl980pjtTaZIC/ftPj6dX4Z+Xcs= X-MC-Unique: -6As2UMBOqu4fJmXZ0vc6Q-1 X-Mimecast-MFC-AGG-ID: -6As2UMBOqu4fJmXZ0vc6Q_1772441299 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441299; x=1773046099; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aEovutUanaTMVZLmJhDrriEKNRGQaiFuuqtZvfjvSwg=; b=RVuZcwn8UU2HX9NOA423r27YWgA0dhlLBjTpU+A4w0XrJSmBOLsrMQ4aCnYo+yFgmZ u+exxMKR/mc6pI4tCJjVIeL9raFDmksLgsGiZJkGvJnqE7dwH6+uw6TjJ/PlYsZ0tTKT o6EYh+GMvzPPfS3qVA+Hd6kw4f+OqaQDCGeqrb3DVlCc8osjC3RmQ486siKPA6mtgDzs fnGOorta22L1rahY55KLGfPYQj2emt2bfXboSwk855XfKBwK3Tp5EpuV2mnC85m32ISv 5dKAXqC7K3+3/CPYphBtsFDyIMLUVxF2R0UEo2fwWHUvwl2gLA84h2gFvGErE2ZterhI tG7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441299; x=1773046099; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=aEovutUanaTMVZLmJhDrriEKNRGQaiFuuqtZvfjvSwg=; b=SCliGYEbWHqMGKlF2mlFJrr3dWUmRGoeceRE1orPit8r0tI4bYjofxISZuO2jLeY+f UlglyobABWkwN1pqfgs1EXtdITRhmyKtYAxRsGv9X5cSSwfyTigg4tFnsd9vcTjiyGSc tblefmlxK07OFoTFs/SxYtDY9hkG2jBWe6k8Ng0GgJRo08918dOTvrIX7TBA+eAhHHLN yjGj2KNJ9N8LDGY3dkm7F+QVTZvWVy+vz7o0DwCfkP0CUjj0dk/bZH+s6Mky+wP8rTyO ij6yEWzp4z/ltBbaqjrAH5Hu1VPEc4n5G0s+GtBBdyZU65opN9mVPxDUKP0E3VjolUpl SBuQ== X-Gm-Message-State: AOJu0YxhkGySvSGUZkjLiM+jcm+w6giqKpHQhv9AwxmysfoRh24RTGTa 3ny5AcZci9QISbwTsJsQ/7p/rUEzNkg2vAq+6+yEoTOdfz64Je79s00l28ejRXExwZ4BLEjFDx+ L3aySs9MYB30Vms0jPLTmHwyZQdEVXftdviWgzf6oqpqSP7hpXQMLifUgrgb13/M0/fKjaJEJ+A zGgcvezXWXNuBYqRGaxFJ+9lddnlZmvaneV4wcEE5X X-Gm-Gg: ATEYQzwLq6Ao9rRC2KzbO+WWMPCO5qWYrGG8HGC2BoW3kL2bFPDPdY5EVjnK0LUui8x U91iIHOQWDQXgc5BiEzd7KBq9cNeEoroLj8btW7YqVuiJ9PCGIRj9HXPQOnbeiKcFDrO0k36I39 CT84goEzfoDhHVAGsH+He5rod9na6LhvtOytsHs3DtUZbQ2+uoR7nXzG9ozUiYzyB+MuwwYR6av y1kygK+IYYWAOvgOathYfa+fmYrci1PQ7mQZclao46qkKsp1UoSHNN3+xlBiRPweBXRkyNRGuoO Oj6W9XQI+kD7xqaUSHe2pGTca60Ce5OHTxYjpzkZAV0Gh5+CA95uv0/6vRoVQZoL8jgpQD9NESX pUj/mLqh2EGepTOyj6cFJtXdfamarEEAAdXjLthemI2ykHwifhLmXs0f+LUtVYup5YTYiBB8n0J Kflzlgvy6q8KCodij6R+dAe+eqikw= X-Received: by 2002:a05:600c:8711:b0:47b:de05:aa28 with SMTP id 5b1f17b1804b1-483c9b9701amr226249425e9.2.1772441299160; Mon, 02 Mar 2026 00:48:19 -0800 (PST) X-Received: by 2002:a05:600c:8711:b0:47b:de05:aa28 with SMTP id 5b1f17b1804b1-483c9b9701amr226248795e9.2.1772441298710; Mon, 02 Mar 2026 00:48:18 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Thomas Huth Subject: [PULL 078/102] scripts/vendor.py: add pycotap Date: Mon, 2 Mar 2026 09:47:24 +0100 Message-ID: <20260302084749.474955-12-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441983747158500 From: Marc-Andr=C3=A9 Lureau Related to commit 5ec1eec11000ef118b2a87c330245ffaa475f5ee ("python: Install pycotap in our venv if necessary") Signed-off-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Thomas Huth Link: https://lore.kernel.org/r/20260211-cleanups-v1-3-e63c96572389@redhat.= com Signed-off-by: Paolo Bonzini --- python/scripts/vendor.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/scripts/vendor.py b/python/scripts/vendor.py index 46ce2980d5d..78058183e4c 100755 --- a/python/scripts/vendor.py +++ b/python/scripts/vendor.py @@ -45,6 +45,8 @@ def main() -> int: "4b27aafce281e652dcb437b28007457411245d975c48b5db3a797d3e93ae1585", "qemu.qmp=3D=3D0.0.5": "e05782d6df5844b34e0d2f7c68693525da074deef7b641c1401dda6e4e3d6303", + "pycotap=3D=3D1.3.1": + "1c3a25b3ff89e48f4e00f1f71dbbc1642b4f65c65d416524d07e73492fff25ea", } =20 vendor_dir =3D Path(__file__, "..", "..", "wheels").resolve() --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441822; cv=none; d=zohomail.com; s=zohoarc; b=F7Ibr5G7aUaZ0Is7LSD2QUA9U9hmQYvlLCC8ryoO9yp+lL3CsODcrSw6cpbIVbwRAbuBmfNcxiCmdh5VDbMZpolfbggymeKv3qfo749hFgU0W/+DHYjz3RnBmRIy+IeDdW5xWJj9vuiXCVUvpqDwGb3keknjkV4UY+EJ0d2xs10= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441822; 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=5kvfH/m3MJ3pc+JdzR3PQMiTgKe/mfGqHZA38rC7Xew=; b=ZUI1Sa1PJUYJ8/BmB/Tehz9UEhOuYMDo9Ha9MXw1VcTLzfnSr9Xfuq5G2eWNp/HIye/NGrqpTeLlYFsfTFJkBXBCYQXmCmX8YQpKDNEBIcytKk8n/6onmHcWJdOIkUS8pDgmEQq/WWuyD4RH0kZNET2/vUm+5uLxWpzLjo4pXRo= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441822568281.1752584344605; Mon, 2 Mar 2026 00:57:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzf-0007tF-MW; Mon, 02 Mar 2026 03:51:11 -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 1vwyx1-0003IA-BT for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:36 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwywz-0002EQ-P3 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:27 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-274-5MxQ37k6NJSHU0XosJPdQg-1; Mon, 02 Mar 2026 03:48:24 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439a9182148so877397f8f.2 for ; Mon, 02 Mar 2026 00:48:23 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439bb69e098sm2236858f8f.9.2026.03.02.00.48.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441305; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5kvfH/m3MJ3pc+JdzR3PQMiTgKe/mfGqHZA38rC7Xew=; b=UUJkKIY2cMFp43VyHWqW/RYA/qco4yEA+QXPmrHTdsGBoVhmwH668IhzfBlrdOZuEvWTtw 3TnHNXG8eD+VwUd+oYdDMca/RLus0XgZhGcURFLd7vsZT8/LRYbM2jx6lBkIj3AOMWbn9E 6SbATGlxXIOlbUrQvypDpcFa1Ppq1ZQ= X-MC-Unique: 5MxQ37k6NJSHU0XosJPdQg-1 X-Mimecast-MFC-AGG-ID: 5MxQ37k6NJSHU0XosJPdQg_1772441303 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441302; x=1773046102; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5kvfH/m3MJ3pc+JdzR3PQMiTgKe/mfGqHZA38rC7Xew=; b=gt/YRATuDU7LSyaZds1bne8+O4RS5SGKE5XztKJTACTBdP0Ph9OZfQzYYlqL9Gbojs 9ODQIYfd1tkXCNtyk1PqxIY20K6sZ3HRWQsu2P45XvlVDfcVvy6fPesjSoQEv4giUF0a bJv9qxr1FUOB/cMHRmGwJ8SUjikku9zOZRSFmPe/nZvvNqltYKmbBui/iqsAqewLoJyN gPRxhIbeKYBB/xuAcWPuP6YtwklwGzeGRoQoUoBN/63XfCETfS/VEVD9KhiOOPdrDJOm zpDMli7YZufiXXClmfxS1Upv4Ky1vClHcxI36n2Ta+fL9C4vvJlkQRXvNINlMae7T/G0 B/Tg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441302; x=1773046102; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5kvfH/m3MJ3pc+JdzR3PQMiTgKe/mfGqHZA38rC7Xew=; b=gs3Jv75Rueg+Hh/drakLhxlvyCLbeqLDJ40i3X+BwVpuDJHaPC92M7rGZv6AZW3Zwv fcvKbaXWA78eB8sKyXhiSFHRbLFkLuUahDnIjOxgo/k7t7ntswpDlN3hJWf2bs/I/t3Y bZhaergZ2w97LGbmnwNpyu1UMIBssZpSX9fcE9qdUoTZJvN73vAoVXC3J9OKzBrhCWQ5 hlEq+Zau48qqu+h/N3+/fpvlicDUOZFKQA8XDeSpqD1M8pJxndr79m3Cf9gy9+trZf8a U4dX2wVMrR+gZ3bPhsfjVmGWbBDdio/ymJLFMweKOpWs4Yl1iohU+ZZF+B+3MS+kETaf WItw== X-Gm-Message-State: AOJu0YyNTmLw75c8MZWYTGNg2yCX3RQWYJszbH+pz7V2C6tXneQ6Obeq biJoCjjh37LDOvoPn+mQhP93pVPlmtOu6ypMaQaZ4/b7hhzDtYK2gEJ3Kv/tFmZHJUsHCy1EMCg 0RnISoxElQVcnF6GtZm37AktebY9f2LOCjCeKHtlqznp/6EDba1MWZaMatT9exYDF9DjgArqZ+7 R4HcNAoC1B7WtjUjzMBAjIwglDBHB+od0CdGPw8jaH X-Gm-Gg: ATEYQzwlsHiVA7sitJP4KoWlIfCktv2UjNvxPwFnBDIdU3wbDwwbNmNM97b4AUgFof0 /Gowl1m8gVgpT37PvJzdbzituUnyBgA/zF57FSpqjo0YtIFXzn8qoYYj/hEIx/wVkfG0WfaxZcZ DbHaoilE1rAWMtpdAFjjQf/fqMcYV3hrUNDRcrQ0esdSvrTAAK+js9/4TtD1KU2X+xB3Ja/B7k9 fJ1SwLEhiX7j+jRnCX1FNWy+HssRLjognN4KedFQNtol9Y2JwE/z7saWEc3ELT33Y2dT3NvBSBJ uy3vJRjcs5JiJ8Iic0xlLCCRqZXdHh5Hrw7/mOVDZ+VgcNtDV8w9QqtaTHIHGJ6vCtWBtFgAx25 /+AZSBwv0Dcefd0gkjeNrkAdf6+7QmT2s0ChqN9AgcN4ts7IsqyCljOcR2oAkECSKyst1m7HL3b LhWvpZPzjfxyKzD15FQWI/bVtgzb8= X-Received: by 2002:a05:6000:4022:b0:439:b3f8:7753 with SMTP id ffacd0b85a97d-439b3f877ffmr7664295f8f.44.1772441301938; Mon, 02 Mar 2026 00:48:21 -0800 (PST) X-Received: by 2002:a05:6000:4022:b0:439:b3f8:7753 with SMTP id ffacd0b85a97d-439b3f877ffmr7664252f8f.44.1772441301445; Mon, 02 Mar 2026 00:48:21 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Subject: [PULL 079/102] audio: require pulse >= 0.9.13 Date: Mon, 2 Mar 2026 09:47:25 +0100 Message-ID: <20260302084749.474955-13-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441822967158500 From: Marc-Andr=C3=A9 Lureau pulseaudio 0.9.13 was released on 2009-09-10. All our supported distros have it. PA_*_IS_GOOD are from 0.9.11. Signed-off-by: Marc-Andr=C3=A9 Lureau Link: https://lore.kernel.org/r/20260211-cleanups-v1-4-e63c96572389@redhat.= com Signed-off-by: Paolo Bonzini --- meson.build | 2 +- audio/paaudio.c | 28 ++-------------------------- 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/meson.build b/meson.build index cbd6d90ce64..11f83cf05c4 100644 --- a/meson.build +++ b/meson.build @@ -1298,7 +1298,7 @@ endif =20 pulse =3D not_found if not get_option('pa').auto() or (host_os =3D=3D 'linux' and have_system) - pulse =3D dependency('libpulse', required: get_option('pa'), + pulse =3D dependency('libpulse', version: '>=3D0.9.13', required: get_op= tion('pa'), method: 'pkg-config') endif alsa =3D not_found diff --git a/audio/paaudio.c b/audio/paaudio.c index 23e8767a46b..24327ecbf45 100644 --- a/audio/paaudio.c +++ b/audio/paaudio.c @@ -62,26 +62,6 @@ static void G_GNUC_PRINTF(2, 3) qpa_logerr(int err, cons= t char *fmt, ...) error_printf(" Reason: %s\n", pa_strerror(err)); } =20 -#ifndef PA_CONTEXT_IS_GOOD -static inline int PA_CONTEXT_IS_GOOD(pa_context_state_t x) -{ - return - x =3D=3D PA_CONTEXT_CONNECTING || - x =3D=3D PA_CONTEXT_AUTHORIZING || - x =3D=3D PA_CONTEXT_SETTING_NAME || - x =3D=3D PA_CONTEXT_READY; -} -#endif - -#ifndef PA_STREAM_IS_GOOD -static inline int PA_STREAM_IS_GOOD(pa_stream_state_t x) -{ - return - x =3D=3D PA_STREAM_CREATING || - x =3D=3D PA_STREAM_READY; -} -#endif - #define CHECK_SUCCESS_GOTO(c, expression, label, msg) \ do { \ if (!(expression)) { \ @@ -682,9 +662,7 @@ static void qpa_volume_out(HWVoiceOut *hw, Volume *vol) PAConnection *c =3D pa->g->conn; int i; =20 -#ifdef PA_CHECK_VERSION /* macro is present in 0.9.16+ */ - pa_cvolume_init (&v); /* function is present in 0.9.13+ */ -#endif + pa_cvolume_init(&v); =20 v.channels =3D vol->channels; for (i =3D 0; i < vol->channels; ++i) { @@ -724,9 +702,7 @@ static void qpa_volume_in(HWVoiceIn *hw, Volume *vol) PAConnection *c =3D pa->g->conn; int i; =20 -#ifdef PA_CHECK_VERSION - pa_cvolume_init (&v); -#endif + pa_cvolume_init(&v); =20 v.channels =3D vol->channels; for (i =3D 0; i < vol->channels; ++i) { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441845; cv=none; d=zohomail.com; s=zohoarc; b=jt+1sbMVb+H7W0Zrr7+XFPhQ/m4Ceu+4tYtFjZvYlTrE2nQO6uQ9cZXGb+9jZLfHaoQ9KT2wBBwMDR+5hhdVGPYkVj/QA09LhAM6f4ItZp2LNw0EgNDjzEOL7vij40gyVVrE5/4a1KZItlMMANPbgt1SSdCBlHSn985zBkG7RwU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441845; 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=MzxHzHOzm9YjyekujVzBigOBvtSdmMNTQfMMLR0iTvo=; b=mWZyoITlMHQWnSnbi9hw7UlPLgwQorF59ghHmMzU8PUBRwav92tH/iU+QRsmmURnMVuIVS/mmRgy1hVEj9alG4dkQ9Lt86UKjrYWJfWTuSPnG1FFPYkof/IgQCW3OS9HnoAG9yv+ukq8lQclZz7S3WlzHUdfE8tPocb6q/SAVHw= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177244184569156.86340590919792; Mon, 2 Mar 2026 00:57:25 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzc-0007OF-83; Mon, 02 Mar 2026 03:51:08 -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 1vwyx3-0003If-SP for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:37 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyx1-0002Eh-RN for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:29 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-298-a1wll9EcO7aRwngbsN6i0Q-1; Mon, 02 Mar 2026 03:48:26 -0500 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-439bab2d095so234660f8f.3 for ; Mon, 02 Mar 2026 00:48:25 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b0549600sm11276137f8f.35.2026.03.02.00.48.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441307; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MzxHzHOzm9YjyekujVzBigOBvtSdmMNTQfMMLR0iTvo=; b=NttXSYwrXoQnMjkesHFOlH3SNJsHXHfWfFHVq3j/kUVd7yrKageBk+awrs4KHBTb6gJpYv uMiErlnUfRDqHCiCggWH0iOWZqsR/Ra/4Unm7htycoJgfe02VpKHzfLI7JqnzNGWx2wEnC 7Kur0Ac1UeUmb+O/EgGLCFh0+pbWXVE= X-MC-Unique: a1wll9EcO7aRwngbsN6i0Q-1 X-Mimecast-MFC-AGG-ID: a1wll9EcO7aRwngbsN6i0Q_1772441305 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441303; x=1773046103; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MzxHzHOzm9YjyekujVzBigOBvtSdmMNTQfMMLR0iTvo=; b=hmbm6vzgR3YHx6HS9MO+nt1a3erNx7YNAA8JDuiPin051HO3JFlvjm+jqf7zBIWEq7 XZBRpwlD/BMcJFZ3j/2j5oiu8sxB+tU8xh65PtO+as5mpBAlB4xDhjjJPNGqDNc1nwwT jlpS6JhIh4JtV59zvgqYKXkqm0gdRmlXa5oLvr3RtfHjXnIQ2YiQSHqhPIwVZNXOq10+ B5j087Lq3FxkImCKTJBXuFhmhJhv6Eg+zhiJHF9bFifbHAZVPBJm9ILYCprQFvjovuhf LMJO/uMcIFGvs/w6yAS2+LJ3BYzHNHzL0SfyytJtv6KieZJ9/9UP8Q7haIVj7wQXVvs3 P88w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441303; x=1773046103; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MzxHzHOzm9YjyekujVzBigOBvtSdmMNTQfMMLR0iTvo=; b=wrNZ5kJf7eYxAmtNcU3Vs2HlyBezOnpwExYF8gqWwrJWoTfgrK68sGLuZZ2oAIcMm7 kF/IPDwlfjOZrnZzt97OLgc9Bw7stcaitPQEY3bys/HndgzQuEclw5HsfoRbhRanB0fD Z3AMms3FLjKMgAmW1svHz32ydYpjbs75q/o3rEvhaY9XRzkT64ixv7dXQsJO9dm0AgrM ieBPdskDaq/A6jDEeUofLY//xHa+ihJLxIFC3jMRyaiiDEVu6RUL/YRhQQ/TRLPVKaEG JJYHgbNrwFSlgtikc9SuTzHA+3d+kxTp4GitSKsmx709fPJU0UyFLS5JgzG08Bqp+BlY gWcw== X-Gm-Message-State: AOJu0YxEJBzlD6c2uVcIS11IV9LfY+2m4UcN40KQL+GXDHK6O+izMiRL eL1gxaZcZNS4gCgcZcaArrkdyS904k4jNuGU8F9mh8jl1MX2lbtqc/aD9l04K4lrBdLtmtxLc5s 3Qs+I//9KuJhckI9ab7Vbc4HKXtjhBM7lNg8fhEsIawey30dy7w2UsSBlBf0A/iEsy4Mii+AZce Vb8J3XVyW5rQqMkER6a/1Nwj+f7KbqEvvP3S9hWCnI X-Gm-Gg: ATEYQzwGHrXVtHOAqhJ4QDnt/1ZtNRFuZG/Eq2OSz9RONHfGnDQXkBoq47o06sExAXm ClY5cp7fHxogsM99U3Y2hjFz5V6vd5Y2HQcdgcaQuKsM8hHceS51N3dO55IBdyXz8nH/+nPyBxL 3GpynFx8F/XrGExS62nxeEz5c07LvE8Aw7qJc3hbr601KrKBqRwV+OyooPh3rB8TeizwSsCmFjM MtICNORXBMggHyBSxejBhLBX+IvbGVFKF+TnnuSjNmouS1C66rzP9Zc1DE1wZybTjdU/C8PsrtP 6m9dZ3ipBWRf1UBepP+4byzpzYLSIET0Kp3cSdCrpstpGiqxceEpHUJ2fgy0jRyjRO1mZzweJeN D1egGxe4C7E1iioH6MisG6d/vDzj3eWJi9bPAxF57M+o7dcaVQ5aOsNI98wfLhBQE9TMt4d5KzJ phGNpf98/nJui4Su4jrYAO5HR51f4= X-Received: by 2002:a05:6000:2401:b0:439:9566:f6d4 with SMTP id ffacd0b85a97d-4399de3a913mr19988352f8f.53.1772441303340; Mon, 02 Mar 2026 00:48:23 -0800 (PST) X-Received: by 2002:a05:6000:2401:b0:439:9566:f6d4 with SMTP id ffacd0b85a97d-4399de3a913mr19988302f8f.53.1772441302839; Mon, 02 Mar 2026 00:48:22 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Subject: [PULL 080/102] audio: require spice >= 0.15 Date: Mon, 2 Mar 2026 09:47:26 +0100 Message-ID: <20260302084749.474955-14-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441847158158500 From: Marc-Andr=C3=A9 Lureau Spice server 0.15.0 was released on 2021-04-16. It is part of all our supported distro (except CentOS 9, which doesn't include it). It has all the new required audio APIs/interfaces. Signed-off-by: Marc-Andr=C3=A9 Lureau Link: https://lore.kernel.org/r/20260211-cleanups-v1-5-e63c96572389@redhat.= com Signed-off-by: Paolo Bonzini --- audio/spiceaudio.c | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c index 70a0b60dd83..5a97eb80a67 100644 --- a/audio/spiceaudio.c +++ b/audio/spiceaudio.c @@ -49,17 +49,8 @@ static bool spice_audio_realize(AudioBackend *abe, Audio= dev *dev, Error **errp) return audio_spice_parent_class->realize(abe, dev, errp); } =20 -#if SPICE_INTERFACE_PLAYBACK_MAJOR > 1 || SPICE_INTERFACE_PLAYBACK_MINOR >= =3D 3 #define LINE_OUT_SAMPLES (480 * 4) -#else -#define LINE_OUT_SAMPLES (256 * 4) -#endif - -#if SPICE_INTERFACE_RECORD_MAJOR > 2 || SPICE_INTERFACE_RECORD_MINOR >=3D 3 #define LINE_IN_SAMPLES (480 * 4) -#else -#define LINE_IN_SAMPLES (256 * 4) -#endif =20 typedef struct SpiceVoiceOut { HWVoiceOut hw; @@ -99,11 +90,7 @@ static int line_out_init(HWVoiceOut *hw, struct audsetti= ngs *as) SpiceVoiceOut *out =3D container_of (hw, SpiceVoiceOut, hw); struct audsettings settings; =20 -#if SPICE_INTERFACE_PLAYBACK_MAJOR > 1 || SPICE_INTERFACE_PLAYBACK_MINOR >= =3D 3 settings.freq =3D spice_server_get_best_playback_rate(NULL); -#else - settings.freq =3D SPICE_INTERFACE_PLAYBACK_FREQ; -#endif settings.nchannels =3D SPICE_INTERFACE_PLAYBACK_CHAN; settings.fmt =3D AUDIO_FORMAT_S16; settings.big_endian =3D HOST_BIG_ENDIAN; @@ -114,9 +101,7 @@ static int line_out_init(HWVoiceOut *hw, struct audsett= ings *as) =20 out->sin.base.sif =3D &playback_sif.base; qemu_spice.add_interface(&out->sin.base); -#if SPICE_INTERFACE_PLAYBACK_MAJOR > 1 || SPICE_INTERFACE_PLAYBACK_MINOR >= =3D 3 spice_server_set_playback_rate(&out->sin, settings.freq); -#endif return 0; } =20 @@ -194,7 +179,6 @@ static void line_out_enable(HWVoiceOut *hw, bool enable) } } =20 -#if ((SPICE_INTERFACE_PLAYBACK_MAJOR >=3D 1) && (SPICE_INTERFACE_PLAYBACK_= MINOR >=3D 2)) static void line_out_volume(HWVoiceOut *hw, Volume *vol) { SpiceVoiceOut *out =3D container_of(hw, SpiceVoiceOut, hw); @@ -206,7 +190,6 @@ static void line_out_volume(HWVoiceOut *hw, Volume *vol) spice_server_playback_set_volume(&out->sin, 2, svol); spice_server_playback_set_mute(&out->sin, vol->mute); } -#endif =20 /* record */ =20 @@ -215,11 +198,7 @@ static int line_in_init(HWVoiceIn *hw, struct audsetti= ngs *as) SpiceVoiceIn *in =3D container_of (hw, SpiceVoiceIn, hw); struct audsettings settings; =20 -#if SPICE_INTERFACE_RECORD_MAJOR > 2 || SPICE_INTERFACE_RECORD_MINOR >=3D 3 settings.freq =3D spice_server_get_best_record_rate(NULL); -#else - settings.freq =3D SPICE_INTERFACE_RECORD_FREQ; -#endif settings.nchannels =3D SPICE_INTERFACE_RECORD_CHAN; settings.fmt =3D AUDIO_FORMAT_S16; settings.big_endian =3D HOST_BIG_ENDIAN; @@ -230,9 +209,7 @@ static int line_in_init(HWVoiceIn *hw, struct audsettin= gs *as) =20 in->sin.base.sif =3D &record_sif.base; qemu_spice.add_interface(&in->sin.base); -#if SPICE_INTERFACE_RECORD_MAJOR > 2 || SPICE_INTERFACE_RECORD_MINOR >=3D 3 spice_server_set_record_rate(&in->sin, settings.freq); -#endif return 0; } =20 @@ -281,7 +258,6 @@ static void line_in_enable(HWVoiceIn *hw, bool enable) } } =20 -#if ((SPICE_INTERFACE_RECORD_MAJOR >=3D 2) && (SPICE_INTERFACE_RECORD_MINO= R >=3D 2)) static void line_in_volume(HWVoiceIn *hw, Volume *vol) { SpiceVoiceIn *in =3D container_of(hw, SpiceVoiceIn, hw); @@ -293,7 +269,6 @@ static void line_in_volume(HWVoiceIn *hw, Volume *vol) spice_server_record_set_volume(&in->sin, 2, svol); spice_server_record_set_mute(&in->sin, vol->mute); } -#endif =20 static void audio_spice_class_init(ObjectClass *klass, const void *data) { @@ -315,19 +290,14 @@ static void audio_spice_class_init(ObjectClass *klass= , const void *data) k->get_buffer_out =3D line_out_get_buffer; k->put_buffer_out =3D line_out_put_buffer; k->enable_out =3D line_out_enable; -#if (SPICE_INTERFACE_PLAYBACK_MAJOR >=3D 1) && \ - (SPICE_INTERFACE_PLAYBACK_MINOR >=3D 2) k->volume_out =3D line_out_volume; -#endif =20 k->init_in =3D line_in_init; k->fini_in =3D line_in_fini; k->read =3D line_in_read; k->run_buffer_in =3D audio_generic_run_buffer_in; k->enable_in =3D line_in_enable; -#if ((SPICE_INTERFACE_RECORD_MAJOR >=3D 2) && (SPICE_INTERFACE_RECORD_MINO= R >=3D 2)) k->volume_in =3D line_in_volume; -#endif } =20 static const TypeInfo audio_types[] =3D { --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441388; cv=none; d=zohomail.com; s=zohoarc; b=OL0u3cXTsyDmBDdy+mtJepJyWmEQALf+T/6vcDObTWDRQxo4ZQZ8U1228sosNSGQXRDK403Mxoj5zI9nuYWka1QBrw3xlkBqnRMdI/ZrYeXDIQflNip/zgEiou92+/9Q8SMJ9UECdbmEYz+5WqRALNPJ6KMgIICtTka6HrAeFDU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441388; 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=xmxuLXSQjpx8FYdfBKGNckzov1k818273nQJiPB8cgA=; b=hBHPEpbXXqMStlJ9NETTHvo0sQ0OGCLouBsJi34r3VUULhd61OBWhKqqgD8ymHNPi+oeE07jSMPe1Z0hyVgwOHRR460zdkrBx1l6vT4Hi5ttm+W4WRsNZRf7Ysmk5x6eMqUdouGlzqkfGcb6Qa9NLYTornjuTAaAI0SUgXUeM4U= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441388090304.7235805068092; Mon, 2 Mar 2026 00:49:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyxv-0003h4-Ku; Mon, 02 Mar 2026 03:49:25 -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 1vwyx7-0003J9-DX for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:41 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyx5-0002F8-MJ for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:33 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-462-Dzw9ACeIMhmX_iWRf4Qsrg-1; Mon, 02 Mar 2026 03:48:30 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439b6c9766aso741884f8f.0 for ; Mon, 02 Mar 2026 00:48:29 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b503425asm7957466f8f.25.2026.03.02.00.48.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441311; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xmxuLXSQjpx8FYdfBKGNckzov1k818273nQJiPB8cgA=; b=KXGxohiR3aymXsaT8YvyHXpgOkZW00KOdcLaFHs3YNcD+dbpO+UYQUTavZIDqN35dGJG9H eh5D4sW7X6HZzoTjQ/4pUj/Ro3ToPhsRb3TZGujYMFhNlSbYu77Bmtkab8aWuI2/Tlz1Nz SLOs+wPGlpqQ8iYz8+7sh+yzAR1mLRE= X-MC-Unique: Dzw9ACeIMhmX_iWRf4Qsrg-1 X-Mimecast-MFC-AGG-ID: Dzw9ACeIMhmX_iWRf4Qsrg_1772441309 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441307; x=1773046107; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xmxuLXSQjpx8FYdfBKGNckzov1k818273nQJiPB8cgA=; b=EjBIBZodECUVhJg2pwrvjjIQR35JcilCfsI4GC9DbowXIQid8fwOoJ1NRBPSs2LSMe sutungkccWzOnWg7Gg7PSK6wNTnXMm/KPawBWMfraqaIGCNU/d4uSaJI1I5zUW/UfmDv Dt/2CbP0wN5Ld6ShszVimtYri6d34txFanpmyNaXvxUDCSOBo5EGEKDag1BVZvWHM7ON R+GIoXyR4Hj+TVy6UvXm+p7n72+/f+Iz8CqzSpMk0S7R0b4HNhOCveneLL7PNgpHIQ9s vyucnYZ984dWIWlsbGp0MydxpTkE/jbW0msudvoVB6TK0hu3tRm0Tr/MSF9s/rpyW6L9 x6Tg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441307; x=1773046107; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=xmxuLXSQjpx8FYdfBKGNckzov1k818273nQJiPB8cgA=; b=Vi/I4LV8sPVSobOn3+4rD4cH9WyXd4jchUibPWIM4zFNN3pZD0n8sOr1XYNPg+kASI 13gO8KCINlwCe2Peh9pzISsqsV3ivK0rJZ9/eExkoQ5+DK7eTwa257ZSoNkflhOHWB14 XYRFGAgwlFWLqNWt0pjV9s9A4D0yLr+4CR/uJR3m4Hx0Fif62NDHz//hk6zTZUSFMS8K 0eQ70fNwFzQ4VDa0YmrkxwHNqbEaqs0bJ7IfxWpE+0ixTeTiG6R2Lx6ch6qxqKistKSv dEsGbUWhnFZeyPVhqd+vUFtrX14iDLTLdq1E+UQ9J80iycw5YUgb3KvYPa5vL0nvLWh5 r9cA== X-Gm-Message-State: AOJu0YzNCZm7tAVJn6tSwaYWWc1agA5ULjlggsI+h38QX6gNxjKErxrr /5PGRY2qEozLXq/cPFYNdkXVa8YO1EHqPGT7bd0LP1lmLWgT+DeV3+/4LGup4MgmtDBQFht3yGm I59hvdjFkbBV8TJVwPz2Q1Strqjk3r5SPFEYaGiD2i7LFS2cWGbqa4VeEm/+migGiupodfyNfsG 87bXHA1fI9+9SoHBcI44X2aDH2hO9ysyBs3mwZJcwm X-Gm-Gg: ATEYQzzIxWydeTrCQavHP+92C9GfYqsedvJsWAWJSXfTGspPYMWRXGVFBdnyeYAEWjL fwFQopyRiZLFpKu/bRyH5OShxWwhXDoeL8+dIrBc3BVIodroqlwuIu9IbT2UhTADRArsVb5dtnO 75NB8FUSC2li+BsJKK4m7KOGoT1xE2S7n0wYieQlA/qLQsoJajEhOqsF68JztNiBqfdYPBX8vzT RGVEW8KHtyzCWtn+H25yUlrDYpJvT/oPslXDVpQR1sHapmTI3Bo1VL3Z73X/pBzyTgfJougGwWY ZnNExdj5jHGeS8d+V31ZhBu957AOD2jOqr3FdN2E43/1XrOQ2oS1suHRykdcX5QmNgcLAVS67iF XfP45Ee39/HGd+FAjck9FFCLRJtFk3tAFVJqhdT097iYI3jECU0RieqxBhBOZRMazTbT3q4AWRE zFnkkwkTm2yM5ZzWaJxXS8g+cR5Qg= X-Received: by 2002:a05:6000:2902:b0:439:b265:6c61 with SMTP id ffacd0b85a97d-439b2656dd5mr7466967f8f.12.1772441307367; Mon, 02 Mar 2026 00:48:27 -0800 (PST) X-Received: by 2002:a05:6000:2902:b0:439:b265:6c61 with SMTP id ffacd0b85a97d-439b2656dd5mr7466917f8f.12.1772441306755; Mon, 02 Mar 2026 00:48:26 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Subject: [PULL 081/102] ui: drop spice-protocol < 0.14.3 support Date: Mon, 2 Mar 2026 09:47:27 +0100 Message-ID: <20260302084749.474955-15-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441388850158500 From: Marc-Andr=C3=A9 Lureau According to repology, all our supported distributions have 0.14.3. Signed-off-by: Marc-Andr=C3=A9 Lureau Link: https://lore.kernel.org/r/20260211-cleanups-v1-7-e63c96572389@redhat.= com Signed-off-by: Paolo Bonzini --- meson.build | 2 +- ui/vdagent.c | 18 ------------------ 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/meson.build b/meson.build index 11f83cf05c4..f67f8668bd8 100644 --- a/meson.build +++ b/meson.build @@ -1325,7 +1325,7 @@ endif =20 spice_protocol =3D not_found if not get_option('spice_protocol').auto() or have_system - spice_protocol =3D dependency('spice-protocol', version: '>=3D0.14.0', + spice_protocol =3D dependency('spice-protocol', version: '>=3D0.14.3', required: get_option('spice_protocol'), method: 'pkg-config') endif diff --git a/ui/vdagent.c b/ui/vdagent.c index 7ff0861f3e9..5a5e4bf6818 100644 --- a/ui/vdagent.c +++ b/ui/vdagent.c @@ -17,14 +17,6 @@ =20 #include "spice/vd_agent.h" =20 -#define CHECK_SPICE_PROTOCOL_VERSION(major, minor, micro) \ - (CONFIG_SPICE_PROTOCOL_MAJOR > (major) || \ - (CONFIG_SPICE_PROTOCOL_MAJOR =3D=3D (major) && \ - CONFIG_SPICE_PROTOCOL_MINOR > (minor)) || \ - (CONFIG_SPICE_PROTOCOL_MAJOR =3D=3D (major) && \ - CONFIG_SPICE_PROTOCOL_MINOR =3D=3D (minor) && \ - CONFIG_SPICE_PROTOCOL_MICRO >=3D (micro))) - #define VDAGENT_BUFFER_LIMIT (1 * MiB) #define VDAGENT_MOUSE_DEFAULT true #define VDAGENT_CLIPBOARD_DEFAULT false @@ -87,10 +79,8 @@ static const char *cap_name[] =3D { [VD_AGENT_CAP_FILE_XFER_DISABLED] =3D "file-xfer-disabled", [VD_AGENT_CAP_FILE_XFER_DETAILED_ERRORS] =3D "file-xfer-detailed-= errors", [VD_AGENT_CAP_GRAPHICS_DEVICE_INFO] =3D "graphics-device-inf= o", -#if CHECK_SPICE_PROTOCOL_VERSION(0, 14, 1) [VD_AGENT_CAP_CLIPBOARD_NO_RELEASE_ON_REGRAB] =3D "clipboard-no-releas= e-on-regrab", [VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL] =3D "clipboard-grab-seri= al", -#endif }; =20 static const char *msg_name[] =3D { @@ -125,9 +115,7 @@ static const char *type_name[] =3D { [VD_AGENT_CLIPBOARD_IMAGE_BMP] =3D "bmp", [VD_AGENT_CLIPBOARD_IMAGE_TIFF] =3D "tiff", [VD_AGENT_CLIPBOARD_IMAGE_JPG] =3D "jpg", -#if CHECK_SPICE_PROTOCOL_VERSION(0, 14, 3) [VD_AGENT_CLIPBOARD_FILE_LIST] =3D "files", -#endif }; =20 #define GET_NAME(_m, _v) \ @@ -197,9 +185,7 @@ static void vdagent_send_caps(VDAgentChardev *vd, bool = request) if (vd->clipboard) { caps->caps[0] |=3D (1 << VD_AGENT_CAP_CLIPBOARD_BY_DEMAND); caps->caps[0] |=3D (1 << VD_AGENT_CAP_CLIPBOARD_SELECTION); -#if CHECK_SPICE_PROTOCOL_VERSION(0, 14, 1) caps->caps[0] |=3D (1 << VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL); -#endif } =20 caps->request =3D request; @@ -318,11 +304,7 @@ static bool have_selection(VDAgentChardev *vd) =20 static bool have_clipboard_serial(VDAgentChardev *vd) { -#if CHECK_SPICE_PROTOCOL_VERSION(0, 14, 1) return vd->caps & (1 << VD_AGENT_CAP_CLIPBOARD_GRAB_SERIAL); -#else - return false; -#endif } =20 static uint32_t type_qemu_to_vdagent(enum QemuClipboardType type) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441958; cv=none; d=zohomail.com; s=zohoarc; b=APXjxZYsQPm55/TrK0WTOmKaI9Pw9Yi8ZbS9126FaVA/lx5KaCgbiFbY2Tcj8TLpxlOFKrnTsRUkVwk7x6B0M8oILRnhijvD7kfC5hCrVc7/2pzckU3L/MNXLhtmycQGbRCEuWBQgZpfPrNRrpdtP2KNVlbgoKKlNVQtkrqBzWY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441958; 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=fvVIHLANBHUcF399LGD4g3MZPY72/e4uDSib/lKjsjw=; b=fd7wLCwF7wwdFkEWqFyytsML2kvnEawxa1pJXhdU6DWHQC2XaCO48tyXKanSsbwApSmFjH9gUv1cgqfoKZVAAfgyWmaJ6MgzObUEwAloWBz8gv52+8fUpdVoXXJTRGkvEVVjf0DOYi2arHly04+kXtejHfUjjFMtzbmC2U/OuFU= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177244195809929.931308527978445; Mon, 2 Mar 2026 00:59:18 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzF-000573-0z; Mon, 02 Mar 2026 03:50:45 -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 1vwyxA-0003Jf-Jb for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:44 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyx8-0002FI-Dj for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:36 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-50-aWoN8bz-Nnq-xEQaKw7QDw-1; Mon, 02 Mar 2026 03:48:32 -0500 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-439b4e653d2so709556f8f.1 for ; Mon, 02 Mar 2026 00:48:32 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b6d540b2sm6405017f8f.36.2026.03.02.00.48.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441313; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fvVIHLANBHUcF399LGD4g3MZPY72/e4uDSib/lKjsjw=; b=CnJ4flQy6Iadun8IzVNQUfTZLKL1k9aGA7wGhQguJMy9MqN5mRg9q+8UkZxBU4xZqMf3w/ EQx6LSakzVnXO+yI7zc30C/0BsFW7S+FF8lTPmqfmqczRLNfB7oO5glEYB/+F/AuC6U1mC /U1gYm1mptDQ0jmBtXi+cwPJhr3jLVw= X-MC-Unique: aWoN8bz-Nnq-xEQaKw7QDw-1 X-Mimecast-MFC-AGG-ID: aWoN8bz-Nnq-xEQaKw7QDw_1772441312 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441311; x=1773046111; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fvVIHLANBHUcF399LGD4g3MZPY72/e4uDSib/lKjsjw=; b=MtGOLrDVmnlYUxQvuH7hyrJeaL/8Fcyo53pvvUZyYh1oI7QZVKzFpg6fDohMskYNEb 4WGlN79Hvczfty28g/oqjnvYq86aGgVcvA9ORsoxVQxCWPJ8A7HH6+Cii6kLWc1JslSe 1M+1R1brrQtC0Sxpv8/6dNTCNtv57ecMTP/K0e26IFBka8/rtxHhdwfd+wgQz1V5gIY1 AKyKBRP15hvUNarnzT4C/IOuuCUQDzjvK2463MvVH0H+Esao0jkyVhJVZzKsBcYpxvgz dIJc8WJHjp02FBzrEeSbTfE1rXCRFstQtWgrhXogQmIdbpZRKdTrNvfiZ9XXRdwMVFpp yBpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441311; x=1773046111; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=fvVIHLANBHUcF399LGD4g3MZPY72/e4uDSib/lKjsjw=; b=iMmD7aZBaNmFtmDF0nJ74Epk9OBFsQcpwse7kr6nJ0tJZaXiFe2dVNDNfSJY/VXEE+ eHvayYIslASMWN1eT42FcI5yXLHCt7JWLf0y33bOWF0Q3jiZDInAHIyOYK+H1PPO0tZZ OKj4O10FkGOjMFM7ceHtajBzI1SeFLTtWc/sSNhfozYxCIBQlqsMvNA3m4oLUdOG0hXu IqNWRDnBsFWfvjd3EdAYgnvO0jJxeYTAvmvWNN+iWaRv/Ww+MNNr2UGoFRt8OrSO/2fX TU2y2Zfp+SgzIcbogieSPbPpRqgy2IQpfDMCKSGV9gtqpq1XFYeeOgwFosEGu7KV1jbo rICA== X-Gm-Message-State: AOJu0YxVPs7s/8iIecTfZr3dnZ6am3efNDSsUcurcM+B5w0Tkiz/0ICo KzTlFaaL1lgTgat8KnIc4SKexfKCV3FV48qcCb0rg2B7R7VMiy9iCmQVCJOS7H/XVjJy5Mnae8f 13z4iclguIFwHzfPImZHBEC6qn3ssUm4KsHFti7IJDii9i4vAtfUqSM9C5kw2O0wyKBZ4/dtcal HKaWzGISya/QKkEuYPth36E6M18Zf9czQbW4IsAWWu X-Gm-Gg: ATEYQzyjPk5KzDw+bybtOSaP9D38PFp76/vvG7wNDY9lkZOBpdyqywGgjpPA5+RQ/Uz xT+XJqyv91oiH2lVYE9LvT4tKsJwgvvkmSN135sD/rJv4nOcL5qwbcZe93mALZ451yd/JJsI0Bp IH+PPP7uzudjFcc0UkvL8bhNSZGe3qSCGlgk8A1662T1Z9xV5UTsVYSpBT4wqcyPhpW4tI0WS7a 6KKDK+aQZc3t/cr+0giZPonCAf9iN9vaDjYlo+2VYCSJQKjYZbKpIB38hDc/DlAzW3L9YbUo/Lm 3/7Sb3jJheqKnz8u1wqteeTI8GJq2Ytz8z+trDDelHKjth+w48Nvj9K6lwWOJMJqimkSUXtjLvC aiiRltq93mua8rts38xTFCI9extwGXq/PLTsjrsPyBq6j9W7K19uvd7lG6TfXaJhwZiJQqlNLlZ dWqwG+26ayDOr+X27u9czXEpb30u0= X-Received: by 2002:a05:6000:3104:b0:439:b715:6f4b with SMTP id ffacd0b85a97d-439b715782fmr4148037f8f.57.1772441310913; Mon, 02 Mar 2026 00:48:30 -0800 (PST) X-Received: by 2002:a05:6000:3104:b0:439:b715:6f4b with SMTP id ffacd0b85a97d-439b715782fmr4147976f8f.57.1772441310259; Mon, 02 Mar 2026 00:48:30 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , John Snow Subject: [PULL 082/102] rust: use checked_div to make clippy happy Date: Mon, 2 Mar 2026 09:47:28 +0100 Message-ID: <20260302084749.474955-16-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441959639158500 Content-Type: text/plain; charset="utf-8" From: John Snow When upgrading from Fedora 41 to Fedora 43 for CI tests, clippy begins complaining about not using checked_div instead of manually checking divisors. Make clippy happy and use checked_div() instead. Signed-off-by: John Snow Link: https://lore.kernel.org/r/20260219185409.708130-2-jsnow@redhat.com Signed-off-by: Paolo Bonzini --- rust/Cargo.toml | 1 + rust/hw/core/src/qdev.rs | 14 ++++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rust/Cargo.toml b/rust/Cargo.toml index ace0baf9bd7..0d24eb84e1c 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -46,6 +46,7 @@ redundant_explicit_links =3D "deny" [workspace.lints.clippy] # default-warn lints result_unit_err =3D "allow" +manual_checked_ops =3D "deny" should_implement_trait =3D "deny" # can be for a reason, e.g. in callbacks unused_self =3D "allow" diff --git a/rust/hw/core/src/qdev.rs b/rust/hw/core/src/qdev.rs index 145e20a984f..b2e5441079d 100644 --- a/rust/hw/core/src/qdev.rs +++ b/rust/hw/core/src/qdev.rs @@ -425,18 +425,16 @@ pub const fn period_from_ns(ns: u64) -> u64 { } =20 pub const fn period_from_hz(hz: u64) -> u64 { - if hz =3D=3D 0 { - 0 - } else { - Self::PERIOD_1SEC / hz + match Self::PERIOD_1SEC.checked_div(hz) { + Some(value) =3D> value, + None =3D> 0, } } =20 pub const fn period_to_hz(period: u64) -> u64 { - if period =3D=3D 0 { - 0 - } else { - Self::PERIOD_1SEC / period + match Self::PERIOD_1SEC.checked_div(period) { + Some(value) =3D> value, + None =3D> 0, } } =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441960; cv=none; d=zohomail.com; s=zohoarc; b=iZUtu24zbeVG3KU2EPMj4NuRIfgDcJybVPyCdljdgi3sSI+anYo2PZPsUZgM2vqL0KsH9V/zinwwY92EIJ5X2zjDl29zAmjRBxq4IJHyx4pkTzfr6IdUwDFCfKpoV4plyyCfdYvva9sQe56LWE2NO8UjIL4t45wBhByI0hnbAhM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441960; 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=3UgH+JOnN2M8WHuMSMR4uqDP2YjLtYKqK18FCdha8ns=; b=O6GNmRxkgi+OJiH9QgBYXWQzU4TXhRl0uhE4ssdNJDk7KtnHfjdbJnnJKdcqpiL6IxLCX44HVlhBrkxqKPf+PI66alNauKOmL6pzie6cMzfz2dliHg5QJlHhqEQ8Odjje3RAX3koUsHkzeQ+f8i3cenz9202MQBVcYFQXxmN+8Q= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441960578917.6388783520175; Mon, 2 Mar 2026 00:59:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzc-0007Ns-2n; Mon, 02 Mar 2026 03:51:08 -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 1vwyxC-0003K6-O6 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:49 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxA-0002FY-Ve for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:38 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-641-wRlI9wCeNI-cKEVXvBJlcQ-1; Mon, 02 Mar 2026 03:48:35 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-48069a43217so41073985e9.1 for ; Mon, 02 Mar 2026 00:48:35 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd750607sm391268695e9.10.2026.03.02.00.48.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441316; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3UgH+JOnN2M8WHuMSMR4uqDP2YjLtYKqK18FCdha8ns=; b=gEwF3k7TYPvwHLcYXC5uOtlZhmI81mu1wUX1gfh1P8fEoQ/Ne82XpcWSiVG2/nLb21sNEC 9WtzpG1fm19yPiE2bORQE17tEoUKCpaT1WQrRyv018mbc9GWayrUV+gJTAKpAKOMVPr12F 7aKKca8X5utcCX97DEdL6ol6w9Fp2LY= X-MC-Unique: wRlI9wCeNI-cKEVXvBJlcQ-1 X-Mimecast-MFC-AGG-ID: wRlI9wCeNI-cKEVXvBJlcQ_1772441314 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441313; x=1773046113; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3UgH+JOnN2M8WHuMSMR4uqDP2YjLtYKqK18FCdha8ns=; b=fxre8Zh1xPmzPIHH30pW4WJwEpZ11ihOoHYAkhk2P5gVqniDJPDGKb3bIBDm0ob0El 8HpZPElA7Bd4dfnyQv9GkImHFVGlAsZQrt5krt9aInJUxpYo2VytWjSTHjBVZwP5VZFv USW0KahrsugIPaMNhCBwTXvJwJsYTG+ZHvVfZLbGbb5Pi8huy9U640OhURL3sAwdnYBj 6uR1BGeSCc1F9TnP3dqBIrYdQ+7icFcRtBwixUeKv7MVHG6I1ZsBb2sEkig4qb6UgVNs wCQc7li7lmim8t52h4rCIdxVv/H7zkNn8HTnNqfnSc1lOMjnWuJpQQVlbqouvLMXbt7x 7vlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441313; x=1773046113; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=3UgH+JOnN2M8WHuMSMR4uqDP2YjLtYKqK18FCdha8ns=; b=qhkbMKf70FObrCO3x+SqKAnT+R1himdGEsXF36RpIW1EWPdnkH8OlUnsG49Pm1XsfT 2PsyfyzppUoDmgMScKCjzuILdL5NRWVS3E650lHGvUvQ90PstGqJI7mtIvOqjLNvwC7k 6RNIed9vAQyd52PBkDsT95XM2DAlxqTTgNMRvqzOePr1Gjnb/Fi9fdI7+I8AtRnH8tjT p4ooWd1LW+Dy2+TmcG+GwT49jxEfK+R0sZRcuuHCxYKDfwf5UDSLIv228ORlecY+ZZ4L w9xxGQqoXvSzBOwgF8SAnx2uKzYn4pDGhLO82gKybv7wH6H2r/AJvArFkPZr6o3/20bO 7WbQ== X-Gm-Message-State: AOJu0YzYfE2Zb05lYZla9ZtLlmd7Ku6q3mwwIzH5F0++mOt4staErLqi esm4m1CoI3+GADc1tBQ2fUaL80WxoFYkHJkGqeLZbFO3edBCt4OurlaW/temMKcrxMbmjoikq/m LHbhxLjX4Unj1phZL8gUMge5okHypWE01+kZQ3Ihfjg/I1M5GGY1MUy6ZqOvbntyCMMMGZ4C9Jp MbIQCppOb0CrLQd4Mn+XN8nYswq6jr1zC7qeX0xcO+ X-Gm-Gg: ATEYQzxzsKs2oEctA7gvOq2iVu8gqz4grUyFSLxb/ytMCz0UL7Gho3AUL7eV1XSLfv4 GEcSO2OPKGeHkWYU78+oy8QJfo2i1PdQL9JyFCsPleEHz4cLgOPX9o+BjLFAHIJakaehXlgVgpZ bCSE5dmMF8LJEwHhU5B7JbMLB+DUatQuSZHrqg7wC+J7MM+lnWzRy1+MdviRUPNqWfOVqpMrI9S C0ehnXt4i98yA7+D3h9GxH0BSVRkhLuG/ZkdKnbvuimf9ZgEdjVtJ+EB2V2QVRIFbO1lGCcE2/n uct8F/WcA2KPiCeXGQVmtcdGsiVjnT5VIvZHVgiXuyt3YFJ47bthdvjL4ftozHM/hNPoupxcGux 1fHCDw5ClCtf/mt1OT9xzNv2d+ufSnypU0Mz0CZc+cQRXydOYa8rBNxsBvaXckUU8VsMtM3O3Zj rQZtu0JhyWZk77O1sTn2EExaMPeTI= X-Received: by 2002:a05:600c:3e8e:b0:47a:8cce:2940 with SMTP id 5b1f17b1804b1-483c9ba2922mr212828335e9.14.1772441313177; Mon, 02 Mar 2026 00:48:33 -0800 (PST) X-Received: by 2002:a05:600c:3e8e:b0:47a:8cce:2940 with SMTP id 5b1f17b1804b1-483c9ba2922mr212828035e9.14.1772441312645; Mon, 02 Mar 2026 00:48:32 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , myrslint Subject: [PULL 083/102] KVM: i386: Default disable ignore guest PAT quirk Date: Mon, 2 Mar 2026 09:47:29 +0100 Message-ID: <20260302084749.474955-17-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441961777158500 Content-Type: text/plain; charset="utf-8" From: myrslint Add a new accelerator option that allows the guest to adjust the PAT. This is already the case for TDX guests and allows using virtio-gpu Venus with RADV or NVIDIA drivers. The quirk is disabled by default. Since this caused problems with Linux's Bochs video device driver, add a knob to leave it enabled, and for now do ont enable it by default. Signed-off-by: Myrsky Lintu Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2943 Link: https://lore.kernel.org/r/175527721636.15451.4393515241478547957-1@gi= t.sr.ht [Add property; for now leave it off by default. - Paolo] Signed-off-by: Paolo Bonzini --- include/system/kvm_int.h | 1 + accel/kvm/kvm-all.c | 1 + target/i386/kvm/kvm.c | 50 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/include/system/kvm_int.h b/include/system/kvm_int.h index baeb166d393..0876aac938d 100644 --- a/include/system/kvm_int.h +++ b/include/system/kvm_int.h @@ -167,6 +167,7 @@ struct KVMState uint16_t xen_gnttab_max_frames; uint16_t xen_evtchn_max_pirq; char *device; + OnOffAuto honor_guest_pat; }; =20 void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml, diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index a1f910e9dff..ebd721c3d66 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -4277,6 +4277,7 @@ static void kvm_accel_instance_init(Object *obj) s->xen_evtchn_max_pirq =3D 256; s->device =3D NULL; s->msr_energy.enable =3D false; + s->honor_guest_pat =3D ON_OFF_AUTO_OFF; } =20 /** diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 7cfbc7832de..27b1b848d6a 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -3595,8 +3595,30 @@ int kvm_arch_init(MachineState *ms, KVMState *s) if (first) { kvm_vmfd_add_change_notifier(&kvm_vmfd_change_notifier); } - first =3D false; =20 + /* + * Most x86 CPUs in current use have self-snoop, so honoring guest PAT= is + * preferable. As well, the bochs video driver bug which motivated ma= king + * this a default-enabled quirk in KVM was fixed long ago. + */ + if (s->honor_guest_pat !=3D ON_OFF_AUTO_OFF) { + ret =3D kvm_check_extension(s, KVM_CAP_DISABLE_QUIRKS2); + if (ret & KVM_X86_QUIRK_IGNORE_GUEST_PAT) { + ret =3D kvm_vm_enable_cap(s, KVM_CAP_DISABLE_QUIRKS2, 0, + KVM_X86_QUIRK_IGNORE_GUEST_PAT); + if (ret < 0) { + error_report("failed to disable KVM_X86_QUIRK_IGNORE_GUEST= _PAT"); + return ret; + } + } else { + if (s->honor_guest_pat =3D=3D ON_OFF_AUTO_ON) { + error_report("KVM does not support disabling ignore-guest-= PAT quirk"); + return -EINVAL; + } + } + } + + first =3D false; return 0; } =20 @@ -7053,6 +7075,24 @@ static void kvm_arch_set_xen_evtchn_max_pirq(Object = *obj, Visitor *v, s->xen_evtchn_max_pirq =3D value; } =20 +static int kvm_arch_get_honor_guest_pat(Object *obj, Error **errp) +{ + KVMState *s =3D KVM_STATE(obj); + return s->honor_guest_pat; +} + +static void kvm_arch_set_honor_guest_pat(Object *obj, int value, Error **e= rrp) +{ + KVMState *s =3D KVM_STATE(obj); + + if (s->fd !=3D -1) { + error_setg(errp, "Cannot set properties after the accelerator has = been initialized"); + return; + } + + s->honor_guest_pat =3D value; +} + void kvm_arch_accel_class_init(ObjectClass *oc) { object_class_property_add_enum(oc, "notify-vmexit", "NotifyVMexitOptio= n", @@ -7092,6 +7132,14 @@ void kvm_arch_accel_class_init(ObjectClass *oc) NULL, NULL); object_class_property_set_description(oc, "xen-evtchn-max-pirq", "Maximum number of Xen PIRQs"); + + object_class_property_add_enum(oc, "honor-guest-pat", "OnOffAuto", + &OnOffAuto_lookup, + kvm_arch_get_honor_guest_pat, + kvm_arch_set_honor_guest_pat); + object_class_property_set_description(oc, "honor-guest-pat", + "Disable KVM quirk that ignores = guest PAT " + "memory type settings (default: = auto)"); } =20 void kvm_set_max_apic_id(uint32_t max_apic_id) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441924; cv=none; d=zohomail.com; s=zohoarc; b=cD++QdM/3W16MgSA9EsrNnQstC66j6CKXjfXIAAEiyC0zjcgzyVCY0i4/DCl4EXjbnBE/Uj5TkhtI3vNZ8+Sfnrjbp+NauEInc4KSS8ikhzY5dzx4iYQPUHB8s6I5AeBFT7qqykjO0o4gHwbLDu2bo41NHTGiYYMsX+SLY6alnU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441924; 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=i8hWVygGjx0fXwShEpBvbBE7gALzYMVLC51muyruEpk=; b=HneTr43khA+NmmGA3TIRSNlF1lt06xxqhYTwX/Qn2dQiv2LHLoltKoJXj7GzEzTLa0SXwuBBgjTqNYNxbAnSAUjcEm4rbCSpJbFvOUNhxrZf5MStoTbinLW7sdzUZTmxSKVkMoCvPP360He89TiLcesl3Xm7qLQ00eCxtIrkB2k= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441924623491.81948970589315; Mon, 2 Mar 2026 00:58:44 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzd-0007ca-QX; Mon, 02 Mar 2026 03:51:10 -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 1vwyxI-0003KQ-B3 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:50 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxG-0002Fm-Qf for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:44 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-164-zcM1cdNqNp2GFbzHdIcNoA-1; Mon, 02 Mar 2026 03:48:37 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439ae2cba40so1005476f8f.1 for ; Mon, 02 Mar 2026 00:48:37 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c75a25dsm25513059f8f.21.2026.03.02.00.48.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441319; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i8hWVygGjx0fXwShEpBvbBE7gALzYMVLC51muyruEpk=; b=cN0lPPHS5AZocQC3+QD+821sjtFuyAMsE5XNybi3YqgTondvcj+fWPcrueByCbuON5qv6j oKHJeVH3OxMqON1IKhgWHAmy0JCEr2SH+5Se5dM/2K2SjbyB2zb01hWwjZSO1ANntiu9Rz yFYq2wqoolu3kZp9TkNvDTbUbpBK9wU= X-MC-Unique: zcM1cdNqNp2GFbzHdIcNoA-1 X-Mimecast-MFC-AGG-ID: zcM1cdNqNp2GFbzHdIcNoA_1772441317 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441316; x=1773046116; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=i8hWVygGjx0fXwShEpBvbBE7gALzYMVLC51muyruEpk=; b=WLvT1gu++Hw51Z6ufzln9Rvmq0Aqn3IgcAn2HwJmWbakcLKv99pwAU/GlWUAFLtJW9 AanFE3N9TlY/b70sVmlRaD+9xEwEhcTIiLJ6dPXQ/y+9HsfHUNwk75cTCFU6H9SHnaAi bepWbGgmmfzb7V+Pt6VfKkb+uFoblZSZtLEezs8STDK4DCXfyo6whvpSfFdzrhaBvqOT 85dkMBNFZBYm82H8KBB5D91hlYToNUjsMlMgzsXFmMUurRtrOA1NbbWYiVUUgW7Ha2um NbDyx8IxyCME3Ds3QDFep5NZMntkHZw2QpNpKaJc8/kyd94Eg5r0432GzZ7HZTx3NYJK izVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441316; x=1773046116; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=i8hWVygGjx0fXwShEpBvbBE7gALzYMVLC51muyruEpk=; b=uBgtMTArbKxD4fsSI34jsAs3hL4M58T3MfhrE9K3aP+J5wh2Rs7Yf7gFz8K7SDQo+B OQIKs239a21KB4oESoku8CFF+Sc89BApaN4PjHfCXCV4vLYVMGPiZqiNwfxguI7gwLvU hRJ3sfjS6v47uMdyJ/s/5BpKK0ztkUTY1YIPLnTcB9Hk2jyr+tVsJELq8rjPaph5EEV8 bAnLFknA47/Gc6zAxffHUP5a9d1pmBj7DZxomFMEU60hK08mUny+QKxnNtmdmpbir0Tg 44tWsiP8JHLmzblFR1BZODP1absGV4JvxpcQ/RMnxHemb+Y8JCFzlFhKbfz8YLbcJb3r snxQ== X-Gm-Message-State: AOJu0Yw+Hwp3Nmcz8eMUmx+jo2w/aUV/KI/oYH4LKyIG34XnnIci9PjB Vfz1xBKy1XRosPvxK8ufW8c9q/oz8HRKj1DDW8wIwGolCi/1qmFZPXumWQHFrjexRveBe4d4UWh Db6OVjLZFPsDvu5fhM5nbL4AlVdX+1wJifJYLQmqxiaVQQTFIn0bRlOV6zCsyAr2WAtzYysyvw2 AGrJGMQU4z6GcahXKKkQc45PQbIhrWxJHWgJhEqFIT X-Gm-Gg: ATEYQzwchOzdaKpegb+OHRPh3YIuvik06yHDXyaf7E7Qt6PGB7PndZjOZh1ggUBpli9 +k6Q8NjEfbzf2GLq2mBByI0NJTmY2tCEvWISbpBOabBAWTNLlkmkoEARavtmfe3+31VZK5SAtRX 3xVVGpXDKVbYuVser90DG98/KFHxDAvJBnTbTiD/jeQrfWdb2Byo/0/ddK1NLsULpQdUKm3qeap pH85KmfE5WwgW17vvstYM6gMmxd8q5rEIJH+N42mgsbSG0qpEPwz0y3EJQndsOcYA8+gSJjrEWz PSuCAdCKklaxIdlXnk0OU4sG2QKjSN0jW9IdJNeHhMP0J6ijc8t9IYEJ2Se86lQwb1SDN4rRGJI yF7vDjvkoodcH4egJRkQzv1KrtJrBZoQxri4YfaWlMvuHTIxwVQYDsJfHkSJCQTELp1LfuKm9OO mlKNEr/5U5Mg7uG2VGVRJb4zIgEBc= X-Received: by 2002:a05:6000:22c7:b0:439:b5d4:2497 with SMTP id ffacd0b85a97d-439b5d428e1mr5928669f8f.16.1772441315806; Mon, 02 Mar 2026 00:48:35 -0800 (PST) X-Received: by 2002:a05:6000:22c7:b0:439:b5d4:2497 with SMTP id ffacd0b85a97d-439b5d428e1mr5928623f8f.16.1772441315229; Mon, 02 Mar 2026 00:48:35 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 084/102] whpx: x86: remove inaccurate comment Date: Mon, 2 Mar 2026 09:47:30 +0100 Message-ID: <20260302084749.474955-18-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441942738158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni WHvRunVpExitReasonX64Halt _is_ triggered on halt with kernel-irqchip=3Doff = as of Windows 11 version 25H2. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260226181930.53170-2-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index d98619facee..cfc63065807 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -1663,8 +1663,7 @@ int whpx_vcpu_run(CPUState *cpu) =20 case WHvRunVpExitReasonX64Halt: /* - * WARNING: as of build 19043.1526 (21H1), this exit reason is= no - * longer used. + * Used for kernel-irqchip=3Doff */ ret =3D whpx_handle_halt(cpu); break; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441916; cv=none; d=zohomail.com; s=zohoarc; b=TevW1P/u/KWJBx/V+we1+ZAvchPoiuFN2PjUF4pto6ZxSS4zkLQ2v1Hi4FgzuCnb+NpdnfSfAu5wAiKnHeAGqC6V0GW38rXVq8sbZJBmFjsXd9VBsjCt9TSh7PJrIjYJj8+snCoE2J/AoNM0td2Scdl67nufXJYpqIiFqAGKfzw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441916; 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=I6/bq4+YkLb97SUzRVOI1Wb1iLfHZWsSp+w0aut9ac4=; b=NtwE4PZzRzHp0H0J1Mtz8wyy2vj5/+jqtF9gkIIeXhY3N/HsUEztoxTtsDUN+kawAVYnxoohNjBf8EaNliI3rMyRuzhvS5bV4yR8thCuH8SeeB84+KmNFMErb7Yc6M19u6CD+SiGZOeKYWYgaeLwLKfJvQXI5L5uTr/xdD+KSY8= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441916118231.15025953422185; Mon, 2 Mar 2026 00:58:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzU-0006MS-HV; Mon, 02 Mar 2026 03:51: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 1vwyxI-0003KP-9C for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:50 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxG-0002Fr-RO for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:44 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-635-1HMvWPS4NJmghGrfhX81ng-1; Mon, 02 Mar 2026 03:48:40 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-439b484ee04so485044f8f.1 for ; Mon, 02 Mar 2026 00:48:40 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439af926c53sm14131735f8f.8.2026.03.02.00.48.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441321; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=I6/bq4+YkLb97SUzRVOI1Wb1iLfHZWsSp+w0aut9ac4=; b=XpkKGm7JzQowz9ULK5aGh/XZO3tBINp2ApcQUKgQHUY6wQOFELTTH4hErF+tVOGsi8JAvy PH25StTDy1lMNrs8hmV1FReQUsmI4N1wsdbljlfUjVpCYRKA8GQPLJNh9bBgbuymxrtUqb naqcjYgwf/s+TlRW/uSS1FNFltbJHzw= X-MC-Unique: 1HMvWPS4NJmghGrfhX81ng-1 X-Mimecast-MFC-AGG-ID: 1HMvWPS4NJmghGrfhX81ng_1772441319 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441318; x=1773046118; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=I6/bq4+YkLb97SUzRVOI1Wb1iLfHZWsSp+w0aut9ac4=; b=sYQMwwpOA/IAJINouY1Jx20zYNLY2tahz8P2Wf5AlIg+Aox3zXx9ry+ZMWA6l+SObp vw2d+hxWHlNEPgECGNGEXfxeD7wwdGDItEosHdBeh4VRRvHM4+Qpq6IZYTAwL6RNDj8h Rkk22cJ+Oe2ivsRFEfH9TBE3MG5+8cM/n9/0nMNn7yN0WoWFLAo6e/Dn8lrtEnPkftCG 8NnuVvy9jyvo3s49QGHUJJlZ+zZGSWwhOgIvb+gC8XDABZUm614nVxDHzeXc3pTrCsd1 eVeXLc5IIB+KR3oYBJf88DyFR5WJiFRUiUZOZQSMyKqZDwri4csinF69dK7/W3KoXJVx Drpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441318; x=1773046118; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=I6/bq4+YkLb97SUzRVOI1Wb1iLfHZWsSp+w0aut9ac4=; b=SgsuyNmQhp2MUNARLTwhnYBowl/8BovEMPoCkYZyQ4k9hc4R8tbGyzspa9qadZ1U0p oFSGsyj8ZIcFe1s5NKLNmTSJR8A8hOmSDWIN2qxKQFz5zar+tB+7P0Fp/qDGgak+3DXe FV4BbmVtPTco6QLXHflse+kjzpEQ75ouMAyPZX5+dHu6IzWtK8aQ/O5NOhWRfYJbqqN6 wh6FWEwp+q9ELh2SsmA/RxzwYcTZTWhQYTESJSpMs8Lnw24DgI9jRtl7cfnffkM5ZuKM Id6gno8R8sBEA5OXywaAOpTx7xFgExCPAgCBeHvRykgqIHwAgvjucQH9QT/n9+YccSaT vnXg== X-Gm-Message-State: AOJu0Yw6XlHTBQ4qGURZ6HLhvzACBa4XAhxaGfGFJmS9ROHYdJRBUK6N DdevyFCPVY1c2f4HM/1nGgOgZNTypsCVNwvdnORh0cX8LBtsXxR4EMf3eCb6N5PFwRDbAwUXnPU CH4dhuSSmg3gIjaVW/fEjOToxuOrR2WZSA/btwbXdS8JkQV8Oj1gkeBk0wrpIG4ZM/zOLvLLo6G kbQ//fR6bNhD7KD1DpE/r1TN++jiK1Bck5GKSbwqGd X-Gm-Gg: ATEYQzxPmAzJbsrXO6ejUwMmy6wGtIE3GHqtfkjTaaMAbKYbdqxFQRUHK7PqQVqHIJZ wSQn+6jZ+nUu8X3DGjZBB5HbjeTy2Xq93OPw9mq++jV3E1vQ6+/MdBk2ePoemWI3uVtJ1wT7Fls dsJ1LjS95dcYpcSQMTyCiJQktB+NC/orsexBKR+19RPJIfODme2DVE7ajVai7wpkCDXTAhvivQo +PO/SMWZ7zNeKC6U2bzyhQ0tFkyi4U3oYD76lw0H6Jk7aMQ2wm4m5FycglfuYYmlMHTOlNpPgx5 eOSXVqjuB5McMSqKayuKso2Vw/z+GCYR2diTHgjq+wUsLELVPa6nNEggfzCA0R4Q3dKFoq+yVKj zfP+J8Ui8tElat3zwXIcEw8Cnb7A813lUAgHqaJlKkRUpidqC0UDxpRLy+xOqy6t5c9xZKDuKLj eaYiw8pBjM7bBLphb3REEDFBFDSe8= X-Received: by 2002:a05:6000:2689:b0:439:b69b:3c8d with SMTP id ffacd0b85a97d-439b69b4206mr5308545f8f.13.1772441318197; Mon, 02 Mar 2026 00:48:38 -0800 (PST) X-Received: by 2002:a05:6000:2689:b0:439:b69b:3c8d with SMTP id ffacd0b85a97d-439b69b4206mr5308489f8f.13.1772441317625; Mon, 02 Mar 2026 00:48:37 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 085/102] whpx: x86: kick out of HLT manually when using the kernel-irqchip Date: Mon, 2 Mar 2026 09:47:31 +0100 Message-ID: <20260302084749.474955-19-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441942758158501 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Otherwise, interrupts processed through the cancel vCPU and inject path wil= l not cause the vCPU to go out of its halt state. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260226181930.53170-3-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index cfc63065807..51ecc9531fe 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -1468,6 +1468,16 @@ static void whpx_vcpu_post_run(CPUState *cpu) !vcpu->exit_ctx.VpContext.ExecutionState.InterruptShadow; } =20 +static void whpx_vcpu_kick_out_of_hlt(CPUState *cpu)=20 +{ + WHV_REGISTER_VALUE reg; + whpx_get_reg(cpu, WHvRegisterInternalActivityState, ®); + if (reg.InternalActivity.HaltSuspend) { + reg.InternalActivity.HaltSuspend =3D 0; + whpx_set_reg(cpu, WHvRegisterInternalActivityState, reg); + } +} + static void whpx_vcpu_process_async_events(CPUState *cpu) { X86CPU *x86_cpu =3D X86_CPU(cpu); @@ -1775,6 +1785,25 @@ int whpx_vcpu_run(CPUState *cpu) cpu->exception_index =3D EXCP_INTERRUPT; ret =3D 1; } + /*=20 + * When the Hyper-V APIC is enabled, to get out of HLT we + * either have to request an interrupt or manually get it away + * from HLT. + * + * We also manually do inject some interrupts via WHvRegisterP= endingEvent + * instead of WHVRequestInterrupt, which does not reset the HL= T state. + * + * However, even with this done, if the guest does an HLT with= out + * interrupts enabled (which the test_sti_inhibit KVM unit tes= t does) + * then the guest will stay in HLT forever. + * + * Keep it this way for now, with perhaps adding a heartbeat l= ater + * so that we get the CPU time savings from having Hyper-V han= dle HLT + * instead of going away from it as soon as possible. + */ + if (whpx_irqchip_in_kernel()) { + whpx_vcpu_kick_out_of_hlt(cpu); + } break; case WHvRunVpExitReasonX64MsrAccess: { WHV_REGISTER_VALUE reg_values[3] =3D {0}; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441829; cv=none; d=zohomail.com; s=zohoarc; b=JD3+gE6dpSs4OxmdsFPen6wPAGSClAspCA93pEKEa/QYklpIvrtbI20S/YATtQw1P/fJrqszg7EeNanktMrDP77leJKzeTDXBfUmeB2tGirA7PCUCFeTGtnkb0GFlde3N3UrX1MpCItFHRS5TIF4pMI1+AO7dI3xy+p0LTFMSx4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441829; 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=AHNaxLarWljLka2XaII0MzS1ca+rKXfEhW8B8+QmmuU=; b=XssrcZ4k+mvEvwSvENzHuoaoAQxeBD4Xc0pCfKmakEtYgx+GIe+l3Gl6TAvf7xaZ8n4cAThgPPxEL32eszpmy8deLS8LAtFfAvvCw9XNq/F3NrhitkjHN+iP7YBiT3WTmKiclKMKKbc+mC08P4ySoDeqXQuOOmuzzr42N0/oCgQ= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441829943155.5755286867892; Mon, 2 Mar 2026 00:57:09 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzZ-000737-Pu; Mon, 02 Mar 2026 03:51: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 1vwyxQ-0003Nc-No for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:55 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxP-0002Gd-5x for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:52 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-453-9T7iuVU0PsuJChBSrUrUgw-1; Mon, 02 Mar 2026 03:48:43 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-48372facfedso37394335e9.0 for ; Mon, 02 Mar 2026 00:48:43 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd6f3124sm395292325e9.1.2026.03.02.00.48.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441330; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AHNaxLarWljLka2XaII0MzS1ca+rKXfEhW8B8+QmmuU=; b=bd+UXGsSDxejzWkEKhauLBPQkde3UItnls8unXaeDEq4F/+ducLprDoPV6RdjdmqhDvXE2 B4lBSr0PXaCSA8yjwyR8Ms+qSeg4ZdqWOgPcMjjR7Z1h+Nax2WUZAufaTNB6ZD/2AXQ6aJ tuUct7ACCFQbM+N86r+Ok4xiwRxC6m4= X-MC-Unique: 9T7iuVU0PsuJChBSrUrUgw-1 X-Mimecast-MFC-AGG-ID: 9T7iuVU0PsuJChBSrUrUgw_1772441322 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441321; x=1773046121; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=AHNaxLarWljLka2XaII0MzS1ca+rKXfEhW8B8+QmmuU=; b=VS5aIJFtyqRTD8pSiOyNAmynHBP16R7JMJbtkJegXyD143mOa8+cLX7PrE9M425TxS pAEVHG3GpJSRyejhzAS6uWxaJZSwrWNlxfgTmOjaj7pXuWhXWclglZrW1+SGn2CLmRFU dHs+TEVDDsTkphDlJXRZES5OOIadWa9a5ePe/2C+sFCJAICXSaih4PCQX4ScAgv65jyM hv5z/kCiUmm3JJU1yBuDWP2xIr3zsnBBA+cs0xTCloWtpc4UfOR0TgnFmcnmxTLjaDvk E5PrliTlMrcmJyTFgDkCDEUhGkLkpns+2RdYsQWlgT/MUsCTkabEurxoT5XjLe9AQJYO eIqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441321; x=1773046121; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=AHNaxLarWljLka2XaII0MzS1ca+rKXfEhW8B8+QmmuU=; b=HxKTCRJWdI76/eUdGWmoebm9D/ql3zzCWUFhoYyQeDgSHWV5pWHJ0hao2b2M0fmkcr 3NXzCsa3judY0WmSjKp9TjmpmKz/TUvH7pgM+FwLUzQHBso1cZl8XUB01HGkl03P4poK E1yk8zhYboLT//NZqB6nkL/txjdpcpmd3sUb0yQwvvD81nBZh8S2A0rhwwWdA7OPWCbh f52r2nM0Id8zBgdJhEe7upTH98ilCysJ7r8ofxptiMBkNqavHgE54QQ4jCKqP9DhCTz0 pf18BC4yrxyP6/8EM48mQb7Al/ZfIe8bwp3on93A0mrLks5sfowj86LLokNd+arD1/Aa FVsg== X-Gm-Message-State: AOJu0YyCAcKYJfHZaSdgczGBkzq1fLK1XULj70dc6cWfT0L1Ym0sCfV2 slS2/kzLlGDlX1hxbXPxMzHOIWwyg3JVNY/WufLMjCQtRUAiG///Gcgmdzf0+uZHXrgh+SFsuq7 vkkRo2uLjya/gz6lVAyxqNtdP4zUUD5JYFpC9tasXn3tfLpeoVZT/S7i3z1Y0GHdmSRkVj/V1yP /aVGnO8KH83czFQdFtN3t3ouz0iUxcL7H2NLkPmEPK X-Gm-Gg: ATEYQzwgHdAE9b0fvSTC1aLoNiXLa2SLrpfHuHMDQ7R1fmf4lYCk4552SA1noltXhlc irvbwQcLiQGtfzN6/hBDKeWHxUgEehsh75Fr8QnSgcR253vIhEejpYh5spx4DaoSTr8jeRuJMZZ SGHOkwuOT9xzOCqi5lKt/t4eUJWOxGBe/Kxhd4X8Q5cCwP/9T4agRwlqv97AkD/uJNraNhxHkN6 jF0dqgHgC6KbDunCTjhj2qfEyFnDdYLuiczj9IRxXJjZgipeQ9+6q63xdE18W40JKDyLCq4Cnhu /Wqu7yKVgL405XznHMaJgcF2BwrFraragd6rYOiAwOBwYY76y9giO8+UaO609yIzu/x4sHRMcAh Pk1r68tvx6xbX+A5/imoYEBQi4epxWkEvL4Vm3hO8JyU2d2oI38uKh5PGH6RFk81gsT4St7YLFw BdmnH8pko9Vz9ofZdBwiMViUdWEUU= X-Received: by 2002:a05:600c:c16e:b0:475:ddad:c3a9 with SMTP id 5b1f17b1804b1-483c99348c5mr202711665e9.13.1772441320774; Mon, 02 Mar 2026 00:48:40 -0800 (PST) X-Received: by 2002:a05:600c:c16e:b0:475:ddad:c3a9 with SMTP id 5b1f17b1804b1-483c99348c5mr202711195e9.13.1772441320229; Mon, 02 Mar 2026 00:48:40 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 086/102] hw: i386: vapic: enable on WHPX with user-mode irqchip Date: Mon, 2 Mar 2026 09:47:32 +0100 Message-ID: <20260302084749.474955-20-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441831028158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Alleviate a performance bottleneck on legacy Windows guests. In my test setup, this makes Windows XP boot times be 20x faster than they're otherwise. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260226181930.53170-4-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- hw/i386/vapic.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/hw/i386/vapic.c b/hw/i386/vapic.c index 670a50524d6..41e5ca26dfd 100644 --- a/hw/i386/vapic.c +++ b/hw/i386/vapic.c @@ -16,6 +16,7 @@ #include "system/cpus.h" #include "system/hw_accel.h" #include "system/kvm.h" +#include "system/whpx.h" #include "system/runstate.h" #include "system/address-spaces.h" #include "hw/i386/apic_internal.h" @@ -229,7 +230,8 @@ static int evaluate_tpr_instruction(VAPICROMState *s, X= 86CPU *cpu, return -1; } =20 - if (kvm_enabled() && !kvm_irqchip_in_kernel()) { + if ((kvm_enabled() && !kvm_irqchip_in_kernel()) + || (whpx_enabled() && !whpx_irqchip_in_kernel())) { /* * KVM without kernel-based TPR access reporting will pass an IP t= hat * points after the accessing instruction. So we need to look back= ward @@ -549,7 +551,7 @@ static int patch_hypercalls(VAPICROMState *s) cpu_physical_memory_read(rom_paddr, rom, s->rom_size); =20 for (pos =3D 0; pos < s->rom_size - sizeof(vmcall_pattern); pos++) { - if (kvm_irqchip_in_kernel()) { + if (kvm_enabled() && kvm_irqchip_in_kernel()) { pattern =3D outl_pattern; alternates[0] =3D outl_pattern[7]; alternates[1] =3D outl_pattern[7]; @@ -679,16 +681,25 @@ static void vapic_write(void *opaque, hwaddr addr, ui= nt64_t data, } break; case 1: - if (kvm_enabled()) { + if (kvm_enabled() || (whpx_enabled() && !whpx_irqchip_in_kernel())= ) { /* * Disable triggering instruction in ROM by writing a NOP. * * We cannot do this in TCG mode as the reported IP is not * accurate. + * + * Oddly enough, KVM increments EIP _before_ the execution + * of the instruction is finished. */ pause_all_vcpus(); - patch_byte(cpu, env->eip - 2, 0x66); - patch_byte(cpu, env->eip - 1, 0x90); + if (!kvm_enabled()) { + patch_byte(cpu, env->eip, 0x66); + patch_byte(cpu, env->eip + 1, 0x90); + } + else { + patch_byte(cpu, env->eip - 2, 0x66); + patch_byte(cpu, env->eip - 1, 0x90); + } resume_all_vcpus(); } =20 @@ -705,7 +716,8 @@ static void vapic_write(void *opaque, hwaddr addr, uint= 64_t data, break; default: case 4: - if (!kvm_irqchip_in_kernel()) { + if ((kvm_enabled() && !kvm_irqchip_in_kernel()) + || (whpx_enabled() && !whpx_irqchip_in_kernel())) { apic_poll_irq(cpu->apic_state); } break; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441963; cv=none; d=zohomail.com; s=zohoarc; b=QkO9xijxnWLRLnbEnYeVhxbzZSNOerwUVXnJJAn3KDxN1wBncELZK3I1BxEy0r14Osi5FSpZfhVqt+qsR64aIrvE2NoUtYLKTMeAunKIOsWcsSiSH7WQXQRrjEc2TX6vy26uZwXF9B9iW9/wgicGrO9B3sD1m5ELr/CNeormf3w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441963; 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=2MmC+0Wc43ZwpOXcA9/m6B258VAHnxzeYte/HMHDPHo=; b=Sn0Hw2njyZ/5/LtVFvA1iL36H05bET1MG+gp8THcPy5dfsKUQhGPCpWAEMXp626x7L20OUBqC/0k3XhQ/5iOKT5tkEDpnZavGoAOgmbYTOD5r/zUinufdslikcZdd9VOIc1gi6jR0CkWk8AaZJrRCMPXHAIL0KqiClPoybwYAv4= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441963822578.6346041701271; Mon, 2 Mar 2026 00:59:23 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzY-0006sz-KQ; Mon, 02 Mar 2026 03:51:04 -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 1vwyxQ-0003NX-I2 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:55 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxO-0002GS-BK for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:51 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-505-PKM950rNOrqBGIqoQiEOjA-1; Mon, 02 Mar 2026 03:48:45 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-48379489438so39519335e9.2 for ; Mon, 02 Mar 2026 00:48:45 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfb87067sm129197695e9.12.2026.03.02.00.48.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441329; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2MmC+0Wc43ZwpOXcA9/m6B258VAHnxzeYte/HMHDPHo=; b=Ycj45CEDCg55pFnmtiaMWaCW8iaeBKBv5uOfcGMTRl8eP7RgBZz3n3TalAIbaJMF4Qp5iy tc29wzR3eiuZrqcMXOhvJR3N3WjueN6zBikPPwRpgEf5t4lyzpv5BiI2fdGckSWcbGXPnI TeDBWXz9mSedo3E5zCDDiyBsTvyzOxg= X-MC-Unique: PKM950rNOrqBGIqoQiEOjA-1 X-Mimecast-MFC-AGG-ID: PKM950rNOrqBGIqoQiEOjA_1772441324 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441323; x=1773046123; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2MmC+0Wc43ZwpOXcA9/m6B258VAHnxzeYte/HMHDPHo=; b=g6HI6Xu99DLUznXesWlRAgP+WSY09L8TqhdPPLrwD9Px8JUaGpcuz0Eq/E/LTAlcju BDzQYMK4OsMfEuH2cvWCA+aWg/HT+BW7TKSmMZV5cM700T0GMytwIoT9DmfB7BHxx/DP 6iJNTp2Y3Sqt02ke2rAWsTtEXwNJbRQbRJCOlqs12Ii6fe8mcZ9wrhy/wAhgjdyLyE3j KKwUTZAKiujpOdQ+L78dyI6n+4sXoqqVB4bOCQHjjp+iwQzBez53M4xVxKA3go0dWFdW sy2ix/RrJacLlQbm30F0wQkl4x2cxcXrbpUSAOwrX3v8EkYvjloOuon0rkpA+Z+lu/yL wO+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441323; x=1773046123; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2MmC+0Wc43ZwpOXcA9/m6B258VAHnxzeYte/HMHDPHo=; b=aCnYVDB39S5+9Mhqoq0NKHdTG8gYh28at688TtIS/ub9rky6EetB9cmvThpaQIMzQt zJJqXM/F4L6rVm60h74pSCm+M4bwUGvkFl/8r07RXEkYumQ65MThqbMRP/lkwynOusOe 3oShk+gc0+qt2TyMCSZOKZzzp5iSCkrvRUOCzvbsu2QdERpv3noCHiiM8mRmOnJWmA1L HyzE25E0yw9g0zsOQgdIgRF+mR+ZBFLTCpzLfIT3PvJMtu+sVpkS3r+F4JnISJzqecv6 5m9lv3rI3j0Dc7Q99KoBgAsp7B90eMiXqz2aTzI3UTSQ6HtXvn34efHj5tBo/uOi/gEY IQDw== X-Gm-Message-State: AOJu0YxyiYQw3bjOKD2rll7sUvSh03V4kegTXjqO/2LEUopJYmcpz+NK E10lNzHTpHtcfucH8ylLIL8svMY1TravvNCp+Cv7E+BGY0gYTYPawjubGZqN+3+IZOTCFCnNOzR dxdwk8zRNmFCDM2qwf4gE7qbhrRNyp7+x9Wz4+RUMsvaCRimpist91ucfrHJqDfji8OU50vuCV4 VPzNIQwoAQsqalaSYEwg1k9OEeRVUZkIu9bj2lr6kf X-Gm-Gg: ATEYQzw8ssWKFv7rnx0oh4XQCTKHSC78gKAgRAFIjx1KYAZVuj0FTJK3PSYFW8yFAEb 1kEScwUksUHrZKL259wQds/1NbAIEdoF62fkYYET+IBOpG98ss0MHu+fTiuyIXRz0HEmYJzGjxo tmpQc1GbygKIauKfdcHXj0xrrcIAnZ1Hkpr2oz5TSXC1ix4GTLZySbMdxFsMhCBvhu4RrCHwP5C 2/1bG47dA7+jMLVQmgN1JIoFP3a/nzVxaLclVmO4S6S8xrK7e3A2A+0AcbtNITmaUHmoNf/CYC6 IIzbCYniOSvIvqMoaoIVG1No7ZsB7o9nPg92nOK5JKuXdKvWdqTdlzXqq0A35E4qCG4Xj+k/A8I kedqtHfnSQM+WOmrVnT4XWqn0K6iDyE+DhupzjHh0salBc2edxOl2X6AC1Uf39Vlkv8yRxXhv8k SXbW6GUONcxk3Ip0aRmMZ2RF3r4xw= X-Received: by 2002:a05:600c:3e12:b0:477:9eb8:97d2 with SMTP id 5b1f17b1804b1-483c9bb1e09mr191438805e9.8.1772441323414; Mon, 02 Mar 2026 00:48:43 -0800 (PST) X-Received: by 2002:a05:600c:3e12:b0:477:9eb8:97d2 with SMTP id 5b1f17b1804b1-483c9bb1e09mr191438415e9.8.1772441322954; Mon, 02 Mar 2026 00:48:42 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Akihiko Odaki , Thomas Huth Subject: [PULL 087/102] target/alpha: Reset CPU Date: Mon, 2 Mar 2026 09:47:33 +0100 Message-ID: <20260302084749.474955-21-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441966038158500 Content-Type: text/plain; charset="utf-8" From: Akihiko Odaki alpha_cpu_realizefn() did not properly call cpu_reset(), which corrupted icount. Add the missing function call to fix icount. Signed-off-by: Akihiko Odaki Tested-by: Thomas Huth Link: https://lore.kernel.org/r/20260217-alpha-v1-1-0dcc708c9db3@rsg.ci.i.u= -tokyo.ac.jp Signed-off-by: Paolo Bonzini --- target/alpha/cpu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c index e0e13d31e55..ff053043a38 100644 --- a/target/alpha/cpu.c +++ b/target/alpha/cpu.c @@ -124,6 +124,7 @@ static void alpha_cpu_realizefn(DeviceState *dev, Error= **errp) } =20 qemu_init_vcpu(cs); + cpu_reset(cs); =20 acc->parent_realize(dev, errp); } --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441487; cv=none; d=zohomail.com; s=zohoarc; b=M5eCgfx+ENruZ1h/tLfbkcDTXrc5lO4sbp0/kZWdUe+oCSp8Uqm9S03oxcyvXELNKGhZStyuYCZq+KOu2rDDIGrahiVTM6gIRcnY2vzKcUnw51CXN9LCBu6zG3CZQwnlO/2w+xJX9qJrll7wPcCeyU9PRs4TFFd8gSKHaXef3UY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441487; 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=szx0I80Lf0BuHe9FbaGyt5toyYxnG/9fgTe5KnAGYFc=; b=EMrDnLUCDVxIuwGBvgQ2t1speM1RqL0bWVbOwqf8VEF1PR27JtL9AOt01478OgkO8YYnoErY4e/4i8bmoJ+sX6BpgFrBxsCP7Gd3FX3FyYJdaykjhYIY4mkKc84YAgyGJMmD9prswqbwqbHCJMxOZI51/h7GwRgc+xv3L3CW0FE= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177244148766416.33642337035201; Mon, 2 Mar 2026 00:51:27 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyyQ-0003zz-LX; Mon, 02 Mar 2026 03:49: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 1vwyxP-0003MF-0Q for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:52 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxN-0002GL-9S for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:50 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-534-VkLSma64MQ6d-AQb__D_fA-1; Mon, 02 Mar 2026 03:48:47 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-48379489438so39519575e9.2 for ; Mon, 02 Mar 2026 00:48:47 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfb77466sm165991045e9.5.2026.03.02.00.48.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441328; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=szx0I80Lf0BuHe9FbaGyt5toyYxnG/9fgTe5KnAGYFc=; b=VwFagnRw0ofBEzz9J/pILS84hvHyD65gyizPGUU74nt534DFFURg+rLfnagann+8rs8gKH 5H5SGWg2Q9T4E92OlQPSPKsUUi4t5L19/9GlTfnMR/71TfpHnUag05recrL7FsiKZm/cko AkAtYDteb4NniHLg7M5o4CYWfx7ih+o= X-MC-Unique: VkLSma64MQ6d-AQb__D_fA-1 X-Mimecast-MFC-AGG-ID: VkLSma64MQ6d-AQb__D_fA_1772441326 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441326; x=1773046126; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=szx0I80Lf0BuHe9FbaGyt5toyYxnG/9fgTe5KnAGYFc=; b=exs518QRdMSqABx1ezYJsFhcFE6nZ4/Lm30Tm2Ux+lcwYI35jQpqm3Rpb29EJF3cdT BhFElCWnq8RuZu2ELaaYZXTVmFi2ku0JGUVv6KT4r9e8fEluBcT1ShU/5eHdLMqUJQAV /82sfnUzkc1/f4ypnpL2uiXFqnyZOi8TN+Ei+k8v0lKMvisQEZq9FvBSI7pjMgyhbax/ KWnZ4Ailc8+taU+IB0qQWeYq2J1hK7Qb8+V4mY+y+6J5+CZOqf8pRJ1CqC76DwF/+d7/ KSuZwTDdjab03LYlg2EMtnGIY/AvJQeHTHZAT9ec7gqVXBH9RkDW+CQn5BJIRpG4A+Ey bLAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441326; x=1773046126; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=szx0I80Lf0BuHe9FbaGyt5toyYxnG/9fgTe5KnAGYFc=; b=trQ2/s2YaiRbtwFTg5zfJswOGJ7HYJMOoxU5z4hKJ6iu45RsiEJK12jGLJzlCMQYgA DuLqCl/NeWSBV7HEVCmG9EfVo3SXDqlcvjCE16lY+xrVpdT53ipCJB25eczAj1mIsc5L FYbtNydEhg3/Ml5ZNvAn+41hou/w14Jv2IiMms8t40jKcyC4rN2n9U60vrxWZdoYiFzE y3jGW7TLsjPlrhL0fQiZnbuCplCnO72gAfboc8gIaywUODP2CI4MvG+CSYCfjFFErgvq DKX2MHGRgcuyNjpkZwvGSV+bMxya3Zz+Ry+T7tXUdg4ARcLAUUTYopen4Ea0Yk1M/RoV ghJg== X-Gm-Message-State: AOJu0YyPji5Ks+hC6FcbY+VWxigoxG8o+ywsMSg6dLT+1dDUelliWLdA a9GDaTpxjSJ7Gm3rfyjHonsKjtScCSqxM7XdDtGNwfI/hUoVmx3L10X1hcGKVyVu1fCIO16Hhdn 4jgw0xz+hvLEPZtxflV9wkzB9QR+PlXbXG8u8KANCRHmo3E6JaTQ6pU3VQUbg43t9Dm/EAfPlJJ kllHblrNMHYbN7IiFqOl2SmMohwbdTydfjD2/x8cDG X-Gm-Gg: ATEYQzwwd+MWmgg1EpGa1r4qjEE9gvSX1FYjW1IOz6tl2BjMVJs5zlsxiOoFR2AGaKH 689XgDkQgC2x9/WO9xUkRmxSi4fnQMEu/UVnu5w2w2fOh4wQlYjF0udV1glf/I4nlrd1d3HmOQX tSKf/QFKhWP26DL7WrTaS5ZEtUPj2tvltz6XiI3XmvEKIsZcCu0adFtQfW+altIXcFur4HrrM3y X133W8xGsoF7M6S0Fp+29olXdFITxZ3R0GjyHlDEI/wosjFUv9jg6IcKPAEXIgB6fdppZox10s1 zBT+AR55VohJ8MA1NlQU7Zinwwnbe4HaEgfdF16lSRCP3l8C/XhUpDJA4Yx8wBjRaDZyB+b569C /AEO7Fj74hY2mE8FgwbWnJcMT8BbL1c06G9ndfBilhDUmFbNUwDXUVxf6W7po3B0qcnowJA3Ius wyZNFnmDALiix9Mgo9yxlH4itWq9g= X-Received: by 2002:a05:600c:a47:b0:483:4807:210c with SMTP id 5b1f17b1804b1-483c9bfa181mr202180495e9.24.1772441325821; Mon, 02 Mar 2026 00:48:45 -0800 (PST) X-Received: by 2002:a05:600c:a47:b0:483:4807:210c with SMTP id 5b1f17b1804b1-483c9bfa181mr202179925e9.24.1772441325247; Mon, 02 Mar 2026 00:48:45 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Akihiko Odaki Subject: [PULL 088/102] Reapply "rcu: Unify force quiescent state" Date: Mon, 2 Mar 2026 09:47:34 +0100 Message-ID: <20260302084749.474955-22-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441489770158500 Content-Type: text/plain; charset="utf-8" From: Akihiko Odaki This reverts commit ddb4d9d1748681cfde824d765af6cda4334fcce3. The commit says: > This reverts commit 55d98e3edeeb17dd8445db27605d2b34f4c3ba85. > > The commit introduced a regression in the replay functional test > on alpha (tests/functional/alpha/test_replay.py), that causes CI > failures regularly. Thus revert this change until someone has > figured out what is going wrong here. Reapply the change as alpha is fixed. Signed-off-by: Akihiko Odaki Link: https://lore.kernel.org/r/20260217-alpha-v1-2-0dcc708c9db3@rsg.ci.i.u= -tokyo.ac.jp Signed-off-by: Paolo Bonzini --- util/rcu.c | 81 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/util/rcu.c b/util/rcu.c index b703c86f15a..acac9446ea9 100644 --- a/util/rcu.c +++ b/util/rcu.c @@ -43,10 +43,14 @@ #define RCU_GP_LOCKED (1UL << 0) #define RCU_GP_CTR (1UL << 1) =20 + +#define RCU_CALL_MIN_SIZE 30 + unsigned long rcu_gp_ctr =3D RCU_GP_LOCKED; =20 QemuEvent rcu_gp_event; static int in_drain_call_rcu; +static int rcu_call_count; static QemuMutex rcu_registry_lock; static QemuMutex rcu_sync_lock; =20 @@ -76,15 +80,29 @@ static void wait_for_readers(void) { ThreadList qsreaders =3D QLIST_HEAD_INITIALIZER(qsreaders); struct rcu_reader_data *index, *tmp; + int sleeps =3D 0; + bool forced =3D false; =20 for (;;) { - /* We want to be notified of changes made to rcu_gp_ongoing - * while we walk the list. + /* + * Force the grace period to end and wait for it if any of the + * following heuristical conditions are satisfied: + * - A decent number of callbacks piled up. + * - It timed out. + * - It is in a drain_call_rcu() call. + * + * Otherwise, periodically poll the grace period, hoping it ends + * promptly. */ - qemu_event_reset(&rcu_gp_event); + if (!forced && + (qatomic_read(&rcu_call_count) >=3D RCU_CALL_MIN_SIZE || + sleeps >=3D 5 || qatomic_read(&in_drain_call_rcu))) { + forced =3D true; =20 - QLIST_FOREACH(index, ®istry, node) { - qatomic_set(&index->waiting, true); + QLIST_FOREACH(index, ®istry, node) { + notifier_list_notify(&index->force_rcu, NULL); + qatomic_set(&index->waiting, true); + } } =20 /* Here, order the stores to index->waiting before the loads of @@ -106,8 +124,6 @@ static void wait_for_readers(void) * get some extra futex wakeups. */ qatomic_set(&index->waiting, false); - } else if (qatomic_read(&in_drain_call_rcu)) { - notifier_list_notify(&index->force_rcu, NULL); } } =20 @@ -115,7 +131,8 @@ static void wait_for_readers(void) break; } =20 - /* Wait for one thread to report a quiescent state and try again. + /* + * Sleep for a while and try again. * Release rcu_registry_lock, so rcu_(un)register_thread() doesn't * wait too much time. * @@ -133,7 +150,20 @@ static void wait_for_readers(void) * rcu_registry_lock is released. */ qemu_mutex_unlock(&rcu_registry_lock); - qemu_event_wait(&rcu_gp_event); + + if (forced) { + qemu_event_wait(&rcu_gp_event); + + /* + * We want to be notified of changes made to rcu_gp_ongoing + * while we walk the list. + */ + qemu_event_reset(&rcu_gp_event); + } else { + g_usleep(10000); + sleeps++; + } + qemu_mutex_lock(&rcu_registry_lock); } =20 @@ -173,15 +203,11 @@ void synchronize_rcu(void) } } =20 - -#define RCU_CALL_MIN_SIZE 30 - /* Multi-producer, single-consumer queue based on urcu/static/wfqueue.h * from liburcu. Note that head is only used by the consumer. */ static struct rcu_head dummy; static struct rcu_head *head =3D &dummy, **tail =3D &dummy.next; -static int rcu_call_count; static QemuEvent rcu_call_ready_event; =20 static void enqueue(struct rcu_head *node) @@ -259,30 +285,27 @@ static void *call_rcu_thread(void *opaque) rcu_register_thread(); =20 for (;;) { - int tries =3D 0; - int n =3D qatomic_read(&rcu_call_count); + int n; =20 - /* Heuristically wait for a decent number of callbacks to pile up. + /* * Fetch rcu_call_count now, we only must process elements that we= re * added before synchronize_rcu() starts. */ - while (n =3D=3D 0 || (n < RCU_CALL_MIN_SIZE && ++tries <=3D 5)) { - g_usleep(10000); - if (n =3D=3D 0) { - qemu_event_reset(&rcu_call_ready_event); - n =3D qatomic_read(&rcu_call_count); - if (n =3D=3D 0) { -#if defined(CONFIG_MALLOC_TRIM) - malloc_trim(4 * 1024 * 1024); -#endif - qemu_event_wait(&rcu_call_ready_event); - } - } + for (;;) { + qemu_event_reset(&rcu_call_ready_event); n =3D qatomic_read(&rcu_call_count); + if (n) { + break; + } + +#if defined(CONFIG_MALLOC_TRIM) + malloc_trim(4 * 1024 * 1024); +#endif + qemu_event_wait(&rcu_call_ready_event); } =20 - qatomic_sub(&rcu_call_count, n); synchronize_rcu(); + qatomic_sub(&rcu_call_count, n); bql_lock(); while (n > 0) { node =3D try_dequeue(); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441960; cv=none; d=zohomail.com; s=zohoarc; b=KZ+xOO1kCxoVGO3ktLlRN17ccFMX9jTCIISchR+aNUR51fwAkDsxwaJWcA9dJ5hDqDx85kaIqxTQCcaj4B6ve5snUv9KYA9s1pWDQQ13y9mXrLDoQkrVZ6WjU8c/crpDJvwlBxTdDUKEKv2Fz2U6v5EAtRt7gMuISlhIQR+xvyQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441960; 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=ZAJCcHg9GGW3sUVSr2tHEQLB2IHA7/8o0P4+m86PMX0=; b=Ou5Tv8bkmqIENALx4mw0cz5xMlcovGxgSjxm1xdEL36CoNEp1umc/2fXOqr1TnmxTVTSwLFN7Ft0R3qlIZ6FeiXee/mjVm7krU8I5ZdviEgvfIRpFF8lZB/5Rt26aV+c3i/GcyrXr3vB8a4cG6dYzZvh24RwotykVE/4X6qHvlQ= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441960312128.75569836451587; Mon, 2 Mar 2026 00:59:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzH-0005Z7-LO; Mon, 02 Mar 2026 03:50:47 -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 1vwyxS-0003Nd-2r for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:55 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxQ-0002Go-9k for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:53 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-682-n-RybIg_PQqGixSm8vlfqg-1; Mon, 02 Mar 2026 03:48:50 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-483a2db68caso34683735e9.0 for ; Mon, 02 Mar 2026 00:48:50 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd75df90sm404799165e9.14.2026.03.02.00.48.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441331; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZAJCcHg9GGW3sUVSr2tHEQLB2IHA7/8o0P4+m86PMX0=; b=Y6bSf4/FLiQNr3QpLlPivHSTybja1ckVZZqFnwsD0unCnVfAZBAGbfMqLjJBzsqEPt8ywT Fvka7ddXzIZqmS63hYH91JnBq0Z45iSYIWy5aUiso7+gqlkzUVaB+QVkDmPb0v7+oGGZbP lLXGLoJbGrJ8FVkbmaZzNjROWWmSBrI= X-MC-Unique: n-RybIg_PQqGixSm8vlfqg-1 X-Mimecast-MFC-AGG-ID: n-RybIg_PQqGixSm8vlfqg_1772441329 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441328; x=1773046128; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZAJCcHg9GGW3sUVSr2tHEQLB2IHA7/8o0P4+m86PMX0=; b=XPBXfHHJRoQqve9yBmDrbWy1Z2oz6e2H6QITB8oYY/wJz12nm1Ms86+M64l/+3yGPq nWRB2pBJbWukQcoXnLR9rSbJdAPfHAxs5WKog+Yz+qhZ08LoSg+GxqGLxk1zs654vAG+ NeLFzXfmuhv78qh0YPPI7+Kywzo1swh1yY1EE6eejei65DiFp4vigyMrv1HYkRwb+OaD eQFtIp3pNqYxWCoCahNqhWiZ7oJ3LEqtmrEUXQ/fD1OtqNc7pFUZI+yXTMFW7jEVMejy fLKbTvvruWpRcChAvv9SZTBebUzCpUDvdnZhhWXttH2rHdG+PbkXtLJ7U2x3weVDRAPH wX1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441328; x=1773046128; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ZAJCcHg9GGW3sUVSr2tHEQLB2IHA7/8o0P4+m86PMX0=; b=v3yMyw3wigZ6JtkMbXmLnhDBXuzNUJiKUoQ2eGp1bmW8zrxxlyH62FoE3iwptsql30 NoPOqP82X+ulwJ+joF+WnnXBt2ONcF8sipBpMe6DgsctAqO5zwni7xwQD8VsYJ0x/kKI ShcLWD62YJ/+o+sYk9BHZtbAG3zGGfZIdMBF+ektReuwI57lqxywfkmsxQRFt18hskF9 +tPKcFEhXVjEp1I160+Me1wXTpdaTrv3rMwmuSzLifejp+RUMxh39Db98NjM4F/VIHqv /15fsKgSaGF88MzgBchPwFWD9EUDZART7aFZ+RaNg8lPALxwX93R9C2ODbdHFbwQ9pmn 9Yrg== X-Gm-Message-State: AOJu0YzpTi9xWS6jJTtQFH07lp+Ts8vYRW/RsaDuFmlX25JJMwU/oP/q anJSfxxV5xdz4GvOVoUSTmeSs71NDlrnkH2wN3KJmtUd6MhUEwEAXhPIH83sZBsV2ET1qaBOLCi qEefhbN5wZmXuc2pHWwAO+sOcRk/XxGNxBPKu8MOBWicgUUC27p7ezfL/Qv21o8M295NjCrONsP 6EndN/krEb+7z/rEprwiJUsPMDeDLMZalhlr1DIrSn X-Gm-Gg: ATEYQzxkoEsuxpujWAydQSHvcwTcfEVx1MrbsllWUcu20wHySiyujKxR+ebJSbh+wmz 8aFxFic3x9A8bkdDUZ+UoJ326mATSG2kONVVpowGhGqvipCWhjQKSyZIYx7fDMVgW4OItl9XsN8 7nLIypN0+Yy1QiWjTzf1u6Vn5OVo3X5vv0RwBXulahLTrRqUgWYFOfpeWooqfBLhsjJ6QwAzinf WyD3V3QI/xg9xShC3G+eDkyHM0qAfJceJgwTDG75xaFDLDVpFUJO5d20dNCVcVRITbxGGxfhWRH 5gDDA9ao4OknDl3qyFcpGKvmPEBzOt1RDlIpC6U4wro/OaHw+552hC9blGTflSdzEC+5yiIsNaL P2grSHI64y/8erlfI0dYjTpDEj9NU2ryMy0pxae/lakRCQnx8U8h3yRbFuE/eJHgem1uzdXpgJH 28yacedP+HouN6QMt0ZdZRmplRVv4= X-Received: by 2002:a05:600c:8b11:b0:483:6f7c:19f4 with SMTP id 5b1f17b1804b1-483c9c0b6c4mr197152525e9.30.1772441328395; Mon, 02 Mar 2026 00:48:48 -0800 (PST) X-Received: by 2002:a05:600c:8b11:b0:483:6f7c:19f4 with SMTP id 5b1f17b1804b1-483c9c0b6c4mr197152055e9.30.1772441327851; Mon, 02 Mar 2026 00:48:47 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Jon Kohler , Xiaoyao Li , Zhao Liu , Aditya Desai Subject: [PULL 089/102] target/i386: Add VMX_SECONDARY_EXEC_MODE_BASED_EPT_EXEC Date: Mon, 2 Mar 2026 09:47:35 +0100 Message-ID: <20260302084749.474955-23-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441961780158500 Content-Type: text/plain; charset="utf-8" From: Jon Kohler Enumerate ability to enable Intel Mode-Based Execute Control (MBEC) on secondary execution control bit 22. Intel MBEC is a hardware feature, introduced in the Kabylake generation, that allows for more granular control over execution permissions. MBEC enables the separation and tracking of execution permissions for supervisor (kernel) and user-mode code. It is used as an accelerator for Microsoft's Memory Integrity [1] (also known as hypervisor-protected code integrity or HVCI). [1] https://learn.microsoft.com/en-us/windows/security/hardware-security/en= able-virtualization-based-protection-of-code-integrity Code is mirrored here: https://github.com/JonKohler/linux/tree/mbec-v1-6.18 https://github.com/JonKohler/kvm-unit-tests/tree/mbec-v1 LKML thread(s) are here: Original RFC: https://lore.kernel.org/all/20250313203702.575156-1-jon@nutan= ix.com/ V1 code: https://lore.kernel.org/all/20251223054806.1611168-1-jon@nutanix.c= om/ KVM unit test changes: https://lore.kernel.org/all/20251223054850.1611618-1= -jon@nutanix.com/ Cc: Xiaoyao Li Cc: Zhao Liu Co-authored-by: Jon Kohler Co-authored-by: Aditya Desai Signed-off-by: Jon Kohler Link: https://lore.kernel.org/r/20251223060834.1618428-1-jon@nutanix.com Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 1 + target/i386/cpu.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 065613722f1..c384302de32 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1414,6 +1414,7 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *c= pu, FeatureWord w); #define VMX_SECONDARY_EXEC_RDSEED_EXITING 0x00010000 #define VMX_SECONDARY_EXEC_ENABLE_PML 0x00020000 #define VMX_SECONDARY_EXEC_XSAVES 0x00100000 +#define VMX_SECONDARY_EXEC_MODE_BASED_EPT_EXEC 0x00400000 #define VMX_SECONDARY_EXEC_TSC_SCALING 0x02000000 #define VMX_SECONDARY_EXEC_ENABLE_USER_WAIT_PAUSE 0x04000000 =20 diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 9b9ed2d1e38..619ed0de322 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -1656,7 +1656,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] =3D { "vmx-apicv-register", "vmx-apicv-vid", "vmx-ple", "vmx-rdrand-= exit", "vmx-invpcid-exit", "vmx-vmfunc", "vmx-shadow-vmcs", "vmx-encl= s-exit", "vmx-rdseed-exit", "vmx-pml", NULL, NULL, - "vmx-xsaves", NULL, NULL, NULL, + "vmx-xsaves", NULL, "vmx-mbec", NULL, NULL, "vmx-tsc-scaling", "vmx-enable-user-wait-pause", NULL, NULL, NULL, NULL, NULL, }, @@ -1971,6 +1971,10 @@ static FeatureDep feature_dependencies[] =3D { .from =3D { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EP= T }, .to =3D { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_UNRESTRIC= TED_GUEST }, }, + { + .from =3D { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EP= T }, + .to =3D { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_MODE_BASE= D_EPT_EXEC }, + }, { .from =3D { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VP= ID }, .to =3D { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull << 32 }, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441446; cv=none; d=zohomail.com; s=zohoarc; b=cqe71AIH8V+mGwbVaeI5YnCKOPZHiRGQPtZmHl3wF6ZIETSCbLDzXrJBc7Mlwxd8X1lU+vcCYoNvUNnFeUKn09tS8u3RQCyP9r96rKpbzH7AuCLvGzd5nENrvtu3pfOvQmAxdgrYqN/Lrax5H+evxqwh40CQh0sILRv7DY8qBjY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441446; 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=EfJw+zfaAr3zTPC2m8isA7MwFlzp1fxZBmdz0nr5xEw=; b=lckc6ZDg0ecAC8HfCr0lRaob3hJLD22LldxtXCFDfjNwciRcqGmv1eFoXXHocfBGyN+lqEhpfiZ4QK/3FGvUc9egaxPpTR13616oYOIaOtSKsNoTUmmV83RHKb2xn6JSLbo4REddmauN98LWQogkmGeDjrS7skBXJNAq+RMRQik= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441446655529.7748479484576; Mon, 2 Mar 2026 00:50:46 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyym-0004J0-RH; Mon, 02 Mar 2026 03:50:22 -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 1vwyxU-0003RV-3N for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:00 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxS-0002HB-MT for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:48:55 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-696-4Vkkrho1NCabAYCI_fB9iQ-1; Mon, 02 Mar 2026 03:48:52 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-48379489438so39520135e9.2 for ; Mon, 02 Mar 2026 00:48:52 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c70ed47sm28531096f8f.11.2026.03.02.00.48.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441334; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EfJw+zfaAr3zTPC2m8isA7MwFlzp1fxZBmdz0nr5xEw=; b=LA/cVHxcby6goGqEsABKxkL6jLXOm4iH99gNCW7mSDWmhYpI+W2Ujd9r27jFsD3vKz4gmb pV/PO+BqoXQpW+M3lCywiHF1xGJ+hrGGygsEps3JorMfX6GisxB0ezEsv3UEQ3DHL7FACR xL1zRl3FD8WerkUaA0UxD1e4LW3ofeM= X-MC-Unique: 4Vkkrho1NCabAYCI_fB9iQ-1 X-Mimecast-MFC-AGG-ID: 4Vkkrho1NCabAYCI_fB9iQ_1772441332 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441331; x=1773046131; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EfJw+zfaAr3zTPC2m8isA7MwFlzp1fxZBmdz0nr5xEw=; b=r3TRlQl2nMX7J5Ipap02JiyQxVtyLcURiLaUpJGUdQJhC84MByNFwXfzZKcFSL+5+9 xXJ0QMvQEptM4J4LZ+Xjm64V3aYGw/RHxhXj3MAdBHiUWbCKqullcgYAt+225PN3S3Xh 3fNGjRmuSAF3XZ+50T7Dv4e7mfVUutTGpZpYaRD2Bd9YILffoH4dsqWzKDb/GLA8MVI1 TQGmuAOhva85H9T8Ze+7iMfHIC6Mf23GCbe0t6jcc8Ut2HKaUh8rrhyB/e5CzANXI2DI ZsckYGh6OSwdUz/Jjtmt+T7mSE2AtpsJdSzfT/qw2KLNATEEY9YuzggFikRyuOYx9WFU 5klg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441331; x=1773046131; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=EfJw+zfaAr3zTPC2m8isA7MwFlzp1fxZBmdz0nr5xEw=; b=dNgepYT2D2mRZTqZU10yhwD6liRFZPDfniIsZM/tvsTUzGWMHvKZar5/2LBIfCtvFg 2yCGO8tlgQIfc1Ov0FF6pweLwBUtf7c/3J0bnIgz9NhIGnLCQoUrGzxRBXZK4SYjLbMf 1kpC3CrrCbYBjIk4tbVH5dTO05fs/sQSmdAFbOpPFCWgM5cCXro7tvlV7wd+H47uWxZz IOUhMdyY+fvaQx6RyXFAAqsOGA5eTGLx49XLx+3k4a7v5akX6k61qm2cC1ZKspc2yQsm FFCmAmSS64191aCfE0Z4hSEpnEjV5ci2OMsxEklaMVJK3SzzHrra/xCNyKDLctbz6vZe DVpA== X-Gm-Message-State: AOJu0YwGLYMIgiwXy8RWWBhU+KLGWHGxzMdtA2wsesx63CSihQrF9kyt ME1z8qq3EOGhZFFaPgipseRK/4MYZMp0ZdluFNh4DcfrtcjgWyLE1SyvIZdv94b8XeCIOejbAWC /C+F5Rq9xBZjO5ljWAH01Csuz78X6fkVw3PONrRSAWRmgzM7wvHH3To0Q2MLjJ07cI68GqVTpV/ d/GYECeQILVzm/is8KJS3oIz2qI6WxxybYsy+osFnE X-Gm-Gg: ATEYQzwYrfT3ebj77YZgWHQ08xkSctigJSIdxN77lWTKmW/0scSdMOqIzZX4ORFtp9z FBuis4BpdwLh3ZZP/whFO/6Rnv+WC3UmTIgWzJt9iRLnSUe65RZnP8q8V6LxqOCWox5FNezHctE r2EHJov06N8zL8goMVfOx+f28BuLF1LPv+XYGEwgYMk74Drpkn2jR3TXq/q5uXdmjnWpo4pBVYE 6wUTxP7VMgOov6cTCsA/E7NNJk1VKab/HZofu5gv4+AiGtpjioKJoviRyn/tpDduC/CbOysGi9m brbpoLnaJrjR1fpkaJBv7QvlZgRh/nTAe56bAAE3H6X99lYLZS8O5BtirJzGet3S1JmUmTiHryp t65AertXbw/U/ZCjKjPeU5BgDbu77KH5ifjHsZUoe9IV1DpY7JR1c0XE6gaEhW20IMLMY0YcE38 iLoYlvoealyr/mGFyR6lDiWBtK7GY= X-Received: by 2002:a05:600c:b90:b0:483:456a:514b with SMTP id 5b1f17b1804b1-483c9bb1fbfmr207701705e9.12.1772441330747; Mon, 02 Mar 2026 00:48:50 -0800 (PST) X-Received: by 2002:a05:600c:b90:b0:483:456a:514b with SMTP id 5b1f17b1804b1-483c9bb1fbfmr207701265e9.12.1772441330234; Mon, 02 Mar 2026 00:48:50 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Jon Kohler , Pawan Gupta Subject: [PULL 090/102] target/i386: Add MSR_IA32_ARCH_CAPABILITIES ITS_NO Date: Mon, 2 Mar 2026 09:47:36 +0100 Message-ID: <20260302084749.474955-24-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441447129158500 Content-Type: text/plain; charset="utf-8" From: Jon Kohler Add bit definition for Indirect Target Selection (ITS_NO) bit 62, to allow ITS_NO to be added directly to a CPU model in the future. Cc: Pawan Gupta Signed-off-by: Jon Kohler Link: https://lore.kernel.org/r/20251106174626.49930-2-jon@nutanix.com Signed-off-by: Paolo Bonzini --- target/i386/cpu.h | 1 + 1 file changed, 1 insertion(+) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index c384302de32..f2679cc5b72 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1329,6 +1329,7 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *c= pu, FeatureWord w); #define MSR_ARCH_CAP_PBRSB_NO (1U << 24) #define MSR_ARCH_CAP_GDS_NO (1U << 26) #define MSR_ARCH_CAP_RFDS_NO (1U << 27) +#define MSR_ARCH_CAP_ITS_NO (1U << 62) =20 #define MSR_CORE_CAP_SPLIT_LOCK_DETECT (1U << 5) =20 --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441820; cv=none; d=zohomail.com; s=zohoarc; b=e+elEZbkv8AJwHpr7SzZSRswaLWBUibLkAA5RTBvz+KzIY02kDoa0L8WcU0T1v11Pd52BW4IZABwHmE4+M0CNL4jnRSA+tkQshqfBHegZ+u6BHPrSgygjNjMwbjIchgKCV43BkD947xUP7BYxtKr6q5neTA2o2XhJkZ6NGTv8WA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441820; 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=qfwgliMDX1wluwfnPRNeDZFvWD6kZBRIIMqtQM7FJWg=; b=OBDBDEEETbk7PfmTY9yLCaYWfKQ4NqR+IKfx76lY/eGCW7RhzwEr9K1ciKfCIHFSYexw7Awg7mkwFm7khaYV0OsUdzRzYXZTE0eLThEB9PkQIN+VtCtIbCft9i1TOtrG8uWvLL1FAX5Jhn3GyMRye0j2c1eS0GE4kFbmlvpzbk4= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441820911688.827607537368; Mon, 2 Mar 2026 00:57:00 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyyw-0004RZ-3q; Mon, 02 Mar 2026 03:50:29 -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 1vwyxc-0003Uw-3Z for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:05 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxa-0002He-9M for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:03 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-245-87pcQ4UFNAOIb95BpnMLNg-1; Mon, 02 Mar 2026 03:48:54 -0500 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-439a85832c0so1168639f8f.2 for ; Mon, 02 Mar 2026 00:48:54 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b55d15besm8996326f8f.30.2026.03.02.00.48.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441341; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qfwgliMDX1wluwfnPRNeDZFvWD6kZBRIIMqtQM7FJWg=; b=icm0grbQhCDE27Vf9zxG604Y5jX9fSma3v5me4UMyGRyjzDliHMix6+Mnw5I/c444OJEKf 1cjmSNhg+ntfOj6hrQ05hVpt31M8Plf+fEW/QCVx2XVmqO1DTkiXOnO46Bfxhu3W8Oewhe wEWSwMuS+o1l4scy8r21+mbWEvUNj34= X-MC-Unique: 87pcQ4UFNAOIb95BpnMLNg-1 X-Mimecast-MFC-AGG-ID: 87pcQ4UFNAOIb95BpnMLNg_1772441334 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441333; x=1773046133; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qfwgliMDX1wluwfnPRNeDZFvWD6kZBRIIMqtQM7FJWg=; b=rmTyWnqxk0h7tt/4VgElX/Cn7y9lXHLmnrcOyjOiyIjuteLJbkUpvczKeWmemSodhY LVtnuJMDxP80mlIFDYdT5v0Le9xLMUtAtosEhbNh4PQrY1lT4Ba0vuW2lvByHMLdvdY5 X7pJpJ0whVILisE7X2Y64F97U4/3Y5EipTUVy6mPFHtTFNu4LkUuaatnl3UN8XfNRIIF YiQjcslkYJkHGfXP+Kvhu7GOFo2gvSeO7W4q8fKcxoiD7ekuI6sE6QhIYMQ8uNltxc11 kaIRU8umCZE0/bAKXdyiMMkPvw8bjK+9SiX85gEMYyzy6nXiwua1xl7FsUqCBgf6r4HJ 79+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441333; x=1773046133; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=qfwgliMDX1wluwfnPRNeDZFvWD6kZBRIIMqtQM7FJWg=; b=qOPjjAwH80wZggDVeutylqenPqzAMyRcOOVPXbaEQdyq2NTe0kA+1+SBo8SfSx3ekG QA/LGKd5CCVfN1c92RdT8Fs8nFM0EHf7wh6WykZ+mFaRntHXd2slbRWR2mub1+sthTnB p/VLxKTJUtbkdGwkjei87C7dVvIR1Ito9ow5OrNLrPrV/LqXYrfY5F6PTECYNixA/eQw WDX6PY6H8OiWATus870B89nGXcM7Fqa8l/pw1IfUTFlW1AqjmSZfzWUOQRjBWLLghiGe JtJ6Qy/cKuLYQnmKNaSjoO6asehezlszWGcsak3VHPffFKYxNrCSnn5ANSIvNaTDVhn0 0eTQ== X-Gm-Message-State: AOJu0YwxRPvZ/Vn7JizR7Jgd/QYabfYR5zU4UQqKFfjlM3FRrCpPzMHW +Ufjk9Z80XS+PZyw/Q4DZOo/l6um+FdUqNoG2jkJhQSIgRnIiZxMym+u3RC7hmEXkiCNivgD2rv fMgQ8Ufog6Gv2BjQ1JUdYgEmWfy8/VrPbBralNSFxz5NNSNUqB8hXeCjRyzR/PXmXDUJ4hjmi9j 8diZ8iq2q9OmnIlgXtZD7q//HTSpypeoqZcjGSEQqX X-Gm-Gg: ATEYQzxFdCZd5MF4L3yXkTQ4EvR5Nd7hUds4bpKeNGpCO9MQeeUdqypOYC2f9rjGsdZ wYgREnw/rloQIXI9u+213n85OizQ7q6ashCRXwWKaQukGKHiNnT3ak+KzFrYG5JMcftDi833L6J jWz3qCMKtRYVsW+1LbmK1gLPzKSDBH8Lhab0zZSgfen1m3lwEyVViTey7Z39tRbNWEkzmzXEy4z Gf6CXlxivntNPHUq2Y2og//qKQmwUXZo6KZSqpwd/VymdF8gZo13iQGbo5QpPug37YFDWQ1MiGd x3mOz+dfDoCtjyNGPcIb7rOXI2DDaHUj/w3XV33qH3f507QkDsUF14So5aNGv9j+cV7d5sRwx56 yuIx6d1qxLGPW25EMtfB1PT9O4CZabodD2UNf3YcIZwfhI3cNcwbqESfoMZQnANO+GoYwZDiaP1 EOLKzO17fml2HR/yBFUNcpnx7rae8= X-Received: by 2002:a05:6000:2f86:b0:435:8ad8:b7a with SMTP id ffacd0b85a97d-4399de2c5a6mr19175220f8f.46.1772441333147; Mon, 02 Mar 2026 00:48:53 -0800 (PST) X-Received: by 2002:a05:6000:2f86:b0:435:8ad8:b7a with SMTP id ffacd0b85a97d-4399de2c5a6mr19175172f8f.46.1772441332625; Mon, 02 Mar 2026 00:48:52 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Jon Kohler , Pawan Gupta Subject: [PULL 091/102] target/i386: introduce SapphireRapids-v6 to expose ITS_NO Date: Mon, 2 Mar 2026 09:47:37 +0100 Message-ID: <20260302084749.474955-25-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441823000158500 Content-Type: text/plain; charset="utf-8" From: Jon Kohler Expose ITS_NO by default, as users using Sapphire Rapids and higher CPU models would not be able to live migrate to lower CPU hosts due to missing features. In that case, they would not be vulnerable to ITS. its-no was originally added on [1], but needs to be exposed on the individual CPU models for the guests to see by default. [1] 74978391b2da ("target/i386: Make ITS_NO available to guests") Cc: Pawan Gupta Signed-off-by: Jon Kohler Link: https://lore.kernel.org/r/20251106174626.49930-3-jon@nutanix.com Signed-off-by: Paolo Bonzini --- target/i386/cpu.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 619ed0de322..81779483d31 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -5261,6 +5261,15 @@ static const X86CPUDefinition builtin_x86_defs[] =3D= { { /* end of list */ }, } }, + { + .version =3D 6, + .note =3D "with cet-ss, cet-ibt, its-no", + .cache_info =3D &xeon_spr_cache_info, + .props =3D (PropValue[]) { + { "its-no", "on" }, + { /* end of list */ }, + } + }, { /* end of list */ } } }, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441506; cv=none; d=zohomail.com; s=zohoarc; b=HvlMGjl7681kENLZ0Bm5nY+exd4oUwaHY8pHsgjSNuJI4qS496QX+j5x8mTlJxtp4bvEaUy86Qw9luIs3TwFvuQjtqxCJyRtXSG02xCizX1iixFTiYEsiDfHYxGPF96uImpvXtAQ/NXTyGWrxwkWlJ1sfKWXE+m2tV5r4bSrKOE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441506; 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=yDTch7d+9uggTBZ+m5g1YxQiJY/J0MiJKjInBlOgjdI=; b=P96CsdkLjkRN4rVg8GUm+o92ptbaJKm6p8w8rzCljshLj8UMzczfR+ca64ConlEw7Y8M5L2pfgN2Kd5yobucJWnsHQZmNnk1mriG4NmIUHR1k6kVTh+cpC4zyMNOdD+gJI8GcyPi9sqgasAp0D4nppMru6EqEDU1iL0o2ObtcIA= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441506370308.38075424215447; Mon, 2 Mar 2026 00:51:46 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyyS-00043O-Eh; Mon, 02 Mar 2026 03:49: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 1vwyxZ-0003SQ-0T for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:03 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxX-0002HO-8u for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:00 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-311-rUfQlft7OzC0Nwgf20SgKw-1; Mon, 02 Mar 2026 03:48:57 -0500 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-439b8858b0cso392530f8f.0 for ; Mon, 02 Mar 2026 00:48:57 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b3cc2e65sm9963582f8f.2.2026.03.02.00.48.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441338; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yDTch7d+9uggTBZ+m5g1YxQiJY/J0MiJKjInBlOgjdI=; b=E6iSm6Q9yxpF7Q20HMHXRcCMM9r+iBCLnvCEIpg41ykRk7G+a89YHJBfYtWNgZ9Qf6Pr7r BvwZgqa8tU3FNEXedcbcgSjhnU8FoJwJ7pGB/uGUC+i6R06lT0+xcx9BQA3uf8zz4CqviA 24io86TtQKZnh45CJB8ZNkkHqTbEgXE= X-MC-Unique: rUfQlft7OzC0Nwgf20SgKw-1 X-Mimecast-MFC-AGG-ID: rUfQlft7OzC0Nwgf20SgKw_1772441336 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441335; x=1773046135; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yDTch7d+9uggTBZ+m5g1YxQiJY/J0MiJKjInBlOgjdI=; b=PGhqFKg9E6/npUTJkgq2PE8dwmklBkWgfJkcGk+brGITncrQxuIZXZ2RXdECS3I701 rXexfh6bOGPRBDFM82DQwT73E062v5ZiDMeYQt5eq/GOEHLNdaDrp7p9jP74D2QGyZb/ zY0v4nHd/DMwVvnDY+UoUicXlmxSoGEmOH+jShYIrfj62luXhm78HbmwzubPm8S8lomu ALrC26K8SJTJDSdtfjbpu/Zbyj0rd5f9fmw1ZXL4i9h8J7ag5Cb+p7oIt03ZG6745HW9 01GbNm654Y1fzu8wGeUSaol7OaPN018x5IW6L5Xta+pnfi67vXN2yGgGHXp1xcwEa8Dl XaTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441335; x=1773046135; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=yDTch7d+9uggTBZ+m5g1YxQiJY/J0MiJKjInBlOgjdI=; b=ptNN8803d0vu9vulSbQ2ZDGGDAQGFwHkKm3WhfQ9nIXSKhe25xIfk/rV3z+ELD6Wnr 7Z/Fb9UgJq78wkTOP28IEXRWFi/67k1oIT4Afoxv4C6Ef1uJhTNOr1VPRn2E2Exo2Rf1 eTuyC3uRXTPk+kQ+5w3LM0MQkQg4P3dHgsDYnaQkd63tDV0CPf3CjBUsDVqU6T7v4wz3 2qfNtvbq61lkLqbWiXQ3oQw2+/Jf7aBoOaGZtqzMNLXN3W0ZfgvGJ5FJamd8RpCR2GvY ZaqDcMxdkBDKfw0Bzb6KAqhQxVUT5YSF9PGBEnnJYsgZv/BIydWB9IvSICGjD7ATeP0W zR5w== X-Gm-Message-State: AOJu0YwqKruCJtThxGpHCgE0YRmoua7Cgd2zPExzWN8u0y/duru6KKhY 8SQGH3tj/eFyU1ba2pNsQdGjh+2WqfnPywiWC5Q8EzQu8MHhL7mmpiIXTpdOlzqUMJvbLNhtj9i iDzX3SFmFYaMB14YiJssIm6esyeB6IPgH8phbmNoqovHjzMTC/ce9qczlyjcTtB2nI4GEDRuvC5 iUB7AsdQIYrlJLl9z+vVwyCU1wjNkAMTv6UUGQPsMi X-Gm-Gg: ATEYQzzN2D6D0YQcNzP2/7K2VfFwHuCEZvpbbaDTxwgA1BU+djw63GMcolCiajpillO mekuxvHLZLobNgEz9cXCpuBqIWj7QPpzuNWODfU3yG0Upb53OR4RGzVU/aMYnBqg2RaJ3wzUOyt p1hmi1ylKnA8d/g2zt0+QyHdeSfpzyz9isz/nLXjz3cIqDMSqpsCapNW+mNV+H3NpSRUcQBAV+Z lj1fLoce+rAZXwYeEE8hOn20zFf5LAnuHAEvoaqcuxz1J/cSITiXQfAM0BMFtxqkVfLCrqyxQn8 Bg03OHisUzK6fN1cbvfUXc2Wd/FQabbKbyYNRLg6+4tRir+4iLCmn/VIiqx/g/JbwE/2A2UROVS Xzb/U3+4CjS2rMSBTRnNG2x780iTYIOjZBMN7jEbG3b3SA1kqPYaJFu76REc7dpjqX73K9LZ/+B /wJj4YgMtTxQte96QpPK1dNhJus+I= X-Received: by 2002:a05:6000:4282:b0:439:ba57:5010 with SMTP id ffacd0b85a97d-439ba5750e2mr2196416f8f.39.1772441335253; Mon, 02 Mar 2026 00:48:55 -0800 (PST) X-Received: by 2002:a05:6000:4282:b0:439:ba57:5010 with SMTP id ffacd0b85a97d-439ba5750e2mr2196368f8f.39.1772441334747; Mon, 02 Mar 2026 00:48:54 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Jon Kohler , Pawan Gupta Subject: [PULL 092/102] target/i386: introduce GraniteRapids-v5 to expose ITS_NO Date: Mon, 2 Mar 2026 09:47:38 +0100 Message-ID: <20260302084749.474955-26-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441507419158500 Content-Type: text/plain; charset="utf-8" From: Jon Kohler Expose ITS_NO by default, as users using Granite Rapids and higher CPU models would not be able to live migrate to lower CPU hosts due to missing features. In that case, they would not be vulnerable to ITS. its-no was originally added on [1], but needs to be exposed on the individual CPU models for the guests to see by default. [1] 74978391b2da ("target/i386: Make ITS_NO available to guests") Cc: Pawan Gupta Signed-off-by: Jon Kohler Link: https://lore.kernel.org/r/20251106174626.49930-4-jon@nutanix.com Signed-off-by: Paolo Bonzini --- target/i386/cpu.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 81779483d31..987f64c5af3 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -5443,6 +5443,15 @@ static const X86CPUDefinition builtin_x86_defs[] =3D= { { /* end of list */ }, } }, + { + .version =3D 5, + .note =3D "with cet-ss, cet-ibt, its-no", + .cache_info =3D &xeon_gnr_cache_info, + .props =3D (PropValue[]) { + { "its-no", "on" }, + { /* end of list */ }, + } + }, { /* end of list */ }, }, }, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441448; cv=none; d=zohomail.com; s=zohoarc; b=mlIWkxrttzwpzxnmPmuWFhCAbVG8AyNeAnBKtvcOvfYkLnaWOJ0nOd4jNOUitIRasvZK3dxGb3OWn+XZPpMgv5SK6wQ2o/CuvBRZDhLpMAE367k8hOwAC6W4Cpjt5gZ+7Ka0v76cPSwdzJ2uVF+wAHyJNrXL5Wc9P1Xde5mGMTM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441448; 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=uiZ/r05wUaynHRBd4aMN6I4BhMIXirJc8H8pOXDGUGw=; b=cpvN49syiECbs6ymx8kn0mXfJrBTn4RpRmw8CtGoGnsQsrS0g/rYho4wt/wg/cCF5aWQBqlOo7ermlwVky2vpJA5N4ESM4lqz+44k3dX5QN/BdLLqM9wGbPfhcF6Z+SrB9yrLH6deRrLQX6u348sm9Fn7FjDwT58n6WhWjt432I= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441448224336.1860445273951; Mon, 2 Mar 2026 00:50:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyxz-0003j3-Sf; Mon, 02 Mar 2026 03:49:30 -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 1vwyxa-0003UL-Sd for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:03 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxZ-0002HX-BI for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:02 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-664-wEI132HuN3urry4jztFi3w-1; Mon, 02 Mar 2026 03:48:59 -0500 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-439bcec86dfso101221f8f.3 for ; Mon, 02 Mar 2026 00:48:59 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439ba2a5970sm3373495f8f.33.2026.03.02.00.48.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441340; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uiZ/r05wUaynHRBd4aMN6I4BhMIXirJc8H8pOXDGUGw=; b=MaWPq/tz+vCY2GjZKFPZQGe2cTThbhS3GvUbvUZyWnYjRNIQD6oma7F20ejpvMMrtWh273 mWgFWqNx2jkyxAoW6qbV12U+91ODxj+g25hiYR4zW+vL3nrTKm3aN+ZFVawXCzBMj4Ar5o yfhTLCRdewY9zTX058RYwW9FPu3RSsc= X-MC-Unique: wEI132HuN3urry4jztFi3w-1 X-Mimecast-MFC-AGG-ID: wEI132HuN3urry4jztFi3w_1772441338 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441338; x=1773046138; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uiZ/r05wUaynHRBd4aMN6I4BhMIXirJc8H8pOXDGUGw=; b=uAOX4mNjj51DUfwGuNNqNOLii8AUa7TyndqgQc0oYhbdASjpR7iep3qWhrdAzbQyhX 7xkEM2rm07n0X+8Y16MtUYptGl3ojHbdh9sYwxGROIM0TkLuGjGo58WaHrFM+ZVtXFTX +mlSvf3B02UpX8oPeTuBOxwdLIUfloniBUm/sXSyjheOFhlVBzqaZY5pNJk3y19eZjHc hDz77+bfFvHNSFdmwDbBY9T98I5xI97MquHyM+ybMtk+UN5e3fVEZKkm39f0JfgCg+hZ dLDpd2hg+S3yOabsxYLVcIJ9t6L3RyrBO04VqohRzrrpeDJ4Q6fNw9zgWr9mPPmxYEwQ m+Gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441338; x=1773046138; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=uiZ/r05wUaynHRBd4aMN6I4BhMIXirJc8H8pOXDGUGw=; b=H/+esJa0isdDNddsZR2XaDA7TnmuBflb16Y6QzfjWSCVRP5WmyZWZtL+onhHRWxv5t Me1eK+tqsvtHcaxnWMZg0RvY6Me+CqO0isGICHRApul/Zvjhz9r/zbvudBjkmvokr6s8 D0BjH6CrMxfeDrJEM4PmBq4SEZcVzfwt9O6ZL2M85F2uIJyb8Fpp8Wn5XlGZVTu0teeD xu3NU1S/QMO7ObQdzmm0tv4FEHVijSyyxnFyHzWLEYiCjVL1S+DzAn8gU9kiwewSPFMx VP4sPaLTrj2sZ+0GIHt/r7Fj35AsrnjXiYGDzsRwEQKYKuHTCcFKdH3bRjnsLQzAbn7C XnrA== X-Gm-Message-State: AOJu0YzOtCOjwYx0G0fuNTsBTqtQDoTsRN6cZUtVyJ+ZOo6A4iM/YyUP HgsvMj4SJOZCZgtLehB2XhJFbUZ1Nmy6tAwLSBPcQsyUi7bOkmPEklG6y8/mVTRRsUFqSZArqmg el7J+FMHmsRr7My7AUx0cf4mrCa2UZwuIFPEW5gm1pvnjA+LCDB3iMgxl7EFP4G90tP2KZMFp+x UEdCc7v+MIdnyruRXmGQZNBVrR1mgKY4bRRM8kH4VA X-Gm-Gg: ATEYQzzbScs5kKQqKspjp8z8juF1V0HnsijWy8c0TJv2xdgx957eKAXlc4FcLdjGQQT Fzh5NKh8mfsU961Gf+cHysQDokJ7zoaLbRvLJSrgbia6YJAmwbYyDl99kUorlNoaFMfvlrhWaRz 7FttorjvCqv/C/G7F+XDfnXbFc9AfZ+PnNKExNk+NiXXoRgDpMq8ADz91XWwwxCBJ9zl/5PH+lH v3vuifttw8Hy1tqvPCC1JUxkofiseiyIY3JVsTv2qfbaM5NOtBF+q3D8Y8uy98nO66Y4RZpxaRT lr3JBLdwY6XItBUpZHEtLQGcoWPQn9GovxRjNdtoPoDgyMRyy+J8obrnJG1Sol9mF8lw82Ir5f0 5q6j2x99LHWhJkL1t3Gl/W96BE/q3ankIDCl+M4jM6WAVhkqIRnsrcMbe9W78D6f19K5288yKjw xcvsk3/KxjdMszKi1GCZoODbAZA/0= X-Received: by 2002:a05:6000:1ac8:b0:439:b046:2044 with SMTP id ffacd0b85a97d-439b04620c1mr8270191f8f.12.1772441337560; Mon, 02 Mar 2026 00:48:57 -0800 (PST) X-Received: by 2002:a05:6000:1ac8:b0:439:b046:2044 with SMTP id ffacd0b85a97d-439b04620c1mr8270136f8f.12.1772441337024; Mon, 02 Mar 2026 00:48:57 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Jon Kohler , Pawan Gupta Subject: [PULL 093/102] target/i386: introduce SierraForest-v5 to expose ITS_NO Date: Mon, 2 Mar 2026 09:47:39 +0100 Message-ID: <20260302084749.474955-27-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441449099158500 Content-Type: text/plain; charset="utf-8" From: Jon Kohler Expose ITS_NO by default, as users using Sierra Forest and higher CPU models would not be able to live migrate to lower CPU hosts due to missing features. In that case, they would not be vulnerable to ITS. its-no was originally added on [1], but needs to be exposed on the individual CPU models for the guests to see by default. Note: For SRF, version 2 already exposed BHI_CTRL, which would already mark the CPU as invulnerable to ITS (at least in Linux); however, expose ITS_NO for completeness. [1] 74978391b2da ("target/i386: Make ITS_NO available to guests") Cc: Pawan Gupta Signed-off-by: Jon Kohler Link: https://lore.kernel.org/r/20251106174626.49930-5-jon@nutanix.com Signed-off-by: Paolo Bonzini --- target/i386/cpu.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 987f64c5af3..2a869f5b739 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -5809,6 +5809,15 @@ static const X86CPUDefinition builtin_x86_defs[] =3D= { { /* end of list */ }, } }, + { + .version =3D 5, + .note =3D "with ITS_NO", + .cache_info =3D &xeon_srf_cache_info, + .props =3D (PropValue[]) { + { "its-no", "on" }, + { /* end of list */ }, + } + }, { /* end of list */ }, }, }, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441840; cv=none; d=zohomail.com; s=zohoarc; b=FB6/1RftgKVMxaAk014OEkI3HaPj879lEoe8CXLQEFO7KZnu3NW24qjeWXXzK6qtqHG81UG7aLooCopU99O/tL+smIWDJM0SrhVcxQ/wBhv60aDq0CqwyIHGBKnQuiQ4R+6BQlUSFr98h1tGiMeewwxOFSr7tGlOJ/3S5id7j+U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441840; 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=TEBmrugjpeYCeKqtbHbuxdvpok1uoogmrN/ghtLcbsU=; b=CGYIW8EXStvNGDmNg/pAdQlCnxm7rUWWkZqSQnoRRlAb9j8AJsbuEermxOKqCzGr3f0hvHbdQcuvmqAirAOuU8k/A520Bq7Jn2wCX9t14xn1k7GqfPBZgl+74GeCXA9A6m22I/gou3t4WiJ43a6yNGoh/gLXt8+dPLdC93P0Gz4= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441840632603.433496592839; Mon, 2 Mar 2026 00:57:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzC-0004nD-Dq; Mon, 02 Mar 2026 03:50:42 -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 1vwyxd-0003VZ-2T for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:05 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxb-0002Ho-ED for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:04 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-272-XEHwJzIcPGi9RCaYgxQ23A-1; Mon, 02 Mar 2026 03:49:01 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4837cee2e9bso33470075e9.3 for ; Mon, 02 Mar 2026 00:49:01 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcbd781sm233713285e9.8.2026.03.02.00.48.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:48:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441342; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=TEBmrugjpeYCeKqtbHbuxdvpok1uoogmrN/ghtLcbsU=; b=g9Zknl3HpQgL5R+uYrOJFo8NNGI4feHPzB5PlhNkX/iT5Citc0uruG5O4c79MyfFsWUK5O 0dh0tjo/WiJT7Nwn7Eqwa7LdMv/hd2f9jCatQlB9KtkQuZkgmspCboR0BTMk7GAXIN6avW vp4j2iwJ0DH2CaISGZqCaOiPw/FGMC8= X-MC-Unique: XEHwJzIcPGi9RCaYgxQ23A-1 X-Mimecast-MFC-AGG-ID: XEHwJzIcPGi9RCaYgxQ23A_1772441341 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441340; x=1773046140; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=TEBmrugjpeYCeKqtbHbuxdvpok1uoogmrN/ghtLcbsU=; b=Cmhtn3mjaJwOS9v4IE8dFDhQG6Z2v+es/F3e2uJMMhg7JXLZXhgITD/9yXcDxxb8+0 VLeUwPmG/KQex4kyYT3dyMAqQUaiZvH6307WtNEvj9hR/3FdyU1te7JjXpvc9KrMWk+1 UhCGIToBtwvIIfX0+P+jiGixPvgjHYH84umg2OkHO1CmBlOuMT3bIrR0vSn/XsyNLzWo zQvu1zXGtTdFx9ubgmy8IIrEyl3UewsOgcaWx6kfDNYtvo2Zo5HZmZBfrq3AD9d3UTpq kEMpoyPLEgjQATzlntdQL9apL/WTEovSga9rlzvIdQuU6heO0UuSbZ6YPZu2IfOGUBC9 kuMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441340; x=1773046140; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=TEBmrugjpeYCeKqtbHbuxdvpok1uoogmrN/ghtLcbsU=; b=jp/U2ib09gEpDUlTKvJpaCQ+LEViSQX99CZJLme2C6Gd3Fxm6b4lEkNG/Tcb89NgNx 7bAOMlic/RObhRKVT9dx2J2ahfoAquIhW9vEzYR+1wOmYY0vVmhBEjizAs+CMQB6gyZ1 feA/5FhKBI+C46jfYBKQYkuzDZ6WKQoXk5xN+dlDLbEO3jMXVzB9kcfd2NlD6n+ud0Ax G6CKGnpG8H4a24k0ElA+P6iSE4fX2o9Uq7463mSV26psCbQS+vdNX1DKbGhjvFqeIItt hZW/D1TCXZqENjVIQd0bw+tRwbVnBUSwyAvRyM/JI2Frxbv3rHiirpVEKp7lt1cFSWIq qJQQ== X-Gm-Message-State: AOJu0YwR4WUYeXL2GA3mYTNBWyde2MPlNeOvRaFHvLBTjPSAOoCi0R/g 7its7iT00WgT5CurFJXOreGJ1ccU+XVpbpfgOcZfxKFIB5CDF+nlXpS1boF6KU8RN2hKH8C7PrY iwRE+U1aqqvxHPcr9qldaQJgtI9y4hnWvMs+ySUSH7hQ6hEjLjSsBJcUyeXFW1VmxdzL4f2hPqd 9U1lOpvx2I4WuHjp7D6FKLMsOnT9A6jMKzfBuubbVz X-Gm-Gg: ATEYQzwR9pfk1s/BQNelXjtfe+lAcvqSV0L8OzIjj05kmY3IvH4N2SaRvaSDF7Ggi8v OFSnUOfSMcqUTJH9eBAwLt4vX75XXekw95NX0Uv1zxcCZByH7ukWY4YTT0Sj9gvVdJG9wUzJDxU lhEQJant+89AG4AaIfW0+1rLktm8/tiAaE4LXmpUXDNKEYj4mB6rOsj5jyjt5YYndZoX+Il5nqH uN6Dlk8exLGjcV/dp2CJjSexHmgQuf9gnjffRFRazsinNwRa6kvjwA3fnDt753dZwoi6Ps42YQN vm8qOOt5OnG4h2lppgJTlAAD9CD8/GZmG670Dqrit8CV1tf/kaKxG/UkVUTTj0ZbA5SycKreG7t nQpni8Uz69DWBxulEjPGcL+rBsk0W7CF/pX7h25ymFc4hGRGnuPjOoCtBaa+idIEv2w2wxNFk0w xRjWCyVCEf5SJIqCqH2jRZ3gAJOwI= X-Received: by 2002:a05:600c:46c4:b0:483:7783:5373 with SMTP id 5b1f17b1804b1-483c9c0f20dmr196013775e9.23.1772441339887; Mon, 02 Mar 2026 00:48:59 -0800 (PST) X-Received: by 2002:a05:600c:46c4:b0:483:7783:5373 with SMTP id 5b1f17b1804b1-483c9c0f20dmr196013365e9.23.1772441339407; Mon, 02 Mar 2026 00:48:59 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Jon Kohler , Pawan Gupta Subject: [PULL 094/102] target/i386: introduce ClearwaterForest-v3 to expose ITS_NO Date: Mon, 2 Mar 2026 09:47:40 +0100 Message-ID: <20260302084749.474955-28-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441841161158500 Content-Type: text/plain; charset="utf-8" From: Jon Kohler Expose ITS_NO by default, as users using Clearwater Forest and higher CPU models would not be able to live migrate to lower CPU hosts due to missing features. In that case, they would not be vulnerable to ITS. its-no was originally added on [1], but needs to be exposed on the individual CPU models for the guests to see by default. Note: Version 1 already exposes ARCH_CAP_BHI_NO, which would already mark the CPU as invulnerable to ITS (at least in Linux); however, expose ITS_NO for completeness. [1] 74978391b2da ("target/i386: Make ITS_NO available to guests") Cc: Pawan Gupta Signed-off-by: Jon Kohler Link: https://lore.kernel.org/r/20251106174626.49930-6-jon@nutanix.com Signed-off-by: Paolo Bonzini --- target/i386/cpu.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 2a869f5b739..01b64940b17 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -5964,6 +5964,14 @@ static const X86CPUDefinition builtin_x86_defs[] =3D= { { /* end of list */ }, } }, + { + .version =3D 3, + .note =3D "with cet-ss, cet-ibt, ITS_NO", + .props =3D (PropValue[]) { + { "its-no", "on" }, + { /* end of list */ }, + } + }, { /* end of list */ }, }, }, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441933; cv=none; d=zohomail.com; s=zohoarc; b=kGxf0IRkjj8McOIr9dMO07SVucHGnY0ozeNp41+afkscjSDvv+Addo+Ma/8aXcIwxlI+xsgtmqHdc23rLLdRCbqazlK84JZ3OTGS4j57yg9haTLaEC6Cc6wnPlavrm4L9FpEy0UZ3JsqO3iAccoVJEyQXD+L1hh/tKE0rG9sRi8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441933; 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=FmDo2JQxyjuf0TSx31It8W03rDTxn7zYL46HcT7TvQI=; b=cepHjoXp2h4uKfKZlpyodU4tls4x/MCiuB5xNIQadsLdjfnVKkwWkm1W/W7AvLKbEWBWDtpfDXXV6rqKo7PipyuU3G0WZPtIv6lqbEcm2pYt52vbbuw+iNqf+kHoE4aBCTgCjrdHaen+hKAwqojf8qhZ60kwAtKMJ9dEtLZvAcM= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441933086920.0213979646862; Mon, 2 Mar 2026 00:58:53 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyze-0007kj-Cx; Mon, 02 Mar 2026 03:51:10 -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 1vwyxr-0003hV-7a for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:22 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxp-0002J8-F9 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:18 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-5-p0jYy8fWPuOxn7r2KZuCHg-1; Mon, 02 Mar 2026 03:49:03 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4832c4621c2so46309155e9.3 for ; Mon, 02 Mar 2026 00:49:03 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfcbd781sm233715205e9.8.2026.03.02.00.49.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:49:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441356; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FmDo2JQxyjuf0TSx31It8W03rDTxn7zYL46HcT7TvQI=; b=KcWZQeYVRjd1P52OTGECWUHiFhpKAGef8zRntFY59ibhwaIxZjBORI+UvisN5z/lQ85F7q SnC6dpeo/DzyRiHzkYA0xOGRghL2CsIZTX0iRB6lxTfgl8OLbzw3OE54mURldTrYh9JXmK xi5Hl7hZg+H86WKULPxaFKa1bOSS0T4= X-MC-Unique: p0jYy8fWPuOxn7r2KZuCHg-1 X-Mimecast-MFC-AGG-ID: p0jYy8fWPuOxn7r2KZuCHg_1772441343 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441342; x=1773046142; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FmDo2JQxyjuf0TSx31It8W03rDTxn7zYL46HcT7TvQI=; b=A0ME94SfKOq9o9XL3riIGeFcW54qkNrSxN7yz5dU8PSODJsvGKw0kGZAFfXZSioevH nspAhCQ85eEut7U8SzIbiBP2b6FzE/4Lr6Kdvqfg8ieBz+ah2U/DyhjSDnpsL/+RjFKo Xf1u0jf18ZKXGWqpSbfGxwC9HBcFMZF+fIun7/3bo3Gx+2+w/uRRsPN7giPVrT3xq2NE P3fIpLTrnUh7EFJtQwFwqWCee2ndXZH7O5ZGkRn3WG3zuTRF6ebPNBRFyqZNglbRXU2c 8M7g6o5wBWWd042ndTWr49nrw4vhFlPGQUM+B5WS/jDL1P2NcSoqmOwTRp/UU6Nw3ZpZ /dsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441342; x=1773046142; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=FmDo2JQxyjuf0TSx31It8W03rDTxn7zYL46HcT7TvQI=; b=oSx/suewtKookynpnLnDKDigANUBheh8aYYhu3OSWiDm5g5itfHewOPsucWTmoMVtX KZDU5Y7QrTvbNTFBwX1g680cEXfWiGHv+OXOGp1bcrpACkNiiY6tSxX2RWLgOZvIK0ao Tc+7xde2SI0FypILaanASJo+Nti6H1d455mGiUHwlV9xQ8w+nQoBylQkFWkDgfmUZplc w8Ar//1hH7+UO52bLGsGz4PTFat6CwQAUeZ6LpafDkV9IkemyqHrGRXno4N0opJHvmHQ rqFt4B+JEQ7AW2TPloIr0nvMkTsQ5tqIoV510V2fQg/PQ1q5jduzDLGGbDEr8A49FTrd pIHw== X-Gm-Message-State: AOJu0Yw4u4U6AyxLo+GnsZBQMQaLIiBHvy2YQDcXZDTstN8/PWpx/TL5 rcTBcMrWIcGyeRY/2oYVKTaXJRMQvXnBewcLyx5VUOei76LQw+6aW+n3b1iNv7hXIXp0NflK7fT LjvgZWjI2MxlY/W/nUsgU0Bvy/Q8IT5deAtjHxw41X3l+86XOysC8lQJjG9kwYCkn25A1PFYjNO iZhin4B7UFYYrgiy3QTWtYqMUGMp02/AHL0LwShgY7 X-Gm-Gg: ATEYQzz6Kjbj4fNtMMFboPuNmbUngU8FZdro4bVK/QY1H83KUrlvmRdZ538wNIrnDhD HrniBESlikFKllOayv8gTfaRmvHyHw+84DB1fDWZeVirtDkEFFN4sh0A3pmeas1AcTbAw6Dq+uY G9QDe7ORjeotlb64tpeEveG/7r5/ywulMcOSf0S0LAoO6tJDAniZTnlLW0p60a3zxyFf+EfQzLH n2mxRwQ2AJ3ok2OV/m3zbw4DtI3M3blWw48Ci4/zLuyewabFCKslCDw3RrqWLhrRjsM8DD1IWLh FzK0ubKFhJX+IbmHvE98dC4Ua3TPfMd3m2LWT7ji65YOg46qfUyT8qalyf/SRobFtpiBgsriYw7 SbWMpEOcfPCEuouXIXuPIJNBa/VljH/ZhGmQarEGf7sqsqbERax5QpJfX1OJjwtd591JTCRjw5Z YcIkFGfxZhurNDjBRUv2ubLwLaFQ4= X-Received: by 2002:a05:600c:3509:b0:483:c3f3:1dad with SMTP id 5b1f17b1804b1-483c9c20d75mr174319175e9.34.1772441342141; Mon, 02 Mar 2026 00:49:02 -0800 (PST) X-Received: by 2002:a05:600c:3509:b0:483:c3f3:1dad with SMTP id 5b1f17b1804b1-483c9c20d75mr174318845e9.34.1772441341642; Mon, 02 Mar 2026 00:49:01 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 095/102] whpx: i386: move whpx_vcpu_kick_out_of_hlt() invocation to interrupt raise time Date: Mon, 2 Mar 2026 09:47:41 +0100 Message-ID: <20260302084749.474955-29-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441933541158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni This fixes the sti followed by hlt kvm_unit_tests. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260228214704.19048-2-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 49 ++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 51ecc9531fe..f12e621a412 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -1323,6 +1323,16 @@ static int whpx_handle_halt(CPUState *cpu) return ret; } =20 +static void whpx_vcpu_kick_out_of_hlt(CPUState *cpu)=20 +{ + WHV_REGISTER_VALUE reg; + whpx_get_reg(cpu, WHvRegisterInternalActivityState, ®); + if (reg.InternalActivity.HaltSuspend) { + reg.InternalActivity.HaltSuspend =3D 0; + whpx_set_reg(cpu, WHvRegisterInternalActivityState, reg); + } +} + static void whpx_vcpu_pre_run(CPUState *cpu) { HRESULT hr; @@ -1406,6 +1416,17 @@ static void whpx_vcpu_pre_run(CPUState *cpu) .Vector =3D irq, }; reg_count +=3D 1; + /*=20 + * When the Hyper-V APIC is enabled, to get out of HLT we + * either have to request an interrupt or manually get it away + * from HLT. + * + * We also manually do inject some interrupts via WHvRegisterP= endingEvent + * instead of WHVRequestInterrupt, which does not reset the HL= T state. + */ + if (whpx_irqchip_in_kernel()) { + whpx_vcpu_kick_out_of_hlt(cpu); + } } } =20 @@ -1468,15 +1489,6 @@ static void whpx_vcpu_post_run(CPUState *cpu) !vcpu->exit_ctx.VpContext.ExecutionState.InterruptShadow; } =20 -static void whpx_vcpu_kick_out_of_hlt(CPUState *cpu)=20 -{ - WHV_REGISTER_VALUE reg; - whpx_get_reg(cpu, WHvRegisterInternalActivityState, ®); - if (reg.InternalActivity.HaltSuspend) { - reg.InternalActivity.HaltSuspend =3D 0; - whpx_set_reg(cpu, WHvRegisterInternalActivityState, reg); - } -} =20 static void whpx_vcpu_process_async_events(CPUState *cpu) { @@ -1785,25 +1797,6 @@ int whpx_vcpu_run(CPUState *cpu) cpu->exception_index =3D EXCP_INTERRUPT; ret =3D 1; } - /*=20 - * When the Hyper-V APIC is enabled, to get out of HLT we - * either have to request an interrupt or manually get it away - * from HLT. - * - * We also manually do inject some interrupts via WHvRegisterP= endingEvent - * instead of WHVRequestInterrupt, which does not reset the HL= T state. - * - * However, even with this done, if the guest does an HLT with= out - * interrupts enabled (which the test_sti_inhibit KVM unit tes= t does) - * then the guest will stay in HLT forever. - * - * Keep it this way for now, with perhaps adding a heartbeat l= ater - * so that we get the CPU time savings from having Hyper-V han= dle HLT - * instead of going away from it as soon as possible. - */ - if (whpx_irqchip_in_kernel()) { - whpx_vcpu_kick_out_of_hlt(cpu); - } break; case WHvRunVpExitReasonX64MsrAccess: { WHV_REGISTER_VALUE reg_values[3] =3D {0}; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441961; cv=none; d=zohomail.com; s=zohoarc; b=VFIFTkRCVV4YbObmbvpUhwLbf4eTPwC5Ya9DVZZDwTKwmTNxXRmctR6n/R3mOBqVqmZICyBe2ZZcICQEEYr/P9sLaApBsR4JjcMeaWqSnQ05guzfkDM9P1vWfGEKsXSK2smSp4B5X9zRXwBbK0f5a68nrjvboMuRPqo37RU7mDE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441961; 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=P4ihGBXvjUCoqlMIHRWzm+yMtviH1aSrNrVoS3hHYfg=; b=AcOlOcnDG/P2ihf4voiFEVe+/Gj1kBuYT6eKwEPXnYH8+KgCiTFz6dgwBKfTN2+oRdqH8MU6SsWlClBd0d7hPF11WrUflPyVeuorhbJK7DbcVBhowUNJ2FTLHeZvuea19Vgu1DgFRCH003FOenx4qDa1wRZ0bMFXHoTXydGUQVo= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441961958898.4965622792535; Mon, 2 Mar 2026 00:59:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzY-0006vr-UQ; Mon, 02 Mar 2026 03:51: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 1vwyxh-0003Zt-8j for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:11 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxf-0002IG-NJ for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:09 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-301-6YV40r89OFeFL2we5sXV5Q-1; Mon, 02 Mar 2026 03:49:06 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4830e7c6131so44164895e9.2 for ; Mon, 02 Mar 2026 00:49:05 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd75df9fsm458676195e9.13.2026.03.02.00.49.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:49:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441347; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=P4ihGBXvjUCoqlMIHRWzm+yMtviH1aSrNrVoS3hHYfg=; b=OezkURJrrAPRJLYpGjPumg7VFt9NGeog5K6BV6bfFL3pu9Y2G3kHD3NRwgj1am+utGV3b9 HzGbmf8wAsol0eIxrL1cy47+8XTdkP5c61i0+Ecp5rAnZM4WdBL3QKt2z8bl2H0xjtmq1g yUtq4DNu/YWd1RUNQDqTrp5hT06DafE= X-MC-Unique: 6YV40r89OFeFL2we5sXV5Q-1 X-Mimecast-MFC-AGG-ID: 6YV40r89OFeFL2we5sXV5Q_1772441345 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441344; x=1773046144; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=P4ihGBXvjUCoqlMIHRWzm+yMtviH1aSrNrVoS3hHYfg=; b=WC1GPIVim7iTgRXtA/nMMNZCCsVS4YlcPC9p/a3lvMZq7la1mgji/nzS+3v5ZKmmwb mMVGfHG/FSrqGwy5vhBf4OEtActZikvz3odg6RDCgxynec+35Z2sDttJCpP+ucjtRHto KnmkeHXNc1DFN9MVfjyafkgz8Sg7UDE/MYGgp3gOBYgRAhS8TEpn1+1f9Q2k5OLBuQU7 //qc0AUNeuYv3hh0Nkz/3eYoUpZTps02pV1wP8fNEbPOl2NggLWuluyiAU3vqIZ1hMxL eQc/1giOBHoP0S0lKINsor0w40vCPmwrOoG5AIa+iCFQ7hSIXxF/KY7H1wqdcJX5AzIb B0Aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441344; x=1773046144; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=P4ihGBXvjUCoqlMIHRWzm+yMtviH1aSrNrVoS3hHYfg=; b=kHOBWPz16e8WbUpE/Fssw7soFduSXeAaJdr5MagoYHZytKwb4PYOwFuVUN0176eP+U Cj6vjbRfvzRlR9tEMTUgBg4/dUsYh+065+9pLh1Ox1tD8pXnBU55OQtJ7x6vTF/wm6Ce hhcMLJDFXVsXNkpqedqXnJ+smmUw+KInQzr7pkWlMxWf0XG5awf0BWckv6Ybr6Jyjgsh sqyVyT2UYYHL1TUy59M7YPfHrakXuaa7AquICJJucnVY1S23SHgoUkSJHmmFfc5heibI jfEhVmEboPrY1YQ63vScq0m006zo5/QyiEb/xA7XyPm4eKy89lGPL9JVUeNVADy4OBiE yV7A== X-Gm-Message-State: AOJu0YwfcEdRDUgtYGKyaAB9e9h2HvPowqn5kjh+N+9dZdRHF27FTfLb nGzJLpVPXf/UOjyXpxXHgW0alyiD7MUSf3EyZZ2a7WoX6lddyFJTW7koWE6CA1Hbc+TUDIacaiR 3Tu05RA/kQoum24XDI0BxMJe9SzxJz6MtS3LM8LrzPPjJhSG1VWOXGkCzPNYHgQ4opyV1Q9gM3l OddR1VwMKBFfly41EJYwdB2nfs4Ip/lQ0/TZU/EIxN X-Gm-Gg: ATEYQzxUIEUCNKdBqo+6v+19yT2BvRg1M1qFXC/4yL9V6p+b1zU9AmcO26M8Dfab7Sz nRnpvG1V6t0yzwtKoZUja+O4dKGLAGSwVYtfzWucJkK0af9ok+1U1bomnT9zqprpTBzpnYnluoY NxBDKUgREbWuAwvBP92oKv4Tdwlyj3H9NGBvQJDfT4wndp5kybfHRQbED2CzUNTnHo52XErkja8 jCKpqgI8Wjct42xP4fuTNQDyWsKzF58xIiQsIzObvhEh3y7SrvaZgM2wSzdb0Qcaf2/FDuPmSpE 09a4A+cw4zcrIBIeB8SWkVqK0eF4u4L+GXYTmVPmT7RpDK/3z5nnLZ/vaD+7dRrDOFSfGVNRtTV Vlb1sTzMowcOIBDpMTzadWFd3Eu7o6eaIMUU5Juc/V3CIycxm/SPn4/gev4qBrTQgW8ncyfw6Sg /hOp9ESCNS/e9k74bhqRCP7/6Mbac= X-Received: by 2002:a05:600c:548a:b0:483:aa2:6bce with SMTP id 5b1f17b1804b1-483c9bdb0c2mr185458645e9.30.1772441344448; Mon, 02 Mar 2026 00:49:04 -0800 (PST) X-Received: by 2002:a05:600c:548a:b0:483:aa2:6bce with SMTP id 5b1f17b1804b1-483c9bdb0c2mr185458105e9.30.1772441343952; Mon, 02 Mar 2026 00:49:03 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 096/102] whpx: i386: enable all supported host features Date: Mon, 2 Mar 2026 09:47:42 +0100 Message-ID: <20260302084749.474955-30-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441963660158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260228214704.19048-3-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index f12e621a412..285740bae87 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -2022,6 +2022,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms) UINT32 whpx_cap_size; WHV_PARTITION_PROPERTY prop; WHV_CAPABILITY_FEATURES features =3D {0}; + WHV_PROCESSOR_FEATURES_BANKS processor_features; =20 whpx =3D &whpx_global; =20 @@ -2127,6 +2128,45 @@ int whpx_accel_init(AccelState *as, MachineState *ms) } } =20 + /* Set all the supported features, to follow the MSHV example */ + memset(&processor_features, 0, sizeof(WHV_PROCESSOR_FEATURES_BANKS)); + processor_features.BanksCount =3D 2; + + hr =3D whp_dispatch.WHvGetCapability( + WHvCapabilityCodeProcessorFeaturesBanks, &processor_features, + sizeof(WHV_PROCESSOR_FEATURES_BANKS), &whpx_cap_size); + if (FAILED(hr)) { + error_report("WHPX: Failed to get processor features, hr=3D%08lx",= hr); + ret =3D -ENOSPC; + goto error; + } + + if (processor_features.Bank1.NestedVirtSupport) { + memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY)); + prop.NestedVirtualization =3D 1; + hr =3D whp_dispatch.WHvSetPartitionProperty( + whpx->partition, + WHvPartitionPropertyCodeNestedVirtualization, + &prop, + sizeof(WHV_PARTITION_PROPERTY)); + if (FAILED(hr)) { + error_report("WHPX: Failed to enable nested virtualization= , hr=3D%08lx", hr); + ret =3D -EINVAL; + goto error; + } + } + + hr =3D whp_dispatch.WHvSetPartitionProperty( + whpx->partition, + WHvPartitionPropertyCodeProcessorFeaturesBanks, + &processor_features, + sizeof(WHV_PROCESSOR_FEATURES_BANKS)); + if (FAILED(hr)) { + error_report("WHPX: Failed to set processor features, hr=3D%08lx",= hr); + ret =3D -EINVAL; + goto error; + } + /* Register for MSR and CPUID exits */ memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY)); prop.ExtendedVmExits.X64MsrExit =3D 1; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441981; cv=none; d=zohomail.com; s=zohoarc; b=bDREK4tAeG7aSgw1IE4iR8v2TvOf77KkHJPnIaCGlatI0ABfC2NyPOnUU8DgfxnhEGIrvqcXHGWqFVRUP1szoi1l11F1nmFyg67meUMC7sBuQAY2U5pJBP8huMqByjI/nZuW+iaBRtZxGz5JsQ3wl2ZHX0QFBcV7GeQnHl39E2o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441981; 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=V4Y3KHfwBhYU7QmfPmdxCiReVolMHUqug+H9G0c80JQ=; b=g1AJDlmmawYMm0beWBufOWetGenpZY3i2BOMhcpRIKyy3yWV4EZGxQ9wS63hySn8DU+XeqFxZnIBp2U6LmOoeRITHLzeeIlE8guJ1IEhf4WefGI5HrdBYWkeVEqFLO0uQvSHZe+U7cSf33kDi11geQSutSFPnTCW7QY8PVPpnP0= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441981698799.3436628096136; Mon, 2 Mar 2026 00:59:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzD-0004xz-Le; Mon, 02 Mar 2026 03:50:43 -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 1vwyxk-0003c5-3k for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:13 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxi-0002IV-7f for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:11 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-387-w9x3RBRHNFyXadimtiXnrg-1; Mon, 02 Mar 2026 03:49:08 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4836fbfa35cso20696955e9.1 for ; Mon, 02 Mar 2026 00:49:08 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bfb77466sm166001065e9.5.2026.03.02.00.49.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:49:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441349; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=V4Y3KHfwBhYU7QmfPmdxCiReVolMHUqug+H9G0c80JQ=; b=fE5vGDvMg7R74Nw6tAKoVEF1EFnL+BtaUecucbc4x41IrXrb2Jb3+GVAJ4BjtJU+mfetw0 MpxQbSIvx/qFGBUHGnm+tRt4Jv1A4d1PXH/2sCa2kWHzgKQoGWIgXMwatRUxC7SKf3vzVy EQ+dxL4bvicS7j27B0+HcK8OHyXvjSA= X-MC-Unique: w9x3RBRHNFyXadimtiXnrg-1 X-Mimecast-MFC-AGG-ID: w9x3RBRHNFyXadimtiXnrg_1772441347 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441346; x=1773046146; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=V4Y3KHfwBhYU7QmfPmdxCiReVolMHUqug+H9G0c80JQ=; b=DOD3zrdUJ04cuBXw5ixx0wZcFg5XD/BZM5WlzlkyHAB6eZ1YbMTr774VKwIPSjjUYL 0zsN7os/BViIvqQ/z61vTw3sRwZTddcMyzlaCBfCrF3yjO6KNBETuJS5MCMIy7IzLg0Y kTyAoQHTAluMEl4fB0nViOR0sTw3sta1JELlj8NY60MJDLuxzkhOOWRfJHGQ9GurtkLZ mnuvUbJ5ttypAxRO18HVJW0Dkt+EUgAe/BtVgh1qXRT7Wldnc921bdGK6ZFhOCNCPhV0 vNnLJsGws7mLtuh9jsZwt8vMpyIgricL2EmkAzkR/Il69c1qS2R4r7cdqMSojcV/zkLs A++Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441346; x=1773046146; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=V4Y3KHfwBhYU7QmfPmdxCiReVolMHUqug+H9G0c80JQ=; b=HYaKo5ikjghIiFU7nG0Lk3OshvoS3mpcxkCPDsN6C/6RjfgfEbfL8P2wL6ywx2+RR5 KG9b4zAtqfdtPiVFfgjGhR90DMFowLg0Y9Lu8AEzPkSaf4WjMZexTR9Dc4CjmLvjVnMo 77dYd1T5J+ujrNv+fdXLmabJs8bqOIZwaBNtaVXXuUpeVSUDZpqZ5+JD/VvjFvb1/lZO xviv4C+aYMIMacUq9l0Edoejg6suPWkYS5UrZAwmxURdG2gFuFRoUgEkkveAnbHgmN9M 7j5h3CKvFlDQqL4ANGB/CEhk6WkbPvtwwxzc6rd70gYBs0gl+EWBhf+yfNfIqqpru8Iu xJSQ== X-Gm-Message-State: AOJu0Ywt3RZjbfDH4XdqSaJZEfx1zlWZMREbYnowSY5xuEgW89CLy6Pv y7VyxmaAVKQ6el3HZvPrYga5rrd4xxshYuyGTgiZ0fFGYCrZWRmae78HPIq1cCURC9DlobDzidk qnXkZZYhRc5S2peT5ijT9UBwJf7BrqssNFVlYlCPUapcZu38UxAR56fHlZ5g90kAXUgSHVHEdMd VspM6dCFouQAd6svtc33R0ERiJC2CWBh90e5qxiJAl X-Gm-Gg: ATEYQzx0CQ24eca3KMAVGZXljpmsmI67MiLgAurlyUMUf+tdjRhW2lRiU0dBeBF+ehk Aocpl21Uzuno01j8FOnIqHXStdyDS5vU8O2DVSGqAH1yKjy6KeglwkzJZWbRvdBpMBBbm9yPP4t ClaR9Qt8MwNjkWTQR8WrJJ0tsWSf37BNTc29FT0VBOzqoIdMVbbJ1I2zIl8wy/kqA01O7iZ1Vb9 cL6FwksOMVEn8D8XE1mB/qyTTQc/QpLnuweN65IsBP6+3AmOZWHFtuvo1YFWb94rlk6d9To+NxS Na3VeqP59tkFiYBxUpgh1LrgFVbUpu1vnlFr0kW6jcmIKaswrhJtqWTnNQ03ZY1zk+yx7YE9rqA vbXZFvnyss0g+o1UAw7ir+RARJYgAA8YImwCTq75uAdAFAMO6k53FgK5kOtFrRufBx6JxvTEaR7 ybUVLXwh+IG/Oxd2f12DdzMcZbOEY= X-Received: by 2002:a05:600c:8108:b0:47e:e9c9:23bc with SMTP id 5b1f17b1804b1-483c9bfa168mr172532705e9.30.1772441346369; Mon, 02 Mar 2026 00:49:06 -0800 (PST) X-Received: by 2002:a05:600c:8108:b0:47e:e9c9:23bc with SMTP id 5b1f17b1804b1-483c9bfa168mr172532415e9.30.1772441345915; Mon, 02 Mar 2026 00:49:05 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 097/102] whpx: i386: enable synthetic processor features Date: Mon, 2 Mar 2026 09:47:43 +0100 Message-ID: <20260302084749.474955-31-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441983755158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni At the point in time in which we setup the partition, the vCPUs aren't available yet. So enable them by default for now like what the MSHV backend does. AccessFrequencyRegs is shared for both the LAPIC frequency reporting and th= e TSC frequency. To still benefit from the fixed TSC frequency reporting when kernel-irqchip= =3Doff, still enable AccessFrequencyRegs anyway. Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260228214704.19048-4-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 285740bae87..2863224cd2e 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -2167,6 +2167,40 @@ int whpx_accel_init(AccelState *as, MachineState *ms) goto error; } =20 + /* Enable synthetic processor features */ + WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS synthetic_features; + memset(&synthetic_features, 0, sizeof(WHV_SYNTHETIC_PROCESSOR_FEATURES= _BANKS)); + synthetic_features.BanksCount =3D 1; + + synthetic_features.Bank0.HypervisorPresent =3D 1; + synthetic_features.Bank0.Hv1 =3D 1; + synthetic_features.Bank0.AccessPartitionReferenceCounter =3D 1; + synthetic_features.Bank0.AccessPartitionReferenceTsc =3D 1; + /* if kernel-irqchip=3Doff, HV_X64_MSR_APIC_FREQUENCY =3D 0. */ + synthetic_features.Bank0.AccessFrequencyRegs =3D 1; + synthetic_features.Bank0.AccessVpIndex =3D 1; + synthetic_features.Bank0.AccessHypercallRegs =3D 1; + synthetic_features.Bank0.TbFlushHypercalls =3D 1; + + if (whpx_irqchip_in_kernel()) { + synthetic_features.Bank0.AccessSynicRegs =3D 1; + synthetic_features.Bank0.AccessSyntheticTimerRegs =3D 1; + synthetic_features.Bank0.AccessIntrCtrlRegs =3D 1; + synthetic_features.Bank0.SyntheticClusterIpi =3D 1; + synthetic_features.Bank0.DirectSyntheticTimers =3D 1; + } + + hr =3D whp_dispatch.WHvSetPartitionProperty( + whpx->partition, + WHvPartitionPropertyCodeSyntheticProcessorFeaturesBanks, + &synthetic_features, + sizeof(WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS)); + if (FAILED(hr)) { + error_report("WHPX: Failed to set synthetic features, hr=3D%08lx",= hr); + ret =3D -EINVAL; + goto error; + } + /* Register for MSR and CPUID exits */ memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY)); prop.ExtendedVmExits.X64MsrExit =3D 1; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772442061; cv=none; d=zohomail.com; s=zohoarc; b=Cud7dH9ZrpdKifipKEKB9DpHlflamZLtMsenMqWKiK29pEQC0ndSws2PBQIsf5J8Lsi5nLaLzmjVdxX6UshEyesjg2IyKSpDtg8IhbfmSDDv5m6uGIHvvOT0d7fObP+xA01qx/Hc6iVhxtNgsUW+28qYyeJECVDmfiGnNSgH/GM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772442061; 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=NKcA6a+NHKs5mFrrvmvgtmWUQArMtlHNbVwmfEzyy3c=; b=dPZnc0AJNFAuOgHg2V3Q04tMwbLQnamVA8gWIakPpmutJiKzcxz4o4g/6EbI5K5z3gjPknqfzxOPefGGMbu8VrY9QYjzhKzxEBzspFMME5+yTeDNXH5ZJDXcUy/CMlXh15gt1PynO64yTzptVwBAqRcaxWTzSxK3Ovj4SoU3BBA= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772442061617389.5047218884097; Mon, 2 Mar 2026 01:01:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzD-0004y4-PB; Mon, 02 Mar 2026 03:50:43 -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 1vwyxm-0003g1-E0 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxk-0002Ik-Ti for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:14 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-385-nwj0E5tZNK-ME4b1Dwc2kg-1; Mon, 02 Mar 2026 03:49:11 -0500 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4837907ec88so48448355e9.0 for ; Mon, 02 Mar 2026 00:49:11 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439ae3f31dbsm12671072f8f.1.2026.03.02.00.49.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:49:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441352; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NKcA6a+NHKs5mFrrvmvgtmWUQArMtlHNbVwmfEzyy3c=; b=WmWPoLjSrNVq38M+j/0aLIALWqjOzUwKLg5iVFMHqPKHI9dKdAestPfeOsjEH/K9NG771n 8exW8SMWKn+XIdmlmPOa0J1qejHnSOTaBo788V+StLM+5n+unoc2fXu4hxL6mH6aj63Pkl sgf2ZObpAJzdiJ2YlYgwmnQW3TwHQlQ= X-MC-Unique: nwj0E5tZNK-ME4b1Dwc2kg-1 X-Mimecast-MFC-AGG-ID: nwj0E5tZNK-ME4b1Dwc2kg_1772441350 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441349; x=1773046149; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NKcA6a+NHKs5mFrrvmvgtmWUQArMtlHNbVwmfEzyy3c=; b=N5AQxHUubLcn8l87zApP52YipdOwPAR2awcms9km6a8WV6jJzKgco36vpUlEf3b0hQ xmvrpXLlLyZmx0n1LKxzqSPjK21ZaTrR1whIbaArY0pEzv1DZc+qxZFOVEFGq+mToj+c XLKPsiShIJks+zD2mC+tSUE3dvcsmu9qif+zRURbzi7C/PUM68tMV6dm4XVYo/0GsQmj ZTkGg9Hosl1pnKkb53w6WHnEub/5vfWvMJiNC1AG0lSEW1hVeG5tEmMJs3AKdaRudi1K UT8/fAov5MjqN0D7aOYdvRGFywMZSgrtsCsOqfWsA+aqUgmjhF4mbkXi2twJeGuSgU7g Uu0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441349; x=1773046149; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=NKcA6a+NHKs5mFrrvmvgtmWUQArMtlHNbVwmfEzyy3c=; b=FxKAmv6aH/vH10xF7Lc3ic6Nmt9/Gx4zfLlcUoQzAb3O1vb8X5m8JuP/MUPuDerUzo p/K5x5FoJMMbM2Oznj0hdVnYSUJN+n65QCAbP/NJWIqz1JNMVHXuhiz4gjtaj7wkgZrR csbf3Gk7WB99yx3MufvTbBJl/eZgf+NO4hnU4PREdYJQjnTZNZSI68pilDq0fj0O/SB+ 8wAPhZtUB4q28Wp4N3/UBeRnPWrXydJTY1KILOXO9Zdtg1CegMo8D0uNVKf2Bi8T/2BN tzsYnGwLzdL+8EIS2XxaTvnbzRnnJhLn3BfAdm8qzzu9e2vtZNt3T080TPdu+Vy3Cvnf YO8g== X-Gm-Message-State: AOJu0YyWidIp+A2jwNMKKtG1H849m7ljuJsU1SO5nVUgMNLxrI347+oQ kZorQnpPf3ZZh+d0cSwbrbdhuGoqwjsz9r3aCWBw9P96frVU1yRWCkSZMdZ1w2Y0f1AokJj5XVy Nv5qOLO2P1TcbyAMXf259iMt8+VmY+WeU17Qfiq/rbnhwgJxWKYxNUIBJqJOsCmg1PrpcN72UPQ URe250cjfOGrm2BmV70xh1Yn0qwEn8BbDu9SUCpcyP X-Gm-Gg: ATEYQzwl5FA64U/OsuMvl7AKNSYr3WEVFmYFPrymOiRYFRrFDfDRCmZ12YN51WVQjjt MCd0mZFyVukQmFFMp3saOKyeT0FObaiO8I6NrMUKSrT/sJmW376mIWucKSp933ildL6Pi9/gVdx eGsg9w2OYx1zG3lm5fkaYXE9oN0QBPkoCReuVjuMbdHOmEoaVgJ+28cskA4EBdy9jOkNqBmkUI5 nM3gXLL/+Xsr6YsTwzQgqzbZCQFgmrwT7rNnOVNOnA1h7T9Nz7Ec7BqK7aqAVnQQPjqlyJ3Sy1+ spYI846FHm4tOiJV/sVvbOaUfCHSOyqSJI5t2C3/vQUclquCvzB6gspXYsNfa/x1dJK6ex0zUqK Ykx7Jp08rMUTIbSCVCiR/a+4Ex0FAo2FJA2azoZ6F2DgWuveDTDtpJ96o5mVNaggmDb9xIAEJN3 Jfa6RsoxVJ/HWQS+z86bbVAcU5+o8= X-Received: by 2002:a05:600c:154b:b0:477:5af7:6fa with SMTP id 5b1f17b1804b1-483c9c2059bmr169736855e9.32.1772441349511; Mon, 02 Mar 2026 00:49:09 -0800 (PST) X-Received: by 2002:a05:600c:154b:b0:477:5af7:6fa with SMTP id 5b1f17b1804b1-483c9c2059bmr169736565e9.32.1772441349026; Mon, 02 Mar 2026 00:49:09 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 098/102] whpx: i386: warn on unsupported MSR access instead of failing silently Date: Mon, 2 Mar 2026 09:47:44 +0100 Message-ID: <20260302084749.474955-32-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772442062363158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260228214704.19048-5-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 2863224cd2e..4186be62ada 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -1819,6 +1819,9 @@ int whpx_vcpu_run(CPUState *cpu) reg_count =3D vcpu->exit_ctx.MsrAccess.AccessInfo.IsWrite ? 1 : 3; =20 + warn_report("WHPX: Unsupported MSR access (0x%x), IsWrite=3D%i= ",=20 + vcpu->exit_ctx.MsrAccess.MsrNumber, vcpu->exit_ctx.MsrAcce= ss.AccessInfo.IsWrite); + hr =3D whp_dispatch.WHvSetVirtualProcessorRegisters( whpx->partition, cpu->cpu_index, --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441960; cv=none; d=zohomail.com; s=zohoarc; b=RNI2IcJ0EDHK1sJo25Ptl7fs4hd3FMmYUJ2RLL3e5+M6WKykmQ5HOCSDTxJnuRJfJ69R2Wu2qQVk6kzJc6uNMTxswUPzm82IghRbuBzhy6jnp7whjuksy4VB0kdH3YCRyQe+EAPBjL3ak0enahSSc3GzAbfKWucbHEaC+dEd2Es= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441960; 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=qhBocWSJc19xl2W81VDGcWaIXhzaLef2h/kLLTGSy64=; b=f57aPjEiXkd8U93M6zozwwBcouf9wizR4VBP1jIXAfOnxp5JpNlhELvr2E8LTh5Oz8svA9hHu4HcRf7lrhPNDCl9PX6H3jAaD/OZUTA80EEJCf4xPFkMDAoMXZusOHWWhldZEjhXBZswgTits6eTMR7grwSn4dpPGbz3MuFG+mk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441960931816.7371567004385; Mon, 2 Mar 2026 00:59:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzF-00056z-0b; Mon, 02 Mar 2026 03:50:45 -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 1vwyxp-0003hD-Ly for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:19 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxn-0002J3-Hx for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:17 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-172-2qTB4JoVPYWNmnkZPeithw-1; Mon, 02 Mar 2026 03:49:13 -0500 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-48069a43217so41079985e9.1 for ; Mon, 02 Mar 2026 00:49:13 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bffc17dasm233060645e9.2.2026.03.02.00.49.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:49:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441355; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qhBocWSJc19xl2W81VDGcWaIXhzaLef2h/kLLTGSy64=; b=W4MQZJzM3MLkp6/bHtJkWZy1iPdoRJvmXvHYF+WNfMVnWtAsNYJhZ8+bIGvoCx3l9e+sab PH4/4MfYYlwl+Ikzg1S8L0ihPlkHXzw914n8inyyhEJlyCfwlBAiOZiCf7n5qnqp7am23G Ymg0NxqU1iAuwAXr+Wo+3QOMGbpcB7k= X-MC-Unique: 2qTB4JoVPYWNmnkZPeithw-1 X-Mimecast-MFC-AGG-ID: 2qTB4JoVPYWNmnkZPeithw_1772441353 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441352; x=1773046152; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qhBocWSJc19xl2W81VDGcWaIXhzaLef2h/kLLTGSy64=; b=QFTwI1KLkfTOaLQO9kItLB9XdnoYCPtb2ge3CanVWeSWUYkdlMMzyMLMJegAvqRTyE k+ROrgNECbGkeaDVfehW0yGLs1B002w9Y/o9P84h7K2ANrwHhMp2MCfG7ZmrFnhGmEkr L5gmuThEnQbqJB+ZIgrJVpZT3mIsJx7bOgMU8t+qByvntqPuiejgNQaGiRMJ/Hld/4CN ErS4X984ue8JVUmuGML988HMZ9RLv37AcLDoEY71caQWCuJ35agFwkaFh4pNpC56x/6u I1I46GRpa0y0hIBf9XapUBnStzlxuhezZVwUWu9RazlEaexVNRCPHSnKdmxfGmm9lYB/ YLBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441352; x=1773046152; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=qhBocWSJc19xl2W81VDGcWaIXhzaLef2h/kLLTGSy64=; b=KhewMsuvQXuqS5Z/ebHrB+CUbglZpxUCH/RMEdnWPLj6DohAQIk9L4l/tYYe3DOS5s BsJBpeGT3AdOdfE6DEwdxn13poOLBLneGoHX9CFy+qNUHRCEuyWi8fsA5h/RD70Gaghz auhiRxs2eiHc1Z0WTAPFdAJp8Bz8Yqlo7F3o67aIGuO/rsJbb29YB80Yj9JIBg8yrHTz DowKQG1Z+dIuXpzp1GNU2yXjSlL5S9e/TkhyALeicad46b9KS5PxCfS3CGYd/a9X0Y8p ZvHCEySz9pGMnZCvSl4Go0nkKqBO6CwsbdcIMXC1sjwAPYb4Zj2mst9VTKZQDMc8YkFK TaUA== X-Gm-Message-State: AOJu0YynTpqA9QOPneRlZ7g+tsMM2/6aPK0+vJZyEnaYxJv87uZK7L/n urcSGFgQyYDhOr3JdH7hpLyUO0nQnH4XmjrlrWj3PR2c3X2NIa92iE4CD+ueFi51FQacbCbaqlY 40G9ydjiA7VJ1aqa3XAnmNdTTPv5NFTJz2BRGR5seBxheGJc3z4nJAbYxXRhfOLZfP1NnIDfm+u 2hzuaa7dakUWBc5DDGnzI2dV2MbI8+iyL1tyQZK1mZ X-Gm-Gg: ATEYQzzYm994SZkqR1tXUqlEi98mrSUd8r81EA4g21NZjLAzkwSuaxky7Jgw/zpRWD0 KXqvTABIkv6/ffztRRYDnRgHMcDLGjZUKmA+Z8sx3XWuna+x7IUX0zm0hnFm7CuTwjJaY27IOsA QIV3maHYbZEBEYLeKix1gCtTblwZG8cywHuceajxmiEWS1cRFcpp67rWyU/vMG8hMypquDXaegY iqi6pA6tSS4JIfOM4TXKmhy9Id+ZjjK0LC7OzZhR8+yZBpvoUH2WW5KQju6CG/7/6tjEZlHYuXE ORCpsNhXdxXFvdm9GU+TN5RElGZuqc+jms8wuuHlnAmNqvlx74Dz1Q+xNiylfoXzN8OJhFylQ+O WFSVTFmta01g0r/Uv1uq/DHmQzVoS8gZblxrRs6MOuC/9KRP4Uqx+PMkU7FdP2jC01krvlWtfJf Z8sdzHn++BQKAZQHIgcShS0jwuFO4= X-Received: by 2002:a05:600c:3509:b0:47a:81b7:9a20 with SMTP id 5b1f17b1804b1-483c9b9d9admr181458515e9.9.1772441351592; Mon, 02 Mar 2026 00:49:11 -0800 (PST) X-Received: by 2002:a05:600c:3509:b0:47a:81b7:9a20 with SMTP id 5b1f17b1804b1-483c9b9d9admr181458095e9.9.1772441351054; Mon, 02 Mar 2026 00:49:11 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 099/102] target/i386: emulate: more 64-bit register handling Date: Mon, 2 Mar 2026 09:47:45 +0100 Message-ID: <20260302084749.474955-33-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441961722158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260228214704.19048-6-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_flags.h | 20 ++++++++++++++ target/i386/emulate/x86_emu.c | 17 ++++++++++++ target/i386/emulate/x86_flags.c | 47 +++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/target/i386/emulate/x86_flags.h b/target/i386/emulate/x86_flag= s.h index a395c837a0e..7ffbbe5c122 100644 --- a/target/i386/emulate/x86_flags.h +++ b/target/i386/emulate/x86_flags.h @@ -33,6 +33,10 @@ void set_CF(CPUX86State *env, bool val); =20 void SET_FLAGS_OxxxxC(CPUX86State *env, bool new_of, bool new_cf); =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAPC_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff); +#endif void SET_FLAGS_OSZAPC_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff); void SET_FLAGS_OSZAPC_SUB16(CPUX86State *env, uint16_t v1, uint16_t v2, @@ -40,6 +44,10 @@ void SET_FLAGS_OSZAPC_SUB16(CPUX86State *env, uint16_t v= 1, uint16_t v2, void SET_FLAGS_OSZAPC_SUB8(CPUX86State *env, uint8_t v1, uint8_t v2, uint8_t diff); =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAPC_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff); +#endif void SET_FLAGS_OSZAPC_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff); void SET_FLAGS_OSZAPC_ADD16(CPUX86State *env, uint16_t v1, uint16_t v2, @@ -47,6 +55,10 @@ void SET_FLAGS_OSZAPC_ADD16(CPUX86State *env, uint16_t v= 1, uint16_t v2, void SET_FLAGS_OSZAPC_ADD8(CPUX86State *env, uint8_t v1, uint8_t v2, uint8_t diff); =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAP_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff); +#endif void SET_FLAGS_OSZAP_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff); void SET_FLAGS_OSZAP_SUB16(CPUX86State *env, uint16_t v1, uint16_t v2, @@ -54,6 +66,10 @@ void SET_FLAGS_OSZAP_SUB16(CPUX86State *env, uint16_t v1= , uint16_t v2, void SET_FLAGS_OSZAP_SUB8(CPUX86State *env, uint8_t v1, uint8_t v2, uint8_t diff); =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAP_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff); +#endif void SET_FLAGS_OSZAP_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff); void SET_FLAGS_OSZAP_ADD16(CPUX86State *env, uint16_t v1, uint16_t v2, @@ -61,6 +77,10 @@ void SET_FLAGS_OSZAP_ADD16(CPUX86State *env, uint16_t v1= , uint16_t v2, void SET_FLAGS_OSZAP_ADD8(CPUX86State *env, uint8_t v1, uint8_t v2, uint8_t diff); =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAPC_LOGIC64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff); +#endif void SET_FLAGS_OSZAPC_LOGIC32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff); void SET_FLAGS_OSZAPC_LOGIC16(CPUX86State *env, uint16_t v1, uint16_t v2, diff --git a/target/i386/emulate/x86_emu.c b/target/i386/emulate/x86_emu.c index 8d35f3338c1..6c4ccc45383 100644 --- a/target/i386/emulate/x86_emu.c +++ b/target/i386/emulate/x86_emu.c @@ -45,6 +45,22 @@ #include "x86_mmu.h" =20 =20 +#ifdef TARGET_X86_64 +#define EXEC_2OP_FLAGS_CMD_64(env, decode, cmd, FLAGS_FUNC, save_res) \ + case 8: \ + { \ + uint64_t v1 =3D (uint64_t)decode->op[0].val; \ + uint64_t v2 =3D (uint64_t)decode->op[1].val; \ + uint64_t diff =3D v1 cmd v2; \ + if (save_res) { \ + if (write_val_ext(env, &decode->op[0], diff, 8)) { return 1; }= \ + } \ + FLAGS_FUNC##64(env, v1, v2, diff); \ + break; \ + } +#else +#define EXEC_2OP_FLAGS_CMD_64(env, decode, cmd, FLAGS_FUNC, save_res) +#endif #define EXEC_2OP_FLAGS_CMD(env, decode, cmd, FLAGS_FUNC, save_res) \ { \ if (fetch_operands(env, decode, 2, true, true, false)) {\ @@ -84,6 +100,7 @@ FLAGS_FUNC##32(env, v1, v2, diff); \ break; \ } \ + EXEC_2OP_FLAGS_CMD_64(env, decode, cmd, FLAGS_FUNC, save_res) \ default: \ VM_PANIC("bad size\n"); \ } \ diff --git a/target/i386/emulate/x86_flags.c b/target/i386/emulate/x86_flag= s.c index 6592193b5e0..3c4270a14c1 100644 --- a/target/i386/emulate/x86_flags.c +++ b/target/i386/emulate/x86_flags.c @@ -82,6 +82,10 @@ SET_FLAGS_OSZAPC_SIZE(16, carries, result) #define SET_FLAGS_OSZAPC_32(carries, result) \ SET_FLAGS_OSZAPC_SIZE(32, carries, result) +#ifdef TARGET_X86_64 +#define SET_FLAGS_OSZAPC_64(carries, result) \ + SET_FLAGS_OSZAPC_SIZE(64, carries, result) +#endif =20 /* ******************* */ /* OSZAP */ @@ -107,6 +111,10 @@ SET_FLAGS_OSZAP_SIZE(16, carries, result) #define SET_FLAGS_OSZAP_32(carries, result) \ SET_FLAGS_OSZAP_SIZE(32, carries, result) +#ifdef TARGET_X86_64 +#define SET_FLAGS_OSZAP_64(carries, result) \ + SET_FLAGS_OSZAP_SIZE(64, carries, result) +#endif =20 void SET_FLAGS_OxxxxC(CPUX86State *env, bool new_of, bool new_cf) { @@ -115,6 +123,14 @@ void SET_FLAGS_OxxxxC(CPUX86State *env, bool new_of, b= ool new_cf) env->cc_src ^=3D ((target_ulong)new_of << LF_BIT_PO); } =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAPC_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff) +{ + SET_FLAGS_OSZAPC_64(SUB_COUT_VEC(v1, v2, diff), diff); +} +#endif + void SET_FLAGS_OSZAPC_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff) { @@ -133,6 +149,14 @@ void SET_FLAGS_OSZAPC_SUB8(CPUX86State *env, uint8_t v= 1, uint8_t v2, SET_FLAGS_OSZAPC_8(SUB_COUT_VEC(v1, v2, diff), diff); } =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAPC_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff) +{ + SET_FLAGS_OSZAPC_64(ADD_COUT_VEC(v1, v2, diff), diff); +} +#endif + void SET_FLAGS_OSZAPC_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff) { @@ -151,6 +175,14 @@ void SET_FLAGS_OSZAPC_ADD8(CPUX86State *env, uint8_t v= 1, uint8_t v2, SET_FLAGS_OSZAPC_8(ADD_COUT_VEC(v1, v2, diff), diff); } =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAP_SUB64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff) +{ + SET_FLAGS_OSZAP_64(SUB_COUT_VEC(v1, v2, diff), diff); +} +#endif + void SET_FLAGS_OSZAP_SUB32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff) { @@ -169,6 +201,14 @@ void SET_FLAGS_OSZAP_SUB8(CPUX86State *env, uint8_t v1= , uint8_t v2, SET_FLAGS_OSZAP_8(SUB_COUT_VEC(v1, v2, diff), diff); } =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAP_ADD64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff) +{ + SET_FLAGS_OSZAP_64(ADD_COUT_VEC(v1, v2, diff), diff); +} +#endif + void SET_FLAGS_OSZAP_ADD32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff) { @@ -187,6 +227,13 @@ void SET_FLAGS_OSZAP_ADD8(CPUX86State *env, uint8_t v1= , uint8_t v2, SET_FLAGS_OSZAP_8(ADD_COUT_VEC(v1, v2, diff), diff); } =20 +#ifdef TARGET_X86_64 +void SET_FLAGS_OSZAPC_LOGIC64(CPUX86State *env, uint64_t v1, uint64_t v2, + uint64_t diff) +{ + SET_FLAGS_OSZAPC_64(0, diff); +} +#endif =20 void SET_FLAGS_OSZAPC_LOGIC32(CPUX86State *env, uint32_t v1, uint32_t v2, uint32_t diff) --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441822; cv=none; d=zohomail.com; s=zohoarc; b=G41MhAZ/nUHEi7t9a426tcWh4Oq9eknuTaXHZrFenVtxHgdZ8JDQGsTIuld2/xtsS075YPbdLJqgVkK29Eq2x5wMn52MM8tUGHCE/g40M+w1pnhnLgud61pNO66XMa1C63tQbdkSLskd2Z8IYPufSDZu5BSZxZkrC2O1qyg6WLY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441822; 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=PsTRHSmch2QZEVM5In5IyzsyvhVTdi0t3g3pkwsZxw8=; b=YkHaWdcxp2GBnMsazCECKlkc9jHs2xUbf1cFockplP1QhoGXQmSpyTDGMB/h03tmimzHq1EnqU4vuWeAp9vFsmyG7UoIewoh0IQPbETev0HOfNlD65oqYjDB6rSwOsjwFop5xNUV8vAE18kgQa3OyB8ACm22XWXqjxGMyYvQr1s= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441822866328.4321978142517; Mon, 2 Mar 2026 00:57:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyza-0007EC-Vz; Mon, 02 Mar 2026 03:51:07 -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 1vwyxr-0003hx-5P for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:22 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxp-0002JB-HA for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:18 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-209-ahLxv8tVOn-LqT8UCt-bbQ-1; Mon, 02 Mar 2026 03:49:15 -0500 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-439af95a718so1179174f8f.2 for ; Mon, 02 Mar 2026 00:49:15 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b55d15besm8998746f8f.30.2026.03.02.00.49.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:49:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441356; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PsTRHSmch2QZEVM5In5IyzsyvhVTdi0t3g3pkwsZxw8=; b=WtDGUbg5wBi5VRkbYjFUYOu0DnhM+3md2Pe0ZDkFG67SikZPLJZ5eEm6WZkgTfcw9JvMFr RVy9l+Ay3N7pHv8xzsmiYKimycv7HrBzoArpr3ArBtSOoRw1ST7cmcMnznOoNl21njSrS0 nF2RPJjsW/IttICf6to5/ezyfrbmj2w= X-MC-Unique: ahLxv8tVOn-LqT8UCt-bbQ-1 X-Mimecast-MFC-AGG-ID: ahLxv8tVOn-LqT8UCt-bbQ_1772441355 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441353; x=1773046153; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PsTRHSmch2QZEVM5In5IyzsyvhVTdi0t3g3pkwsZxw8=; b=uEzVysbaV06NLceNmvX81LK1dBjMrCZS1eEwM/kA+t630XYeUZI5/PlyKRsB6fw/97 JwqIXWyrbgwByMmkDpgKAFlRNrDXc8etvEZ1RTCy/gSDayEZ7oXLR/XJEHDtewi299rf Z4dF4cxVE3xnTS6ISP686zLL2TE1ItKToFvibeQ1aRvITeRBeOsPlaHXZZtMFGdfRClF bU+wcoY6ntkGvFP+RNXKWRs/czuhEipCkqzBTjXhWzpf+Ohoad0qL/BBMjNvieCmtnqw lmh2zpKZVy7jqPRQmI6g0wCX+S2dG5uolkV8bFSXBhu8P2fXcyU+klPqlHlebGDo9GAu Xp4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441353; x=1773046153; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=PsTRHSmch2QZEVM5In5IyzsyvhVTdi0t3g3pkwsZxw8=; b=KQOyyBrcyGO2gyaeLNUK2DFbYuRLVm1Le7vXOVq2+B/s/MXR5c25BtWMbN4R3gSe97 583kFU9VsyA7Tj/q85M6Wq/sMDsqnaZKoez9KXldmxyKIilLEEaEYkg4JabizD5xEyUT gpneb8LPLKx7OJxBM6nq8ykn+D850zuu/Ylj1vjaCtVhCaTEYVDblTpo979KKLR9RL7/ g3dAM1YiktO+7U5N49KWOHzwwRpenRH9A4FBpLswA0+36MsvCrA+lHZPaQR+biYSzO+2 37mAGcOI2tNKusACVDluZQdBjM9g1OrBfThHwogcyiiAYwt6d1TzBB4PEqr8hfHHTSO7 b0zQ== X-Gm-Message-State: AOJu0Yx4+PeIBddkG83srvTccfHKrlzAfebBD/Jfz+75OFXl8HF3KUsJ qyuPlygPSur8+ZHPDyP1JCieuF8WoZ6odQV8SqWDYQSOL+eUaPiEgd7BwqB2Z/fWZr1PCsfqgvs r+CZDWM28Hs1VViQYAbrDXbAcDdqw3LAtIEALHrrSz9xDFrpToH3nOSy5LqdqdxifDV4hR0bY+f ozp8a0wsvqaK39auEE7AhJwSA92nF9Z/YiZij9NwnQ X-Gm-Gg: ATEYQzy7fipEWtTLtA+MA0Acrz8+EJ+43IPFyHqyfGHWhUmNyVgXGrC4vQ+OOorLEse xpxfSrEujq2s1ssC2s2FBeAJ/tD5fEPDU8dhWJIdryIzUYFnirVe084zxPscvzdN3kaRseg04hb /V2pklRkckMt1Av5/oK2MVD7i3x5ThTVkQWzZ/2hTldAJXhCHhmSCPDu6OB+M25jIjTtufMTODa xmxECAhnbVieUALCj+KWkOOBOS8zBjogSW8SIU6oaYGjA/BLx+1hkq6Ypbrgev8Abl/OWcU0GGL DLnZ/JtpUzidZ0MxO1ghd4BccKwJFKxtcDVTklnAe/K21CDI51JDsL1ygHYYWmVhm8UsJCIv4Bj +uelrjX9N3oo1PVKljd/UFPxT7NHCzdUrWPkRYeyqWt+Mr3haGRdHtSHKonUEFMbygX9DSD/gg/ EOQxy/bajZM5qzOJ8RdkCfZQLBs3o= X-Received: by 2002:a05:6000:2891:b0:439:bcb8:54c3 with SMTP id ffacd0b85a97d-439bcb856femr929360f8f.19.1772441352810; Mon, 02 Mar 2026 00:49:12 -0800 (PST) X-Received: by 2002:a05:6000:2891:b0:439:bcb8:54c3 with SMTP id ffacd0b85a97d-439bcb856femr929312f8f.19.1772441352308; Mon, 02 Mar 2026 00:49:12 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 100/102] whpx: i386: enable PMU Date: Mon, 2 Mar 2026 09:47:46 +0100 Message-ID: <20260302084749.474955-34-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441825003158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Also a partition property instead of a CPU one... Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260228214704.19048-7-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 4186be62ada..7ccf92e4d11 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -2026,6 +2026,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms) WHV_PARTITION_PROPERTY prop; WHV_CAPABILITY_FEATURES features =3D {0}; WHV_PROCESSOR_FEATURES_BANKS processor_features; + WHV_PROCESSOR_PERFMON_FEATURES perfmon_features; =20 whpx =3D &whpx_global; =20 @@ -2170,6 +2171,27 @@ int whpx_accel_init(AccelState *as, MachineState *ms) goto error; } =20 + /* Enable supported performance monitoring capabilities */ + hr =3D whp_dispatch.WHvGetCapability( + WHvCapabilityCodeProcessorPerfmonFeatures, &perfmon_features, + sizeof(WHV_PROCESSOR_PERFMON_FEATURES), &whpx_cap_size); + if (FAILED(hr)) { + error_report("WHPX: Failed to get performance monitoring features,= hr=3D%08lx", hr); + ret =3D -ENOSPC; + goto error; + } + + hr =3D whp_dispatch.WHvSetPartitionProperty( + whpx->partition, + WHvPartitionPropertyCodeProcessorPerfmonFeatures, + &perfmon_features, + sizeof(WHV_PROCESSOR_PERFMON_FEATURES)); + if (FAILED(hr)) { + error_report("WHPX: Failed to set performance monitoring features,= hr=3D%08lx", hr); + ret =3D -EINVAL; + goto error; + } + /* Enable synthetic processor features */ WHV_SYNTHETIC_PROCESSOR_FEATURES_BANKS synthetic_features; memset(&synthetic_features, 0, sizeof(WHV_SYNTHETIC_PROCESSOR_FEATURES= _BANKS)); --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441933; cv=none; d=zohomail.com; s=zohoarc; b=RAwhYtAcO38SS1yq7xwk0dwhBQvsd25laPMEOHDBQ8kd7b2Ru82mSOJy/vVFVPaGlTUBKJy6kz5ef/MW019Z7zPZr1HEImGORZaBJ0C+Dsz2Ss3okSCeWiCH91Nj5p56Rz3My1nmhoZrINSmdyRQeQKSCyV7vQ8JsJT510ZgzP8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441933; 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=FQ0pJ2GkmExCaSdV0O5zvgfrDynBvwwWk9QdKJSzqkA=; b=bTM0uK3EzlgARD7rZZkY01ugTEEoMwAmCg3WPhu8lCw3WvmxxQRTxKwTXVzXlT4uMqOzp4fR0jdZDsyr/9TWK3cm4CYA6X+ZwHezSJmfAfaEqPLeaEo3dOKqcLxu5PaDL25dmAL8sVd/XSdjpFKKvO0uKZDJEW6Z0eoZCGuU00Q= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441933353309.5429963232317; Mon, 2 Mar 2026 00:58:53 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzH-0005Yd-Hq; Mon, 02 Mar 2026 03:50:47 -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 1vwyxt-0003ia-Dq for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:23 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxr-0002Jc-SK for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:21 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-8-UmNky7RkM3ySi29Od0Ux3A-1; Mon, 02 Mar 2026 03:49:18 -0500 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4806b12ad3fso34929555e9.0 for ; Mon, 02 Mar 2026 00:49:17 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483bd70e692sm413760335e9.7.2026.03.02.00.49.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:49:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441359; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FQ0pJ2GkmExCaSdV0O5zvgfrDynBvwwWk9QdKJSzqkA=; b=DQ0v/VJsU08+4zo/MDJ6PpjwWDSnWzDt3YdGVLuRjcUOEk6cc0IvWeg8W64OrIjDYkJqqz dPv3yMG85JdwWFvCiohCnqyvCQYjae4KaOCr8XJlYj/jigCYz0IveuQxHDJHQAnvJ3BcMf QQH7ul8/9aIaghVxMvIwT+u9hK5rv8o= X-MC-Unique: UmNky7RkM3ySi29Od0Ux3A-1 X-Mimecast-MFC-AGG-ID: UmNky7RkM3ySi29Od0Ux3A_1772441357 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441356; x=1773046156; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FQ0pJ2GkmExCaSdV0O5zvgfrDynBvwwWk9QdKJSzqkA=; b=qgmbqRjwy0kJ2HXRwEfflIPlVjGdTy0HhMevV/6hIr3nCU5k5r3Us6Olt6e7tRuC6a TRtNFWHM4yLqr7VjU5F39/jKXevnwwSnWbhDRhgV9eGI9+yyjvfSij8IagHVYPvAoysD s2bAsiNmPgcZofpqJk09xuwG6Cjkj2f59z3kbitcJKNf9+83seZRVTV+LYlY8/Rg9J1s srHlwfglN7S59CzI+hHxMMZh5QpQfwzkP1Vjf6Q4pQqLlGW3l7KmDg6KDOVo0V578gwf 8vrgScuEGE9uDGQ0whSBd7C0lNav+IeWhTo0qKcxHFZ5a1b8V/d0vfIxIxr79342NVi2 pBNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441356; x=1773046156; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=FQ0pJ2GkmExCaSdV0O5zvgfrDynBvwwWk9QdKJSzqkA=; b=j7Y4uRJJ6RG4BOYVIO+oO+waRjJraiNUzHb+AM/Yh3bvvwyG3hQMbpNt8bb347d1eB Md7YljnKLYiJzBCrnfWeQ4hvrwth6FZqEBw8EMO6HwyqxANGJwRO2eI/12mV5CPprYpr X2ulokk2qgnaqqZHJ8DPiSVuOJEDhRdaSTIWWTvItJsxY0CNBt/NVXZYzWkgzoHvgSjr qDJo0yMhjGOOmoYfVTdVCFQz9TQNwpaQfyyP2II02E4dK0c0noqOfduLOg5aglfk8y9y 2842aI9P9qo/CLziSdBageoljlnyeieLXqLRu6wR5aIb8gn/EaaST6u5hSX1JFGbzGEr 4n+A== X-Gm-Message-State: AOJu0YyihTas2zshpNFXbQlc37YoqUUCZz7qVsfpZnt8lWYENG1Lq8py +LYlfyQjAb2uZvMMZ9+S/LZsrPj+Y7tLiukHO9cRoP/82PymmvFNr2a6vaR87bNK66JOaEYw/VG y5H8+Olhk6EGvcckMQJSrg31lH5eSz90mgRpFXyxhv2u+73gLzVSfzlPWTon4yMGe+5CDzSkdUZ 4Cg0O8vU8c/W7Z5UqRBecrU3+JyaSYvfSLY117hSp7 X-Gm-Gg: ATEYQzxCjg7sJF2Jd3GTIpf01W9AQQ2MqVabPaVZeU5dxam9A61h3gt+nSYTYg5f7nZ bnXviHj+i4uFVGLcX9wv/NZ0NSYXgp0UnMaKqtOIzHFHKEhaGo5s0jrHI01W6tTLQT459Nt2rN7 oZBAlmg/rmtqNhVHQxAFWDU3TPjE5V26VhWz6PDfimyHfAVfCTKWIerWXKAgWj/ytNxA/XIEl7W 4PeFiGYfu2zG5IopFsmswU/wjxSgLYjw1ijUFiDHF4qUWSdr/YbiN4ldYhamA5Gw8C8+0KFjgrO 7YqJu7NWlNtmCOJmMp976dbolJmLIgC2cIifSHtTCuYD+nsbgpKnG/doXgTZQePFZ1JTbdc2Hmb 8+raVUUpM0gLZ0RO3AxhO/Sg1LwNftXTXPsl+0aVFXGBeEVH2VLDXaHVeMk1+dM4r6gXLJvqq57 Ar44J7+on63EJRSDrpao6eGWZ+LYc= X-Received: by 2002:a05:600c:6215:b0:47a:935f:618e with SMTP id 5b1f17b1804b1-483c9becbc1mr207229705e9.15.1772441356391; Mon, 02 Mar 2026 00:49:16 -0800 (PST) X-Received: by 2002:a05:600c:6215:b0:47a:935f:618e with SMTP id 5b1f17b1804b1-483c9becbc1mr207229395e9.15.1772441355934; Mon, 02 Mar 2026 00:49:15 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 101/102] whpx: i386: expose HV_X64_MSR_APIC_FREQUENCY when kernel-irqchip=off Date: Mon, 2 Mar 2026 09:47:47 +0100 Message-ID: <20260302084749.474955-35-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441933532158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Now that we expose AccessFrequencyRegs, expose HV_X64_MSR_APIC_FREQUENCY as= well for the case when the Hyper-V LAPIC is not used. If the Hyper-V LAPIC is used, this will be handled by the hypervisor instea= d of the VMM, hence gating it on !whpx_irqchip_in_kernel(). Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260228214704.19048-8-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 7ccf92e4d11..c172e86886b 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -45,6 +45,8 @@ #include =20 #define HYPERV_APIC_BUS_FREQUENCY (200000000ULL) +/* for kernel-irqchip=3Doff */ +#define HV_X64_MSR_APIC_FREQUENCY 0x40000023 =20 static const WHV_REGISTER_NAME whpx_register_names[] =3D { =20 @@ -1802,6 +1804,7 @@ int whpx_vcpu_run(CPUState *cpu) WHV_REGISTER_VALUE reg_values[3] =3D {0}; WHV_REGISTER_NAME reg_names[3]; UINT32 reg_count; + bool is_known_msr =3D 0;=20 =20 reg_names[0] =3D WHvX64RegisterRip; reg_names[1] =3D WHvX64RegisterRax; @@ -1811,6 +1814,12 @@ int whpx_vcpu_run(CPUState *cpu) vcpu->exit_ctx.VpContext.Rip + vcpu->exit_ctx.VpContext.InstructionLength; =20 + if (vcpu->exit_ctx.MsrAccess.MsrNumber =3D=3D HV_X64_MSR_APIC_= FREQUENCY + && !vcpu->exit_ctx.MsrAccess.AccessInfo.IsWrite + && !whpx_irqchip_in_kernel()) { + is_known_msr =3D 1; + reg_values[1].Reg32 =3D (uint32_t)X86_CPU(cpu)->env.apic_b= us_freq; + } /* * For all unsupported MSR access we: * ignore writes @@ -1819,8 +1828,10 @@ int whpx_vcpu_run(CPUState *cpu) reg_count =3D vcpu->exit_ctx.MsrAccess.AccessInfo.IsWrite ? 1 : 3; =20 - warn_report("WHPX: Unsupported MSR access (0x%x), IsWrite=3D%i= ",=20 + if (!is_known_msr) { + warn_report("WHPX: Unsupported MSR access (0x%x), IsWrite= =3D%i",=20 vcpu->exit_ctx.MsrAccess.MsrNumber, vcpu->exit_ctx.MsrAcce= ss.AccessInfo.IsWrite); + } =20 hr =3D whp_dispatch.WHvSetVirtualProcessorRegisters( whpx->partition, @@ -1988,6 +1999,10 @@ int whpx_init_vcpu(CPUState *cpu) } } =20 + /* When not using the Hyper-V APIC, the frequency is 1 GHz */ + if (!whpx_irqchip_in_kernel()) { + env->apic_bus_freq =3D 1000000000; + } =20 vcpu->interruptable =3D true; cpu->vcpu_dirty =3D true; @@ -2201,7 +2216,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms) synthetic_features.Bank0.Hv1 =3D 1; synthetic_features.Bank0.AccessPartitionReferenceCounter =3D 1; synthetic_features.Bank0.AccessPartitionReferenceTsc =3D 1; - /* if kernel-irqchip=3Doff, HV_X64_MSR_APIC_FREQUENCY =3D 0. */ synthetic_features.Bank0.AccessFrequencyRegs =3D 1; synthetic_features.Bank0.AccessVpIndex =3D 1; synthetic_features.Bank0.AccessHypercallRegs =3D 1; --=20 2.53.0 From nobody Sat Apr 11 23:08:43 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441917; cv=none; d=zohomail.com; s=zohoarc; b=NpJGY2QwV7lhmu7WZIA5H2eU86wHPAC7klGtXCdfqjRyObf0OHA8tn0Xw6h2SgkcnZ1hxyh0kEc8Sd7CwomY9qBaBTpTB/Uu1GcptOW6vCz1X045pm6SrBVUJhmO0mQVlk82NIWranikny5SqUDEl9+BqjP+LJcCqlQXZWhksuY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441917; 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=Zmf9RGYgcG9fpX+Du8LFdn3cLSYkIIzBakMQhwNPfJE=; b=FFikAcMfW8+E9L3Mhyq3U+X7uLYDMC/PTfsM/6EPHDBrCwbJvBjHv+LI6CNxehSPUUTn4AtaGxzgiWBi5P1Hsa4ejYKTz1DnT/sgEO5Ww6+OcxZyUqC8Vx3V8C1S8UwYyOhsNESkX8F7PPRKs9gMlByMRLkunH5AWiazrEVEosI= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441917400781.227539353234; Mon, 2 Mar 2026 00:58:37 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwyzZ-00075x-Vb; Mon, 02 Mar 2026 03:51:06 -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 1vwyxx-0003mv-FO for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:28 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwyxu-0002Jv-60 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:49:24 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-516-kezrGW8rMOiZFl4qBhH8HQ-1; Mon, 02 Mar 2026 03:49:20 -0500 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-4398eac51b3so3500927f8f.0 for ; Mon, 02 Mar 2026 00:49:20 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c75a523sm25615542f8f.19.2026.03.02.00.49.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:49:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441361; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Zmf9RGYgcG9fpX+Du8LFdn3cLSYkIIzBakMQhwNPfJE=; b=cjb3vx+hDJ7vV2rS0v6dZoTCLD4uBZ77/mNajLeXhoICAr/CMLLpVetH1QliVMuzKUZxAv 9VcM4tJlrJpNYpw455w7DXqbaFoDPepNOu1WaZNQnBVSO3ipovks7yWAAb66WK09EMsseQ DD6E9tHwWtTpr4wEF9zfxWnCT8x4fNc= X-MC-Unique: kezrGW8rMOiZFl4qBhH8HQ-1 X-Mimecast-MFC-AGG-ID: kezrGW8rMOiZFl4qBhH8HQ_1772441359 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441359; x=1773046159; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Zmf9RGYgcG9fpX+Du8LFdn3cLSYkIIzBakMQhwNPfJE=; b=QBZB8eBxXF+m8WV5kk4JtJHL6r0qVm+DRArMrKAV+AtOAKeDhzZx3I0uw2IPs0rEpH jCa4w/l0pvvOKsEkMlmQOMaOAfb2Klk77pXgImwdLQhqwbRqf3lzgT+CcK/Pl8HNGeuw uW0OtucaT0cicpi86hCXMHOkvGHRjrpznOh+g5p3lwIoW9IKUPvS1Mbvo3QVWJnf+Zv5 +3A6iwMBHXdwBN/bwm7ddgr4E9f4WIOcVrysPv8boT61pM2GDDI/2BCJdTyCRIV9nv/H y6e+a3/4EHLkeI/+SVpYkFnzraHyulm5PAcZxgskzo83qypEwSae7mghfl/t/VMo4g+c 3WvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441359; x=1773046159; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Zmf9RGYgcG9fpX+Du8LFdn3cLSYkIIzBakMQhwNPfJE=; b=Wm6V9gKDGetZ4tKLscfoGAxAViXeVPd5o8k8PBopkx+MGlLjit5VPTJJfDgBD9vouw 0XZoR/apiZF0uF97THKn4h3wbk8pgUhdxm/XNNLYfmunvr2QOJlmbWUrRc9TgblI/aAg sPIb+CllIkcNMfKABwnOMso+VK9DMb7ljNefp48JV+jxxlnHiNfiCKov1tkjTr2F2ai4 +wU+ANCmTE62teHZIW0k+o8sPYJ+abfzRtpcLRzLPt0R0j1B8gwBGaGXmWxbFsBNreF3 w6GlnjCHxSxENYRTuK66z4HzsHz3Eva74RUcnFFLfg9a+fh3+VfPMy4g8ty9tzhQrymd jw4Q== X-Gm-Message-State: AOJu0YxIzFJDPGFCpdfHW+YuCojUApRRZabhNj06MVxVBaEh25VKVLYs 8tHfdMVvBDdL6+K/LtyMlCxtdSA/nRguvBT6vVDB2Q9SmKvKr6W2LOctQpGl+A+03AMUy96hyyL DrFIMMt83fQ93ZzCVZlOTWkD/yUW/7R6RIvqHvW4Imy2MoEOCa/xy1PS1d8v3lUG2E5cn5rQAeM /HPFUZ8XXq7KM2UC0a8yfvP6eAEWpW5UcJq2NpMxx2 X-Gm-Gg: ATEYQzw3r5imNC28QXQ1SXj9t8bp/QKGxBE6F6tyfmuZMeOPysoE4uwDvcOxs47AdHX yRhhaGTy6eo0b/RJve4BrrHXP7P1KzriH16hLkWruXawNGCcENw9A/d/XBntjl0j35hLCJzSHj4 WnqwDyBKa5fZng2yTmXtKFJr2KbMUgmtj6QdSd8zb0ITpOVIfiRrnnT0Q0P38mB6JPGhIeVGBgV vfd6ZEGKmQqaSQxVI11eYnnTJ/ZoR9/qJ+3VVg8c2oi2+LLE5RIUWWdSAb1iwsdKVeMFSsFeCiY LofSvE7LouLZcHfBXkfOL23xbASQY7GQO1mmWk51MfMNL+54kA9sZgGpZpd2eOSeTdDKu521VMq ZqRi08MqmBz2CMQRQgT1tpvkzHQ30XJz2mjuCdurf/TL6R+YeNYHK3CwWrPvLysd0m/HKmXnc8t +ok1uPZVtsa5+wW9Pw/NLLho5rfQ4= X-Received: by 2002:a5d:5c0f:0:b0:439:b62d:be9e with SMTP id ffacd0b85a97d-439b62dc877mr4830948f8f.12.1772441358856; Mon, 02 Mar 2026 00:49:18 -0800 (PST) X-Received: by 2002:a5d:5c0f:0:b0:439:b62d:be9e with SMTP id ffacd0b85a97d-439b62dc877mr4830908f8f.12.1772441358344; Mon, 02 Mar 2026 00:49:18 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ani Sinha , Mohamed Mediouni Subject: [PULL 102/102] target/i386: emulate: fix scas Date: Mon, 2 Mar 2026 09:47:48 +0100 Message-ID: <20260302084749.474955-36-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @redhat.com) X-ZM-MESSAGEID: 1772441919419158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Signed-off-by: Mohamed Mediouni Link: https://lore.kernel.org/r/20260228214704.19048-9-mohamed@unpredictabl= e.fr Signed-off-by: Paolo Bonzini --- target/i386/emulate/x86_emu.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target/i386/emulate/x86_emu.c b/target/i386/emulate/x86_emu.c index 6c4ccc45383..55b1a68eb6c 100644 --- a/target/i386/emulate/x86_emu.c +++ b/target/i386/emulate/x86_emu.c @@ -745,6 +745,8 @@ static bool exec_scas(CPUX86State *env, struct x86_deco= de *decode) { decode->op[0].type =3D X86_VAR_REG; decode->op[0].reg =3D R_EAX; + decode->op[0].regptr =3D x86_reg(env, R_EAX); + if (decode->rep) { string_rep(env, decode, exec_scas_single, decode->rep); } else { --=20 2.53.0