From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.33) id 1BxONN-0002bY-T1 for qemu-devel@nongnu.org; Wed, 18 Aug 2004 07:13:06 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.33) id 1BxONN-0002bM-1k for qemu-devel@nongnu.org; Wed, 18 Aug 2004 07:13:05 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.33) id 1BxONM-0002bJ-US for qemu-devel@nongnu.org; Wed, 18 Aug 2004 07:13:05 -0400 Received: from [202.81.18.187] (helo=ausmtp02.au.ibm.com) by monty-python.gnu.org with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.34) id 1BxOIw-00056G-Oh for qemu-devel@nongnu.org; Wed, 18 Aug 2004 07:08:31 -0400 From: Rusty Russell Content-Type: text/plain Message-Id: <1092827270.27348.218.camel@bach> Mime-Version: 1.0 Date: Wed, 18 Aug 2004 21:07:50 +1000 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] -serial option for 0.6.0 Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fabrice Bellard Cc: qemu-devel@nongnu.org I had reason recently to use a tty as a serial console, so I added the "-serial" option. This also allows you to cleanly output the serial to a file while still having a console on stdin. Ideally it would allow use of a real serial port in future. Thanks, Rusty. diff -ur qemu-0.6.0/hw/pc.c qemu-0.6.0-serial/hw/pc.c --- qemu-0.6.0/hw/pc.c 2004-07-11 04:20:09.000000000 +1000 +++ qemu-0.6.0-serial/hw/pc.c 2004-08-18 14:43:35.000000000 +1000 @@ -321,7 +321,7 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename) + const char *initrd_filename, const char *serial_filename) { char buf[1024]; int ret, linux_boot, initrd_size, i, nb_nics1, fd; @@ -471,7 +471,7 @@ pic_init(); pit = pit_init(0x40, 0); - fd = serial_open_device(); + fd = serial_open_device(serial_filename); serial_init(0x3f8, 4, fd); if (pci_enabled) { Only in qemu-0.6.0-serial/hw: pc.c.~1~ diff -ur qemu-0.6.0/hw/ppc.c qemu-0.6.0-serial/hw/ppc.c --- qemu-0.6.0/hw/ppc.c 2004-07-11 04:20:09.000000000 +1000 +++ qemu-0.6.0-serial/hw/ppc.c 2004-08-18 14:44:08.000000000 +1000 @@ -446,16 +446,16 @@ void ppc_init (int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename) + const char *initrd_filename, const char *serial_filename) { if (prep_enabled) { ppc_prep_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, kernel_filename, kernel_cmdline, - initrd_filename); + initrd_filename, serial_filename); } else { ppc_chrp_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, kernel_filename, kernel_cmdline, - initrd_filename); + initrd_filename, serial_filename); } /* Special port to get debug messages from Open-Firmware */ register_ioport_write(0x0F00, 4, 1, &PPC_debug_write, NULL); diff -ur qemu-0.6.0/hw/ppc_chrp.c qemu-0.6.0-serial/hw/ppc_chrp.c --- qemu-0.6.0/hw/ppc_chrp.c 2004-07-11 04:20:09.000000000 +1000 +++ qemu-0.6.0-serial/hw/ppc_chrp.c 2004-08-18 14:44:34.000000000 +1000 @@ -120,7 +120,7 @@ void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename) + const char *initrd_filename, const char *serial_filename) { char buf[1024]; openpic_t *openpic; @@ -200,7 +200,7 @@ pic_init(); /* XXX: use Mac Serial port */ - fd = serial_open_device(); + fd = serial_open_device(serial_filename); serial_init(0x3f8, 4, fd); for(i = 0; i < nb_nics; i++) { Only in qemu-0.6.0-serial/hw: ppc_chrp.c.~1~ diff -ur qemu-0.6.0/hw/ppc_prep.c qemu-0.6.0-serial/hw/ppc_prep.c --- qemu-0.6.0/hw/ppc_prep.c 2004-07-11 04:20:09.000000000 +1000 +++ qemu-0.6.0-serial/hw/ppc_prep.c 2004-08-18 14:44:50.000000000 +1000 @@ -410,7 +410,7 @@ void ppc_prep_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename) + const char *initrd_filename, const char *serial_filename) { char buf[1024]; m48t59_t *nvram; @@ -492,7 +492,7 @@ pic_init(); // pit = pit_init(0x40, 0); - fd = serial_open_device(); + fd = serial_open_device(serial_filename); serial_init(0x3f8, 4, fd); nb_nics1 = nb_nics; if (nb_nics1 > NE2000_NB_MAX) Only in qemu-0.6.0-serial/hw: ppc_prep.c.~1~ diff -ur qemu-0.6.0/hw/serial.c qemu-0.6.0-serial/hw/serial.c --- qemu-0.6.0/hw/serial.c 2004-07-11 04:20:09.000000000 +1000 +++ qemu-0.6.0-serial/hw/serial.c 2004-08-18 21:01:33.000000000 +1000 @@ -125,9 +125,11 @@ if (s->out_fd >= 0) { ch = val; + /* Most likely nonblocking (we do that to stdin), so + * we spin, unless it's really dead. */ do { ret = write(s->out_fd, &ch, 1); - } while (ret != 1); + } while (ret == 0 || (ret < 0 && errno == EAGAIN)); } s->thr_ipending = 1; s->lsr |= UART_LSR_THRE; diff -ur qemu-0.6.0/qemu-doc.texi qemu-0.6.0-serial/qemu-doc.texi --- qemu-0.6.0/qemu-doc.texi 2004-07-11 04:20:09.000000000 +1000 +++ qemu-0.6.0-serial/qemu-doc.texi 2004-08-18 15:07:39.000000000 +1000 @@ -178,6 +178,9 @@ @item -initrd file Use @var{file} as initial ram disk. +@item -serial file +Use @var{file} as serial device: create it for output if neccessary. + @item -nographic Normally, QEMU uses SDL to display the VGA output. With this option, diff -ur qemu-0.6.0/vl.c qemu-0.6.0-serial/vl.c --- qemu-0.6.0/vl.c 2004-07-11 04:20:09.000000000 +1000 +++ qemu-0.6.0-serial/vl.c 2004-08-18 21:03:29.000000000 +1000 @@ -953,36 +953,30 @@ #ifdef _WIN32 -int serial_open_device(void) +int serial_open_device(const char *serial_filename) { return -1; } #else -int serial_open_device(void) +int serial_open_device(const char *serial_filename) { + int fd = -1; + + if (serial_filename) { + fd = open(serial_filename, O_RDWR|O_CREAT, 0666); + if (fd < 0) + fprintf(stderr, "Failed to open serial port %s\n", + serial_filename); + } + if (serial_console == NULL && nographic) { /* use console for serial port */ - return 0; - } else { -#if 0 - char slave_name[1024]; - int master_fd, slave_fd; - - /* Not satisfying */ - if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) { - fprintf(stderr, "warning: could not create pseudo terminal for serial port\n"); - return -1; - } - fprintf(stderr, "Serial port redirected to %s\n", slave_name); - return master_fd; -#else - return -1; -#endif + fd = 0; } + return fd; } - #endif /***********************************************************/ @@ -2169,6 +2163,7 @@ QEMU_OPTION_kernel, QEMU_OPTION_append, QEMU_OPTION_initrd, + QEMU_OPTION_serial, QEMU_OPTION_S, QEMU_OPTION_s, @@ -2220,6 +2215,7 @@ { "kernel", HAS_ARG, QEMU_OPTION_kernel }, { "append", HAS_ARG, QEMU_OPTION_append }, { "initrd", HAS_ARG, QEMU_OPTION_initrd }, + { "serial", HAS_ARG, QEMU_OPTION_serial }, { "S", 0, QEMU_OPTION_S }, { "s", 0, QEMU_OPTION_s }, @@ -2263,7 +2259,7 @@ int i, has_cdrom; int snapshot, linux_boot; CPUState *env; - const char *initrd_filename; + const char *initrd_filename, *serial_filename; const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD]; const char *kernel_filename, *kernel_cmdline; DisplayState *ds = &display_state; @@ -2279,6 +2275,7 @@ mallopt(M_MMAP_THRESHOLD, 4096 * 1024); #endif initrd_filename = NULL; + serial_filename = NULL; for(i = 0; i < MAX_FD; i++) fd_filename[i] = NULL; for(i = 0; i < MAX_DISKS; i++) @@ -2346,6 +2343,9 @@ case QEMU_OPTION_initrd: initrd_filename = optarg; break; + case QEMU_OPTION_serial: + serial_filename = optarg; + break; case QEMU_OPTION_hda: hd_filename[0] = optarg; break; @@ -2798,11 +2798,11 @@ #if defined(TARGET_I386) pc_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, - kernel_filename, kernel_cmdline, initrd_filename); + kernel_filename, kernel_cmdline, initrd_filename, serial_filename); #elif defined(TARGET_PPC) ppc_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, - kernel_filename, kernel_cmdline, initrd_filename); + kernel_filename, kernel_cmdline, initrd_filename, serial_filename); #endif /* launched after the device init so that it can display or not a diff -ur qemu-0.6.0/vl.h qemu-0.6.0-serial/vl.h --- qemu-0.6.0/vl.h 2004-07-11 04:20:09.000000000 +1000 +++ qemu-0.6.0-serial/vl.h 2004-08-18 14:45:35.000000000 +1000 @@ -216,7 +216,7 @@ void pstrcpy(char *buf, int buf_size, const char *str); char *pstrcat(char *buf, int buf_size, const char *s); -int serial_open_device(void); +int serial_open_device(const char *serial_filename); extern int vm_running; @@ -675,21 +675,21 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename); + const char *initrd_filename, const char *serial_filename); /* ppc.c */ void ppc_init (int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename); + const char *initrd_filename, const char *serial_filename); void ppc_prep_init (int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename); + const char *initrd_filename, const char *serial_filename); void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename); + const char *initrd_filename, const char *serial_filename); #ifdef TARGET_PPC ppc_tb_t *cpu_ppc_tb_init (CPUState *env, uint32_t freq); #endif -- Anyone who quotes me in their signature is an idiot -- Rusty Russell