[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] Add info commands for serial/parallel devices
From: |
Anthony Liguori |
Subject: |
[Qemu-devel] [PATCH] Add info commands for serial/parallel devices |
Date: |
Sat, 03 Mar 2007 21:38:16 -0600 |
User-agent: |
Thunderbird 1.5.0.9 (X11/20070103) |
Howdy,
The following patch adds an info serial and an info parallel command.
Besides providing useful information (especially for the serial port),
it provides a method for management tools to connect to a running VM and
what character devices the serial/parallel ports have been redirected to.
The format of the info is similar to that of info block.
Regards,
Anthony Liguori
diff -r 18e99d1e8814 hw/parallel.c
--- a/hw/parallel.c Sat Mar 03 21:18:48 2007 -0600
+++ b/hw/parallel.c Sat Mar 03 21:33:07 2007 -0600
@@ -73,6 +73,11 @@ struct ParallelState {
uint32_t last_read_offset; /* For debugging */
};
+void do_info_parallel_device(ParallelState *s)
+{
+ term_printf(" filename=%s", s->chr->filename);
+}
+
static void parallel_update_irq(ParallelState *s)
{
if (s->irq_pending)
diff -r 18e99d1e8814 hw/pc.c
--- a/hw/pc.c Sat Mar 03 21:18:48 2007 -0600
+++ b/hw/pc.c Sat Mar 03 21:33:07 2007 -0600
@@ -442,6 +442,34 @@ static void pc_init_ne2k_isa(NICInfo *nd
nb_ne2k++;
}
+static SerialState *serial_devices[MAX_SERIAL_PORTS];
+
+void do_info_serial(void)
+{
+ int i;
+ for (i = 0; i < MAX_SERIAL_PORTS; i++) {
+ if (serial_devices[i]) {
+ term_printf("serial%d:", i);
+ do_info_serial_device(serial_devices[i]);
+ term_printf("\n");
+ }
+ }
+}
+
+static ParallelState *parallel_devices[MAX_PARALLEL_PORTS];
+
+void do_info_parallel(void)
+{
+ int i;
+ for (i = 0; i < MAX_PARALLEL_PORTS; i++) {
+ if (parallel_devices[i]) {
+ term_printf("parallel%d:", i);
+ do_info_parallel_device(parallel_devices[i]);
+ term_printf("\n");
+ }
+ }
+}
+
/* PC hardware initialisation */
static void pc_init1(int ram_size, int vga_ram_size, int boot_device,
DisplayState *ds, const char **fd_filename, int snapshot,
@@ -668,14 +696,14 @@ static void pc_init1(int ram_size, int v
for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
- serial_init(&pic_set_irq_new, isa_pic,
- serial_io[i], serial_irq[i], serial_hds[i]);
+ serial_devices[i] = serial_init(&pic_set_irq_new, isa_pic,
+ serial_io[i], serial_irq[i],
serial_hds[i]);
}
}
for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
if (parallel_hds[i]) {
- parallel_init(parallel_io[i], parallel_irq[i], parallel_hds[i]);
+ parallel_devices[i] = parallel_init(parallel_io[i],
parallel_irq[i], parallel_hds[i]);
}
}
diff -r 18e99d1e8814 hw/serial.c
--- a/hw/serial.c Sat Mar 03 21:18:48 2007 -0600
+++ b/hw/serial.c Sat Mar 03 21:33:07 2007 -0600
@@ -92,6 +92,31 @@ struct SerialState {
int it_shift;
};
+void do_info_serial_device(SerialState *s)
+{
+ int parity;
+
+ if (!s)
+ return;
+
+ term_printf(" filename=");
+ term_print_filename(s->chr->filename);
+
+ if (s->lcr & 0x08) {
+ if (s->lcr & 0x10)
+ parity = 'E';
+ else
+ parity = 'O';
+ } else
+ parity = 'N';
+
+ if (s->divider)
+ term_printf(" speed=%d", 115200 / s->divider);
+ term_printf(" parity=%c", parity);
+ term_printf(" data bits=%d", (s->lcr & 0x03) + 5);
+ term_printf(" stop bits=%d", (s->lcr & 0x04) ? 2 : 1);
+}
+
static void serial_update_irq(SerialState *s)
{
if ((s->lsr & UART_LSR_DR) && (s->ier & UART_IER_RDI)) {
diff -r 18e99d1e8814 monitor.c
--- a/monitor.c Sat Mar 03 21:18:48 2007 -0600
+++ b/monitor.c Sat Mar 03 21:33:07 2007 -0600
@@ -1311,6 +1311,10 @@ static term_cmd_t info_cmds[] = {
"", "show the vnc server status"},
{ "name", "", do_info_name,
"", "show the current VM name" },
+ { "serial", "", do_info_serial,
+ "", "show serial device information" },
+ { "parallel", "", do_info_parallel,
+ "", "show parallel device information" },
{ NULL, NULL, },
};
diff -r 18e99d1e8814 vl.c
--- a/vl.c Sat Mar 03 21:18:48 2007 -0600
+++ b/vl.c Sat Mar 03 21:33:07 2007 -0600
@@ -2884,66 +2884,73 @@ CharDriverState *qemu_chr_open(const cha
CharDriverState *qemu_chr_open(const char *filename)
{
const char *p;
+ CharDriverState *chr;
if (!strcmp(filename, "vc")) {
- return text_console_init(&display_state);
+ chr = text_console_init(&display_state);
} else if (!strcmp(filename, "null")) {
- return qemu_chr_open_null();
+ chr = qemu_chr_open_null();
} else
if (strstart(filename, "tcp:", &p)) {
- return qemu_chr_open_tcp(p, 0, 0);
+ chr = qemu_chr_open_tcp(p, 0, 0);
} else
if (strstart(filename, "telnet:", &p)) {
- return qemu_chr_open_tcp(p, 1, 0);
+ chr = qemu_chr_open_tcp(p, 1, 0);
} else
if (strstart(filename, "udp:", &p)) {
- return qemu_chr_open_udp(p);
+ chr = qemu_chr_open_udp(p);
} else
if (strstart(filename, "mon:", &p)) {
CharDriverState *drv = qemu_chr_open(p);
if (drv) {
drv = qemu_chr_open_mux(drv);
monitor_init(drv, !nographic);
- return drv;
- }
- printf("Unable to open driver: %s\n", p);
- return 0;
+ chr = drv;
+ } else {
+ printf("Unable to open driver: %s\n", p);
+ return 0;
+ }
} else
#ifndef _WIN32
if (strstart(filename, "unix:", &p)) {
- return qemu_chr_open_tcp(p, 0, 1);
+ chr = qemu_chr_open_tcp(p, 0, 1);
} else if (strstart(filename, "file:", &p)) {
- return qemu_chr_open_file_out(p);
+ chr = qemu_chr_open_file_out(p);
} else if (strstart(filename, "pipe:", &p)) {
- return qemu_chr_open_pipe(p);
+ chr = qemu_chr_open_pipe(p);
} else if (!strcmp(filename, "pty")) {
- return qemu_chr_open_pty();
+ chr = qemu_chr_open_pty();
} else if (!strcmp(filename, "stdio")) {
- return qemu_chr_open_stdio();
+ chr = qemu_chr_open_stdio();
} else
#endif
#if defined(__linux__)
if (strstart(filename, "/dev/parport", NULL)) {
- return qemu_chr_open_pp(filename);
+ chr = qemu_chr_open_pp(filename);
} else
if (strstart(filename, "/dev/", NULL)) {
- return qemu_chr_open_tty(filename);
+ chr = qemu_chr_open_tty(filename);
} else
#endif
#ifdef _WIN32
if (strstart(filename, "COM", NULL)) {
- return qemu_chr_open_win(filename);
+ chr = qemu_chr_open_win(filename);
} else
if (strstart(filename, "pipe:", &p)) {
- return qemu_chr_open_win_pipe(p);
+ chr = qemu_chr_open_win_pipe(p);
} else
if (strstart(filename, "file:", &p)) {
- return qemu_chr_open_win_file_out(p);
- }
+ chr = qemu_chr_open_win_file_out(p);
+ } else
#endif
{
return NULL;
}
+
+ if (chr)
+ chr->filename = strdup(filename);
+
+ return chr;
}
void qemu_chr_close(CharDriverState *chr)
diff -r 18e99d1e8814 vl.h
--- a/vl.h Sat Mar 03 21:18:48 2007 -0600
+++ b/vl.h Sat Mar 03 21:33:07 2007 -0600
@@ -307,6 +307,7 @@ typedef struct CharDriverState {
void *opaque;
int focus;
QEMUBH *bh;
+ char *filename;
} CharDriverState;
CharDriverState *qemu_chr_open(const char *filename);
@@ -1019,10 +1020,16 @@ SerialState *serial_mm_init (SetIRQFunc
target_ulong base, int it_shift,
int irq, CharDriverState *chr);
+void do_info_serial_device(SerialState *s);
+void do_info_serial(void);
+
/* parallel.c */
typedef struct ParallelState ParallelState;
ParallelState *parallel_init(int base, int irq, CharDriverState *chr);
+
+void do_info_parallel_device(ParallelState *s);
+void do_info_parallel(void);
/* i8259.c */
- [Qemu-devel] [PATCH] Add info commands for serial/parallel devices,
Anthony Liguori <=