Hi, all
This patch fixes an issue about VMX "xm console" issue.
"xm console" issue is that the serial parameter has not been set, and I add
a function to set this parameter. Code is mainly borrowed from Minicom and
has been tested both in domU and VMX.
# HG changeset patch
# User Ping Yu <ping.y.yu@xxxxxxxxx>
# Node ID 71111788840f0dd557d7cfc4e919beb511c0237c
# Parent 8451c65671238604e2678a1f44c2f582ec6ebf96
Fix an issue for VMX console.
Add a function to set serial parameter, thus make "xm console" work well
both in domU and VMX
Signed-off-by: Ping Yu <ping.y.yu@xxxxxxxxx>
diff -r 8451c6567123 -r 71111788840f tools/console/client/main.c
--- a/tools/console/client/main.c Wed Nov 23 19:37:33 2005
+++ b/tools/console/client/main.c Mon Nov 28 15:53:17 2005
@@ -87,6 +87,92 @@
tcsetattr(fd, TCSAFLUSH, &new_term);
}
+/* Code borrowed from Minicom
+ * Set baudrate, parity and number of bits
+ */
+static void set_serial_argument(int fd, char *baudr, char *par,
+ char *bits, char *stopb, int hwf, int swf)
+{
+ int spd = -1;
+ int newbaud;
+ int bit = bits[0];
+
+ struct termios tty;
+
+ tcgetattr(fd, &tty);
+
+ /* We generate mark and space parity ourself. */
+ if (bit == '7' && (par[0] == 'M' || par[0] == 'S'))
+ bit = '8';
+
+ /* Check if 'baudr' is really a number */
+ if ((newbaud = (atol(baudr) / 100)) == 0 && baudr[0] != '0')
+ newbaud = -1;
+
+ switch(newbaud) {
+ case 0:
+ case 3: spd = B300; break;
+ case 6: spd = B600; break;
+ case 12: spd = B1200; break;
+ case 24: spd = B2400; break;
+ case 48: spd = B4800; break;
+ case 96: spd = B9600; break;
+ case 192: spd = B19200; break;
+ case 384: spd = B38400; break;
+ case 576: spd = B57600; break;
+ case 1152: spd = B115200; break;
+ case 2304: spd = B230400; break;
+ }
+
+ if (spd != -1) {
+ cfsetospeed(&tty, (speed_t)spd);
+ cfsetispeed(&tty, (speed_t)spd);
+ }
+
+ switch (bit) {
+ case '5':
+ tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5;
+ break;
+ case '6':
+ tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6;
+ break;
+ case '7':
+ tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7;
+ break;
+ case '8':
+ default:
+ tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
+ break;
+ }
+
+ /* Set into raw, no echo mode */
+ tty.c_iflag = IGNBRK;
+ tty.c_lflag = 0;
+ tty.c_oflag = 0;
+ tty.c_cflag |= CLOCAL | CREAD;
+ tty.c_cc[VMIN] = 1;
+ tty.c_cc[VTIME] = 5;
+
+ if (swf)
+ tty.c_iflag |= IXON | IXOFF;
+ else
+ tty.c_iflag &= ~(IXON|IXOFF|IXANY);
+
+ tty.c_cflag &= ~(PARENB | PARODD);
+ if (par[0] == 'E')
+ tty.c_cflag |= PARENB;
+ else if (par[0] == 'O')
+ tty.c_cflag |= (PARENB | PARODD);
+
+ if (stopb[0] == '2')
+ tty.c_cflag |= CSTOPB;
+ else
+ tty.c_cflag &= ~CSTOPB;
+
+ tcsetattr(fd, TCSANOW, &tty);
+
+}
+
static void restore_term(int fd, struct termios *old)
{
tcsetattr(fd, TCSAFLUSH, old);
@@ -260,6 +346,7 @@
free(path);
init_term(STDIN_FILENO, &attr);
+ set_serial_argument(spty, "115200", "N", "8", "1", 1, 0);
console_loop(xc_handle, domid, spty);
restore_term(STDIN_FILENO, &attr);
Sincerely Yours
Yu Ping
xm_console.patch
Description: xm_console.patch
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|