diff mbox series

[08/22] system/vl: more error exit into config enumeration code

Message ID 20250109170619.2271193-9-alex.bennee@linaro.org
State New
Headers show
Series maintainer updates for jan '25 (semihosting, gdb, plugins) | expand

Commit Message

Alex Bennée Jan. 9, 2025, 5:06 p.m. UTC
All of the failures to configure devices will result in QEMU exiting
with an error code. In preparation for passing Error * down the chain
re-name the iterator to foreach_device_config_or_exit and exit using
&error_fatal instead of returning a failure indication.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 system/vl.c | 31 ++++++++++++++++---------------
 1 file changed, 16 insertions(+), 15 deletions(-)

Comments

Pierrick Bouvier Jan. 9, 2025, 6:49 p.m. UTC | #1
On 1/9/25 09:06, Alex Bennée wrote:
> All of the failures to configure devices will result in QEMU exiting
> with an error code. In preparation for passing Error * down the chain
> re-name the iterator to foreach_device_config_or_exit and exit using
> &error_fatal instead of returning a failure indication.
> 
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
>   system/vl.c | 31 ++++++++++++++++---------------
>   1 file changed, 16 insertions(+), 15 deletions(-)
> 
> diff --git a/system/vl.c b/system/vl.c
> index 0843b7ab49..25d9968ccc 100644
> --- a/system/vl.c
> +++ b/system/vl.c
> @@ -1307,7 +1307,14 @@ static void add_device_config(int type, const char *cmdline)
>       QTAILQ_INSERT_TAIL(&device_configs, conf, next);
>   }
>   
> -static int foreach_device_config(int type, int (*func)(const char *cmdline))
> +/**
> + * foreach_device_config_or_exit(): process per-device configs
> + * @type: device_config type
> + * @func: device specific config function, returning pass/fail
> + *
> + * Any failure is fatal and we exit with an error message.
> + */
> +static void foreach_device_config_or_exit(int type, int (*func)(const char *cmdline))
>   {
>       struct device_config *conf;
>       int rc;
> @@ -1319,10 +1326,10 @@ static int foreach_device_config(int type, int (*func)(const char *cmdline))
>           rc = func(conf->cmdline);
>           loc_pop(&conf->loc);
>           if (rc) {
> -            return rc;
> +            error_setg(&error_fatal, "failed to configure: %s", conf->cmdline);
> +            exit(1);
>           }
>       }
> -    return 0;
>   }
>   
>   static void qemu_disable_default_devices(void)
> @@ -2044,12 +2051,9 @@ static void qemu_create_late_backends(void)
>       qemu_opts_foreach(qemu_find_opts("mon"),
>                         mon_init_func, NULL, &error_fatal);
>   
> -    if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
> -        exit(1);
> -    if (foreach_device_config(DEV_PARALLEL, parallel_parse) < 0)
> -        exit(1);
> -    if (foreach_device_config(DEV_DEBUGCON, debugcon_parse) < 0)
> -        exit(1);
> +    foreach_device_config_or_exit(DEV_SERIAL, serial_parse);
> +    foreach_device_config_or_exit(DEV_PARALLEL, parallel_parse);
> +    foreach_device_config_or_exit(DEV_DEBUGCON, debugcon_parse);
>   
>       /* now chardevs have been created we may have semihosting to connect */
>       qemu_semihosting_chardev_init();
> @@ -2670,8 +2674,7 @@ static void qemu_create_cli_devices(void)
>   
>       /* init USB devices */
>       if (machine_usb(current_machine)) {
> -        if (foreach_device_config(DEV_USB, usb_parse) < 0)
> -            exit(1);
> +        foreach_device_config_or_exit(DEV_USB, usb_parse);
>       }
>   
>       /* init generic devices */
> @@ -2718,10 +2721,8 @@ static bool qemu_machine_creation_done(Error **errp)
>           exit(1);
>       }
>   
> -    if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
> -        error_setg(errp, "could not start gdbserver");
> -        return false;
> -    }
> +    foreach_device_config_or_exit(DEV_GDB, gdbserver_start);
> +
>       if (!vga_interface_created && !default_vga &&
>           vga_interface_type != VGA_NONE) {
>           warn_report("A -vga option was passed but this machine "

Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
diff mbox series

Patch

diff --git a/system/vl.c b/system/vl.c
index 0843b7ab49..25d9968ccc 100644
--- a/system/vl.c
+++ b/system/vl.c
@@ -1307,7 +1307,14 @@  static void add_device_config(int type, const char *cmdline)
     QTAILQ_INSERT_TAIL(&device_configs, conf, next);
 }
 
-static int foreach_device_config(int type, int (*func)(const char *cmdline))
+/**
+ * foreach_device_config_or_exit(): process per-device configs
+ * @type: device_config type
+ * @func: device specific config function, returning pass/fail
+ *
+ * Any failure is fatal and we exit with an error message.
+ */
+static void foreach_device_config_or_exit(int type, int (*func)(const char *cmdline))
 {
     struct device_config *conf;
     int rc;
@@ -1319,10 +1326,10 @@  static int foreach_device_config(int type, int (*func)(const char *cmdline))
         rc = func(conf->cmdline);
         loc_pop(&conf->loc);
         if (rc) {
-            return rc;
+            error_setg(&error_fatal, "failed to configure: %s", conf->cmdline);
+            exit(1);
         }
     }
-    return 0;
 }
 
 static void qemu_disable_default_devices(void)
@@ -2044,12 +2051,9 @@  static void qemu_create_late_backends(void)
     qemu_opts_foreach(qemu_find_opts("mon"),
                       mon_init_func, NULL, &error_fatal);
 
-    if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
-        exit(1);
-    if (foreach_device_config(DEV_PARALLEL, parallel_parse) < 0)
-        exit(1);
-    if (foreach_device_config(DEV_DEBUGCON, debugcon_parse) < 0)
-        exit(1);
+    foreach_device_config_or_exit(DEV_SERIAL, serial_parse);
+    foreach_device_config_or_exit(DEV_PARALLEL, parallel_parse);
+    foreach_device_config_or_exit(DEV_DEBUGCON, debugcon_parse);
 
     /* now chardevs have been created we may have semihosting to connect */
     qemu_semihosting_chardev_init();
@@ -2670,8 +2674,7 @@  static void qemu_create_cli_devices(void)
 
     /* init USB devices */
     if (machine_usb(current_machine)) {
-        if (foreach_device_config(DEV_USB, usb_parse) < 0)
-            exit(1);
+        foreach_device_config_or_exit(DEV_USB, usb_parse);
     }
 
     /* init generic devices */
@@ -2718,10 +2721,8 @@  static bool qemu_machine_creation_done(Error **errp)
         exit(1);
     }
 
-    if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
-        error_setg(errp, "could not start gdbserver");
-        return false;
-    }
+    foreach_device_config_or_exit(DEV_GDB, gdbserver_start);
+
     if (!vga_interface_created && !default_vga &&
         vga_interface_type != VGA_NONE) {
         warn_report("A -vga option was passed but this machine "