qemu-devel
[Top][All Lists]
Advanced

[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 */
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]