If the device rom can't be read, report an error to the
user. The guest might try to read the rom contents more than
once, so introduce macros that print a message only once and
not clutter up the console. This is to alert the user
that the device has a bad state that is causing rom read
failure or option rom loading has been disabled from the device
boot menu (among other reasons).

Signed-off-by: Bandan Das <b...@redhat.com>
---
 hw/misc/vfio.c              |  7 +++++++
 include/qemu/error-report.h | 20 ++++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
index 9aecaa8..e5b2826 100644
--- a/hw/misc/vfio.c
+++ b/hw/misc/vfio.c
@@ -1125,6 +1125,13 @@ static void vfio_pci_load_rom(VFIODevice *vdev)
     vdev->rom_offset = reg_info.offset;
 
     if (!vdev->rom_size) {
+        error_report_once("vfio-pci: Cannot read device rom at "
+                    "%04x:%02x:%02x.%x\n",
+                    vdev->host.domain, vdev->host.bus, vdev->host.slot,
+                    vdev->host.function);
+        error_printf_once("Device option ROM contents are probably invalid "
+                    "(check dmesg).\nSkip option ROM probe with rombar=0, "
+                    "or load from file with romfile=\n");
         return;
     }
 
diff --git a/include/qemu/error-report.h b/include/qemu/error-report.h
index 3b098a9..7d24e4c 100644
--- a/include/qemu/error-report.h
+++ b/include/qemu/error-report.h
@@ -43,4 +43,24 @@ void error_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
 const char *error_get_progname(void);
 extern bool enable_timestamp_msg;
 
+#define error_printf_once(fmt, ...)             \
+({                                              \
+        static bool __printf_once;              \
+                                                \
+        if (!__printf_once) {                   \
+            __printf_once = true;               \
+            error_printf(fmt, ##__VA_ARGS__);   \
+        }                                       \
+})                                              \
+
+#define error_report_once(fmt, ...)             \
+({                                              \
+        static bool __report_once;              \
+                                                \
+        if (!__report_once) {                   \
+            __report_once = true;               \
+            error_report(fmt, ##__VA_ARGS__);   \
+        }                                       \
+})                                              \
+
 #endif
-- 
1.8.3.1


Reply via email to