hw/xen: Fix errp handling in xen_console

When attempting to read the 'output' node, interpret any error *other*
than ENOENT as a fatal error. For ENOENT, fall back to serial_hd() to
find a character device, or create a null device.

Do not attempt to prepend to errp when serial_hd() fails; the error
isn't relevant (and prior to this change, wasn't set anyway).

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
This commit is contained in:
David Woodhouse 2025-01-15 15:46:06 +00:00
parent cd414c3f56
commit 8b44a3e39f

View file

@ -569,7 +569,7 @@ static void xen_console_device_create(XenBackendInstance *backend,
snprintf(label, sizeof(label), "xencons%ld", number);
output = xs_node_read(xsh, XBT_NULL, NULL, NULL, "%s/%s", fe, "output");
output = xs_node_read(xsh, XBT_NULL, NULL, errp, "%s/%s", fe, "output");
if (output) {
/*
* FIXME: sure we want to support implicit
@ -581,19 +581,27 @@ static void xen_console_device_create(XenBackendInstance *backend,
output);
goto fail;
}
} else if (number) {
cd = serial_hd(number);
if (!cd) {
error_prepend(errp, "console: No serial device #%ld found: ",
number);
goto fail;
}
} else if (errno != ENOENT) {
error_prepend(errp, "console: No valid chardev found: ");
goto fail;
} else {
/* No 'output' node on primary console: use null. */
cd = qemu_chr_new(label, "null", NULL);
if (!cd) {
error_setg(errp, "console: failed to create null device");
goto fail;
error_free(*errp);
*errp = NULL;
if (number) {
cd = serial_hd(number);
if (!cd) {
error_setg(errp, "console: No serial device #%ld found",
number);
goto fail;
}
} else {
/* No 'output' node on primary console: use null. */
cd = qemu_chr_new(label, "null", NULL);
if (!cd) {
error_setg(errp, "console: failed to create null device");
goto fail;
}
}
}