From: Rusty Russell <rusty@rustcorp.com.au>
To: Fabrice Bellard <fabrice@bellard.org>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] -serial option for 0.6.0
Date: Wed, 18 Aug 2004 21:07:50 +1000 [thread overview]
Message-ID: <1092827270.27348.218.camel@bach> (raw)
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
reply other threads:[~2004-08-18 11:13 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1092827270.27348.218.camel@bach \
--to=rusty@rustcorp.com.au \
--cc=fabrice@bellard.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.