diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index bd5b55c514..989cbc2b7b 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -161,8 +161,6 @@ void hmp_pcie_aer_inject_error(Monitor *mon, const QDict *qdict); #define MAX_SERIAL_PORTS 4 -extern Chardev *serial_hds[MAX_SERIAL_PORTS]; - /* Return the Chardev for serial port i, or NULL if none */ Chardev *serial_hd(int i); diff --git a/vl.c b/vl.c index 6daf026da6..a8a98c5a37 100644 --- a/vl.c +++ b/vl.c @@ -154,7 +154,8 @@ QEMUClockType rtc_clock; int vga_interface_type = VGA_NONE; static DisplayOptions dpy; int no_frame; -Chardev *serial_hds[MAX_SERIAL_PORTS]; +static int num_serial_hds = 0; +static Chardev **serial_hds = NULL; Chardev *parallel_hds[MAX_PARALLEL_PORTS]; Chardev *virtcon_hds[MAX_VIRTIO_CONSOLES]; Chardev *sclp_hds[MAX_SCLP_CONSOLES]; @@ -2496,30 +2497,28 @@ static int foreach_device_config(int type, int (*func)(const char *cmdline)) static int serial_parse(const char *devname) { - static int index = 0; + int index = num_serial_hds; char label[32]; if (strcmp(devname, "none") == 0) return 0; - if (index == MAX_SERIAL_PORTS) { - error_report("too many serial ports"); - exit(1); - } snprintf(label, sizeof(label), "serial%d", index); + serial_hds = g_renew(Chardev *, serial_hds, index + 1); + serial_hds[index] = qemu_chr_new(label, devname); if (!serial_hds[index]) { error_report("could not connect serial device" " to character backend '%s'", devname); return -1; } - index++; + num_serial_hds++; return 0; } Chardev *serial_hd(int i) { assert(i >= 0); - if (i < ARRAY_SIZE(serial_hds)) { + if (i < num_serial_hds) { return serial_hds[i]; } return NULL;