diff -ru qemu-snapshot-2004-08-16_23/hw/pc.c qemu-snapshot-2004-08-16_23-testserial/hw/pc.c --- qemu-snapshot-2004-08-16_23/hw/pc.c 2004-07-15 05:28:12.000000000 +1200 +++ qemu-snapshot-2004-08-16_23-testserial/hw/pc.c 2004-08-18 01:27:58.832976507 +1200 @@ -471,6 +471,9 @@ pic_init(); pit = pit_init(0x40, 0); + if (init_com2_serial_device) { + serial_init(0x2f8, 3, com2_serial_hd); + } serial_init(0x3f8, 4, serial_hd); if (pci_enabled) { Only in qemu-snapshot-2004-08-16_23-testserial: qemu.1 Only in qemu-snapshot-2004-08-16_23-testserial: qemu-doc.html Only in qemu-snapshot-2004-08-16_23-testserial: qemu-tech.html diff -ru qemu-snapshot-2004-08-16_23/vl.c qemu-snapshot-2004-08-16_23-testserial/vl.c --- qemu-snapshot-2004-08-16_23/vl.c 2004-08-04 10:09:30.000000000 +1200 +++ qemu-snapshot-2004-08-16_23-testserial/vl.c 2004-08-18 01:32:40.551758716 +1200 @@ -1222,8 +1222,17 @@ return qemu_chr_open_stdio(); } else #endif - { + if (!strcmp(filename, "NULL")) { + /* Shouldn't ever end up in here */ return NULL; + } else { + int fdesc; + fdesc = open(filename, O_RDWR); + if (fdesc >= 0) { + return qemu_chr_open_fd(fdesc, fdesc); + } else { + return NULL; + } } } @@ -2438,6 +2447,7 @@ QEMU_OPTION_std_vga, QEMU_OPTION_monitor, QEMU_OPTION_serial, + QEMU_OPTION_com2_serial, }; typedef struct QEMUOption { @@ -2491,6 +2501,7 @@ { "std-vga", 0, QEMU_OPTION_std_vga }, { "monitor", 1, QEMU_OPTION_monitor }, { "serial", 1, QEMU_OPTION_serial }, + { "com2-serial", 1, QEMU_OPTION_com2_serial }, /* temporary options */ { "pci", 0, QEMU_OPTION_pci }, @@ -2569,7 +2580,8 @@ CharDriverState *monitor_hd; char monitor_device[128]; char serial_device[128]; - + char com2_serial_device[128]; + #if !defined(CONFIG_SOFTMMU) /* we never want that malloc() uses mmap() */ mallopt(M_MMAP_THRESHOLD, 4096 * 1024); @@ -2595,6 +2607,8 @@ cyls = heads = secs = 0; pstrcpy(monitor_device, sizeof(monitor_device), "vc"); pstrcpy(serial_device, sizeof(serial_device), "vc"); + pstrcpy(com2_serial_device, sizeof(com2_serial_device), "NULL"); + init_com2_serial_device = 0; nb_tun_fds = 0; net_if_type = -1; @@ -2867,6 +2881,10 @@ case QEMU_OPTION_serial: pstrcpy(serial_device, sizeof(serial_device), optarg); break; + case QEMU_OPTION_com2_serial: + pstrcpy(com2_serial_device, sizeof(com2_serial_device), optarg); + init_com2_serial_device = 1; + break; } } } @@ -3065,6 +3083,15 @@ exit(1); } monitor_init(monitor_hd, !nographic); + + if (init_com2_serial_device) + { + com2_serial_hd = qemu_chr_open(com2_serial_device); + if (!com2_serial_hd) { + fprintf(stderr, "qemu: could not open serial device '%s'\n", com2_serial_device); + exit(1); + } + } serial_hd = qemu_chr_open(serial_device); if (!serial_hd) { diff -ru qemu-snapshot-2004-08-16_23/vl.h qemu-snapshot-2004-08-16_23-testserial/vl.h --- qemu-snapshot-2004-08-16_23/vl.h 2004-08-04 09:15:11.000000000 +1200 +++ qemu-snapshot-2004-08-16_23-testserial/vl.h 2004-08-18 01:31:55.037425215 +1200 @@ -201,6 +201,9 @@ void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event); CharDriverState *serial_hd; +CharDriverState *com2_serial_hd; +int init_com2_serial_device; + /* consoles */