* [PULL 0/4] qemu-ga patch queue
@ 2020-09-14 1:58 Michael Roth
2020-09-14 1:58 ` [PULL 1/4] qga/commands-posix: Rework build_guest_fsinfo_for_real_device() function Michael Roth
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Michael Roth @ 2020-09-14 1:58 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell
The following changes since commit c47edb8dda0660180f86df4defae2a1f60e345db:
Merge remote-tracking branch 'remotes/berrange-gitlab/tags/crypt-perf-pull-request' into staging (2020-09-12 21:17:22 +0100)
are available in the Git repository at:
git://github.com/mdroth/qemu.git tags/qga-pull-2020-09-12-tag
for you to fetch changes up to 2e4211cee49a666bf0e333011689b0981025879e:
qga: add command guest-get-devices for reporting VirtIO devices (2020-09-12 20:37:48 -0500)
----------------------------------------------------------------
patch queue for qemu-ga
* add guest-get-devices for reporting virtio devices (w32-only)
* extend guest-get-fsinfo to support non-PCI virtio disk controllers
* NOTE: qemu-ga w32 build currently broken, fixed with pending patch:
"meson: fix MSI rule"
w32 tested with patch applied.
----------------------------------------------------------------
Thomas Huth (3):
qga/commands-posix: Rework build_guest_fsinfo_for_real_device() function
qga/commands-posix: Move the udev code from the pci to the generic function
qga/commands-posix: Support fsinfo for non-PCI virtio devices, too
Tomáš Golembiovský (1):
qga: add command guest-get-devices for reporting VirtIO devices
qga/commands-posix.c | 166 ++++++++++++++++++++++++++++------------
qga/commands-win32.c | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++-
qga/qapi-schema.json | 51 +++++++++++++
3 files changed, 378 insertions(+), 49 deletions(-)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PULL 1/4] qga/commands-posix: Rework build_guest_fsinfo_for_real_device() function
2020-09-14 1:58 [PULL 0/4] qemu-ga patch queue Michael Roth
@ 2020-09-14 1:58 ` Michael Roth
2020-09-14 1:59 ` [PULL 2/4] qga/commands-posix: Move the udev code from the pci to the generic function Michael Roth
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Michael Roth @ 2020-09-14 1:58 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, Thomas Huth
From: Thomas Huth <thuth@redhat.com>
We are going to support non-PCI devices soon. For this we need to split
the generic GuestDiskAddress and GuestDiskAddressList memory allocation
and list chaining into a separate function first.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
qga/commands-posix.c | 65 ++++++++++++++++++++++++++++----------------
1 file changed, 41 insertions(+), 24 deletions(-)
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 1a62a3a70d..1a42ec8171 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -861,28 +861,30 @@ static int build_hosts(char const *syspath, char const *host, bool ata,
return i;
}
-/* Store disk device info specified by @sysfs into @fs */
-static void build_guest_fsinfo_for_real_device(char const *syspath,
- GuestFilesystemInfo *fs,
- Error **errp)
+/*
+ * Store disk device info for devices on the PCI bus.
+ * Returns true if information has been stored, or false for failure.
+ */
+static bool build_guest_fsinfo_for_pci_dev(char const *syspath,
+ GuestDiskAddress *disk,
+ Error **errp)
{
unsigned int pci[4], host, hosts[8], tgt[3];
int i, nhosts = 0, pcilen;
- GuestDiskAddress *disk;
- GuestPCIAddress *pciaddr;
- GuestDiskAddressList *list = NULL;
+ GuestPCIAddress *pciaddr = disk->pci_controller;
bool has_ata = false, has_host = false, has_tgt = false;
char *p, *q, *driver = NULL;
#ifdef CONFIG_LIBUDEV
struct udev *udev = NULL;
struct udev_device *udevice = NULL;
#endif
+ bool ret = false;
p = strstr(syspath, "/devices/pci");
if (!p || sscanf(p + 12, "%*x:%*x/%x:%x:%x.%x%n",
pci, pci + 1, pci + 2, pci + 3, &pcilen) < 4) {
g_debug("only pci device is supported: sysfs path '%s'", syspath);
- return;
+ return false;
}
p += 12 + pcilen;
@@ -903,7 +905,7 @@ static void build_guest_fsinfo_for_real_device(char const *syspath,
}
g_debug("unsupported driver or sysfs path '%s'", syspath);
- return;
+ return false;
}
p = strstr(syspath, "/target");
@@ -929,18 +931,11 @@ static void build_guest_fsinfo_for_real_device(char const *syspath,
}
}
- pciaddr = g_malloc0(sizeof(*pciaddr));
pciaddr->domain = pci[0];
pciaddr->bus = pci[1];
pciaddr->slot = pci[2];
pciaddr->function = pci[3];
- disk = g_malloc0(sizeof(*disk));
- disk->pci_controller = pciaddr;
-
- list = g_malloc0(sizeof(*list));
- list->value = disk;
-
#ifdef CONFIG_LIBUDEV
udev = udev_new();
udevice = udev_device_new_from_syspath(udev, syspath);
@@ -1018,21 +1013,43 @@ static void build_guest_fsinfo_for_real_device(char const *syspath,
goto cleanup;
}
- list->next = fs->disk;
- fs->disk = list;
- goto out;
+ ret = true;
cleanup:
- if (list) {
- qapi_free_GuestDiskAddressList(list);
- }
-out:
g_free(driver);
#ifdef CONFIG_LIBUDEV
udev_unref(udev);
udev_device_unref(udevice);
#endif
- return;
+ return ret;
+}
+
+/* Store disk device info specified by @sysfs into @fs */
+static void build_guest_fsinfo_for_real_device(char const *syspath,
+ GuestFilesystemInfo *fs,
+ Error **errp)
+{
+ GuestDiskAddress *disk;
+ GuestPCIAddress *pciaddr;
+ GuestDiskAddressList *list = NULL;
+ bool has_hwinf;
+
+ pciaddr = g_new0(GuestPCIAddress, 1);
+
+ disk = g_new0(GuestDiskAddress, 1);
+ disk->pci_controller = pciaddr;
+
+ list = g_new0(GuestDiskAddressList, 1);
+ list->value = disk;
+
+ has_hwinf = build_guest_fsinfo_for_pci_dev(syspath, disk, errp);
+
+ if (has_hwinf) {
+ list->next = fs->disk;
+ fs->disk = list;
+ } else {
+ qapi_free_GuestDiskAddressList(list);
+ }
}
static void build_guest_fsinfo_for_device(char const *devpath,
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PULL 2/4] qga/commands-posix: Move the udev code from the pci to the generic function
2020-09-14 1:58 [PULL 0/4] qemu-ga patch queue Michael Roth
2020-09-14 1:58 ` [PULL 1/4] qga/commands-posix: Rework build_guest_fsinfo_for_real_device() function Michael Roth
@ 2020-09-14 1:59 ` Michael Roth
2020-09-14 1:59 ` [PULL 3/4] qga/commands-posix: Support fsinfo for non-PCI virtio devices, too Michael Roth
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Michael Roth @ 2020-09-14 1:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, Thomas Huth
From: Thomas Huth <thuth@redhat.com>
The libudev-related code is independent from the other pci-related code
and can be re-used for non-pci devices (like ccw devices on s390x). Thus
move this part to the generic function.
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1755075
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
qga/commands-posix.c | 62 +++++++++++++++++++++++---------------------
1 file changed, 33 insertions(+), 29 deletions(-)
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 1a42ec8171..e8467ac567 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -874,10 +874,6 @@ static bool build_guest_fsinfo_for_pci_dev(char const *syspath,
GuestPCIAddress *pciaddr = disk->pci_controller;
bool has_ata = false, has_host = false, has_tgt = false;
char *p, *q, *driver = NULL;
-#ifdef CONFIG_LIBUDEV
- struct udev *udev = NULL;
- struct udev_device *udevice = NULL;
-#endif
bool ret = false;
p = strstr(syspath, "/devices/pci");
@@ -936,26 +932,6 @@ static bool build_guest_fsinfo_for_pci_dev(char const *syspath,
pciaddr->slot = pci[2];
pciaddr->function = pci[3];
-#ifdef CONFIG_LIBUDEV
- udev = udev_new();
- udevice = udev_device_new_from_syspath(udev, syspath);
- if (udev == NULL || udevice == NULL) {
- g_debug("failed to query udev");
- } else {
- const char *devnode, *serial;
- devnode = udev_device_get_devnode(udevice);
- if (devnode != NULL) {
- disk->dev = g_strdup(devnode);
- disk->has_dev = true;
- }
- serial = udev_device_get_property_value(udevice, "ID_SERIAL");
- if (serial != NULL && *serial != 0) {
- disk->serial = g_strdup(serial);
- disk->has_serial = true;
- }
- }
-#endif
-
if (strcmp(driver, "ata_piix") == 0) {
/* a host per ide bus, target*:0:<unit>:0 */
if (!has_host || !has_tgt) {
@@ -1017,10 +993,6 @@ static bool build_guest_fsinfo_for_pci_dev(char const *syspath,
cleanup:
g_free(driver);
-#ifdef CONFIG_LIBUDEV
- udev_unref(udev);
- udev_device_unref(udevice);
-#endif
return ret;
}
@@ -1033,18 +1005,50 @@ static void build_guest_fsinfo_for_real_device(char const *syspath,
GuestPCIAddress *pciaddr;
GuestDiskAddressList *list = NULL;
bool has_hwinf;
+#ifdef CONFIG_LIBUDEV
+ struct udev *udev = NULL;
+ struct udev_device *udevice = NULL;
+#endif
pciaddr = g_new0(GuestPCIAddress, 1);
+ pciaddr->domain = -1; /* -1 means field is invalid */
+ pciaddr->bus = -1;
+ pciaddr->slot = -1;
+ pciaddr->function = -1;
disk = g_new0(GuestDiskAddress, 1);
disk->pci_controller = pciaddr;
+ disk->bus_type = GUEST_DISK_BUS_TYPE_UNKNOWN;
list = g_new0(GuestDiskAddressList, 1);
list->value = disk;
+#ifdef CONFIG_LIBUDEV
+ udev = udev_new();
+ udevice = udev_device_new_from_syspath(udev, syspath);
+ if (udev == NULL || udevice == NULL) {
+ g_debug("failed to query udev");
+ } else {
+ const char *devnode, *serial;
+ devnode = udev_device_get_devnode(udevice);
+ if (devnode != NULL) {
+ disk->dev = g_strdup(devnode);
+ disk->has_dev = true;
+ }
+ serial = udev_device_get_property_value(udevice, "ID_SERIAL");
+ if (serial != NULL && *serial != 0) {
+ disk->serial = g_strdup(serial);
+ disk->has_serial = true;
+ }
+ }
+
+ udev_unref(udev);
+ udev_device_unref(udevice);
+#endif
+
has_hwinf = build_guest_fsinfo_for_pci_dev(syspath, disk, errp);
- if (has_hwinf) {
+ if (has_hwinf || disk->has_dev || disk->has_serial) {
list->next = fs->disk;
fs->disk = list;
} else {
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PULL 3/4] qga/commands-posix: Support fsinfo for non-PCI virtio devices, too
2020-09-14 1:58 [PULL 0/4] qemu-ga patch queue Michael Roth
2020-09-14 1:58 ` [PULL 1/4] qga/commands-posix: Rework build_guest_fsinfo_for_real_device() function Michael Roth
2020-09-14 1:59 ` [PULL 2/4] qga/commands-posix: Move the udev code from the pci to the generic function Michael Roth
@ 2020-09-14 1:59 ` Michael Roth
2020-09-14 1:59 ` [PULL 4/4] qga: add command guest-get-devices for reporting VirtIO devices Michael Roth
2020-09-14 11:12 ` [PULL 0/4] qemu-ga patch queue Peter Maydell
4 siblings, 0 replies; 7+ messages in thread
From: Michael Roth @ 2020-09-14 1:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, Thomas Huth
From: Thomas Huth <thuth@redhat.com>
QEMU on s390x uses virtio via channel I/O instead of PCI by default.
Add a function to detect and provide information for virtio-scsi and
virtio-block devices here, too.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
qga/commands-posix.c | 42 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 41 insertions(+), 1 deletion(-)
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index e8467ac567..744c2b5a5d 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -996,6 +996,39 @@ cleanup:
return ret;
}
+/*
+ * Store disk device info for non-PCI virtio devices (for example s390x
+ * channel I/O devices). Returns true if information has been stored, or
+ * false for failure.
+ */
+static bool build_guest_fsinfo_for_nonpci_virtio(char const *syspath,
+ GuestDiskAddress *disk,
+ Error **errp)
+{
+ unsigned int tgt[3];
+ char *p;
+
+ if (!strstr(syspath, "/virtio") || !strstr(syspath, "/block")) {
+ g_debug("Unsupported virtio device '%s'", syspath);
+ return false;
+ }
+
+ p = strstr(syspath, "/target");
+ if (p && sscanf(p + 7, "%*u:%*u:%*u/%*u:%u:%u:%u",
+ &tgt[0], &tgt[1], &tgt[2]) == 3) {
+ /* virtio-scsi: target*:0:<target>:<unit> */
+ disk->bus_type = GUEST_DISK_BUS_TYPE_SCSI;
+ disk->bus = tgt[0];
+ disk->target = tgt[1];
+ disk->unit = tgt[2];
+ } else {
+ /* virtio-blk: 1 disk per 1 device */
+ disk->bus_type = GUEST_DISK_BUS_TYPE_VIRTIO;
+ }
+
+ return true;
+}
+
/* Store disk device info specified by @sysfs into @fs */
static void build_guest_fsinfo_for_real_device(char const *syspath,
GuestFilesystemInfo *fs,
@@ -1046,7 +1079,14 @@ static void build_guest_fsinfo_for_real_device(char const *syspath,
udev_device_unref(udevice);
#endif
- has_hwinf = build_guest_fsinfo_for_pci_dev(syspath, disk, errp);
+ if (strstr(syspath, "/devices/pci")) {
+ has_hwinf = build_guest_fsinfo_for_pci_dev(syspath, disk, errp);
+ } else if (strstr(syspath, "/virtio")) {
+ has_hwinf = build_guest_fsinfo_for_nonpci_virtio(syspath, disk, errp);
+ } else {
+ g_debug("Unsupported device type for '%s'", syspath);
+ has_hwinf = false;
+ }
if (has_hwinf || disk->has_dev || disk->has_serial) {
list->next = fs->disk;
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PULL 4/4] qga: add command guest-get-devices for reporting VirtIO devices
2020-09-14 1:58 [PULL 0/4] qemu-ga patch queue Michael Roth
` (2 preceding siblings ...)
2020-09-14 1:59 ` [PULL 3/4] qga/commands-posix: Support fsinfo for non-PCI virtio devices, too Michael Roth
@ 2020-09-14 1:59 ` Michael Roth
2020-09-15 10:09 ` Thomas Huth
2020-09-14 11:12 ` [PULL 0/4] qemu-ga patch queue Peter Maydell
4 siblings, 1 reply; 7+ messages in thread
From: Michael Roth @ 2020-09-14 1:59 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, Tomáš Golembiovský
From: Tomáš Golembiovský <tgolembi@redhat.com>
Add command for reporting devices on Windows guest. The intent is not so
much to report the devices but more importantly the driver (and its
version) that is assigned to the device. This gives caller the
information whether VirtIO drivers are installed and/or whether
inadequate driver is used on a device (e.g. QXL device with base VGA
driver).
Example:
[
{
"driver-date": "2019-08-12",
"driver-name": "Red Hat VirtIO SCSI controller",
"driver-version": "100.80.104.17300",
"address": {
"type": "pci",
"data": {
"device-id": 4162,
"vendor-id": 6900
}
}
},
...
]
Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
*remove redundant glib autoptr declaration for GuestDeviceInfo
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
qga/commands-posix.c | 9 ++
qga/commands-win32.c | 210 ++++++++++++++++++++++++++++++++++++++++++-
qga/qapi-schema.json | 51 +++++++++++
3 files changed, 269 insertions(+), 1 deletion(-)
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 744c2b5a5d..af5a58a9fd 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -2822,6 +2822,8 @@ GList *ga_command_blacklist_init(GList *blacklist)
blacklist = g_list_append(blacklist, g_strdup("guest-fstrim"));
#endif
+ blacklist = g_list_append(blacklist, g_strdup("guest-get-devices"));
+
return blacklist;
}
@@ -3042,3 +3044,10 @@ GuestOSInfo *qmp_guest_get_osinfo(Error **errp)
return info;
}
+
+GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
+{
+ error_setg(errp, QERR_UNSUPPORTED);
+
+ return NULL;
+}
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 15c9d7944b..48d8bbe649 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -21,10 +21,11 @@
#ifdef CONFIG_QGA_NTDDSCSI
#include <winioctl.h>
#include <ntddscsi.h>
+#endif
#include <setupapi.h>
#include <cfgmgr32.h>
#include <initguid.h>
-#endif
+#include <devpropdef.h>
#include <lm.h>
#include <wtsapi32.h>
#include <wininet.h>
@@ -39,6 +40,36 @@
#include "qemu/base64.h"
#include "commands-common.h"
+/*
+ * The following should be in devpkey.h, but it isn't. The key names were
+ * prefixed to avoid (future) name clashes. Once the definitions get into
+ * mingw the following lines can be removed.
+ */
+DEFINE_DEVPROPKEY(qga_DEVPKEY_NAME, 0xb725f130, 0x47ef, 0x101a, 0xa5,
+ 0xf1, 0x02, 0x60, 0x8c, 0x9e, 0xeb, 0xac, 10);
+ /* DEVPROP_TYPE_STRING */
+DEFINE_DEVPROPKEY(qga_DEVPKEY_Device_HardwareIds, 0xa45c254e, 0xdf1c,
+ 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 3);
+ /* DEVPROP_TYPE_STRING_LIST */
+DEFINE_DEVPROPKEY(qga_DEVPKEY_Device_DriverDate, 0xa8b865dd, 0x2e3d,
+ 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 2);
+ /* DEVPROP_TYPE_FILETIME */
+DEFINE_DEVPROPKEY(qga_DEVPKEY_Device_DriverVersion, 0xa8b865dd, 0x2e3d,
+ 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 3);
+ /* DEVPROP_TYPE_STRING */
+/* The following shoud be in cfgmgr32.h, but it isn't */
+#ifndef CM_Get_DevNode_Property
+CMAPI CONFIGRET WINAPI CM_Get_DevNode_PropertyW(
+ DEVINST dnDevInst,
+ CONST DEVPROPKEY * PropertyKey,
+ DEVPROPTYPE * PropertyType,
+ PBYTE PropertyBuffer,
+ PULONG PropertyBufferSize,
+ ULONG ulFlags
+);
+#define CM_Get_DevNode_Property CM_Get_DevNode_PropertyW
+#endif
+
#ifndef SHTDN_REASON_FLAG_PLANNED
#define SHTDN_REASON_FLAG_PLANNED 0x80000000
#endif
@@ -2246,3 +2277,180 @@ GuestOSInfo *qmp_guest_get_osinfo(Error **errp)
return info;
}
+
+/*
+ * Safely get device property. Returned strings are using wide characters.
+ * Caller is responsible for freeing the buffer.
+ */
+static LPBYTE cm_get_property(DEVINST devInst, const DEVPROPKEY *propName,
+ PDEVPROPTYPE propType)
+{
+ CONFIGRET cr;
+ g_autofree LPBYTE buffer = NULL;
+ ULONG buffer_len = 0;
+
+ /* First query for needed space */
+ cr = CM_Get_DevNode_PropertyW(devInst, propName, propType,
+ buffer, &buffer_len, 0);
+ if (cr != CR_SUCCESS && cr != CR_BUFFER_SMALL) {
+
+ slog("failed to get property size, error=0x%lx", cr);
+ return NULL;
+ }
+ buffer = g_new0(BYTE, buffer_len + 1);
+ cr = CM_Get_DevNode_PropertyW(devInst, propName, propType,
+ buffer, &buffer_len, 0);
+ if (cr != CR_SUCCESS) {
+ slog("failed to get device property, error=0x%lx", cr);
+ return NULL;
+ }
+ return g_steal_pointer(&buffer);
+}
+
+static GStrv ga_get_hardware_ids(DEVINST devInstance)
+{
+ GArray *values = NULL;
+ DEVPROPTYPE cm_type;
+ LPWSTR id;
+ g_autofree LPWSTR property = (LPWSTR)cm_get_property(devInstance,
+ &qga_DEVPKEY_Device_HardwareIds, &cm_type);
+ if (property == NULL) {
+ slog("failed to get hardware IDs");
+ return NULL;
+ }
+ if (*property == '\0') {
+ /* empty list */
+ return NULL;
+ }
+ values = g_array_new(TRUE, TRUE, sizeof(gchar *));
+ for (id = property; '\0' != *id; id += lstrlenW(id) + 1) {
+ gchar *id8 = g_utf16_to_utf8(id, -1, NULL, NULL, NULL);
+ g_array_append_val(values, id8);
+ }
+ return (GStrv)g_array_free(values, FALSE);
+}
+
+/*
+ * https://docs.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-pci-devices
+ */
+#define DEVICE_PCI_RE "PCI\\\\VEN_(1AF4|1B36)&DEV_([0-9A-B]{4})(&|$)"
+
+GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
+{
+ GuestDeviceInfoList *head = NULL, *cur_item = NULL, *item = NULL;
+ HDEVINFO dev_info = INVALID_HANDLE_VALUE;
+ SP_DEVINFO_DATA dev_info_data;
+ int i, j;
+ GError *gerr = NULL;
+ g_autoptr(GRegex) device_pci_re = NULL;
+ DEVPROPTYPE cm_type;
+
+ device_pci_re = g_regex_new(DEVICE_PCI_RE,
+ G_REGEX_ANCHORED | G_REGEX_OPTIMIZE, 0,
+ &gerr);
+ g_assert(device_pci_re != NULL);
+
+ dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA);
+ dev_info = SetupDiGetClassDevs(0, 0, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES);
+ if (dev_info == INVALID_HANDLE_VALUE) {
+ error_setg(errp, "failed to get device tree");
+ return NULL;
+ }
+
+ slog("enumerating devices");
+ for (i = 0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) {
+ bool skip = true;
+ SYSTEMTIME utc_date;
+ g_autofree LPWSTR name = NULL;
+ g_autofree LPFILETIME date = NULL;
+ g_autofree LPWSTR version = NULL;
+ g_auto(GStrv) hw_ids = NULL;
+ g_autoptr(GuestDeviceInfo) device = g_new0(GuestDeviceInfo, 1);
+ g_autofree char *vendor_id = NULL;
+ g_autofree char *device_id = NULL;
+
+ name = (LPWSTR)cm_get_property(dev_info_data.DevInst,
+ &qga_DEVPKEY_NAME, &cm_type);
+ if (name == NULL) {
+ slog("failed to get device description");
+ continue;
+ }
+ device->driver_name = g_utf16_to_utf8(name, -1, NULL, NULL, NULL);
+ if (device->driver_name == NULL) {
+ error_setg(errp, "conversion to utf8 failed (driver name)");
+ continue;
+ }
+ slog("querying device: %s", device->driver_name);
+ hw_ids = ga_get_hardware_ids(dev_info_data.DevInst);
+ if (hw_ids == NULL) {
+ continue;
+ }
+ for (j = 0; hw_ids[j] != NULL; j++) {
+ GMatchInfo *match_info;
+ GuestDeviceAddressPCI *address;
+ if (!g_regex_match(device_pci_re, hw_ids[j], 0, &match_info)) {
+ continue;
+ }
+ skip = false;
+
+ address = g_new0(GuestDeviceAddressPCI, 1);
+ vendor_id = g_match_info_fetch(match_info, 1);
+ device_id = g_match_info_fetch(match_info, 2);
+ address->vendor_id = g_ascii_strtoull(vendor_id, NULL, 16);
+ address->device_id = g_ascii_strtoull(device_id, NULL, 16);
+
+ device->address = g_new0(GuestDeviceAddress, 1);
+ device->has_address = true;
+ device->address->type = GUEST_DEVICE_ADDRESS_KIND_PCI;
+ device->address->u.pci.data = address;
+
+ g_match_info_free(match_info);
+ break;
+ }
+ if (skip) {
+ continue;
+ }
+
+ version = (LPWSTR)cm_get_property(dev_info_data.DevInst,
+ &qga_DEVPKEY_Device_DriverVersion, &cm_type);
+ if (version == NULL) {
+ slog("failed to get driver version");
+ continue;
+ }
+ device->driver_version = g_utf16_to_utf8(version, -1, NULL,
+ NULL, NULL);
+ if (device->driver_version == NULL) {
+ error_setg(errp, "conversion to utf8 failed (driver version)");
+ continue;
+ }
+ device->has_driver_version = true;
+
+ date = (LPFILETIME)cm_get_property(dev_info_data.DevInst,
+ &qga_DEVPKEY_Device_DriverDate, &cm_type);
+ if (date == NULL) {
+ slog("failed to get driver date");
+ continue;
+ }
+ FileTimeToSystemTime(date, &utc_date);
+ device->driver_date = g_strdup_printf("%04d-%02d-%02d",
+ utc_date.wYear, utc_date.wMonth, utc_date.wDay);
+ device->has_driver_date = true;
+
+ slog("driver: %s\ndriver version: %s,%s\n", device->driver_name,
+ device->driver_date, device->driver_version);
+ item = g_new0(GuestDeviceInfoList, 1);
+ item->value = g_steal_pointer(&device);
+ if (!cur_item) {
+ head = cur_item = item;
+ } else {
+ cur_item->next = item;
+ cur_item = item;
+ }
+ continue;
+ }
+
+ if (dev_info != INVALID_HANDLE_VALUE) {
+ SetupDiDestroyDeviceInfoList(dev_info);
+ }
+ return head;
+}
diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
index b1e9ed836d..d2ea7446db 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -1253,3 +1253,54 @@
##
{ 'command': 'guest-get-osinfo',
'returns': 'GuestOSInfo' }
+
+##
+# @GuestDeviceAddressPCI:
+#
+# @vendor-id: vendor ID
+# @device-id: device ID
+#
+# Since: 5.2
+##
+{ 'struct': 'GuestDeviceAddressPCI',
+ 'data': { 'vendor-id': 'uint16', 'device-id': 'uint16' } }
+
+##
+# @GuestDeviceAddress:
+#
+# Address of the device
+# - @pci: address of PCI device, since: 5.2
+#
+# Since: 5.2
+##
+{ 'union': 'GuestDeviceAddress',
+ 'data': { 'pci': 'GuestDeviceAddressPCI' } }
+
+##
+# @GuestDeviceInfo:
+#
+# @driver-name: name of the associated driver
+# @driver-date: driver release date in format YYYY-MM-DD
+# @driver-version: driver version
+#
+# Since: 5.2
+##
+{ 'struct': 'GuestDeviceInfo',
+ 'data': {
+ 'driver-name': 'str',
+ '*driver-date': 'str',
+ '*driver-version': 'str',
+ '*address': 'GuestDeviceAddress'
+ } }
+
+##
+# @guest-get-devices:
+#
+# Retrieve information about device drivers in Windows guest
+#
+# Returns: @GuestDeviceInfo
+#
+# Since: 5.2
+##
+{ 'command': 'guest-get-devices',
+ 'returns': ['GuestDeviceInfo'] }
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PULL 0/4] qemu-ga patch queue
2020-09-14 1:58 [PULL 0/4] qemu-ga patch queue Michael Roth
` (3 preceding siblings ...)
2020-09-14 1:59 ` [PULL 4/4] qga: add command guest-get-devices for reporting VirtIO devices Michael Roth
@ 2020-09-14 11:12 ` Peter Maydell
4 siblings, 0 replies; 7+ messages in thread
From: Peter Maydell @ 2020-09-14 11:12 UTC (permalink / raw)
To: Michael Roth; +Cc: QEMU Developers
On Mon, 14 Sep 2020 at 02:59, Michael Roth <mdroth@linux.vnet.ibm.com> wrote:
>
> The following changes since commit c47edb8dda0660180f86df4defae2a1f60e345db:
>
> Merge remote-tracking branch 'remotes/berrange-gitlab/tags/crypt-perf-pull-request' into staging (2020-09-12 21:17:22 +0100)
>
> are available in the Git repository at:
>
> git://github.com/mdroth/qemu.git tags/qga-pull-2020-09-12-tag
>
> for you to fetch changes up to 2e4211cee49a666bf0e333011689b0981025879e:
>
> qga: add command guest-get-devices for reporting VirtIO devices (2020-09-12 20:37:48 -0500)
>
> ----------------------------------------------------------------
> patch queue for qemu-ga
>
> * add guest-get-devices for reporting virtio devices (w32-only)
> * extend guest-get-fsinfo to support non-PCI virtio disk controllers
>
> * NOTE: qemu-ga w32 build currently broken, fixed with pending patch:
> "meson: fix MSI rule"
> w32 tested with patch applied.
Applied, thanks.
Please update the changelog at https://wiki.qemu.org/ChangeLog/5.2
for any user-visible changes.
-- PMM
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PULL 4/4] qga: add command guest-get-devices for reporting VirtIO devices
2020-09-14 1:59 ` [PULL 4/4] qga: add command guest-get-devices for reporting VirtIO devices Michael Roth
@ 2020-09-15 10:09 ` Thomas Huth
0 siblings, 0 replies; 7+ messages in thread
From: Thomas Huth @ 2020-09-15 10:09 UTC (permalink / raw)
To: Michael Roth, qemu-devel
Cc: peter.maydell, 罗勇刚(Yonggang Luo),
Tomáš Golembiovský, Stefan Weil
On 14/09/2020 03.59, Michael Roth wrote:
> From: Tomáš Golembiovský <tgolembi@redhat.com>
>
> Add command for reporting devices on Windows guest. The intent is not so
> much to report the devices but more importantly the driver (and its
> version) that is assigned to the device. This gives caller the
> information whether VirtIO drivers are installed and/or whether
> inadequate driver is used on a device (e.g. QXL device with base VGA
> driver).
>
> Example:
> [
> {
> "driver-date": "2019-08-12",
> "driver-name": "Red Hat VirtIO SCSI controller",
> "driver-version": "100.80.104.17300",
> "address": {
> "type": "pci",
> "data": {
> "device-id": 4162,
> "vendor-id": 6900
> }
> }
> },
> ...
> ]
>
> Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> *remove redundant glib autoptr declaration for GuestDeviceInfo
> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> ---
> qga/commands-posix.c | 9 ++
> qga/commands-win32.c | 210 ++++++++++++++++++++++++++++++++++++++++++-
> qga/qapi-schema.json | 51 +++++++++++
> 3 files changed, 269 insertions(+), 1 deletion(-)
>
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index 744c2b5a5d..af5a58a9fd 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -2822,6 +2822,8 @@ GList *ga_command_blacklist_init(GList *blacklist)
> blacklist = g_list_append(blacklist, g_strdup("guest-fstrim"));
> #endif
>
> + blacklist = g_list_append(blacklist, g_strdup("guest-get-devices"));
> +
> return blacklist;
> }
>
> @@ -3042,3 +3044,10 @@ GuestOSInfo *qmp_guest_get_osinfo(Error **errp)
>
> return info;
> }
> +
> +GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
> +{
> + error_setg(errp, QERR_UNSUPPORTED);
> +
> + return NULL;
> +}
> diff --git a/qga/commands-win32.c b/qga/commands-win32.c
> index 15c9d7944b..48d8bbe649 100644
> --- a/qga/commands-win32.c
> +++ b/qga/commands-win32.c
> @@ -21,10 +21,11 @@
> #ifdef CONFIG_QGA_NTDDSCSI
> #include <winioctl.h>
> #include <ntddscsi.h>
> +#endif
> #include <setupapi.h>
> #include <cfgmgr32.h>
> #include <initguid.h>
> -#endif
> +#include <devpropdef.h>
> #include <lm.h>
> #include <wtsapi32.h>
> #include <wininet.h>
> @@ -39,6 +40,36 @@
> #include "qemu/base64.h"
> #include "commands-common.h"
>
> +/*
> + * The following should be in devpkey.h, but it isn't. The key names were
> + * prefixed to avoid (future) name clashes. Once the definitions get into
> + * mingw the following lines can be removed.
> + */
> +DEFINE_DEVPROPKEY(qga_DEVPKEY_NAME, 0xb725f130, 0x47ef, 0x101a, 0xa5,
> + 0xf1, 0x02, 0x60, 0x8c, 0x9e, 0xeb, 0xac, 10);
> + /* DEVPROP_TYPE_STRING */
> +DEFINE_DEVPROPKEY(qga_DEVPKEY_Device_HardwareIds, 0xa45c254e, 0xdf1c,
> + 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 3);
> + /* DEVPROP_TYPE_STRING_LIST */
> +DEFINE_DEVPROPKEY(qga_DEVPKEY_Device_DriverDate, 0xa8b865dd, 0x2e3d,
> + 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 2);
> + /* DEVPROP_TYPE_FILETIME */
> +DEFINE_DEVPROPKEY(qga_DEVPKEY_Device_DriverVersion, 0xa8b865dd, 0x2e3d,
> + 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6, 3);
> + /* DEVPROP_TYPE_STRING */
> +/* The following shoud be in cfgmgr32.h, but it isn't */
> +#ifndef CM_Get_DevNode_Property
> +CMAPI CONFIGRET WINAPI CM_Get_DevNode_PropertyW(
> + DEVINST dnDevInst,
> + CONST DEVPROPKEY * PropertyKey,
> + DEVPROPTYPE * PropertyType,
> + PBYTE PropertyBuffer,
> + PULONG PropertyBufferSize,
> + ULONG ulFlags
> +);
> +#define CM_Get_DevNode_Property CM_Get_DevNode_PropertyW
> +#endif
Hi!
This is causing a build failure with MSYS2:
https://cirrus-ci.com/task/6371116979585024?command=main#L4583
Any ideas how to fix it?
Thomas
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-09-15 10:10 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-09-14 1:58 [PULL 0/4] qemu-ga patch queue Michael Roth
2020-09-14 1:58 ` [PULL 1/4] qga/commands-posix: Rework build_guest_fsinfo_for_real_device() function Michael Roth
2020-09-14 1:59 ` [PULL 2/4] qga/commands-posix: Move the udev code from the pci to the generic function Michael Roth
2020-09-14 1:59 ` [PULL 3/4] qga/commands-posix: Support fsinfo for non-PCI virtio devices, too Michael Roth
2020-09-14 1:59 ` [PULL 4/4] qga: add command guest-get-devices for reporting VirtIO devices Michael Roth
2020-09-15 10:09 ` Thomas Huth
2020-09-14 11:12 ` [PULL 0/4] qemu-ga patch queue Peter Maydell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).