From ceecf1d158d324c61a7ec1ba5de57dbc8a0f8373 Mon Sep 17 00:00:00 2001 From: aurel32 Date: Sun, 18 Jan 2009 14:08:04 +0000 Subject: [PATCH] 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 --- console.c | 2 ++ gdbstub.c | 2 +- hw/mips_malta.c | 33 ++++++++++++++++++++------------- hw/omap1.c | 4 ++-- hw/omap2.c | 2 +- hw/usb-serial.c | 2 +- qemu-char.c | 5 +++-- qemu-char.h | 3 ++- vl.c | 8 ++++---- 9 files changed, 36 insertions(+), 25 deletions(-) diff --git a/console.c b/console.c index b452bca102..6f0f1afade 100644 --- a/console.c +++ b/console.c @@ -1357,6 +1357,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 99a4772954..2921a04ed4 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -2286,7 +2286,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/mips_malta.c b/hw/mips_malta.c index 42f77f1eef..42169bf328 100644 --- a/hw/mips_malta.c +++ b/hw/mips_malta.c @@ -418,7 +418,24 @@ static void malta_fpga_reset(void *opaque) s->display_text[8] = '\0'; snprintf(s->display_text, 9, " "); - malta_fpga_update_display(s); +} + +static void malta_fpga_uart_init(CharDriverState *chr) +{ + qemu_chr_printf(chr, "CBUS UART\r\n"); +} + +static void malta_fpga_led_init(CharDriverState *chr) +{ + qemu_chr_printf(chr, "\e[HMalta LEDBAR\r\n"); + qemu_chr_printf(chr, "+--------+\r\n"); + qemu_chr_printf(chr, "+ +\r\n"); + qemu_chr_printf(chr, "+--------+\r\n"); + qemu_chr_printf(chr, "\n"); + qemu_chr_printf(chr, "Malta ASCII\r\n"); + qemu_chr_printf(chr, "+--------+\r\n"); + qemu_chr_printf(chr, "+ +\r\n"); + qemu_chr_printf(chr, "+--------+\r\n"); } static MaltaFPGAState *malta_fpga_init(target_phys_addr_t base, CPUState *env) @@ -436,19 +453,9 @@ static MaltaFPGAState *malta_fpga_init(target_phys_addr_t base, CPUState *env) /* 0xa00 is less than a page, so will still get the right offsets. */ cpu_register_physical_memory(base + 0xa00, 0x100000 - 0xa00, malta); - s->display = qemu_chr_open("fpga", "vc:320x200"); - qemu_chr_printf(s->display, "\e[HMalta LEDBAR\r\n"); - qemu_chr_printf(s->display, "+--------+\r\n"); - qemu_chr_printf(s->display, "+ +\r\n"); - qemu_chr_printf(s->display, "+--------+\r\n"); - qemu_chr_printf(s->display, "\n"); - qemu_chr_printf(s->display, "Malta ASCII\r\n"); - qemu_chr_printf(s->display, "+--------+\r\n"); - qemu_chr_printf(s->display, "+ +\r\n"); - qemu_chr_printf(s->display, "+--------+\r\n"); + s->display = qemu_chr_open("fpga", "vc:320x200", malta_fpga_led_init); - uart_chr = qemu_chr_open("cbus", "vc:80Cx24C"); - qemu_chr_printf(uart_chr, "CBUS UART\r\n"); + uart_chr = qemu_chr_open("cbus", "vc:80Cx24C", malta_fpga_uart_init); s->uart = serial_mm_init(base + 0x900, 3, env->irq[2], 230400, uart_chr, 1); diff --git a/hw/omap1.c b/hw/omap1.c index 4c79028698..c32d3f7f09 100644 --- a/hw/omap1.c +++ b/hw/omap1.c @@ -1988,7 +1988,7 @@ struct omap_uart_s *omap_uart_init(target_phys_addr_t base, s->fclk = fclk; s->irq = irq; s->serial = serial_mm_init(base, 2, irq, omap_clk_getrate(fclk)/16, - chr ?: qemu_chr_open("null", "null"), 1); + chr ?: qemu_chr_open("null", "null", NULL), 1); return s; } @@ -2104,7 +2104,7 @@ void omap_uart_attach(struct omap_uart_s *s, CharDriverState *chr) /* TODO: Should reuse or destroy current s->serial */ s->serial = serial_mm_init(s->base, 2, s->irq, omap_clk_getrate(s->fclk) / 16, - chr ?: qemu_chr_open("null", "null"), 1); + chr ?: qemu_chr_open("null", "null", NULL), 1); } /* MPU Clock/Reset/Power Mode Control */ diff --git a/hw/omap2.c b/hw/omap2.c index b9f7706096..20b38116ff 100644 --- a/hw/omap2.c +++ b/hw/omap2.c @@ -2161,7 +2161,7 @@ static struct omap_sti_s *omap_sti_init(struct omap_target_agent_s *ta, s->irq = irq; omap_sti_reset(s); - s->chr = chr ?: qemu_chr_open("null", "null"); + s->chr = chr ?: qemu_chr_open("null", "null", NULL); iomemtype = l4_register_io_memory(0, omap_sti_readfn, omap_sti_writefn, s); diff --git a/hw/usb-serial.c b/hw/usb-serial.c index a6a756d957..9dd2c072d0 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.c b/qemu-char.c index 02d4049d0c..ac431c7c5c 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2122,7 +2122,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; @@ -2146,7 +2146,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); @@ -2207,6 +2207,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); } diff --git a/qemu-char.h b/qemu-char.h index c64fc28c2e..bc0fcf3259 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); @@ -61,7 +62,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 34ddc072f7..bfacdcf040 100644 --- a/vl.c +++ b/vl.c @@ -5462,7 +5462,7 @@ int main(int argc, char **argv, char **envp) } 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); @@ -5474,7 +5474,7 @@ int main(int argc, char **argv, char **envp) 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); @@ -5488,7 +5488,7 @@ int main(int argc, char **argv, char **envp) 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); @@ -5502,7 +5502,7 @@ int main(int argc, char **argv, char **envp) if (devname && strcmp(devname, "none")) { char label[32]; snprintf(label, sizeof(label), "virtcon%d", i); - virtcon_hds[i] = qemu_chr_open(label, devname); + virtcon_hds[i] = qemu_chr_open(label, devname, NULL); if (!virtcon_hds[i]) { fprintf(stderr, "qemu: could not open virtio console '%s'\n", devname);