diff options
author | David Woodhouse <dwmw@amazon.co.uk> | 2025-01-15 15:46:06 +0000 |
---|---|---|
committer | David Woodhouse <dwmw@amazon.co.uk> | 2025-01-15 17:09:11 +0000 |
commit | 8b44a3e39f36540818d99ef8cf79e64bba1ed9c3 (patch) | |
tree | 499a2294611a728a8d8db22847c23629973b44cd | |
parent | cd414c3f566fdbd98778c1c9a497428a80cd7fdd (diff) | |
download | qemu-8b44a3e39f36540818d99ef8cf79e64bba1ed9c3.zip qemu-8b44a3e39f36540818d99ef8cf79e64bba1ed9c3.tar.gz qemu-8b44a3e39f36540818d99ef8cf79e64bba1ed9c3.tar.bz2 |
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>
-rw-r--r-- | hw/char/xen_console.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/hw/char/xen_console.c b/hw/char/xen_console.c index e619024..d03c188 100644 --- a/hw/char/xen_console.c +++ b/hw/char/xen_console.c @@ -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; + } } } |