From nobody Mon Sep 8 17:03:37 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1756137861; cv=none; d=zohomail.com; s=zohoarc; b=OsHXBI9Tuc0SMS+OazXvkHwyf3C6hYGZVWZJTYgk12hi4OQxdQD/iaNLpv1jVHf+Y0Sw408rBAJyzOVoVP1+TcwreO6IFmqcjQGXhrw6GqmJcREC7cja8EUtO0W+lDZowNMLrYCL4D2gHqdM1xbpFXmbov/fVUMGs3A1kChVJM0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756137861; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=KTxFc7R5pvUEM1JZorO4+ucSdEyZYeBt1bXnX1BhQ/o=; b=RvxgUNgFcQcYpdgapfHvrJR1nPqDreP5m+fo3D97iFQDIRR4hVIoGkbUqd4krXoJ5gUR4pOprv9hCNTYtSwMErKVEQUFoWB8cGxGM0a78RaomzdWyREI2XRse1QQMYyOcXL+vQ8+3n0J/4aCqVD1X7etkNA0ex6JNTHvZYi5Hbc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1756137861213562.7796030406421; Mon, 25 Aug 2025 09:04:21 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 2BEF043E2C; Mon, 25 Aug 2025 12:04:20 -0400 (EDT) Received: from [172.19.199.3] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id B191543F11; Mon, 25 Aug 2025 11:58:18 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B9D8D43E20; Mon, 25 Aug 2025 11:58:05 -0400 (EDT) Received: from mail-oa1-f45.google.com (mail-oa1-f45.google.com [209.85.160.45]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 39AB943E25 for ; Mon, 25 Aug 2025 11:58:01 -0400 (EDT) Received: by mail-oa1-f45.google.com with SMTP id 586e51a60fabf-30cceb749d7so1469711fac.2 for ; Mon, 25 Aug 2025 08:58:01 -0700 (PDT) Received: from home ([2603:8081:c640:1::1004]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-314f7d13449sm1861944fac.26.2025.08.25.08.57.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Aug 2025 08:57:59 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756137480; x=1756742280; darn=lists.libvirt.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=KTxFc7R5pvUEM1JZorO4+ucSdEyZYeBt1bXnX1BhQ/o=; b=RxQa2feLmyHFBnjFarAwXDEaDA9zoqoE+Az/IphHApySB9bEDbY+eyS8Bp2v9pGbzj IhqMerX2HXmzmCeS8tHp8cJO7jiotMw2LXvtr1FLDtyB17vyJczDJ3q5ISvEDrFeQwje Q/j1tsSYh0qrOazfdookAD6PTqtoBc6GH1SY1Z7ycFfEt1CFEhd8MFJYDV0eJXfchV6m 9XP9/G7EvNDbBUmZ+qs7WW9dt1r3Uv1FvVozi7nDrzI0lmYLjga7PDPDaBVGNiSkKzHS m5HLLAH/OQg2cMo339OGfv4vUqxFUeiw6KNRpFLR2qBEsjmDViJJA4RNaLmLamnaS4kU /GZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756137480; x=1756742280; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KTxFc7R5pvUEM1JZorO4+ucSdEyZYeBt1bXnX1BhQ/o=; b=PLL8v3XwsUQ5gaYuNkI71wXS+6PWtCEP4/Y2bJ7sUDtoG6CF7mVVT+DKcOEBbHugmb EqhPlpvNERqow6hwsv/TJOYth1Cj4t0qVXqkRThsgHa6KlVbWbyVqOs4MmSimAZLzmGN Vaz0+8bFD9KFDBXycNQx6YJ8hQSgu6ISOabetWWAbza/1eYsKQ+cERdG6FMhTprFSZs0 Rik/zVBCAMHvhQttigMuKWnz23CosXblJmPgZ5Zg0caMIo4yN6oXVJl0wZSzOKcnzBc/ IFW/Z3Ar+lN+sRmzmkfhwTEFIrRxdKUEcdbHLCVqd8jeB5EAH1hcnV0/f6PJBap7WGfI XrQw== X-Gm-Message-State: AOJu0YxL7i+CovOSHiggD8JZ39M+Zb7aJR2EguCMgqGyD/GgqHjGvHCF DFQC+4FIOjIJTxuA+B7O4ShAIGtTsHNqGj6SMIKLQGn0K1oJ4kXw9O+MJEYHAw== X-Gm-Gg: ASbGncuYa6lxpddYHZtNPI0RdaIRcoZaEKQy7rRTBKCVauuPQIENGmUSy1UtSQOapVB xYFoS1M/Mu/dubv0rv85PLl4THCXttEGZA/uekIEMh0V4G8Yf4BOwYQVV8j46F+wl3f/23WZNDf 78iAaPJbaUf/DQi6ibnj5pqoU+QOU8i2ey9Os8nKH3SByKwkwu3p5QuSwy7xNmcmJL1TruYA9ks ykI5f53SSc9XGfysmP+A2VRAmXOQTJ0uqJPa4q+Mmr9deXtnjMSPnmyiQIpbFuUMObG8IA297SV vsV/5BegAucmK+3H+7R3SNx3198MtI7ePKJ6cYydSAjFklpWDXte7kthVSJFNqXug1MbRnJacxn e8zb95iue8X8RMg== X-Google-Smtp-Source: AGHT+IEQJKPlHer8OX43lDE5nfrdev3XN1J4YBRqXPfcaq++/0wWo+XyT5GjjMQECYC4kowNjppeVQ== X-Received: by 2002:a05:6870:24a3:b0:2d5:1232:b081 with SMTP id 586e51a60fabf-314dcd2c949mr6252426fac.29.1756137480259; Mon, 25 Aug 2025 08:58:00 -0700 (PDT) From: Praveen K Paladugu X-Google-Original-From: Praveen K Paladugu To: devel@lists.libvirt.org Subject: [PATCH v2 1/6] qemu: introduce mshv capabilities Date: Mon, 25 Aug 2025 10:57:47 -0500 Message-ID: <20250825155752.5663-2-prapal@linux.microsoft.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250825155752.5663-1-prapal@linux.microsoft.com> References: <20250825155752.5663-1-prapal@linux.microsoft.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: CU4DPPRX6FNK54E4YYA23T76OF77MHS7 X-Message-ID-Hash: CU4DPPRX6FNK54E4YYA23T76OF77MHS7 X-MailFrom: praveenkpaladugu@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: liuwe@microsoft.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1756137863890116600 Content-Type: text/plain; charset="utf-8" Qemu with mshv capabilities can launch domains of type hyperv. Signed-off-by: Praveen K Paladugu --- src/qemu/qemu_capabilities.c | 40 +++++++++++++++++++++++++++++++++--- src/qemu/qemu_capabilities.h | 1 + 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index af238894b5..1e069eb0e5 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -742,6 +742,7 @@ VIR_ENUM_IMPL(virQEMUCaps, "amd-iommu.pci-id", /* QEMU_CAPS_AMD_IOMMU_PCI_ID */ "usb-bot", /* QEMU_CAPS_DEVICE_USB_BOT */ "tdx-guest", /* QEMU_CAPS_TDX_GUEST */ + "mshv", /* QEMU_CAPS_MSHV */ ); =20 =20 @@ -833,6 +834,7 @@ struct _virQEMUCaps { virQEMUCapsAccel kvm; virQEMUCapsAccel hvf; virQEMUCapsAccel tcg; + virQEMUCapsAccel mshv; }; =20 static virClass *virQEMUCapsClass; @@ -930,7 +932,8 @@ virQEMUCapsTypeIsAccelerated(virDomainVirtType type) bool virQEMUCapsHaveAccel(virQEMUCaps *qemuCaps) { - return virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) || + return virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) || + virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV) || virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF); } =20 @@ -942,6 +945,8 @@ virQEMUCapsAccelStr(virDomainVirtType type) return "kvm"; else if (type =3D=3D VIR_DOMAIN_VIRT_HVF) return "hvf"; + else if (type =3D=3D VIR_DOMAIN_VIRT_HYPERV) + return "mshv"; =20 return "tcg"; } @@ -955,6 +960,8 @@ virQEMUCapsGetAccel(virQEMUCaps *qemuCaps, return &qemuCaps->kvm; else if (type =3D=3D VIR_DOMAIN_VIRT_HVF) return &qemuCaps->hvf; + else if (type =3D=3D VIR_DOMAIN_VIRT_HYPERV) + return &qemuCaps->mshv; =20 return &qemuCaps->tcg; } @@ -1062,6 +1069,8 @@ virQEMUCapsGetMachineTypesCaps(virQEMUCaps *qemuCaps, accel =3D &qemuCaps->kvm; else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF)) accel =3D &qemuCaps->hvf; + else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + accel =3D &qemuCaps->mshv; else accel =3D &qemuCaps->tcg; =20 @@ -1170,6 +1179,10 @@ virQEMUCapsInitGuestFromBinary(virCaps *caps, virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_HVF, NULL, NULL, 0, NULL); } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) { + virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_HYPERV, + NULL, NULL, 0, NULL); + } =20 if (ARCH_IS_X86(guestarch) || guestarch =3D=3D VIR_ARCH_AARCH64 || ARCH_IS_LOONGARCH(guestarch)) @@ -2049,6 +2062,7 @@ virQEMUCaps *virQEMUCapsNewCopy(virQEMUCaps *qemuCaps) virQEMUCapsAccelCopy(&ret->kvm, &qemuCaps->kvm); virQEMUCapsAccelCopy(&ret->hvf, &qemuCaps->hvf); virQEMUCapsAccelCopy(&ret->tcg, &qemuCaps->tcg); + virQEMUCapsAccelCopy(&ret->mshv, &qemuCaps->mshv); =20 ret->gicCapabilities =3D g_new0(virGICCapability, qemuCaps->ngicCapabi= lities); ret->ngicCapabilities =3D qemuCaps->ngicCapabilities; @@ -2109,6 +2123,7 @@ void virQEMUCapsDispose(void *obj) virQEMUCapsAccelClear(&qemuCaps->kvm); virQEMUCapsAccelClear(&qemuCaps->hvf); virQEMUCapsAccelClear(&qemuCaps->tcg); + virQEMUCapsAccelClear(&qemuCaps->mshv); } =20 void @@ -2331,6 +2346,10 @@ virQEMUCapsIsVirtTypeSupported(virQEMUCaps *qemuCaps, virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) return true; =20 + if (virtType =3D=3D VIR_DOMAIN_VIRT_HYPERV && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + return true; + return false; } =20 @@ -2894,8 +2913,9 @@ bool virQEMUCapsHasMachines(virQEMUCaps *qemuCaps) { =20 - return !!qemuCaps->kvm.nmachineTypes || - !!qemuCaps->hvf.nmachineTypes || + return !!qemuCaps->kvm.nmachineTypes || + !!qemuCaps->hvf.nmachineTypes || + !!qemuCaps->mshv.nmachineTypes || !!qemuCaps->tcg.nmachineTypes; } =20 @@ -4873,6 +4893,10 @@ virQEMUCapsLoadCache(virArch hostArch, virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_HVF) < 0) { return -1; } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV) && + virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_HYPERV) < 0) { + return -1; + } if (virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_QEMU) < 0) return -1; =20 @@ -4892,6 +4916,8 @@ virQEMUCapsLoadCache(virArch hostArch, virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KV= M); if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF)) virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HV= F); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HY= PERV); virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU); =20 if (virXPathBoolean("boolean(./kvmSupportsNesting)", ctxt) > 0) @@ -5209,6 +5235,8 @@ virQEMUCapsFormatCache(virQEMUCaps *qemuCaps) virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_KVM); if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF)) virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_HVF); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_HYPERV); virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_QEMU); =20 for (i =3D 0; i < qemuCaps->ngicCapabilities; i++) { @@ -5719,6 +5747,9 @@ virQEMUCapsGetVirtType(virQEMUCaps *qemuCaps) if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_TCG)) return VIR_DOMAIN_VIRT_QEMU; =20 + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + return VIR_DOMAIN_VIRT_HYPERV; + return VIR_DOMAIN_VIRT_NONE; } =20 @@ -5951,6 +5982,8 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch, virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KV= M); if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF)) virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HV= F); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MSHV)) + virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HY= PERV); virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU); =20 if (virQEMUCapsHaveAccel(qemuCaps)) { @@ -7160,4 +7193,5 @@ virQEMUCapsStripMachineAliases(virQEMUCaps *qemuCaps) virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_KV= M); virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_HV= F); virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_QE= MU); + virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_HY= PERV); } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 55b05bea84..3aee25ab0e 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -723,6 +723,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ QEMU_CAPS_AMD_IOMMU_PCI_ID, /* amd-iommu.pci-id */ QEMU_CAPS_DEVICE_USB_BOT, /* -device usb-bot */ QEMU_CAPS_TDX_GUEST, /* -object tdx-guest,... */ + QEMU_CAPS_MSHV, /* Whether MSHV is usable / was used during probing */ =20 QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; --=20 2.50.1