Home | History | Annotate | Line # | Download | only in gdb
ser-unix.c revision 1.8
      1  1.1  christos /* Serial interface for local (hardwired) serial ports on Un*x like systems
      2  1.1  christos 
      3  1.8  christos    Copyright (C) 1992-2019 Free Software Foundation, Inc.
      4  1.1  christos 
      5  1.1  christos    This file is part of GDB.
      6  1.1  christos 
      7  1.1  christos    This program is free software; you can redistribute it and/or modify
      8  1.1  christos    it under the terms of the GNU General Public License as published by
      9  1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10  1.1  christos    (at your option) any later version.
     11  1.1  christos 
     12  1.1  christos    This program is distributed in the hope that it will be useful,
     13  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  christos    GNU General Public License for more details.
     16  1.1  christos 
     17  1.1  christos    You should have received a copy of the GNU General Public License
     18  1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19  1.1  christos 
     20  1.1  christos #include "defs.h"
     21  1.1  christos #include "serial.h"
     22  1.1  christos #include "ser-base.h"
     23  1.1  christos #include "ser-unix.h"
     24  1.1  christos 
     25  1.1  christos #include <fcntl.h>
     26  1.1  christos #include <sys/types.h>
     27  1.1  christos #include "terminal.h"
     28  1.1  christos #include <sys/socket.h>
     29  1.8  christos #include "common/gdb_sys_time.h"
     30  1.1  christos 
     31  1.1  christos #include "gdb_select.h"
     32  1.1  christos #include "gdbcmd.h"
     33  1.8  christos #include "common/filestuff.h"
     34  1.8  christos #include <termios.h>
     35  1.8  christos #include "inflow.h"
     36  1.1  christos 
     37  1.1  christos struct hardwire_ttystate
     38  1.1  christos   {
     39  1.1  christos     struct termios termios;
     40  1.1  christos   };
     41  1.1  christos 
     42  1.1  christos #ifdef CRTSCTS
     43  1.1  christos /* Boolean to explicitly enable or disable h/w flow control.  */
     44  1.1  christos static int serial_hwflow;
     45  1.1  christos static void
     46  1.1  christos show_serial_hwflow (struct ui_file *file, int from_tty,
     47  1.1  christos 		    struct cmd_list_element *c, const char *value)
     48  1.1  christos {
     49  1.1  christos   fprintf_filtered (file, _("Hardware flow control is %s.\n"), value);
     50  1.1  christos }
     51  1.1  christos #endif
     52  1.1  christos 
     53  1.1  christos static int hardwire_open (struct serial *scb, const char *name);
     54  1.1  christos static void hardwire_raw (struct serial *scb);
     55  1.1  christos static int rate_to_code (int rate);
     56  1.1  christos static int hardwire_setbaudrate (struct serial *scb, int rate);
     57  1.5  christos static int hardwire_setparity (struct serial *scb, int parity);
     58  1.1  christos static void hardwire_close (struct serial *scb);
     59  1.1  christos static int get_tty_state (struct serial *scb,
     60  1.1  christos 			  struct hardwire_ttystate * state);
     61  1.1  christos static int set_tty_state (struct serial *scb,
     62  1.1  christos 			  struct hardwire_ttystate * state);
     63  1.1  christos static serial_ttystate hardwire_get_tty_state (struct serial *scb);
     64  1.1  christos static int hardwire_set_tty_state (struct serial *scb, serial_ttystate state);
     65  1.1  christos static void hardwire_print_tty_state (struct serial *, serial_ttystate,
     66  1.1  christos 				      struct ui_file *);
     67  1.1  christos static int hardwire_drain_output (struct serial *);
     68  1.1  christos static int hardwire_flush_output (struct serial *);
     69  1.1  christos static int hardwire_flush_input (struct serial *);
     70  1.1  christos static int hardwire_send_break (struct serial *);
     71  1.1  christos static int hardwire_setstopbits (struct serial *, int);
     72  1.1  christos 
     73  1.1  christos /* Open up a real live device for serial I/O.  */
     74  1.1  christos 
     75  1.1  christos static int
     76  1.1  christos hardwire_open (struct serial *scb, const char *name)
     77  1.1  christos {
     78  1.1  christos   scb->fd = gdb_open_cloexec (name, O_RDWR, 0);
     79  1.1  christos   if (scb->fd < 0)
     80  1.1  christos     return -1;
     81  1.1  christos 
     82  1.1  christos   return 0;
     83  1.1  christos }
     84  1.1  christos 
     85  1.1  christos static int
     86  1.1  christos get_tty_state (struct serial *scb, struct hardwire_ttystate *state)
     87  1.1  christos {
     88  1.1  christos   if (tcgetattr (scb->fd, &state->termios) < 0)
     89  1.1  christos     return -1;
     90  1.1  christos 
     91  1.1  christos   return 0;
     92  1.1  christos }
     93  1.1  christos 
     94  1.1  christos static int
     95  1.1  christos set_tty_state (struct serial *scb, struct hardwire_ttystate *state)
     96  1.1  christos {
     97  1.1  christos   if (tcsetattr (scb->fd, TCSANOW, &state->termios) < 0)
     98  1.1  christos     return -1;
     99  1.1  christos 
    100  1.1  christos   return 0;
    101  1.1  christos }
    102  1.1  christos 
    103  1.1  christos static serial_ttystate
    104  1.1  christos hardwire_get_tty_state (struct serial *scb)
    105  1.1  christos {
    106  1.6  christos   struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
    107  1.1  christos 
    108  1.1  christos   if (get_tty_state (scb, state))
    109  1.1  christos     {
    110  1.1  christos       xfree (state);
    111  1.1  christos       return NULL;
    112  1.1  christos     }
    113  1.1  christos 
    114  1.1  christos   return (serial_ttystate) state;
    115  1.1  christos }
    116  1.1  christos 
    117  1.1  christos static serial_ttystate
    118  1.1  christos hardwire_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
    119  1.1  christos {
    120  1.6  christos   struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
    121  1.1  christos 
    122  1.1  christos   *state = *(struct hardwire_ttystate *) ttystate;
    123  1.1  christos 
    124  1.1  christos   return (serial_ttystate) state;
    125  1.1  christos }
    126  1.1  christos 
    127  1.1  christos static int
    128  1.1  christos hardwire_set_tty_state (struct serial *scb, serial_ttystate ttystate)
    129  1.1  christos {
    130  1.1  christos   struct hardwire_ttystate *state;
    131  1.1  christos 
    132  1.1  christos   state = (struct hardwire_ttystate *) ttystate;
    133  1.1  christos 
    134  1.1  christos   return set_tty_state (scb, state);
    135  1.1  christos }
    136  1.1  christos 
    137  1.1  christos static void
    138  1.1  christos hardwire_print_tty_state (struct serial *scb,
    139  1.1  christos 			  serial_ttystate ttystate,
    140  1.1  christos 			  struct ui_file *stream)
    141  1.1  christos {
    142  1.1  christos   struct hardwire_ttystate *state = (struct hardwire_ttystate *) ttystate;
    143  1.1  christos   int i;
    144  1.1  christos 
    145  1.1  christos   fprintf_filtered (stream, "c_iflag = 0x%x, c_oflag = 0x%x,\n",
    146  1.1  christos 		    (int) state->termios.c_iflag,
    147  1.1  christos 		    (int) state->termios.c_oflag);
    148  1.1  christos   fprintf_filtered (stream, "c_cflag = 0x%x, c_lflag = 0x%x\n",
    149  1.1  christos 		    (int) state->termios.c_cflag,
    150  1.1  christos 		    (int) state->termios.c_lflag);
    151  1.1  christos #if 0
    152  1.1  christos   /* This not in POSIX, and is not really documented by those systems
    153  1.1  christos      which have it (at least not Sun).  */
    154  1.1  christos   fprintf_filtered (stream, "c_line = 0x%x.\n", state->termios.c_line);
    155  1.1  christos #endif
    156  1.1  christos   fprintf_filtered (stream, "c_cc: ");
    157  1.1  christos   for (i = 0; i < NCCS; i += 1)
    158  1.1  christos     fprintf_filtered (stream, "0x%x ", state->termios.c_cc[i]);
    159  1.1  christos   fprintf_filtered (stream, "\n");
    160  1.1  christos }
    161  1.1  christos 
    162  1.1  christos /* Wait for the output to drain away, as opposed to flushing
    163  1.1  christos    (discarding) it.  */
    164  1.1  christos 
    165  1.1  christos static int
    166  1.1  christos hardwire_drain_output (struct serial *scb)
    167  1.1  christos {
    168  1.8  christos   /* Ignore SIGTTOU which may occur during the drain.  */
    169  1.8  christos   scoped_ignore_sigttou ignore_sigttou;
    170  1.8  christos 
    171  1.1  christos   return tcdrain (scb->fd);
    172  1.1  christos }
    173  1.1  christos 
    174  1.1  christos static int
    175  1.1  christos hardwire_flush_output (struct serial *scb)
    176  1.1  christos {
    177  1.1  christos   return tcflush (scb->fd, TCOFLUSH);
    178  1.1  christos }
    179  1.1  christos 
    180  1.1  christos static int
    181  1.1  christos hardwire_flush_input (struct serial *scb)
    182  1.1  christos {
    183  1.1  christos   ser_base_flush_input (scb);
    184  1.1  christos 
    185  1.1  christos   return tcflush (scb->fd, TCIFLUSH);
    186  1.1  christos }
    187  1.1  christos 
    188  1.1  christos static int
    189  1.1  christos hardwire_send_break (struct serial *scb)
    190  1.1  christos {
    191  1.1  christos   return tcsendbreak (scb->fd, 0);
    192  1.1  christos }
    193  1.1  christos 
    194  1.1  christos static void
    195  1.1  christos hardwire_raw (struct serial *scb)
    196  1.1  christos {
    197  1.1  christos   struct hardwire_ttystate state;
    198  1.1  christos 
    199  1.1  christos   if (get_tty_state (scb, &state))
    200  1.1  christos     fprintf_unfiltered (gdb_stderr, "get_tty_state failed: %s\n",
    201  1.1  christos 			safe_strerror (errno));
    202  1.1  christos 
    203  1.1  christos   state.termios.c_iflag = 0;
    204  1.1  christos   state.termios.c_oflag = 0;
    205  1.1  christos   state.termios.c_lflag = 0;
    206  1.5  christos   state.termios.c_cflag &= ~CSIZE;
    207  1.1  christos   state.termios.c_cflag |= CLOCAL | CS8;
    208  1.1  christos #ifdef CRTSCTS
    209  1.1  christos   /* h/w flow control.  */
    210  1.1  christos   if (serial_hwflow)
    211  1.1  christos     state.termios.c_cflag |= CRTSCTS;
    212  1.1  christos   else
    213  1.1  christos     state.termios.c_cflag &= ~CRTSCTS;
    214  1.1  christos #ifdef CRTS_IFLOW
    215  1.1  christos   if (serial_hwflow)
    216  1.1  christos     state.termios.c_cflag |= CRTS_IFLOW;
    217  1.1  christos   else
    218  1.1  christos     state.termios.c_cflag &= ~CRTS_IFLOW;
    219  1.1  christos #endif
    220  1.1  christos #endif
    221  1.1  christos   state.termios.c_cc[VMIN] = 0;
    222  1.1  christos   state.termios.c_cc[VTIME] = 0;
    223  1.1  christos 
    224  1.1  christos   if (set_tty_state (scb, &state))
    225  1.1  christos     fprintf_unfiltered (gdb_stderr, "set_tty_state failed: %s\n",
    226  1.1  christos 			safe_strerror (errno));
    227  1.1  christos }
    228  1.1  christos 
    229  1.1  christos #ifndef B19200
    230  1.1  christos #define B19200 EXTA
    231  1.1  christos #endif
    232  1.1  christos 
    233  1.1  christos #ifndef B38400
    234  1.1  christos #define B38400 EXTB
    235  1.1  christos #endif
    236  1.1  christos 
    237  1.1  christos /* Translate baud rates from integers to damn B_codes.  Unix should
    238  1.1  christos    have outgrown this crap years ago, but even POSIX wouldn't buck it.  */
    239  1.1  christos 
    240  1.1  christos static struct
    241  1.1  christos {
    242  1.1  christos   int rate;
    243  1.1  christos   int code;
    244  1.1  christos }
    245  1.1  christos baudtab[] =
    246  1.1  christos {
    247  1.1  christos   {
    248  1.1  christos     50, B50
    249  1.1  christos   }
    250  1.1  christos   ,
    251  1.1  christos   {
    252  1.1  christos     75, B75
    253  1.1  christos   }
    254  1.1  christos   ,
    255  1.1  christos   {
    256  1.1  christos     110, B110
    257  1.1  christos   }
    258  1.1  christos   ,
    259  1.1  christos   {
    260  1.1  christos     134, B134
    261  1.1  christos   }
    262  1.1  christos   ,
    263  1.1  christos   {
    264  1.1  christos     150, B150
    265  1.1  christos   }
    266  1.1  christos   ,
    267  1.1  christos   {
    268  1.1  christos     200, B200
    269  1.1  christos   }
    270  1.1  christos   ,
    271  1.1  christos   {
    272  1.1  christos     300, B300
    273  1.1  christos   }
    274  1.1  christos   ,
    275  1.1  christos   {
    276  1.1  christos     600, B600
    277  1.1  christos   }
    278  1.1  christos   ,
    279  1.1  christos   {
    280  1.1  christos     1200, B1200
    281  1.1  christos   }
    282  1.1  christos   ,
    283  1.1  christos   {
    284  1.1  christos     1800, B1800
    285  1.1  christos   }
    286  1.1  christos   ,
    287  1.1  christos   {
    288  1.1  christos     2400, B2400
    289  1.1  christos   }
    290  1.1  christos   ,
    291  1.1  christos   {
    292  1.1  christos     4800, B4800
    293  1.1  christos   }
    294  1.1  christos   ,
    295  1.1  christos   {
    296  1.1  christos     9600, B9600
    297  1.1  christos   }
    298  1.1  christos   ,
    299  1.1  christos   {
    300  1.1  christos     19200, B19200
    301  1.1  christos   }
    302  1.1  christos   ,
    303  1.1  christos   {
    304  1.1  christos     38400, B38400
    305  1.1  christos   }
    306  1.1  christos   ,
    307  1.1  christos #ifdef B57600
    308  1.1  christos   {
    309  1.1  christos     57600, B57600
    310  1.1  christos   }
    311  1.1  christos   ,
    312  1.1  christos #endif
    313  1.1  christos #ifdef B115200
    314  1.1  christos   {
    315  1.1  christos     115200, B115200
    316  1.1  christos   }
    317  1.1  christos   ,
    318  1.1  christos #endif
    319  1.1  christos #ifdef B230400
    320  1.1  christos   {
    321  1.1  christos     230400, B230400
    322  1.1  christos   }
    323  1.1  christos   ,
    324  1.1  christos #endif
    325  1.1  christos #ifdef B460800
    326  1.1  christos   {
    327  1.1  christos     460800, B460800
    328  1.1  christos   }
    329  1.1  christos   ,
    330  1.1  christos #endif
    331  1.1  christos   {
    332  1.1  christos     -1, -1
    333  1.1  christos   }
    334  1.1  christos   ,
    335  1.1  christos };
    336  1.1  christos 
    337  1.1  christos static int
    338  1.1  christos rate_to_code (int rate)
    339  1.1  christos {
    340  1.1  christos   int i;
    341  1.1  christos 
    342  1.1  christos   for (i = 0; baudtab[i].rate != -1; i++)
    343  1.1  christos     {
    344  1.1  christos       /* test for perfect macth.  */
    345  1.1  christos       if (rate == baudtab[i].rate)
    346  1.1  christos         return baudtab[i].code;
    347  1.1  christos       else
    348  1.1  christos         {
    349  1.1  christos 	  /* check if it is in between valid values.  */
    350  1.1  christos           if (rate < baudtab[i].rate)
    351  1.1  christos 	    {
    352  1.1  christos 	      if (i)
    353  1.1  christos 	        {
    354  1.1  christos 	          warning (_("Invalid baud rate %d.  "
    355  1.1  christos 			     "Closest values are %d and %d."),
    356  1.1  christos 			   rate, baudtab[i - 1].rate, baudtab[i].rate);
    357  1.1  christos 		}
    358  1.1  christos 	      else
    359  1.1  christos 	        {
    360  1.1  christos 	          warning (_("Invalid baud rate %d.  Minimum value is %d."),
    361  1.1  christos 			   rate, baudtab[0].rate);
    362  1.1  christos 		}
    363  1.1  christos 	      return -1;
    364  1.1  christos 	    }
    365  1.1  christos         }
    366  1.1  christos     }
    367  1.1  christos 
    368  1.1  christos   /* The requested speed was too large.  */
    369  1.1  christos   warning (_("Invalid baud rate %d.  Maximum value is %d."),
    370  1.1  christos             rate, baudtab[i - 1].rate);
    371  1.1  christos   return -1;
    372  1.1  christos }
    373  1.1  christos 
    374  1.1  christos static int
    375  1.1  christos hardwire_setbaudrate (struct serial *scb, int rate)
    376  1.1  christos {
    377  1.1  christos   struct hardwire_ttystate state;
    378  1.1  christos   int baud_code = rate_to_code (rate);
    379  1.1  christos 
    380  1.1  christos   if (baud_code < 0)
    381  1.1  christos     {
    382  1.1  christos       /* The baud rate was not valid.
    383  1.1  christos          A warning has already been issued.  */
    384  1.1  christos       errno = EINVAL;
    385  1.1  christos       return -1;
    386  1.1  christos     }
    387  1.1  christos 
    388  1.1  christos   if (get_tty_state (scb, &state))
    389  1.1  christos     return -1;
    390  1.1  christos 
    391  1.1  christos   cfsetospeed (&state.termios, baud_code);
    392  1.1  christos   cfsetispeed (&state.termios, baud_code);
    393  1.1  christos 
    394  1.1  christos   return set_tty_state (scb, &state);
    395  1.1  christos }
    396  1.1  christos 
    397  1.1  christos static int
    398  1.1  christos hardwire_setstopbits (struct serial *scb, int num)
    399  1.1  christos {
    400  1.1  christos   struct hardwire_ttystate state;
    401  1.1  christos   int newbit;
    402  1.1  christos 
    403  1.1  christos   if (get_tty_state (scb, &state))
    404  1.1  christos     return -1;
    405  1.1  christos 
    406  1.1  christos   switch (num)
    407  1.1  christos     {
    408  1.1  christos     case SERIAL_1_STOPBITS:
    409  1.1  christos       newbit = 0;
    410  1.1  christos       break;
    411  1.1  christos     case SERIAL_1_AND_A_HALF_STOPBITS:
    412  1.1  christos     case SERIAL_2_STOPBITS:
    413  1.1  christos       newbit = 1;
    414  1.1  christos       break;
    415  1.1  christos     default:
    416  1.1  christos       return 1;
    417  1.1  christos     }
    418  1.1  christos 
    419  1.1  christos   if (!newbit)
    420  1.1  christos     state.termios.c_cflag &= ~CSTOPB;
    421  1.1  christos   else
    422  1.1  christos     state.termios.c_cflag |= CSTOPB;	/* two bits */
    423  1.1  christos 
    424  1.1  christos   return set_tty_state (scb, &state);
    425  1.1  christos }
    426  1.1  christos 
    427  1.5  christos /* Implement the "setparity" serial_ops callback.  */
    428  1.5  christos 
    429  1.5  christos static int
    430  1.5  christos hardwire_setparity (struct serial *scb, int parity)
    431  1.5  christos {
    432  1.5  christos   struct hardwire_ttystate state;
    433  1.5  christos   int newparity = 0;
    434  1.5  christos 
    435  1.5  christos   if (get_tty_state (scb, &state))
    436  1.5  christos     return -1;
    437  1.5  christos 
    438  1.5  christos   switch (parity)
    439  1.5  christos     {
    440  1.5  christos     case GDBPARITY_NONE:
    441  1.5  christos       newparity = 0;
    442  1.5  christos       break;
    443  1.5  christos     case GDBPARITY_ODD:
    444  1.5  christos       newparity = PARENB | PARODD;
    445  1.5  christos       break;
    446  1.5  christos     case GDBPARITY_EVEN:
    447  1.5  christos       newparity = PARENB;
    448  1.5  christos       break;
    449  1.5  christos     default:
    450  1.5  christos       internal_warning (__FILE__, __LINE__,
    451  1.5  christos 			"Incorrect parity value: %d", parity);
    452  1.5  christos       return -1;
    453  1.5  christos     }
    454  1.5  christos 
    455  1.5  christos   state.termios.c_cflag &= ~(PARENB | PARODD);
    456  1.5  christos   state.termios.c_cflag |= newparity;
    457  1.5  christos 
    458  1.5  christos   return set_tty_state (scb, &state);
    459  1.5  christos }
    460  1.5  christos 
    461  1.5  christos 
    462  1.1  christos static void
    463  1.1  christos hardwire_close (struct serial *scb)
    464  1.1  christos {
    465  1.1  christos   if (scb->fd < 0)
    466  1.1  christos     return;
    467  1.1  christos 
    468  1.1  christos   close (scb->fd);
    469  1.1  christos   scb->fd = -1;
    470  1.1  christos }
    471  1.1  christos 
    472  1.1  christos 
    474  1.1  christos 
    476  1.1  christos /* The hardwire ops.  */
    477  1.1  christos 
    478  1.1  christos static const struct serial_ops hardwire_ops =
    479  1.1  christos {
    480  1.1  christos   "hardwire",
    481  1.1  christos   hardwire_open,
    482  1.7  christos   hardwire_close,
    483  1.1  christos   NULL,
    484  1.1  christos   ser_base_readchar,
    485  1.1  christos   ser_base_write,
    486  1.1  christos   hardwire_flush_output,
    487  1.1  christos   hardwire_flush_input,
    488  1.1  christos   hardwire_send_break,
    489  1.1  christos   hardwire_raw,
    490  1.1  christos   hardwire_get_tty_state,
    491  1.1  christos   hardwire_copy_tty_state,
    492  1.1  christos   hardwire_set_tty_state,
    493  1.1  christos   hardwire_print_tty_state,
    494  1.5  christos   hardwire_setbaudrate,
    495  1.1  christos   hardwire_setstopbits,
    496  1.1  christos   hardwire_setparity,
    497  1.1  christos   hardwire_drain_output,
    498  1.1  christos   ser_base_async,
    499  1.1  christos   ser_unix_read_prim,
    500  1.1  christos   ser_unix_write_prim
    501  1.1  christos };
    502  1.1  christos 
    503  1.1  christos void
    504  1.1  christos _initialize_ser_hardwire (void)
    505  1.1  christos {
    506  1.1  christos   serial_add_interface (&hardwire_ops);
    507  1.1  christos 
    508  1.1  christos #ifdef CRTSCTS
    509  1.1  christos   add_setshow_boolean_cmd ("remoteflow", no_class,
    510  1.1  christos 			   &serial_hwflow, _("\
    511  1.1  christos Set use of hardware flow control for remote serial I/O."), _("\
    512  1.1  christos Show use of hardware flow control for remote serial I/O."), _("\
    513  1.1  christos Enable or disable hardware flow control (RTS/CTS) on the serial port\n\
    514  1.1  christos when debugging using remote targets."),
    515  1.1  christos 			   NULL,
    516  1.1  christos 			   show_serial_hwflow,
    517  1.1  christos 			   &setlist, &showlist);
    518  1.1  christos #endif
    519  1.1  christos }
    520  1.1  christos 
    521  1.1  christos int
    522  1.6  christos ser_unix_read_prim (struct serial *scb, size_t count)
    523  1.1  christos {
    524  1.1  christos   return read (scb->fd, scb->buf, count);
    525  1.1  christos }
    526  1.1  christos 
    527  1.1  christos int
    528  1.1  christos ser_unix_write_prim (struct serial *scb, const void *buf, size_t len)
    529  1.1  christos {
    530                  return write (scb->fd, buf, len);
    531                }
    532