|
@@ -811,15 +811,15 @@ static void configure_msg(QemuOpts *opts)
|
|
/***********************************************************/
|
|
/***********************************************************/
|
|
/* USB devices */
|
|
/* USB devices */
|
|
|
|
|
|
-static int usb_parse(const char *cmdline)
|
|
|
|
|
|
+static bool usb_parse(const char *cmdline, Error **errp)
|
|
{
|
|
{
|
|
g_assert(machine_usb(current_machine));
|
|
g_assert(machine_usb(current_machine));
|
|
|
|
|
|
if (!usbdevice_create(cmdline)) {
|
|
if (!usbdevice_create(cmdline)) {
|
|
- error_report("could not add USB device '%s'", cmdline);
|
|
|
|
- return -1;
|
|
|
|
|
|
+ error_setg(errp, "could not add USB device '%s'", cmdline);
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
/***********************************************************/
|
|
/***********************************************************/
|
|
@@ -1298,24 +1298,21 @@ static void add_device_config(int type, const char *cmdline)
|
|
* @type: device_config type
|
|
* @type: device_config type
|
|
* @func: device specific config function, returning pass/fail
|
|
* @func: device specific config function, returning pass/fail
|
|
*
|
|
*
|
|
- * Any failure is fatal and we exit with an error message.
|
|
|
|
|
|
+ * @func is called with the &error_fatal handler so device specific
|
|
|
|
+ * error messages can be reported on failure.
|
|
*/
|
|
*/
|
|
static void foreach_device_config_or_exit(int type,
|
|
static void foreach_device_config_or_exit(int type,
|
|
- int (*func)(const char *cmdline))
|
|
|
|
|
|
+ bool (*func)(const char *cmdline,
|
|
|
|
+ Error **errp))
|
|
{
|
|
{
|
|
struct device_config *conf;
|
|
struct device_config *conf;
|
|
- int rc;
|
|
|
|
|
|
|
|
QTAILQ_FOREACH(conf, &device_configs, next) {
|
|
QTAILQ_FOREACH(conf, &device_configs, next) {
|
|
if (conf->type != type)
|
|
if (conf->type != type)
|
|
continue;
|
|
continue;
|
|
loc_push_restore(&conf->loc);
|
|
loc_push_restore(&conf->loc);
|
|
- rc = func(conf->cmdline);
|
|
|
|
|
|
+ func(conf->cmdline, &error_fatal);
|
|
loc_pop(&conf->loc);
|
|
loc_pop(&conf->loc);
|
|
- if (rc) {
|
|
|
|
- error_setg(&error_fatal, "failed to configure: %s", conf->cmdline);
|
|
|
|
- exit(1);
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1446,7 +1443,7 @@ static void qemu_create_default_devices(void)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static int serial_parse(const char *devname)
|
|
|
|
|
|
+static bool serial_parse(const char *devname, Error **errp)
|
|
{
|
|
{
|
|
int index = num_serial_hds;
|
|
int index = num_serial_hds;
|
|
|
|
|
|
@@ -1461,13 +1458,13 @@ static int serial_parse(const char *devname)
|
|
|
|
|
|
serial_hds[index] = qemu_chr_new_mux_mon(label, devname, NULL);
|
|
serial_hds[index] = qemu_chr_new_mux_mon(label, devname, NULL);
|
|
if (!serial_hds[index]) {
|
|
if (!serial_hds[index]) {
|
|
- error_report("could not connect serial device"
|
|
|
|
- " to character backend '%s'", devname);
|
|
|
|
- return -1;
|
|
|
|
|
|
+ error_setg(errp, "could not connect serial device"
|
|
|
|
+ " to character backend '%s'", devname);
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
num_serial_hds++;
|
|
num_serial_hds++;
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
Chardev *serial_hd(int i)
|
|
Chardev *serial_hd(int i)
|
|
@@ -1479,44 +1476,44 @@ Chardev *serial_hd(int i)
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-static int parallel_parse(const char *devname)
|
|
|
|
|
|
+static bool parallel_parse(const char *devname, Error **errp)
|
|
{
|
|
{
|
|
static int index = 0;
|
|
static int index = 0;
|
|
char label[32];
|
|
char label[32];
|
|
|
|
|
|
if (strcmp(devname, "none") == 0)
|
|
if (strcmp(devname, "none") == 0)
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
if (index == MAX_PARALLEL_PORTS) {
|
|
if (index == MAX_PARALLEL_PORTS) {
|
|
- error_report("too many parallel ports");
|
|
|
|
- exit(1);
|
|
|
|
|
|
+ error_setg(errp, "too many parallel ports");
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
snprintf(label, sizeof(label), "parallel%d", index);
|
|
snprintf(label, sizeof(label), "parallel%d", index);
|
|
parallel_hds[index] = qemu_chr_new_mux_mon(label, devname, NULL);
|
|
parallel_hds[index] = qemu_chr_new_mux_mon(label, devname, NULL);
|
|
if (!parallel_hds[index]) {
|
|
if (!parallel_hds[index]) {
|
|
- error_report("could not connect parallel device"
|
|
|
|
- " to character backend '%s'", devname);
|
|
|
|
- return -1;
|
|
|
|
|
|
+ error_setg(errp, "could not connect parallel device"
|
|
|
|
+ " to character backend '%s'", devname);
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
index++;
|
|
index++;
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
-static int debugcon_parse(const char *devname)
|
|
|
|
|
|
+static bool debugcon_parse(const char *devname, Error **errp)
|
|
{
|
|
{
|
|
QemuOpts *opts;
|
|
QemuOpts *opts;
|
|
|
|
|
|
if (!qemu_chr_new_mux_mon("debugcon", devname, NULL)) {
|
|
if (!qemu_chr_new_mux_mon("debugcon", devname, NULL)) {
|
|
- error_report("invalid character backend '%s'", devname);
|
|
|
|
- exit(1);
|
|
|
|
|
|
+ error_setg(errp, "invalid character backend '%s'", devname);
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
opts = qemu_opts_create(qemu_find_opts("device"), "debugcon", 1, NULL);
|
|
opts = qemu_opts_create(qemu_find_opts("device"), "debugcon", 1, NULL);
|
|
if (!opts) {
|
|
if (!opts) {
|
|
- error_report("already have a debugcon device");
|
|
|
|
- exit(1);
|
|
|
|
|
|
+ error_setg(errp, "already have a debugcon device");
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
qemu_opt_set(opts, "driver", "isa-debugcon", &error_abort);
|
|
qemu_opt_set(opts, "driver", "isa-debugcon", &error_abort);
|
|
qemu_opt_set(opts, "chardev", "debugcon", &error_abort);
|
|
qemu_opt_set(opts, "chardev", "debugcon", &error_abort);
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
static gint machine_class_cmp(gconstpointer a, gconstpointer b)
|
|
static gint machine_class_cmp(gconstpointer a, gconstpointer b)
|