[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: Tue, 29 Nov 2005 19:24:37 +0800
  • Delivery-date: Tue, 29 Nov 2005 11:24:36 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: AcX0kXm6P3GPNQq0SLeZDjrEEl/V+wAO9f4AAAJ2fSA=
  • Thread-topic: [Xen-devel] [PATCH]fix VMX "xm console" issue

Sorry the long line, resend again. 

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

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.


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