aboutsummaryrefslogtreecommitdiff
path: root/samples/lspci.c
diff options
context:
space:
mode:
authorThanos Makatos <thanos.makatos@nutanix.com>2020-12-04 07:14:59 -0500
committerThanos Makatos <tmakatos@gmail.com>2020-12-07 11:53:52 +0000
commit03181093d2ff01daee166252996cc6c0a01db483 (patch)
tree66330c205ca094b90a85d91377bc260585d3e2c6 /samples/lspci.c
parent56ad046f32b46b24d0e743dc41b400d937eb2c9f (diff)
downloadlibvfio-user-03181093d2ff01daee166252996cc6c0a01db483.zip
libvfio-user-03181093d2ff01daee166252996cc6c0a01db483.tar.gz
libvfio-user-03181093d2ff01daee166252996cc6c0a01db483.tar.bz2
add lspci sample
Signed-off-by: Thanos Makatos <thanos.makatos@nutanix.com>
Diffstat (limited to 'samples/lspci.c')
-rw-r--r--samples/lspci.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/samples/lspci.c b/samples/lspci.c
new file mode 100644
index 0000000..674164b
--- /dev/null
+++ b/samples/lspci.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2019 Nutanix Inc. All rights reserved.
+ *
+ * Authors: Thanos Makatos <thanos@nutanix.com>
+ * Swapnil Ingle <swapnil.ingle@nutanix.com>
+ * Felipe Franciosi <felipe@nutanix.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Nutanix nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ */
+
+#include <stdio.h>
+#include <err.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "libvfio-user.h"
+
+int main(void)
+{
+ int i, j;
+ char *buf;
+ const int bytes_per_line = 0x10;
+ vfu_pci_hdr_id_t id = { 0 };
+ vfu_pci_hdr_ss_t ss = { 0 };
+ vfu_pci_hdr_cc_t cc = { 0 };
+ vfu_cap_t pm = {.pm = {.hdr.id = PCI_CAP_ID_PM, .pmcs.nsfrst = 0x1}};
+ vfu_cap_t *caps[1] = {&pm};
+ vfu_ctx_t *vfu_ctx = vfu_create_ctx(VFU_TRANS_SOCK, "",
+ LIBVFIO_USER_FLAG_ATTACH_NB, NULL,
+ VFU_DEV_TYPE_PCI);
+ if (vfu_ctx == NULL) {
+ err(EXIT_FAILURE, "failed to create libvfio-user context");
+ }
+ if (vfu_pci_setup_config_hdr(vfu_ctx, id, ss, cc, VFU_PCI_TYPE_CONVENTIONAL, 0) < 0) {
+ err(EXIT_FAILURE, "failed to setup PCI configuration space header");
+ }
+ if (vfu_pci_setup_caps(vfu_ctx, caps, 1) < 0) {
+ err(EXIT_FAILURE, "failed to setup PCI capabilities");
+ }
+ if (vfu_realize_ctx(vfu_ctx) < 0) {
+ err(EXIT_FAILURE, "failed to realize device");
+ }
+ buf = (char*)vfu_pci_get_config_space(vfu_ctx);;
+ printf("00:00.0 bogus PCI device\n");
+ for (i = 0; i < PCI_CFG_SPACE_SIZE / bytes_per_line; i++) {
+ printf("%02x:", i * bytes_per_line);
+ for (j = 0; j < bytes_per_line; j++) {
+ printf(" %02x", buf[i * bytes_per_line + j] & 0xff);
+ }
+ printf("\n");
+ }
+
+ return 0;
+}
+
+/* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */