>> >Please expand upon what this issue with the console client is. Why
>> >hasn't the issue been seen with paravirtualized domains?
>> "xm console" in VMX could not work well now, as we know. We
>> can see the output of the console, but it keeps scrolling
>> like hitting enter.
>> When I investigate this bug, I found that the serial
>> parameter has not been set anywhere, which might be the cause
>> of this issue.
>
>I'd prefer to understand the issue a bit more first/
The issue is the following:
VMX is a unmodified guest OS, and to enable serial output, we should
configure the following items in grub.
console=tty0 console=ttyS0,9600n8
for details please refer to:
http://people.redhat.com/steved/RemoteConsoleNotes.txt
Once we configure ttyS0, VMX will use qemu to create a pty in dom0 directly,
bypassing xenconsoled. To better support serial output, I add parameter setting
function to fix this issue, which is the reason of my patch. :-)
>
>> The VMX console model for VMX is somewhat different with
>> domU's. When the serial port is redirect to pty, write the
>> allocated device to xenstore, then xm console can get it,
>> thus xenconsole is independent of xenconsoled in VMX.
>
>But xenconsole is used by paravirt guests too. What effect does this
>patch have on them?
I tested domU and VMX, and it is fine if parameter setting function is enabled.
>
>Ian
>
>> >
>> >What behaviour does the tcsetattr alter, and why not just set that
>> >particular bit?
>> I found that Minicom can work well in "xm console" VMX, and
>> borrow minicom's behavior to set some parameter for "xen
>> console" and domU is working well too.
>> >
>> >Thanks,
>> >Ian
>> >
>> >>
>> >> # 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
>> >>
>> >>
>> >>
>>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|