Introduce a test that checks newly introduced virAcpi module.
There are three IORT tables from a real HW (IORT_ampere,
IORT_gigabyte and IORT_qualcomm), then there's one from a VM
(IORT_virt_aarch64) and one that I handcrafted to be empty
(IORT_empty).
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
Reviewed-by: Andrea Bolognani <abologna(a)redhat.com>
---
build-aux/syntax-check.mk | 2 +-
tests/meson.build | 1 +
tests/viracpidata/IORT_ampere | Bin 0 -> 2304 bytes
tests/viracpidata/IORT_empty | Bin 0 -> 65 bytes
tests/viracpidata/IORT_gigabyte | Bin 0 -> 10100 bytes
tests/viracpidata/IORT_qualcomm | Bin 0 -> 3560 bytes
tests/viracpidata/IORT_virt_aarch64 | Bin 0 -> 128 bytes
tests/viracpitest.c | 135 ++++++++++++++++++++++++++++
8 files changed, 137 insertions(+), 1 deletion(-)
create mode 100644 tests/viracpidata/IORT_ampere
create mode 100644 tests/viracpidata/IORT_empty
create mode 100644 tests/viracpidata/IORT_gigabyte
create mode 100644 tests/viracpidata/IORT_qualcomm
create mode 100644 tests/viracpidata/IORT_virt_aarch64
create mode 100644 tests/viracpitest.c
diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk
index 5829dc9011..64c1e2773e 100644
--- a/build-aux/syntax-check.mk
+++ b/build-aux/syntax-check.mk
@@ -1370,7 +1370,7 @@ exclude_file_name_regexp--sc_prohibit_close = \
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)|tools/virt-qemu-qmp-proxy$$)
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
-
(^tests/(nodedevmdevctl|virhostcpu|virpcitest|virstoragetest)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)
+
(^tests/(nodedevmdevctl|viracpi|virhostcpu|virpcitest|virstoragetest)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
(^(src/(util/(vircommand|virdaemon)|lxc/lxc_controller)|tests/testutils)\.c$$)
diff --git a/tests/meson.build b/tests/meson.build
index 24d08e4f97..35adbc2d56 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -269,6 +269,7 @@ tests += [
{ 'name': 'storagevolxml2xmltest' },
{ 'name': 'sysinfotest' },
{ 'name': 'utiltest' },
+ { 'name': 'viracpitest' },
{ 'name': 'viralloctest' },
{ 'name': 'virauthconfigtest' },
{ 'name': 'virbitmaptest' },
diff --git a/tests/viracpidata/IORT_ampere b/tests/viracpidata/IORT_ampere
new file mode 100644
index 0000000000000000000000000000000000000000..02e7fd98499729025346c6ac3ae5cf10b0f1074d
GIT binary patch
literal 2304
zcmbW1y-EW?6opUzV}1)8%LN4mK`kr-7P4TWg&4%rLXlu$L<trF3*SI2d;m)y!oo6-
zU}@n4<PFw6a}$x7++mo7OlH2Bv)?d#caKg^&#(mGIla9fj0WlOVRV@!NluU+_qUdT
z!dl+nA>g$lfAhAGcZwV=;3b8Z6<$$zRpB*-Hx%AfcuV1Jg?AL*&3Um09*JpqZe{?O
zqhNo2j#<W4z|_q6b6jWV&dnkEb9^p#ZW55=mh9ZFc{qL_Z*Aw^0&-kp=UV2W`+Zzu
z=f(j!){UL}3CPtK<oc!v{rlwWW&1t?a;#%Jx4}*1m#@xP=XUOOmMahCb!BZF@J7IQ
zwg>YGkfFbw)ib1ii+>)bWKJ0S3tjuMt`ZLaZB1OlRM%>(tBecBB}{d#$GR#QJ1$|W
zYctkW#f#$-rn<IcT{XNrE@7(cG0eq0f4rm)8~8LMX=F~A>UxTGHSy)RgsHBpSXT>E
n$0ba4UB|lGsLR0_qjZI-uA5j_2Z`enrn>H8U0w7XmoVaAS)q0T
literal 0
HcmV?d00001
diff --git a/tests/viracpidata/IORT_empty b/tests/viracpidata/IORT_empty
new file mode 100644
index 0000000000000000000000000000000000000000..58b696fe935b432020377aabc76fe2b95376b48f
GIT binary patch
literal 65
ucmebD4+?Q$U|?Y6a`g=eiDdBcbPDqf3SnRbih&p)8U!4`B$SXqaJT?S&j#KA
literal 0
HcmV?d00001
diff --git a/tests/viracpidata/IORT_gigabyte b/tests/viracpidata/IORT_gigabyte
new file mode 100644
index 0000000000000000000000000000000000000000..b18b445b5de0911ba7190dfe396a72fec3fe6cf5
GIT binary patch
literal 10100
zcmeI1OHRWu5Qg2REq(9^AS76TA~tNhV95qiBr266RV`x4f;U?ZP>CaO1rESrH~<IW
z4#mG`Y%0}>oNhgq5>JSK2mi4?O{V>;(fI91sY?6o^twN}9A8X^z4OscMJd%Ejt6^<
zo$Nrz$NF$>*F_2;#-b&+H51}AsNpZVy_<6t=eh}%I??@99|OL|*gKAGch7<JWQ6!2
zKEQ!k_5s#9o8kP=o+?8Ke981-U^Cb2&}l4Nd`wCMne>1O=h`F3(vuP5gZKakV%Y~+
zD>13!@}VLoSw2~g{cuiHq~RfsV<DP4{xRLkJf}gD1&xoFSs*W;cuw0rb09q#AwGx?
za3Gd_fVC2nszJOoABj$*RNBT2{_o0eAd_Bb3U_|xNP03td=MYtKrH(JYb7QnK}<>@
z(9PynpX+p8l*6sikW!lF5}H<y#uVlFo~_Rz7xm?K>cb3_`W*WeOMOMwNiSS{Sk4Ei
zh>1=0y-jlzF_BX_$HZUO_?VOiGD+%l<a;dj7g?vgZ#a;*4{(o|)Cyu!2Ljz}Za3xM
zHH$dL>0c?$20f;fCe6|Kc$o$AQtESLYAp2^S*N^jIFPpwaF5v64&vo11iD#Xe(lq>
zk4fD?CP{scJdCCOBI}g*4F~e}0qzlBIzdcYgFrXSq~0N27v*r9G^CVfYY7d1;x0Vr
E57fpI9{>OV
literal 0
HcmV?d00001
diff --git a/tests/viracpidata/IORT_qualcomm b/tests/viracpidata/IORT_qualcomm
new file mode 100644
index 0000000000000000000000000000000000000000..5364a9968fa024f34b5e911513a08e8a7f88cf91
GIT binary patch
literal 3560
zcmb7_yK7WI6vk)w?gfdc+XO5}jbI^i_hDy|WN$P9V~9y%A;c$GhzN?HK?NJFM9@YX
zTmKYG!TbS&7AXbo*Yn+ZoZX!D-Z=xi^Z3p;bLMyV++Eway1jqI7;|ZJw6SjOW_htc
zEDGDArL`;Dm*?|&yF%lFK2<v&2ChdOTIas0hHV;`)ylW=_^@${n9qH$<`_PppeG2V
z_Q>~PpYhnO$Ma|k4ZC3t<Mxogs9|h<PhEz2XknjKzmVIYgnqBe=OLYs7@>C?blad8
z)4JsI;{czZk<Vkw>6z#9bS9q`KM%?s_r`81d;+7u=bm2>_cy;HAH)c~+o0P9y_nV|
zpWg@g{E2*C5tCid<@HQHZNUe-rSS3FnZW0bUl8{<e<L5n2))~&+XlUu)+HaRh-2>A
zSHEb~7tPV$Qa;ap-tT=s{oFIb2fL;4$=nf<&lkTS?r-+0eBROdh!HyKi}L-ij{2(8
zQC}0f<U<ufdbqclqxzyb+6T(%h3E2dCZCSrgWXd2blee<&sV=7?vMKN`6EW?sINL5
z^;M^%z9w|Zhbn?}=0o*GbF@#y<fZ5Gc_yD+@WE~=d~$b0<g@P=#QjlUK7Ygr9rabG
zqrU2N)YpXGy5JH6k25|;jE~a)%Hs8%t>v9_<$8e|24;sU28c=X_M*3CwBCO7w$<K2
z^k!<W`=iAjJ8JLwcy6xs_L#F(dzteIwU;@cRC}58DYch5FQ~oD`Lx#CXU>aiFLPc}
zdztgH+RL0rYA<sx)n4Yj(%`Lr`1D$c?~MU-zM=Lq=bLITbH1haGUwZBFLS=5_A=+Y
zliu)B_HfbRy+kcraPQ}>a?~@eq_}=!+#oS-SQ~fN<#%m$R3ygL--Gw7zX!(+%s=~I
BN)P}5
literal 0
HcmV?d00001
diff --git a/tests/viracpidata/IORT_virt_aarch64 b/tests/viracpidata/IORT_virt_aarch64
new file mode 100644
index 0000000000000000000000000000000000000000..7efd0ce8a6b3928efa7e1373f688ab4c5f50543b
GIT binary patch
literal 128
zcmebD4+?2uU|?Y0?Bwt45v<@85#X!<1dKp25F11@0kHuPgMkDCNC*yK93~3}W)K^M
VRiHGGVg_O`aDdYP|3ers^8jQz3IPBB
literal 0
HcmV?d00001
diff --git a/tests/viracpitest.c b/tests/viracpitest.c
new file mode 100644
index 0000000000..f5dd542ffb
--- /dev/null
+++ b/tests/viracpitest.c
@@ -0,0 +1,135 @@
+/*
+ * viracpitest.c: Test ACPI table parsing
+ *
+ * Copyright (C) 2023 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <
http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <config.h>
+
+#define LIBVIRT_VIRACPIPRIV_H_ALLOW
+#include "testutils.h"
+#include "viracpi.h"
+#include "viracpipriv.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+typedef struct testAarch64SMMUData testAarch64SMMUData;
+struct testAarch64SMMUData {
+ const char *filename;
+ ssize_t nnodes;
+ const virIORTNodeType *node_types;
+};
+
+static void
+printBitmap(virBitmap *types)
+{
+ size_t i;
+
+ for (i = 0; i < VIR_IORT_NODE_TYPE_LAST; i++) {
+ if (virBitmapIsBitSet(types, i)) {
+ fprintf(stderr, "%s\n", virIORTNodeTypeTypeToString(i));
+ }
+ }
+}
+
+static int
+testAarch64SMMU(const void *opaque)
+{
+ const testAarch64SMMUData *data = opaque;
+ g_autofree char *path = NULL;
+ g_autofree virIORTNodeHeader *nodes = NULL;
+ ssize_t nnodes = 0;
+
+ path = g_strdup_printf("%s/viracpidata/%s",
+ abs_srcdir, data->filename);
+
+ nnodes = virAcpiParseIORT(&nodes, path);
+
+ if (nnodes != data->nnodes) {
+ fprintf(stderr,
+ "virAcpiParseIORT() returned wrong number of nodes: %zd, expected
%zd\n",
+ nnodes, data->nnodes);
+ return -1;
+ }
+
+ if (nnodes > 0) {
+ g_autoptr(virBitmap) typesSeen = virBitmapNew(VIR_IORT_NODE_TYPE_LAST);
+ g_autoptr(virBitmap) typesExp = virBitmapNew(VIR_IORT_NODE_TYPE_LAST);
+ size_t i = 0;
+
+ for (i = 0; data->node_types[i] != VIR_IORT_NODE_TYPE_LAST; i++) {
+ size_t type = data->node_types[i];
+
+ ignore_value(virBitmapSetBit(typesExp, type));
+ }
+
+ for (i = 0; i < nnodes; i++) {
+ virIORTNodeHeader *h = &nodes[i];
+
+ ignore_value(virBitmapSetBit(typesSeen, h->type));
+ }
+
+ if (!virBitmapEqual(typesSeen, typesExp)) {
+ fprintf(stderr, "node types mismatch.\n\nExpected:\n");
+ printBitmap(typesExp);
+ fprintf(stderr, "\nActual:\n");
+ printBitmap(typesSeen);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
+static int
+mymain(void)
+{
+ int ret = 0;
+
+#define DO_TEST(filename, nnodes, ...) \
+ do { \
+ const virIORTNodeType node_types[] = { __VA_ARGS__, VIR_IORT_NODE_TYPE_LAST }; \
+ const testAarch64SMMUData data = {filename, nnodes, node_types }; \
+ if (virTestRun("aarch64 SMMU " filename, testAarch64SMMU, &data)
< 0) \
+ ret = -1; \
+ } while (0)
+
+ DO_TEST("IORT_empty", 0, VIR_IORT_NODE_TYPE_LAST);
+ DO_TEST("IORT_virt_aarch64", 2,
+ VIR_IORT_NODE_TYPE_ITS_GROUP,
+ VIR_IORT_NODE_TYPE_ROOT_COMPLEX);
+ DO_TEST("IORT_ampere", 36,
+ VIR_IORT_NODE_TYPE_ITS_GROUP,
+ VIR_IORT_NODE_TYPE_ROOT_COMPLEX,
+ VIR_IORT_NODE_TYPE_SMMUV3);
+ DO_TEST("IORT_gigabyte", 30,
+ VIR_IORT_NODE_TYPE_ITS_GROUP,
+ VIR_IORT_NODE_TYPE_ROOT_COMPLEX,
+ VIR_IORT_NODE_TYPE_SMMUV1_OR_SMMUV2);
+ DO_TEST("IORT_qualcomm", 69,
+ VIR_IORT_NODE_TYPE_ITS_GROUP,
+ VIR_IORT_NODE_TYPE_NAMED_COMPONENT,
+ VIR_IORT_NODE_TYPE_ROOT_COMPLEX,
+ VIR_IORT_NODE_TYPE_SMMUV3,
+ VIR_IORT_NODE_TYPE_PMCG);
+
+ return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+VIR_TEST_MAIN(mymain)
--
2.39.2