From nobody Sun Oct 25 16:50:11 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; 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 38.145.34.151 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=1792320845; cv=none; d=zohomail.com; s=zohoarc; b=mAdWbxnYiNalF7RvFay2ymO1L4Bq/Vw4NGf/BI7mmlwo4ze9nkeKRTOrBC2EsSXjuNr7blwOyIqiBTKdF0gD1Ovqf3QyrDId3eKa7NBNuyysid8Yh+q+b1sLbBvc1goFHpIPfUSQV2rH575PAS+pTVIiWGN0HSq337yPOrkNKMA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1792320845; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=0kZYdxICZ8EwuOfmxZ0y5NB2Jg0ZITALZxdtkUHfvgk=; b=lusImQjx8MBIKZeaxSs6O93kygKWi347AZweehBfSwb3MRxgmL5UjHmXhi7a4y7pK+9R1K7oMIGtr9wTHtBUHD2u/3ui+B2JAoJ8vF0bBcx8pQc5hT0hLn75hmqLiST3XZIgaffpm+t6J7fcCSW3hlgrZ2Qycf/puoJO3DB+NDM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 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 [38.145.34.151]) by mx.zohomail.com with SMTPS id 1792320845893969.474898890744; Sun, 18 Oct 2026 03:54:05 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 6BE364196F; Sun, 18 Oct 2026 06:54:03 -0400 (EDT) Received: from [172.19.199.16] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 40CD041979; Sun, 18 Oct 2026 06:48:41 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 1B7D041966; Sun, 18 Oct 2026 06:48:22 -0400 (EDT) Received: from mail-ed1-x534.google.com (mail-ed1-x534.google.com [IPv6:2a00:1450:4864:20::534]) (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 574893F367 for ; Sun, 18 Oct 2026 06:48:18 -0400 (EDT) Received: by mail-ed1-x534.google.com with SMTP id 4fb4d7f45d1cf-6acba4bf65eso1289105a12.1 for ; Sun, 18 Oct 2026 03:48:18 -0700 (PDT) Received: from tulp.my.domain (2001-1c02-1a15-3000-2727-f7d1-9628-aa81.cable.dynamic.v6.ziggo.nl. [2001:1c02:1a15:3000:2727:f7d1:9628:aa81]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6b3c74eb8a7sm597969a12.2.2026.10.18.03.48.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 18 Oct 2026 03:48:15 -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=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792320497; x=1792925297; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=0kZYdxICZ8EwuOfmxZ0y5NB2Jg0ZITALZxdtkUHfvgk=; b=kqEdoqW9Kj+51izRrSp3/9V6Fw3yQWb3VFkr8gda801re6Iko3fOFDUUj5VI5gq3zm RLQBBgYG5SjIo+/1KQv2oStzwn7hM0bo9SLgEFRhu3ZYKaptEjgSGSg5ddLlCJy/D2l+ 0IW1jYantIk3m2LYVCwzX0AcMBh7jIAAs/2f6bwfa8y9yhuENJ6dU0ktOUkb9FAPVr1o BpDuUpuJpx3dU1bXPURKzqDKSjWp1EwMhNncElT25419UWUeZzCY0mKBCdlCCKbUB8dK 8fur3XFZH0UAbDzSjZQUog1xWnDWqlQGkceZYLIJp/zfDjav1mLRIzyCetzzgYO12VtE BxUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792320497; x=1792925297; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=0kZYdxICZ8EwuOfmxZ0y5NB2Jg0ZITALZxdtkUHfvgk=; b=dsATBJK8IV57JIitsrxCLSzmF/QYZ24m7zRTYdTwb6uKJPPT3vRbbtK5zlhO8oryzj Qm+GMaeRUKbpz63bUrS7L0EH5PvkrO2ImxGLMh2Hp8hmTtHMKP0ArZ7U9Duamvsx4PBU MYfWDl1hHKFPMlopdzKcczSzKYeSbk364CpNwB7Qbh5+n5JF6E95PshLAzUjQmBr9FG9 GqKh2jaANfwZ2asKIm2T40QH5WIF3PynFEsTRx9Ya91kwylVyIjyu+rDv7u1wryWNs0k FSpoLTY2RScFs5mlWGGPM16Tx9ZZMxjOlxLHKY3I46g3Sx9j5ZR5vBMPD2Ekncv+Ta4w p/mA== X-Gm-Message-State: AFq9FYKMMnf7JJQljxyjjyFyvmgn6bHUPCMdOJoWJO1UmfT2/BOhS5Nr pr2doy3O8eJLZgeebY+UKexZZYm5Q4PVgaOgBSsd7SeJc2gT7tOwcX3ZRmXj72qf9PI= X-Gm-Gg: AYBFou0XDrAQY9QlpZJC9iiRfIj5cquunnGNs/GqKr8RX8xl0L0dxa4I+hpIZD1yB56 54ihpllD8Fq3uAVJU6MuHViYP51rSWhKaZKq/FhRWsmc/av/HQDOhn+WE1lhdKCp1WRtfpxD0VN YxNHOSWosl8ZiZO8U5vb2QYI1bqwUmj1vWsl3xnuAGD/CcF0PDXWzTOUBC5x+xWF3+sdYfL7BAF e1nJi2cp+Wp7Mjf/swbR3g8sejb6o3fpkzlftu7gwuZ0vf8HSjTWJpfkJ4WEAXQdx5YmM0O0qwE zguAkgu+1REmYKWWTDoAm0ETZtj2cykuFL5iamOkVM4f/f8BXjCdtjnJ9IwKqgdCE4e01ToDyow EvWmEBt7B5ai4pW0srXyVRbks0cJL8fkyzTlhMjtZhPX2w4w9gczsL6PolGR3tQs49i2Bnz0q8K 1P7SlUvjcfrrZ/a9RIDaPRbZF6dNVelZuJuSuG0mANxerwpbSeBnSAqOowO6uK/A/b1IWKRHn0N v1ykSRCSwalEHPgyJ+QwPcVWiUsj7vgvhz/RZcnFz6PJTC9NkZmxkNw0I8jSd702u+jTk93edNS Hwf/IjLmkg== X-Received: by 2002:a05:6402:848:b0:6b1:c223:7568 with SMTP id 4fb4d7f45d1cf-6b3a818814emr2803708a12.28.1792320496212; Sun, 18 Oct 2026 03:48:16 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH] bhyve: capabilities: use virBitmap to store capabilities Date: Sun, 18 Oct 2026 12:47:28 +0200 Message-ID: <20261018104728.54538-1-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.55.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: Q5KWTV54Z3TEAF3JALP2ENM5ZRFXMDQC X-Message-ID-Hash: Q5KWTV54Z3TEAF3JALP2ENM5ZRFXMDQC X-MailFrom: bogorodskiy@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: Roman Bogorodskiy 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: 1792320847731158500 Content-Type: text/plain; charset="utf-8" Similarly to the qemu driver, store bhyve capabilities in virBitmap. Add helpers to work with capabilities: virBhyveCapsGet(), virBhyveCapsSet(), and virBhyveCapsClear(). No functional changes. Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_capabilities.c | 107 ++++++++++++++++++++------------ src/bhyve/bhyve_capabilities.h | 50 +++++++++------ src/bhyve/bhyve_command.c | 30 ++++----- src/bhyve/bhyve_domain.c | 4 +- src/bhyve/bhyve_driver.c | 17 ++--- src/bhyve/bhyve_driver.h | 2 +- src/bhyve/bhyve_parse_command.c | 16 ++--- src/bhyve/bhyve_parse_command.h | 2 +- src/bhyve/bhyve_process.c | 2 +- src/bhyve/bhyve_utils.h | 3 +- tests/bhyveargv2xmltest.c | 4 +- tests/bhyvexml2argvtest.c | 54 +++++++++------- tests/bhyvexml2xmltest.c | 9 ++- tests/domaincapstest.c | 20 +++--- 14 files changed, 187 insertions(+), 133 deletions(-) diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index 5d07d16f69..42da2a7c47 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -42,6 +42,30 @@ VIR_LOG_INIT("bhyve.bhyve_capabilities"); =20 =20 +void +virBhyveCapsSet(virBitmap *caps, + virBhyveCapsFlags flag) +{ + ignore_value(virBitmapSetBit(caps, flag)); +} + + +void +virBhyveCapsClear(virBitmap *caps, + virBhyveCapsFlags flag) +{ + ignore_value(virBitmapClearBit(caps, flag)); +} + + +bool +virBhyveCapsGet(virBitmap *caps, + virBhyveCapsFlags flag) +{ + return caps && virBitmapIsBitSet(caps, flag); +} + + virCaps * virBhyveCapsBuild(void) { @@ -69,7 +93,7 @@ virBhyveCapsBuild(void) =20 int virBhyveDomainCapsFill(virDomainCaps *caps, - unsigned int bhyvecaps, + virBitmap *bhyvecaps, virDomainCapsStringValues *firmwares) { caps->disk.supported =3D VIR_TRISTATE_BOOL_YES; @@ -87,7 +111,7 @@ virBhyveDomainCapsFill(virDomainCaps *caps, caps->os.supported =3D VIR_TRISTATE_BOOL_YES; =20 caps->os.loader.supported =3D VIR_TRISTATE_BOOL_NO; - if (bhyvecaps & BHYVE_CAP_LPC_BOOTROM) { + if (virBhyveCapsGet(bhyvecaps, BHYVE_CAP_LPC_BOOTROM)) { caps->os.loader.type.report =3D true; caps->os.loader.readonly.report =3D true; caps->os.loader.supported =3D VIR_TRISTATE_BOOL_YES; @@ -103,7 +127,7 @@ virBhyveDomainCapsFill(virDomainCaps *caps, =20 caps->graphics.supported =3D VIR_TRISTATE_BOOL_NO; caps->video.supported =3D VIR_TRISTATE_BOOL_NO; - if (bhyvecaps & BHYVE_CAP_FBUF) { + if (virBhyveCapsGet(bhyvecaps, BHYVE_CAP_FBUF)) { caps->graphics.supported =3D VIR_TRISTATE_BOOL_YES; caps->graphics.type.report =3D true; caps->video.supported =3D VIR_TRISTATE_BOOL_YES; @@ -112,7 +136,7 @@ virBhyveDomainCapsFill(virDomainCaps *caps, VIR_DOMAIN_CAPS_ENUM_SET(caps->video.modelType, VIR_DOMAIN_VIDEO_T= YPE_GOP); } =20 - if (bhyvecaps & BHYVE_CAP_VIRTIO_RND) { + if (virBhyveCapsGet(bhyvecaps, BHYVE_CAP_VIRTIO_RND)) { caps->rng.supported =3D VIR_TRISTATE_BOOL_YES; caps->rng.model.report =3D true; caps->rng.backendModel.report =3D true; @@ -121,7 +145,7 @@ virBhyveDomainCapsFill(virDomainCaps *caps, VIR_DOMAIN_CAPS_ENUM_SET(caps->rng.backendModel, VIR_DOMAIN_RNG_BACKEND_RANDOM); } - if (bhyvecaps & BHYVE_CAP_LPC_TPM) { + if (virBhyveCapsGet(bhyvecaps, BHYVE_CAP_LPC_TPM)) { caps->tpm.supported =3D VIR_TRISTATE_BOOL_YES; caps->tpm.model.report =3D true; caps->tpm.backendModel.report =3D true; @@ -156,7 +180,7 @@ virBhyveDomainCapsBuild(struct _bhyveConn *conn, virDomainVirtType virttype) { virDomainCaps *caps =3D NULL; - unsigned int bhyve_caps =3D 0; + g_autoptr(virBitmap) bhyve_caps =3D NULL; g_autoptr(DIR) dir =3D NULL; struct dirent *entry; size_t firmwares_alloc =3D 0; @@ -222,12 +246,12 @@ virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps) } =20 static int -bhyveProbeCapsDeviceHelper(unsigned int *caps, +bhyveProbeCapsDeviceHelper(virBitmap *caps, char *binary, const char *bus, const char *device, const char *errormsg, - unsigned int flag) + virBhyveCapsFlags flag) { g_autofree char *error =3D NULL; g_autoptr(virCommand) cmd =3D NULL; @@ -240,13 +264,13 @@ bhyveProbeCapsDeviceHelper(unsigned int *caps, return -1; =20 if (strstr(error, errormsg) =3D=3D NULL) - *caps |=3D flag; + virBhyveCapsSet(caps, flag); =20 return 0; } =20 static int -bhyveProbeCapsFromHelp(unsigned int *caps, char *binary) +bhyveProbeCapsFromHelp(virBitmap *caps, char *binary) { g_autofree char *help =3D NULL; g_autoptr(virCommand) cmd =3D NULL; @@ -259,52 +283,52 @@ bhyveProbeCapsFromHelp(unsigned int *caps, char *bina= ry) return -1; =20 if (strstr(help, "-u:") !=3D NULL) - *caps |=3D BHYVE_CAP_RTC_UTC; + virBhyveCapsSet(caps, BHYVE_CAP_RTC_UTC); =20 /* "-c vcpus" was there before CPU topology support was introduced, * then it became * "-c [[cpus=3D]numcpus][,sockets=3Dn][,cores=3Dn][,threads=3Dn] */ if (strstr(help, "-c vcpus") =3D=3D NULL) - *caps |=3D BHYVE_CAP_CPUTOPOLOGY; + virBhyveCapsSet(caps, BHYVE_CAP_CPUTOPOLOGY); =20 if (strstr(help, "-A:") !=3D NULL) - *caps |=3D BHYVE_CAP_ACPI; + virBhyveCapsSet(caps, BHYVE_CAP_ACPI); =20 if (strstr(help, "-n:") !=3D NULL) - *caps |=3D BHYVE_CAP_NUMA; + virBhyveCapsSet(caps, BHYVE_CAP_NUMA); =20 if (strstr(help, "-M:") !=3D NULL) - *caps |=3D BHYVE_CAP_MONITOR; + virBhyveCapsSet(caps, BHYVE_CAP_MONITOR); =20 return 0; } =20 static int -bhyveFillCapForDevice(unsigned int *caps, const char *device) +bhyveFillCapForDevice(virBitmap *caps, const char *device) { if (STREQ(device, "ahci")) - *caps |=3D BHYVE_CAP_AHCI32SLOT; + virBhyveCapsSet(caps, BHYVE_CAP_AHCI32SLOT); else if (STREQ(device, "e1000")) - *caps |=3D BHYVE_CAP_NET_E1000; + virBhyveCapsSet(caps, BHYVE_CAP_NET_E1000); else if (STREQ(device, "fbuf")) - *caps |=3D BHYVE_CAP_FBUF; + virBhyveCapsSet(caps, BHYVE_CAP_FBUF); else if (STREQ(device, "hda")) - *caps |=3D BHYVE_CAP_SOUND_HDA; + virBhyveCapsSet(caps, BHYVE_CAP_SOUND_HDA); else if (STREQ(device, "nvme")) - *caps |=3D BHYVE_CAP_NVME; + virBhyveCapsSet(caps, BHYVE_CAP_NVME); else if (STREQ(device, "virtio-9p")) - *caps |=3D BHYVE_CAP_VIRTIO_9P; + virBhyveCapsSet(caps, BHYVE_CAP_VIRTIO_9P); else if (STREQ(device, "virtio-rnd")) - *caps |=3D BHYVE_CAP_VIRTIO_RND; + virBhyveCapsSet(caps, BHYVE_CAP_VIRTIO_RND); else if (STREQ(device, "xhci")) - *caps |=3D BHYVE_CAP_XHCI; + virBhyveCapsSet(caps, BHYVE_CAP_XHCI); =20 return 0; } =20 =20 static int -bhyveProbeCapsFromSHelp(unsigned int *caps, char *binary) +bhyveProbeCapsFromSHelp(virBitmap *caps, char *binary) { g_autofree char *help =3D NULL; g_autoptr(virCommand) cmd =3D NULL; @@ -328,7 +352,7 @@ bhyveProbeCapsFromSHelp(unsigned int *caps, char *binar= y) } =20 static int -bhyveProbeCapsLpcBootrom(unsigned int *caps, char *binary) +bhyveProbeCapsLpcBootrom(virBitmap *caps, char *binary) { return bhyveProbeCapsDeviceHelper(caps, binary, "-l", @@ -339,7 +363,7 @@ bhyveProbeCapsLpcBootrom(unsigned int *caps, char *bina= ry) =20 =20 static int -bhyveProbeCapsVNCPassword(unsigned int *caps, char *binary) +bhyveProbeCapsVNCPassword(virBitmap *caps, char *binary) { return bhyveProbeCapsDeviceHelper(caps, binary, "-s", @@ -350,7 +374,7 @@ bhyveProbeCapsVNCPassword(unsigned int *caps, char *bin= ary) =20 =20 static int -bhyveProbeCapsLpcTpm(unsigned int *caps, char *binary) +bhyveProbeCapsLpcTpm(virBitmap *caps, char *binary) { return bhyveProbeCapsDeviceHelper(caps, binary, "-l", @@ -361,7 +385,7 @@ bhyveProbeCapsLpcTpm(unsigned int *caps, char *binary) =20 =20 static void -bhyveProbeCapsRctl(unsigned int *caps) +bhyveProbeCapsRctl(virBitmap *caps) { bool racct_enable; size_t racct_enable_len; @@ -376,13 +400,13 @@ bhyveProbeCapsRctl(unsigned int *caps) return; =20 if (racct_enable) - *caps |=3D BHYVE_CAP_RCTL; + virBhyveCapsSet(caps, BHYVE_CAP_RCTL); =20 return; } =20 static int -bhyveProbeCapsBhyvectl(unsigned int *caps) +bhyveProbeCapsBhyvectl(virBitmap *caps) { g_autofree char *binary =3D virFindFileInPath("bhyvectl"); g_autofree char *help =3D NULL; @@ -399,14 +423,15 @@ bhyveProbeCapsBhyvectl(unsigned int *caps) return -1; =20 if (strstr(help, "--get-vm-pid") !=3D NULL) - *caps |=3D BHYVE_CAP_GET_VMPID; + virBhyveCapsSet(caps, BHYVE_CAP_GET_VMPID); =20 return 0; } =20 int -virBhyveProbeCaps(unsigned int *caps) +virBhyveProbeCaps(virBitmap **caps) { + g_autoptr(virBitmap) bitmap =3D virBitmapNew(BHYVE_CAP_LAST); char *binary; int ret =3D 0; =20 @@ -414,27 +439,29 @@ virBhyveProbeCaps(unsigned int *caps) if (binary =3D=3D NULL) goto out; =20 - if ((ret =3D bhyveProbeCapsFromHelp(caps, binary))) + if ((ret =3D bhyveProbeCapsFromHelp(bitmap, binary))) goto out; =20 - if ((ret =3D bhyveProbeCapsFromSHelp(caps, binary))) + if ((ret =3D bhyveProbeCapsFromSHelp(bitmap, binary))) goto out; =20 - if ((ret =3D bhyveProbeCapsLpcBootrom(caps, binary))) + if ((ret =3D bhyveProbeCapsLpcBootrom(bitmap, binary))) goto out; =20 - if ((ret =3D bhyveProbeCapsVNCPassword(caps, binary))) + if ((ret =3D bhyveProbeCapsVNCPassword(bitmap, binary))) goto out; =20 - if ((ret =3D bhyveProbeCapsBhyvectl(caps))) + if ((ret =3D bhyveProbeCapsBhyvectl(bitmap))) goto out; =20 - bhyveProbeCapsRctl(caps); + bhyveProbeCapsRctl(bitmap); =20 - if ((ret =3D bhyveProbeCapsLpcTpm(caps, binary))) + if ((ret =3D bhyveProbeCapsLpcTpm(bitmap, binary))) goto out; =20 out: + if (ret =3D=3D 0) + *caps =3D g_steal_pointer(&bitmap); VIR_FREE(binary); return ret; } diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h index 35ca214538..90e604c41b 100644 --- a/src/bhyve/bhyve_capabilities.h +++ b/src/bhyve/bhyve_capabilities.h @@ -24,12 +24,13 @@ =20 #include "capabilities.h" #include "conf/domain_capabilities.h" +#include "virbitmap.h" =20 #include "bhyve_utils.h" =20 virCaps *virBhyveCapsBuild(void); int virBhyveDomainCapsFill(virDomainCaps *caps, - unsigned int bhyvecaps, + virBitmap *bhyvecaps, virDomainCapsStringValues *firmwares); virDomainCaps *virBhyveDomainCapsBuild(bhyveConn *conn, const char *emulatorbin, @@ -43,25 +44,34 @@ typedef enum { } virBhyveGrubCapsFlags; =20 typedef enum { - BHYVE_CAP_RTC_UTC =3D 1 << 0, - BHYVE_CAP_AHCI32SLOT =3D 1 << 1, - BHYVE_CAP_NET_E1000 =3D 1 << 2, - BHYVE_CAP_LPC_BOOTROM =3D 1 << 3, - BHYVE_CAP_FBUF =3D 1 << 4, - BHYVE_CAP_XHCI =3D 1 << 5, - BHYVE_CAP_CPUTOPOLOGY =3D 1 << 6, - BHYVE_CAP_SOUND_HDA =3D 1 << 7, - BHYVE_CAP_VNC_PASSWORD =3D 1 << 8, - BHYVE_CAP_VIRTIO_9P =3D 1 << 9, - BHYVE_CAP_VIRTIO_RND =3D 1 << 10, - BHYVE_CAP_NVME =3D 1 << 11, - BHYVE_CAP_ACPI =3D 1 << 12, - BHYVE_CAP_NUMA =3D 1 << 13, - BHYVE_CAP_RCTL =3D 1 << 14, - BHYVE_CAP_MONITOR =3D 1 << 15, - BHYVE_CAP_GET_VMPID =3D 1 << 16, - BHYVE_CAP_LPC_TPM =3D 1 << 17, + BHYVE_CAP_RTC_UTC, + BHYVE_CAP_AHCI32SLOT, + BHYVE_CAP_NET_E1000, + BHYVE_CAP_LPC_BOOTROM, + BHYVE_CAP_FBUF, + BHYVE_CAP_XHCI, + BHYVE_CAP_CPUTOPOLOGY, + BHYVE_CAP_SOUND_HDA, + BHYVE_CAP_VNC_PASSWORD, + BHYVE_CAP_VIRTIO_9P, + BHYVE_CAP_VIRTIO_RND, + BHYVE_CAP_NVME, + BHYVE_CAP_ACPI, + BHYVE_CAP_NUMA, + BHYVE_CAP_RCTL, + BHYVE_CAP_MONITOR, + BHYVE_CAP_GET_VMPID, + BHYVE_CAP_LPC_TPM, + + BHYVE_CAP_LAST, } virBhyveCapsFlags; =20 +void virBhyveCapsSet(virBitmap *caps, + virBhyveCapsFlags flag) ATTRIBUTE_NONNULL(1); +void virBhyveCapsClear(virBitmap *caps, + virBhyveCapsFlags flag) ATTRIBUTE_NONNULL(1); +bool virBhyveCapsGet(virBitmap *caps, + virBhyveCapsFlags flag); + int virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps); -int virBhyveProbeCaps(unsigned int *caps); +int virBhyveProbeCaps(virBitmap **caps); diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index dac3146785..09ef61e798 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -60,7 +60,7 @@ bhyveBuildNetArgStr(const virDomainDef *def, if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO) { nic_model =3D "virtio-net"; } else if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_E1000) { - if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_NET_E1000) !=3D 0= ) { + if (virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_NET= _E1000)) { nic_model =3D "e1000"; } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -272,7 +272,7 @@ bhyveBuildTPMArgStr(const virDomainDef *def G_GNUC_UNUS= ED, struct _bhyveConn *driver, virCommand *cmd) { - if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_LPC_TPM)) { + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_LPC_TP= M)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Installed bhyve binary does not support TPM devi= ces")); return -1; @@ -333,13 +333,13 @@ bhyveBuildAHCIControllerArgStr(const virDomainDef *de= f, =20 switch (disk->device) { case VIR_DOMAIN_DISK_DEVICE_DISK: - if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_AHCI32SLOT)) + if (virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP= _AHCI32SLOT)) virBufferAsprintf(&device, ",hd:%s", disk_source); else virBufferAsprintf(&device, "-hd,%s", disk_source); break; case VIR_DOMAIN_DISK_DEVICE_CDROM: - if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_AHCI32SLOT)) + if (virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP= _AHCI32SLOT)) virBufferAsprintf(&device, ",cd:%s", disk_source); else virBufferAsprintf(&device, "-cd,%s", disk_source); @@ -488,7 +488,7 @@ bhyveBuildNVMeControllerArgStr(const virDomainDef *def, if (disk->bus !=3D VIR_DOMAIN_DISK_BUS_NVME) continue; =20 - if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_NVME)) { + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_NV= ME)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Bhyve version does not support NVMe")); return -1; @@ -716,7 +716,7 @@ bhyveBuildGraphicsArgStr(const virDomainDef *def, bool escapeAddr; unsigned short port; =20 - if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_LPC_BOOTROM) || + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_LPC_BO= OTROM) || def->os.bootloader || !def->os.loader) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -724,7 +724,7 @@ bhyveBuildGraphicsArgStr(const virDomainDef *def, return -1; } =20 - if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_FBUF)) { + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_FBUF))= { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Bhyve version does not support framebuffer")); return -1; @@ -791,7 +791,7 @@ bhyveBuildGraphicsArgStr(const virDomainDef *def, } =20 if (graphics->data.vnc.auth.passwd) { - if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_VNC_PASSWORD)) { + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_VN= C_PASSWORD)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("VNC Password authentication not supported by= bhyve")); return -1; @@ -805,7 +805,7 @@ bhyveBuildGraphicsArgStr(const virDomainDef *def, =20 virBufferAsprintf(&opt, ",password=3D%s", graphics->data.vnc.auth.= passwd); } else { - if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_VNC_PASSWORD)) + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_VN= C_PASSWORD)) VIR_WARN("%s", _("Security warning: VNC auth is not supported.= ")); else VIR_WARN("%s", _("Security warning: VNC is used without authen= tication.")); @@ -836,7 +836,7 @@ bhyveBuildSoundArgStr(const virDomainDef *def G_GNUC_UN= USED, { g_auto(virBuffer) params =3D VIR_BUFFER_INITIALIZER; =20 - if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_SOUND_HDA)) { + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_SOUND_= HDA)) { /* Currently, bhyve only supports "hda" sound devices, so if it's not supported, sound devices are not supported at all */ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -1157,7 +1157,7 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *drive= r, virDomainDef *def, return NULL; } =20 - if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_CPUTOPOLOGY) !=3D= 0) { + if (virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_CPU= TOPOLOGY)) { virCommandAddArgFormat(cmd, "cpus=3D%d,sockets=3D%d,cores=3D%d= ,threads=3D%d", nvcpus, def->cpu->sockets, @@ -1189,7 +1189,7 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *drive= r, virDomainDef *def, =20 /* NUMA */ if (ncells) { - if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_NUMA)) { + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_NU= MA)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Installed bhyve binary does not support NUMA= configuration")); return NULL; @@ -1222,7 +1222,7 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *drive= r, virDomainDef *def, =20 /* Options */ if ((def->features[VIR_DOMAIN_FEATURE_ACPI] =3D=3D VIR_TRISTATE_SWITCH= _ON) && - (bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_ACPI)) + virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_ACPI)) /* As of FreeBSD commit * https://cgit.freebsd.org/src/commit/?id=3D6a0e7f908802b86ca5d1c= 0b3c404b8391d0f626e * bhyve(8) generates ACPI tables unconditionally, so nothing need= s to be done @@ -1238,7 +1238,7 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *drive= r, virDomainDef *def, /* used by default in bhyve */ break; case VIR_DOMAIN_CLOCK_OFFSET_UTC: - if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_RTC_UTC) !=3D 0) { + if (virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_RTC= _UTC)) { virCommandAddArg(cmd, "-u"); } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -1279,7 +1279,7 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *drive= r, virDomainDef *def, g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; =20 if (ARCH_IS_X86(arch)) { - if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_LPC_BOOTROM))= { + if (virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP= _LPC_BOOTROM)) { virBufferAsprintf(&buf, "bootrom,%s", def->os.loader->path= ); if (def->os.loader->nvram && def->os.loader->nvram->path) virBufferAsprintf(&buf, ",%s", def->os.loader->nvram->= path); diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index 142d01e016..0ee2e06664 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -157,7 +157,7 @@ bhyveDomainDefPostParse(virDomainDef *def, /* When not specified in the domain XML, clock.offset defaults to UTC = which is * not supported by bhyve on ARM64. So force it to LOCALTIME. */ if ((def->clock.offset =3D=3D VIR_DOMAIN_CLOCK_OFFSET_UTC) && - !(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_RTC_UTC)) + !virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_RTC_UT= C)) def->clock.offset =3D VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME; =20 /* bhyve/arm64 does not provide the bhyveload(8) tool, @@ -237,7 +237,7 @@ bhyveDomainDiskDefAssignAddress(struct _bhyveConn *driv= er, case VIR_DOMAIN_DISK_BUS_SATA: def->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE; =20 - if ((driver->bhyvecaps & BHYVE_CAP_AHCI32SLOT) !=3D 0) { + if (virBhyveCapsGet(driver->bhyvecaps, BHYVE_CAP_AHCI32SLOT)) { def->info.addr.drive.controller =3D idx / 32; def->info.addr.drive.unit =3D idx % 32; } else { diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 4c4ba9b0ba..47ed7d6963 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -783,7 +783,7 @@ bhyveConnectDomainXMLToNative(virConnectPtr conn, return NULL; } =20 - if ((bhyveDriverGetBhyveCaps(privconn) & BHYVE_CAP_LPC_BOOTROM) = =3D=3D 0) { + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(privconn), BHYVE_CAP_= LPC_BOOTROM)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Installed bhyve binary does not support boot= rom")); return NULL; @@ -1377,6 +1377,7 @@ bhyveStateCleanup(void) virSysinfoDefFree(bhyve_driver->hostsysinfo); virObjectUnref(bhyve_driver->domainEventState); virPortAllocatorRangeFree(bhyve_driver->remotePorts); + virBitmapFree(bhyve_driver->bhyvecaps); =20 if (bhyve_driver->lockFD !=3D -1) virPidFileRelease(bhyve_driver->config->stateDir, "driver", bhyve_= driver->lockFD); @@ -1421,13 +1422,15 @@ bhyveStateInitialize(bool privileged, if (virBhyveProbeCaps(&bhyve_driver->bhyvecaps) < 0) goto cleanup; =20 - if (!privileged && !(bhyveDriverGetBhyveCaps(bhyve_driver) & BHYVE_CAP= _MONITOR)) { + if (!privileged && + !virBhyveCapsGet(bhyveDriverGetBhyveCaps(bhyve_driver), BHYVE_CAP_= MONITOR)) { virReportError(VIR_ERR_INVALID_ARG, "%s", _("bhyve does not support monitor mode, cannot run = unprivileged")); goto cleanup; } =20 - if (!privileged && !(bhyveDriverGetBhyveCaps(bhyve_driver) & BHYVE_CAP= _GET_VMPID)) { + if (!privileged && + !virBhyveCapsGet(bhyveDriverGetBhyveCaps(bhyve_driver), BHYVE_CAP_= GET_VMPID)) { virReportError(VIR_ERR_INVALID_ARG, "%s", _("bhyvectl does not support querying the VM PID, c= annot run unprivileged")); goto cleanup; @@ -1513,12 +1516,12 @@ bhyveStateInitialize(bool privileged, return VIR_DRV_STATE_INIT_ERROR; } =20 -unsigned +virBitmap * bhyveDriverGetBhyveCaps(struct _bhyveConn *driver) { if (driver !=3D NULL) return driver->bhyvecaps; - return 0; + return NULL; } =20 unsigned @@ -1774,7 +1777,7 @@ bhyveConnectDomainXMLFromNative(virConnectPtr conn, { g_autoptr(virDomainDef) def =3D NULL; struct _bhyveConn *privconn =3D conn->privateData; - unsigned bhyveCaps =3D bhyveDriverGetBhyveCaps(privconn); + virBitmap *bhyveCaps =3D bhyveDriverGetBhyveCaps(privconn); =20 virCheckFlags(0, NULL); =20 @@ -2409,7 +2412,7 @@ bhyveDomainSetMemoryParameters(virDomainPtr domain, return -1; =20 if (def) { - if ((bhyveDriverGetBhyveCaps(privconn) & BHYVE_CAP_RCTL) =3D=3D 0)= { + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(privconn), BHYVE_CAP_= RCTL)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Cannot set resource limits: RACCT/RCTL is ei= ther not supported or not enabled")); goto endjob; diff --git a/src/bhyve/bhyve_driver.h b/src/bhyve/bhyve_driver.h index 3f86081910..49ba7bbddb 100644 --- a/src/bhyve/bhyve_driver.h +++ b/src/bhyve/bhyve_driver.h @@ -25,7 +25,7 @@ =20 int bhyveRegister(void); =20 -unsigned bhyveDriverGetBhyveCaps(struct _bhyveConn *driver); +virBitmap *bhyveDriverGetBhyveCaps(struct _bhyveConn *driver); =20 unsigned bhyveDriverGetGrubCaps(struct _bhyveConn *driver); =20 diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_comman= d.c index 3d9a6f3964..fd8d062c31 100644 --- a/src/bhyve/bhyve_parse_command.c +++ b/src/bhyve/bhyve_parse_command.c @@ -253,7 +253,7 @@ bhyveCommandLineToArgv(const char *nativeConfig, =20 static int bhyveParseBhyveLPCArg(virDomainDef *def, - unsigned caps G_GNUC_UNUSED, + virBitmap *caps G_GNUC_UNUSED, const char *arg) { /* -l emulation[,config] */ @@ -391,7 +391,7 @@ bhyveParsePCISlot(const char *slotdef, =20 static int bhyveParsePCIDisk(virDomainDef *def, - unsigned caps G_GNUC_UNUSED, + virBitmap *caps G_GNUC_UNUSED, unsigned pcibus, unsigned pcislot, unsigned function, @@ -461,7 +461,7 @@ bhyveParsePCIDisk(virDomainDef *def, static int bhyveParsePCINet(virDomainDef *def, virDomainXMLOption *xmlopt, - unsigned caps G_GNUC_UNUSED, + virBitmap *caps G_GNUC_UNUSED, unsigned bus, unsigned slot, unsigned function, @@ -536,7 +536,7 @@ bhyveParsePCINet(virDomainDef *def, static int bhyveParsePCIFbuf(virDomainDef *def, virDomainXMLOption *xmlopt, - unsigned caps G_GNUC_UNUSED, + virBitmap *caps G_GNUC_UNUSED, unsigned bus, unsigned slot, unsigned function, @@ -644,7 +644,7 @@ bhyveParsePCIFbuf(virDomainDef *def, static int bhyveParsePCIRND(virDomainDef *def, virDomainXMLOption *xmlopt G_GNUC_UNUSED, - unsigned caps G_GNUC_UNUSED, + virBitmap *caps G_GNUC_UNUSED, unsigned bus, unsigned slot, unsigned function, @@ -733,7 +733,7 @@ bhyveParsePassthru(virDomainDef *def G_GNUC_UNUSED, static int bhyveParseBhyvePCIArg(virDomainDef *def, virDomainXMLOption *xmlopt, - unsigned caps, + virBitmap *caps, unsigned *nvirtiodisk, unsigned *nahcidisk, const char *arg) @@ -822,7 +822,7 @@ bhyveParseBhyvePCIArg(virDomainDef *def, static int bhyveParseBhyveCommandLine(virDomainDef *def, virDomainXMLOption *xmlopt, - unsigned caps, + virBitmap *caps, int argc, char **argv) { int vcpus =3D 1; @@ -1025,7 +1025,7 @@ bhyveParseCustomLoaderCommandLine(virDomainDef *def, =20 virDomainDef * bhyveParseCommandLineString(const char* nativeConfig, - unsigned caps, + virBitmap *caps, virDomainXMLOption *xmlopt) { g_autoptr(virDomainDef) def =3D NULL; diff --git a/src/bhyve/bhyve_parse_command.h b/src/bhyve/bhyve_parse_comman= d.h index 7cf3e70b5e..bf9ad3beb2 100644 --- a/src/bhyve/bhyve_parse_command.h +++ b/src/bhyve/bhyve_parse_command.h @@ -21,5 +21,5 @@ #pragma once =20 virDomainDef *bhyveParseCommandLineString(const char* nativeConfig, - unsigned caps, + virBitmap *caps, virDomainXMLOption *xmlopt); diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c index 41b5c118f2..c27a5cf6ed 100644 --- a/src/bhyve/bhyve_process.c +++ b/src/bhyve/bhyve_process.c @@ -225,7 +225,7 @@ bhyveSetResourceLimits(struct _bhyveConn *driver, virDo= mainObj *vm) return -1; } =20 - if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_RCTL) =3D=3D 0) { + if (!virBhyveCapsGet(bhyveDriverGetBhyveCaps(driver), BHYVE_CAP_RCTL))= { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Cannot set resource limits: RACCT/RCTL is either= not supported or not enabled")); return -1; diff --git a/src/bhyve/bhyve_utils.h b/src/bhyve/bhyve_utils.h index db2789fe02..6d15035693 100644 --- a/src/bhyve/bhyve_utils.h +++ b/src/bhyve/bhyve_utils.h @@ -27,6 +27,7 @@ #include "virdomainobjlist.h" #include "virthread.h" #include "hypervisor/virclosecallbacks.h" +#include "virbitmap.h" #include "virportallocator.h" =20 typedef struct _virBhyveDriverConfig virBhyveDriverConfig; @@ -69,7 +70,7 @@ struct _bhyveConn { =20 virPortAllocatorRange *remotePorts; =20 - unsigned bhyvecaps; + virBitmap *bhyvecaps; unsigned grubcaps; =20 bool privileged; diff --git a/tests/bhyveargv2xmltest.c b/tests/bhyveargv2xmltest.c index acfaade24c..4cb5045704 100644 --- a/tests/bhyveargv2xmltest.c +++ b/tests/bhyveargv2xmltest.c @@ -143,7 +143,8 @@ mymain(void) DO_TEST_FULL(name, FLAG_EXPECT_PARSE_ERROR) =20 driver.grubcaps =3D BHYVE_GRUB_CAP_CONSDEV; - driver.bhyvecaps =3D BHYVE_CAP_RTC_UTC; + driver.bhyvecaps =3D virBitmapNew(BHYVE_CAP_LAST); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_RTC_UTC); =20 DO_TEST("base"); DO_TEST("wired"); @@ -193,6 +194,7 @@ mymain(void) =20 virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); + virBitmapFree(driver.bhyvecaps); =20 return ret =3D=3D 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 8a6e044ad0..650563821b 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -214,13 +214,20 @@ mymain(void) DO_TEST_FULL(name, FLAG_EXPECT_PREPARE_ERROR) =20 driver.grubcaps =3D BHYVE_GRUB_CAP_CONSDEV; - driver.bhyvecaps =3D BHYVE_CAP_RTC_UTC | BHYVE_CAP_AHCI32SLOT | \ - BHYVE_CAP_NET_E1000 | BHYVE_CAP_LPC_BOOTROM | \ - BHYVE_CAP_FBUF | BHYVE_CAP_XHCI | \ - BHYVE_CAP_CPUTOPOLOGY | BHYVE_CAP_SOUND_HDA | \ - BHYVE_CAP_VNC_PASSWORD | BHYVE_CAP_VIRTIO_9P | \ - BHYVE_CAP_NVME | BHYVE_CAP_NUMA | \ - BHYVE_CAP_LPC_TPM; + driver.bhyvecaps =3D virBitmapNew(BHYVE_CAP_LAST); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_RTC_UTC); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_AHCI32SLOT); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_NET_E1000); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_LPC_BOOTROM); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_FBUF); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_XHCI); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_CPUTOPOLOGY); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_SOUND_HDA); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_VNC_PASSWORD); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_VIRTIO_9P); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_NVME); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_NUMA); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_LPC_TPM); =20 DO_TEST("base"); DO_TEST_UNPRIVILEGED_FAILURE("base"); @@ -228,7 +235,7 @@ mymain(void) DO_TEST_FAILURE("bootorder-invalid-index"); DO_TEST("wired"); DO_TEST("acpiapic"); - driver.bhyvecaps &=3D ~BHYVE_CAP_ACPI; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_ACPI); DO_TEST_FAILURE("acpiapic"); DO_TEST("disk-cdrom"); DO_TEST("disk-virtio"); @@ -281,7 +288,7 @@ mymain(void) DO_TEST("numa"); DO_TEST_FAILURE("numa-empty-cpuset"); DO_TEST_FAILURE("numa-too-many-domains"); - driver.bhyvecaps &=3D ~BHYVE_CAP_NUMA; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_NUMA); DO_TEST_FAILURE("numa"); fakefirmwaredir =3D g_steal_pointer(&driver.config->firmwareDir); driver.config->firmwareDir =3D g_steal_pointer(&fakefirmwareemptydir); @@ -291,13 +298,13 @@ mymain(void) DO_TEST_FAILURE("fs-9p-unsupported-type"); DO_TEST_FAILURE("fs-9p-unsupported-driver"); DO_TEST_FAILURE("fs-9p-unsupported-accessmode"); - driver.bhyvecaps &=3D ~BHYVE_CAP_VIRTIO_9P; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_VIRTIO_9P); DO_TEST_FAILURE("fs-9p"); DO_TEST("virtio-rnd"); DO_TEST_FAILURE("virtio-rnd-backend-random-non-default-file"); DO_TEST_FAILURE("virtio-rnd-backend-builtin"); DO_TEST_FAILURE("virtio-rnd-transitional"); - driver.bhyvecaps &=3D ~BHYVE_CAP_VIRTIO_RND; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_VIRTIO_RND); DO_TEST_FAILURE("virtio-rnd"); DO_TEST("serial-tcp"); DO_TEST("4-consoles"); @@ -338,7 +345,7 @@ mymain(void) DO_TEST_FAILURE("tpm-comma-path"); DO_TEST_FAILURE("tpm-invalid-model"); DO_TEST_FAILURE("tpm-multiple-devices"); - driver.bhyvecaps &=3D ~BHYVE_CAP_LPC_TPM; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_LPC_TPM); DO_TEST_FAILURE("tpm"); =20 /* Address allocation tests */ @@ -352,7 +359,7 @@ mymain(void) DO_TEST("addr-non-isa-controller-on-slot-1"); =20 /* The same without 32 devs per controller support */ - driver.bhyvecaps ^=3D BHYVE_CAP_AHCI32SLOT; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_AHCI32SLOT); DO_TEST("addr-no32devs-single-sata-disk"); DO_TEST("addr-no32devs-multiple-sata-disks"); DO_TEST_FAILURE("addr-no32devs-more-than-32-sata-disks"); @@ -362,33 +369,33 @@ mymain(void) DO_TEST_FAILURE("xhci-multiple-controllers"); DO_TEST_FAILURE("xhci-no-devs"); DO_TEST_FAILURE("xhci-multiple-devs"); - driver.bhyvecaps ^=3D BHYVE_CAP_XHCI; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_XHCI); DO_TEST_FAILURE("input-xhci-tablet"); =20 driver.grubcaps =3D 0; =20 DO_TEST("serial-grub-nocons"); =20 - driver.bhyvecaps &=3D ~BHYVE_CAP_NET_E1000; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_NET_E1000); =20 DO_TEST_FAILURE("net-e1000"); =20 - driver.bhyvecaps &=3D ~BHYVE_CAP_LPC_BOOTROM; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_LPC_BOOTROM); DO_TEST_FAILURE("uefi"); =20 - driver.bhyvecaps &=3D ~BHYVE_CAP_FBUF; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_FBUF); DO_TEST_FAILURE("vnc"); =20 - driver.bhyvecaps &=3D ~BHYVE_CAP_CPUTOPOLOGY; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_CPUTOPOLOGY); DO_TEST_FAILURE("cputopology"); =20 - driver.bhyvecaps &=3D ~BHYVE_CAP_SOUND_HDA; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_SOUND_HDA); DO_TEST_FAILURE("sound"); =20 - driver.bhyvecaps &=3D ~BHYVE_CAP_VNC_PASSWORD; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_VNC_PASSWORD); DO_TEST_FAILURE("vnc-password"); =20 - driver.bhyvecaps &=3D ~BHYVE_CAP_NVME; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_NVME); DO_TEST_FAILURE("nvme"); =20 driver.config->bhyveloadTimeout =3D 300; @@ -400,9 +407,9 @@ mymain(void) virTestSetHostArch(VIR_ARCH_AARCH64); driver.caps =3D virBhyveCapsBuild(); /* bhyve does not support UTC clock on ARM */ - driver.bhyvecaps ^=3D BHYVE_CAP_RTC_UTC; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_RTC_UTC); /* bhyve does not support NUMA on ARM */ - driver.bhyvecaps &=3D ~BHYVE_CAP_NUMA; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_NUMA); =20 DO_TEST("base"); DO_TEST("console"); @@ -411,6 +418,7 @@ mymain(void) =20 virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); + virBitmapFree(driver.bhyvecaps); virPortAllocatorRangeFree(driver.remotePorts); virObjectUnref(driver.config); =20 diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c index a9964f9825..724ba4d85f 100644 --- a/tests/bhyvexml2xmltest.c +++ b/tests/bhyvexml2xmltest.c @@ -95,7 +95,9 @@ mymain(void) # define DO_TEST_FAILURE(name) \ DO_TEST_FULL(name, FLAG_EXPECT_FAILURE) =20 - driver.bhyvecaps =3D BHYVE_CAP_AHCI32SLOT | BHYVE_CAP_RTC_UTC; + driver.bhyvecaps =3D virBitmapNew(BHYVE_CAP_LAST); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_AHCI32SLOT); + virBhyveCapsSet(driver.bhyvecaps, BHYVE_CAP_RTC_UTC); =20 DO_TEST_DIFFERENT("acpiapic"); DO_TEST_DIFFERENT("base"); @@ -174,7 +176,7 @@ mymain(void) DO_TEST_DIFFERENT("addr-isa-controller-on-slot-31"); =20 /* The same without 32 devs per controller support */ - driver.bhyvecaps ^=3D BHYVE_CAP_AHCI32SLOT; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_AHCI32SLOT); DO_TEST_DIFFERENT("addr-no32devs-single-sata-disk"); DO_TEST_DIFFERENT("addr-no32devs-multiple-sata-disks"); DO_TEST_FAILURE("addr-no32devs-more-than-32-sata-disks"); @@ -186,7 +188,7 @@ mymain(void) virTestSetHostArch(VIR_ARCH_AARCH64); driver.caps =3D virBhyveCapsBuild(); /* bhyve does not support UTC clock on ARM */ - driver.bhyvecaps ^=3D BHYVE_CAP_RTC_UTC; + virBhyveCapsClear(driver.bhyvecaps, BHYVE_CAP_RTC_UTC); =20 DO_TEST_DIFFERENT("base"); DO_TEST_DIFFERENT("console"); @@ -194,6 +196,7 @@ mymain(void) =20 virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); + virBitmapFree(driver.bhyvecaps); virObjectUnref(driver.config); =20 return ret =3D=3D 0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index b3e9ff7051..b4ade48f91 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -147,7 +147,7 @@ fillXenCaps(virDomainCaps *domCaps) # include "bhyve/bhyve_capabilities.h" =20 static int -fillBhyveCaps(virDomainCaps *domCaps, unsigned int *bhyve_caps) +fillBhyveCaps(virDomainCaps *domCaps, virBitmap *bhyve_caps) { g_autofree virDomainCapsStringValues *firmwares =3D NULL; =20 @@ -156,7 +156,7 @@ fillBhyveCaps(virDomainCaps *domCaps, unsigned int *bhy= ve_caps) if (fillStringValues(firmwares, "/foo/bar", "/foo/baz", NULL) < 0) return -1; =20 - if (virBhyveDomainCapsFill(domCaps, *bhyve_caps, firmwares) < 0) + if (virBhyveDomainCapsFill(domCaps, bhyve_caps, firmwares) < 0) return -1; =20 return 0; @@ -420,7 +420,7 @@ mymain(void) int ret =3D 0; =20 #if WITH_BHYVE - unsigned int bhyve_caps =3D 0; + g_autoptr(virBitmap) bhyve_caps =3D virBitmapNew(BHYVE_CAP_LAST); #endif =20 #if WITH_QEMU @@ -523,16 +523,16 @@ mymain(void) #endif /* WITH_LIBXL */ =20 #if WITH_BHYVE - DO_TEST_BHYVE("basic", "/usr/sbin/bhyve", &bhyve_caps, VIR_DOMAIN_VIRT= _BHYVE); + DO_TEST_BHYVE("basic", "/usr/sbin/bhyve", bhyve_caps, VIR_DOMAIN_VIRT_= BHYVE); =20 - bhyve_caps |=3D BHYVE_CAP_LPC_BOOTROM; - DO_TEST_BHYVE("uefi", "/usr/sbin/bhyve", &bhyve_caps, VIR_DOMAIN_VIRT_= BHYVE); + virBhyveCapsSet(bhyve_caps, BHYVE_CAP_LPC_BOOTROM); + DO_TEST_BHYVE("uefi", "/usr/sbin/bhyve", bhyve_caps, VIR_DOMAIN_VIRT_B= HYVE); =20 - bhyve_caps |=3D BHYVE_CAP_FBUF; - DO_TEST_BHYVE("fbuf", "/usr/sbin/bhyve", &bhyve_caps, VIR_DOMAIN_VIRT_= BHYVE); + virBhyveCapsSet(bhyve_caps, BHYVE_CAP_FBUF); + DO_TEST_BHYVE("fbuf", "/usr/sbin/bhyve", bhyve_caps, VIR_DOMAIN_VIRT_B= HYVE); =20 - bhyve_caps |=3D BHYVE_CAP_LPC_TPM; - DO_TEST_BHYVE("tpm", "/usr/sbin/bhyve", &bhyve_caps, VIR_DOMAIN_VIRT_B= HYVE); + virBhyveCapsSet(bhyve_caps, BHYVE_CAP_LPC_TPM); + DO_TEST_BHYVE("tpm", "/usr/sbin/bhyve", bhyve_caps, VIR_DOMAIN_VIRT_BH= YVE); #endif /* WITH_BHYVE */ =20 return ret =3D=3D 0 ? EXIT_SUCCESS : EXIT_FAILURE; --=20 2.55.0