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