[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH]fix VMX "xm console" issue


  • To: "Ian Pratt" <m+Ian.Pratt@xxxxxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: "Yu, Ping Y" <ping.y.yu@xxxxxxxxx>
  • Date: Wed, 30 Nov 2005 19:09:38 +0800
  • Delivery-date: Wed, 30 Nov 2005 11:09:34 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: AcX0kXm6P3GPNQq0SLeZDjrEEl/V+wAO9f4AAAA+AqAAAy+gEAAwrFNQ
  • Thread-topic: [Xen-devel] [PATCH]fix VMX "xm console" issue

>> >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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.