diff --git a/sys/amd64/vmm/io/ppt.c b/sys/amd64/vmm/io/ppt.c --- a/sys/amd64/vmm/io/ppt.c +++ b/sys/amd64/vmm/io/ppt.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -757,3 +758,29 @@ ppt_teardown_msix(ppt); return (0); } + +static int +ppt_devlist_sysctl(SYSCTL_HANDLER_ARGS) +{ + struct pptdev *ppt; + struct sbuf sb; + int error; + + sbuf_new(&sb, NULL, 32, SBUF_AUTOEXTEND); + TAILQ_FOREACH(ppt, &pptdev_list, next) { + sbuf_printf(&sb, "%d/%d/%d%s", + pci_get_bus(ppt->dev), + pci_get_slot(ppt->dev), + pci_get_function(ppt->dev), + TAILQ_NEXT(ppt, next) != NULL ? ", " : ""); + } + sbuf_trim(&sb); + sbuf_finish(&sb); + error = sysctl_handle_string(oidp, sbuf_data(&sb), sbuf_len(&sb), req); + sbuf_delete(&sb); + + return (error); +} +SYSCTL_PROC(_hw_vmm_ppt, OID_AUTO, devlist, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 0, ppt_devlist_sysctl, "A", + "list of pci passthru devices");