From: Ian Jackson Date: Tue, 10 Mar 2009 18:14:19 +0000 (+0000) Subject: add an init function parameter to qemu_chr_open() X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=a3e680f92aa27f1ec3b0ddf5064023b2e7e33b4f;p=xenclient%2Fioemu.git add an init function parameter to qemu_chr_open() And use it for the malta emulation. Fix segfault introduced in revision 6352. Signed-off-by: Aurelien Jarno git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6365 c046a42c-6fe2-441c-8c8c-71466251a162 As adapted by Stefano to qemu-xen-unstable in his posting: [Xen-devel] [PATCH 10 of 13] add an init function parameter to qemu_chr_open() Signed-off-by: Stefano Stabellini --- diff --git a/console.c b/console.c index 93243274..db2ea53c 100644 --- a/console.c +++ b/console.c @@ -1359,6 +1359,8 @@ static void text_console_do_init(CharDriverState *chr, DisplayState *ds, const c text_console_resize(s); qemu_chr_reset(chr); + if (chr->init) + chr->init(chr); } CharDriverState *text_console_init(const char *p) diff --git a/gdbstub.c b/gdbstub.c index c54354cc..a499f7fb 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -1852,7 +1852,7 @@ int gdbserver_start(const char *port) port = gdbstub_port_name; } - chr = qemu_chr_open("gdb", port); + chr = qemu_chr_open("gdb", port, NULL); if (!chr) return -1; diff --git a/hw/usb-serial.c b/hw/usb-serial.c index a6a756d9..9dd2c072 100644 --- a/hw/usb-serial.c +++ b/hw/usb-serial.c @@ -558,7 +558,7 @@ USBDevice *usb_serial_init(const char *filename) return NULL; snprintf(label, sizeof(label), "usbserial%d", index++); - cdrv = qemu_chr_open(label, filename); + cdrv = qemu_chr_open(label, filename, NULL); if (!cdrv) goto fail; s->cs = cdrv; diff --git a/qemu-char.h b/qemu-char.h index 25feaae0..a139f07d 100644 --- a/qemu-char.h +++ b/qemu-char.h @@ -43,6 +43,7 @@ typedef struct { typedef void IOEventHandler(void *opaque, int event); struct CharDriverState { + void (*init)(struct CharDriverState *s); int (*chr_write)(struct CharDriverState *s, const uint8_t *buf, int len); void (*chr_update_read_handler)(struct CharDriverState *s); int (*chr_ioctl)(struct CharDriverState *s, int cmd, void *arg); @@ -62,7 +63,7 @@ struct CharDriverState { TAILQ_ENTRY(CharDriverState) next; }; -CharDriverState *qemu_chr_open(const char *label, const char *filename); +CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*init)(struct CharDriverState *s)); void qemu_chr_close(CharDriverState *chr); void qemu_chr_printf(CharDriverState *s, const char *fmt, ...); int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len); diff --git a/vl.c b/vl.c index e59a15f2..52836d1c 100644 --- a/vl.c +++ b/vl.c @@ -3836,7 +3836,7 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str, static TAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs = TAILQ_HEAD_INITIALIZER(chardevs); -CharDriverState *qemu_chr_open(const char *label, const char *filename) +CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*init)(struct CharDriverState *s)) { const char *p; CharDriverState *chr; @@ -3860,7 +3860,7 @@ CharDriverState *qemu_chr_open(const char *label, const char *filename) chr = qemu_chr_open_udp(p); } else if (strstart(filename, "mon:", &p)) { - chr = qemu_chr_open(label, p); + chr = qemu_chr_open(label, p, NULL); if (chr) { chr = qemu_chr_open_mux(chr); monitor_init(chr, !nographic); @@ -3917,6 +3917,7 @@ CharDriverState *qemu_chr_open(const char *label, const char *filename) if (chr) { if (!chr->filename) chr->filename = qemu_strdup(filename); + chr->init = init; chr->label = qemu_strdup(label); TAILQ_INSERT_TAIL(&chardevs, chr, next); } @@ -10067,7 +10068,7 @@ int main(int argc, char **argv) } if (monitor_device) { - monitor_hd = qemu_chr_open("monitor", monitor_device); + monitor_hd = qemu_chr_open("monitor", monitor_device, NULL); if (!monitor_hd) { fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device); exit(1); @@ -10079,7 +10080,7 @@ int main(int argc, char **argv) if (devname && strcmp(devname, "none")) { char label[32]; snprintf(label, sizeof(label), "serial%d", i); - serial_hds[i] = qemu_chr_open(label, devname); + serial_hds[i] = qemu_chr_open(label, devname, NULL); if (!serial_hds[i]) { fprintf(stderr, "qemu: could not open serial device '%s'\n", devname); @@ -10093,7 +10094,7 @@ int main(int argc, char **argv) if (devname && strcmp(devname, "none")) { char label[32]; snprintf(label, sizeof(label), "parallel%d", i); - parallel_hds[i] = qemu_chr_open(label, devname); + parallel_hds[i] = qemu_chr_open(label, devname, NULL); if (!parallel_hds[i]) { fprintf(stderr, "qemu: could not open parallel device '%s'\n", devname);