GDB: Remote target can now accept the form unix::/path/to/socket.
[deliverable/binutils-gdb.git] / gdb / serial.c
CommitLineData
c906108c 1/* Generic serial interface routines
4fcf66da 2
e2882c85 3 Copyright (C) 1992-2018 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include <ctype.h>
22#include "serial.h"
c906108c 23#include "gdbcmd.h"
529480d0 24#include "cli/cli-utils.h"
c906108c 25
c378eb4e 26/* Is serial being debugged? */
2acceee2 27
ccce17b0 28static unsigned int global_serial_debug_p;
2acceee2 29
fcd488ca
TT
30/* Serial I/O handlers. */
31
191cca63 32static std::vector<const struct serial_ops *> serial_ops_list;
c906108c 33
5eb3b062
PA
34/* Pointer to list of scb's. */
35
36static struct serial *scb_base;
37
c906108c 38/* Non-NULL gives filename which contains a recording of the remote session,
c378eb4e 39 suitable for playback by gdbserver. */
c906108c
SS
40
41static char *serial_logfile = NULL;
d9fcf2fb 42static struct ui_file *serial_logfp = NULL;
c906108c 43
fcd488ca 44static const struct serial_ops *serial_interface_lookup (const char *);
3e43a32a
MS
45static void serial_logchar (struct ui_file *stream,
46 int ch_type, int ch, int timeout);
53904c9e
AC
47static const char logbase_hex[] = "hex";
48static const char logbase_octal[] = "octal";
49static const char logbase_ascii[] = "ascii";
40478521 50static const char *const logbase_enums[] =
c5aa993b 51{logbase_hex, logbase_octal, logbase_ascii, NULL};
53904c9e 52static const char *serial_logbase = logbase_ascii;
c906108c 53\f
c5aa993b 54
c906108c
SS
55static int serial_current_type = 0;
56
c378eb4e 57/* Log char CH of type CHTYPE, with TIMEOUT. */
c906108c
SS
58
59/* Define bogus char to represent a BREAK. Should be careful to choose a value
60 that can't be confused with a normal char, or an error code. */
61#define SERIAL_BREAK 1235
62
63static void
d9fcf2fb 64serial_logchar (struct ui_file *stream, int ch_type, int ch, int timeout)
c906108c
SS
65{
66 if (ch_type != serial_current_type)
67 {
2acceee2 68 fprintf_unfiltered (stream, "\n%c ", ch_type);
c906108c
SS
69 serial_current_type = ch_type;
70 }
71
72 if (serial_logbase != logbase_ascii)
2acceee2 73 fputc_unfiltered (' ', stream);
c906108c
SS
74
75 switch (ch)
76 {
77 case SERIAL_TIMEOUT:
2acceee2 78 fprintf_unfiltered (stream, "<Timeout: %d seconds>", timeout);
c906108c
SS
79 return;
80 case SERIAL_ERROR:
2acceee2 81 fprintf_unfiltered (stream, "<Error: %s>", safe_strerror (errno));
c906108c
SS
82 return;
83 case SERIAL_EOF:
2acceee2 84 fputs_unfiltered ("<Eof>", stream);
c906108c
SS
85 return;
86 case SERIAL_BREAK:
2acceee2 87 fputs_unfiltered ("<Break>", stream);
c906108c
SS
88 return;
89 default:
90 if (serial_logbase == logbase_hex)
2acceee2 91 fprintf_unfiltered (stream, "%02x", ch & 0xff);
c906108c 92 else if (serial_logbase == logbase_octal)
2acceee2 93 fprintf_unfiltered (stream, "%03o", ch & 0xff);
c906108c
SS
94 else
95 switch (ch)
96 {
c5aa993b 97 case '\\':
2acceee2 98 fputs_unfiltered ("\\\\", stream);
c5aa993b
JM
99 break;
100 case '\b':
2acceee2 101 fputs_unfiltered ("\\b", stream);
c5aa993b
JM
102 break;
103 case '\f':
2acceee2 104 fputs_unfiltered ("\\f", stream);
c5aa993b
JM
105 break;
106 case '\n':
2acceee2 107 fputs_unfiltered ("\\n", stream);
c5aa993b
JM
108 break;
109 case '\r':
2acceee2 110 fputs_unfiltered ("\\r", stream);
c5aa993b
JM
111 break;
112 case '\t':
2acceee2 113 fputs_unfiltered ("\\t", stream);
c5aa993b
JM
114 break;
115 case '\v':
2acceee2 116 fputs_unfiltered ("\\v", stream);
c5aa993b
JM
117 break;
118 default:
3e43a32a
MS
119 fprintf_unfiltered (stream,
120 isprint (ch) ? "%c" : "\\x%02x", ch & 0xFF);
c5aa993b 121 break;
c906108c
SS
122 }
123 }
124}
125
126void
4ab76ea3 127serial_log_command (struct target_ops *self, const char *cmd)
c906108c
SS
128{
129 if (!serial_logfp)
130 return;
131
132 serial_current_type = 'c';
133
134 fputs_unfiltered ("\nc ", serial_logfp);
135 fputs_unfiltered (cmd, serial_logfp);
136
137 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 138 in case we are getting ready to dump core or something. */
c906108c
SS
139 gdb_flush (serial_logfp);
140}
141
c2c6d25f 142\f
fcd488ca 143static const struct serial_ops *
58f07bae 144serial_interface_lookup (const char *name)
c906108c 145{
71b73764 146 for (const serial_ops *ops : serial_ops_list)
c906108c
SS
147 if (strcmp (name, ops->name) == 0)
148 return ops;
149
150 return NULL;
151}
152
153void
fcd488ca 154serial_add_interface (const struct serial_ops *optable)
c906108c 155{
191cca63 156 serial_ops_list.push_back (optable);
c906108c
SS
157}
158
5eb3b062
PA
159/* Return the open serial device for FD, if found, or NULL if FD is
160 not already opened. */
161
162struct serial *
163serial_for_fd (int fd)
164{
165 struct serial *scb;
166
167 for (scb = scb_base; scb; scb = scb->next)
168 if (scb->fd == fd)
169 return scb;
170
171 return NULL;
172}
173
00340e1b
PA
174/* Create a new serial for OPS. */
175
176static struct serial *
177new_serial (const struct serial_ops *ops)
178{
179 struct serial *scb;
180
181 scb = XCNEW (struct serial);
182
183 scb->ops = ops;
184
185 scb->bufp = scb->buf;
186 scb->error_fd = -1;
187 scb->refcnt = 1;
188
189 return scb;
190}
191
192static struct serial *serial_open_ops_1 (const struct serial_ops *ops,
193 const char *open_name);
194
c378eb4e 195/* Open up a device or a network socket, depending upon the syntax of NAME. */
c906108c 196
819cc324 197struct serial *
c2c6d25f 198serial_open (const char *name)
c906108c 199{
fcd488ca 200 const struct serial_ops *ops;
c2c6d25f 201 const char *open_name = name;
c906108c 202
ca1ca08b 203 if (startswith (name, "|"))
c2c6d25f
JM
204 {
205 ops = serial_interface_lookup ("pipe");
8b9e3a15
VP
206 /* Discard ``|'' and any space before the command itself. */
207 ++open_name;
f1735a53 208 open_name = skip_spaces (open_name);
c2c6d25f 209 }
2821caf1
JB
210 /* Check for a colon, suggesting an IP address/port pair.
211 Do this *after* checking for all the interesting prefixes. We
212 don't want to constrain the syntax of what can follow them. */
88f5cc8c 213 else if (!startswith (name, "unix:") && (strchr (name, ':')))
2821caf1 214 ops = serial_interface_lookup ("tcp");
c906108c 215 else
c1168a2f
JD
216 {
217#ifndef USE_WIN32API
218 /* Check to see if name is a socket. If it is, then treat it
219 as such. Otherwise assume that it's a character device. */
220 struct stat sb;
88f5cc8c
JD
221 if (startswith (name, "unix:") ||
222 (stat (name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFSOCK))
c1168a2f
JD
223 ops = serial_interface_lookup ("local");
224 else
225#endif
226 ops = serial_interface_lookup ("hardwire");
227 }
c906108c
SS
228
229 if (!ops)
230 return NULL;
231
00340e1b
PA
232 return serial_open_ops_1 (ops, open_name);
233}
c906108c 234
00340e1b 235/* Open up a serial for OPS, passing OPEN_NAME to the open method. */
c906108c 236
00340e1b
PA
237static struct serial *
238serial_open_ops_1 (const struct serial_ops *ops, const char *open_name)
239{
240 struct serial *scb;
241
242 scb = new_serial (ops);
c906108c 243
766062f6 244 /* `...->open (...)' would get expanded by the open(2) syscall macro. */
652aaa24 245 if ((*scb->ops->open) (scb, open_name))
c906108c 246 {
b8c9b27d 247 xfree (scb);
c906108c
SS
248 return NULL;
249 }
250
5eb3b062 251 scb->next = scb_base;
5eb3b062 252 scb_base = scb;
c906108c
SS
253
254 if (serial_logfile != NULL)
255 {
d7e74731
PA
256 stdio_file_up file (new stdio_file ());
257
258 if (!file->open (serial_logfile, "w"))
c906108c 259 perror_with_name (serial_logfile);
d7e74731
PA
260
261 serial_logfp = file.release ();
c906108c
SS
262 }
263
264 return scb;
265}
266
00340e1b
PA
267/* See serial.h. */
268
269struct serial *
270serial_open_ops (const struct serial_ops *ops)
271{
272 return serial_open_ops_1 (ops, NULL);
273}
274
58f07bae
PA
275/* Open a new serial stream using a file handle, using serial
276 interface ops OPS. */
277
278static struct serial *
fcd488ca 279serial_fdopen_ops (const int fd, const struct serial_ops *ops)
c906108c 280{
819cc324 281 struct serial *scb;
c906108c 282
0ea3f30e 283 if (!ops)
58f07bae
PA
284 {
285 ops = serial_interface_lookup ("terminal");
286 if (!ops)
287 ops = serial_interface_lookup ("hardwire");
288 }
c906108c
SS
289
290 if (!ops)
291 return NULL;
292
00340e1b 293 scb = new_serial (ops);
c906108c 294
5eb3b062 295 scb->next = scb_base;
5eb3b062 296 scb_base = scb;
c906108c 297
58f07bae
PA
298 if ((ops->fdopen) != NULL)
299 (*ops->fdopen) (scb, fd);
300 else
301 scb->fd = fd;
302
c906108c
SS
303 return scb;
304}
305
58f07bae
PA
306struct serial *
307serial_fdopen (const int fd)
308{
309 return serial_fdopen_ops (fd, NULL);
310}
311
c2c6d25f 312static void
819cc324 313do_serial_close (struct serial *scb, int really_close)
c906108c 314{
819cc324 315 struct serial *tmp_scb;
c906108c 316
c906108c
SS
317 if (serial_logfp)
318 {
319 fputs_unfiltered ("\nEnd of log\n", serial_logfp);
320 serial_current_type = 0;
321
c378eb4e 322 /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */
d7e74731 323 delete serial_logfp;
c906108c
SS
324 serial_logfp = NULL;
325 }
326
c378eb4e 327 /* ensure that the FD has been taken out of async mode. */
c2c6d25f
JM
328 if (scb->async_handler != NULL)
329 serial_async (scb, NULL, NULL);
330
c906108c
SS
331 if (really_close)
332 scb->ops->close (scb);
333
ddefb60f
PA
334 /* For serial_is_open. */
335 scb->bufp = NULL;
336
5eb3b062
PA
337 if (scb_base == scb)
338 scb_base = scb_base->next;
339 else
340 for (tmp_scb = scb_base; tmp_scb; tmp_scb = tmp_scb->next)
341 {
342 if (tmp_scb->next != scb)
343 continue;
344
345 tmp_scb->next = tmp_scb->next->next;
346 break;
347 }
348
ddefb60f 349 serial_unref (scb);
c906108c
SS
350}
351
c2c6d25f 352void
819cc324 353serial_close (struct serial *scb)
c2c6d25f
JM
354{
355 do_serial_close (scb, 1);
356}
357
358void
819cc324 359serial_un_fdopen (struct serial *scb)
c2c6d25f
JM
360{
361 do_serial_close (scb, 0);
362}
363
ddefb60f
PA
364int
365serial_is_open (struct serial *scb)
366{
367 return scb->bufp != NULL;
368}
369
370void
371serial_ref (struct serial *scb)
372{
373 scb->refcnt++;
374}
375
376void
377serial_unref (struct serial *scb)
378{
379 --scb->refcnt;
380 if (scb->refcnt == 0)
381 xfree (scb);
382}
383
c2c6d25f 384int
819cc324 385serial_readchar (struct serial *scb, int timeout)
c2c6d25f
JM
386{
387 int ch;
388
2df3850c 389 /* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC
c378eb4e 390 code is finished. */
2cd58942 391 if (0 && serial_is_async_p (scb) && timeout < 0)
8e65ff28 392 internal_error (__FILE__, __LINE__,
e2e0b3e5 393 _("serial_readchar: blocking read in async mode"));
2df3850c 394
c2c6d25f
JM
395 ch = scb->ops->readchar (scb, timeout);
396 if (serial_logfp != NULL)
397 {
2acceee2 398 serial_logchar (serial_logfp, 'r', ch, timeout);
c2c6d25f
JM
399
400 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 401 in case we are getting ready to dump core or something. */
c2c6d25f
JM
402 gdb_flush (serial_logfp);
403 }
2cd58942 404 if (serial_debug_p (scb))
2acceee2
JM
405 {
406 fprintf_unfiltered (gdb_stdlog, "[");
407 serial_logchar (gdb_stdlog, 'r', ch, timeout);
408 fprintf_unfiltered (gdb_stdlog, "]");
409 gdb_flush (gdb_stdlog);
410 }
c2c6d25f
JM
411
412 return (ch);
413}
414
415int
c628b528 416serial_write (struct serial *scb, const void *buf, size_t count)
c2c6d25f
JM
417{
418 if (serial_logfp != NULL)
419 {
19ba03f4 420 const char *str = (const char *) buf;
c628b528 421 size_t c;
c2c6d25f 422
c628b528
PA
423 for (c = 0; c < count; c++)
424 serial_logchar (serial_logfp, 'w', str[c] & 0xff, 0);
c2c6d25f
JM
425
426 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 427 in case we are getting ready to dump core or something. */
c2c6d25f
JM
428 gdb_flush (serial_logfp);
429 }
9214d371
DE
430 if (serial_debug_p (scb))
431 {
19ba03f4 432 const char *str = (const char *) buf;
c628b528 433 size_t c;
9214d371 434
c628b528 435 for (c = 0; c < count; c++)
9214d371
DE
436 {
437 fprintf_unfiltered (gdb_stdlog, "[");
0e58ee40 438 serial_logchar (gdb_stdlog, 'w', str[c] & 0xff, 0);
9214d371
DE
439 fprintf_unfiltered (gdb_stdlog, "]");
440 }
441 gdb_flush (gdb_stdlog);
442 }
c2c6d25f 443
c628b528 444 return (scb->ops->write (scb, buf, count));
c2c6d25f
JM
445}
446
447void
467dc1e2 448serial_printf (struct serial *desc, const char *format, ...)
c2c6d25f
JM
449{
450 va_list args;
c2c6d25f
JM
451 va_start (args, format);
452
467dc1e2
SM
453 std::string buf = string_vprintf (format, args);
454 serial_write (desc, buf.c_str (), buf.length ());
c2c6d25f 455
c2c6d25f
JM
456 va_end (args);
457}
458
459int
819cc324 460serial_drain_output (struct serial *scb)
c2c6d25f
JM
461{
462 return scb->ops->drain_output (scb);
463}
464
465int
819cc324 466serial_flush_output (struct serial *scb)
c2c6d25f
JM
467{
468 return scb->ops->flush_output (scb);
469}
470
471int
819cc324 472serial_flush_input (struct serial *scb)
c2c6d25f
JM
473{
474 return scb->ops->flush_input (scb);
475}
476
477int
819cc324 478serial_send_break (struct serial *scb)
c2c6d25f
JM
479{
480 if (serial_logfp != NULL)
2acceee2 481 serial_logchar (serial_logfp, 'w', SERIAL_BREAK, 0);
c2c6d25f
JM
482
483 return (scb->ops->send_break (scb));
484}
485
486void
819cc324 487serial_raw (struct serial *scb)
c2c6d25f
JM
488{
489 scb->ops->go_raw (scb);
490}
491
492serial_ttystate
819cc324 493serial_get_tty_state (struct serial *scb)
c2c6d25f
JM
494{
495 return scb->ops->get_tty_state (scb);
496}
497
1e182ce8
UW
498serial_ttystate
499serial_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
500{
501 return scb->ops->copy_tty_state (scb, ttystate);
502}
503
c2c6d25f 504int
819cc324 505serial_set_tty_state (struct serial *scb, serial_ttystate ttystate)
c2c6d25f
JM
506{
507 return scb->ops->set_tty_state (scb, ttystate);
508}
509
510void
819cc324 511serial_print_tty_state (struct serial *scb,
c2c6d25f 512 serial_ttystate ttystate,
d9fcf2fb 513 struct ui_file *stream)
c2c6d25f
JM
514{
515 scb->ops->print_tty_state (scb, ttystate, stream);
516}
517
c2c6d25f 518int
819cc324 519serial_setbaudrate (struct serial *scb, int rate)
c2c6d25f
JM
520{
521 return scb->ops->setbaudrate (scb, rate);
522}
523
524int
819cc324 525serial_setstopbits (struct serial *scb, int num)
c2c6d25f
JM
526{
527 return scb->ops->setstopbits (scb, num);
528}
529
236af5e3
YG
530/* See serial.h. */
531
532int
533serial_setparity (struct serial *scb, int parity)
534{
535 return scb->ops->setparity (scb, parity);
536}
537
c2c6d25f 538int
819cc324 539serial_can_async_p (struct serial *scb)
c2c6d25f
JM
540{
541 return (scb->ops->async != NULL);
542}
543
544int
819cc324 545serial_is_async_p (struct serial *scb)
c2c6d25f
JM
546{
547 return (scb->ops->async != NULL) && (scb->async_handler != NULL);
548}
549
550void
819cc324 551serial_async (struct serial *scb,
c2c6d25f
JM
552 serial_event_ftype *handler,
553 void *context)
554{
05ce04a4 555 int changed = ((scb->async_handler == NULL) != (handler == NULL));
433759f7 556
c2c6d25f
JM
557 scb->async_handler = handler;
558 scb->async_context = context;
05ce04a4
VP
559 /* Only change mode if there is a need. */
560 if (changed)
561 scb->ops->async (scb, handler != NULL);
c2c6d25f
JM
562}
563
2acceee2 564void
819cc324 565serial_debug (struct serial *scb, int debug_p)
2acceee2
JM
566{
567 scb->debug_p = debug_p;
568}
569
570int
819cc324 571serial_debug_p (struct serial *scb)
2acceee2
JM
572{
573 return scb->debug_p || global_serial_debug_p;
574}
575
0ea3f30e
DJ
576#ifdef USE_WIN32API
577void
578serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
579{
580 if (scb->ops->wait_handle)
581 scb->ops->wait_handle (scb, read, except);
582 else
583 {
584 *read = (HANDLE) _get_osfhandle (scb->fd);
585 *except = NULL;
586 }
587}
c3e2b812
DJ
588
589void
590serial_done_wait_handle (struct serial *scb)
591{
592 if (scb->ops->done_wait_handle)
593 scb->ops->done_wait_handle (scb);
594}
0ea3f30e 595#endif
2acceee2 596
58f07bae
PA
597int
598serial_pipe (struct serial *scbs[2])
599{
fcd488ca 600 const struct serial_ops *ops;
58f07bae
PA
601 int fildes[2];
602
603 ops = serial_interface_lookup ("pipe");
604 if (!ops)
605 {
606 errno = ENOSYS;
607 return -1;
608 }
609
610 if (gdb_pipe (fildes) == -1)
611 return -1;
612
613 scbs[0] = serial_fdopen_ops (fildes[0], ops);
614 scbs[1] = serial_fdopen_ops (fildes[1], ops);
615 return 0;
616}
617
e3abfe1d
AC
618/* Serial set/show framework. */
619
620static struct cmd_list_element *serial_set_cmdlist;
621static struct cmd_list_element *serial_show_cmdlist;
622
623static void
981a3fb3 624serial_set_cmd (const char *args, int from_tty)
e3abfe1d 625{
3e43a32a
MS
626 printf_unfiltered ("\"set serial\" must be followed "
627 "by the name of a command.\n");
635c7e8a 628 help_list (serial_set_cmdlist, "set serial ", all_commands, gdb_stdout);
e3abfe1d
AC
629}
630
631static void
981a3fb3 632serial_show_cmd (const char *args, int from_tty)
e3abfe1d
AC
633{
634 cmd_show_list (serial_show_cmdlist, from_tty, "");
635}
636
0d12017b
JB
637/* Baud rate specified for talking to serial target systems. Default
638 is left as -1, so targets can choose their own defaults. */
639/* FIXME: This means that "show serial baud" and gr_files_info can
640 print -1 or (unsigned int)-1. This is a Bad User Interface. */
641
642int baud_rate = -1;
643
644static void
645serial_baud_show_cmd (struct ui_file *file, int from_tty,
646 struct cmd_list_element *c, const char *value)
647{
648 fprintf_filtered (file, _("Baud rate for remote serial I/O is %s.\n"),
649 value);
650}
e3abfe1d 651
236af5e3
YG
652/* Parity for serial port. */
653
654int serial_parity = GDBPARITY_NONE;
655
656static const char parity_none[] = "none";
657static const char parity_odd[] = "odd";
658static const char parity_even[] = "even";
659static const char *const parity_enums[] =
660 {parity_none, parity_odd, parity_even, NULL};
661static const char *parity = parity_none;
662
663/* Set serial_parity value. */
664
665static void
eb4c3f4a 666set_parity (const char *ignore_args, int from_tty, struct cmd_list_element *c)
236af5e3
YG
667{
668 if (parity == parity_odd)
669 serial_parity = GDBPARITY_ODD;
670 else if (parity == parity_even)
671 serial_parity = GDBPARITY_EVEN;
672 else
673 serial_parity = GDBPARITY_NONE;
674}
675
c906108c 676void
c2c6d25f 677_initialize_serial (void)
c906108c
SS
678{
679#if 0
1bedd215
AC
680 add_com ("connect", class_obscure, connect_command, _("\
681Connect the terminal directly up to the command monitor.\n\
682Use <CR>~. or <CR>~^D to break out."));
c906108c
SS
683#endif /* 0 */
684
1bedd215
AC
685 add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\
686Set default serial/parallel port configuration."),
e3abfe1d
AC
687 &serial_set_cmdlist, "set serial ",
688 0/*allow-unknown*/,
689 &setlist);
690
1bedd215
AC
691 add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\
692Show default serial/parallel port configuration."),
e3abfe1d
AC
693 &serial_show_cmdlist, "show serial ",
694 0/*allow-unknown*/,
695 &showlist);
696
0d12017b
JB
697 /* If target is open when baud changes, it doesn't take effect until
698 the next open (I think, not sure). */
699 add_setshow_zinteger_cmd ("baud", no_class, &baud_rate, _("\
700Set baud rate for remote serial I/O."), _("\
701Show baud rate for remote serial I/O."), _("\
702This value is used to set the speed of the serial port when debugging\n\
703using remote targets."),
704 NULL,
705 serial_baud_show_cmd,
706 &serial_set_cmdlist, &serial_show_cmdlist);
707
236af5e3
YG
708 add_setshow_enum_cmd ("parity", no_class, parity_enums,
709 &parity, _("\
710Set parity for remote serial I/O"), _("\
711Show parity for remote serial I/O"), NULL,
712 set_parity,
713 NULL, /* FIXME: i18n: */
714 &serial_set_cmdlist, &serial_show_cmdlist);
715
f397e303
AC
716 add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
717Set filename for remote session recording."), _("\
718Show filename for remote session recording."), _("\
c906108c 719This file is used to record the remote session for future playback\n\
f397e303
AC
720by gdbserver."),
721 NULL,
722 NULL, /* FIXME: i18n: */
723 &setlist, &showlist);
c906108c 724
7ab04401
AC
725 add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
726 &serial_logbase, _("\
727Set numerical base for remote session logging"), _("\
728Show numerical base for remote session logging"), NULL,
729 NULL,
730 NULL, /* FIXME: i18n: */
731 &setlist, &showlist);
2acceee2 732
ccce17b0
YQ
733 add_setshow_zuinteger_cmd ("serial", class_maintenance,
734 &global_serial_debug_p, _("\
85c07804
AC
735Set serial debugging."), _("\
736Show serial debugging."), _("\
737When non-zero, serial port debugging is enabled."),
ccce17b0
YQ
738 NULL,
739 NULL, /* FIXME: i18n: */
740 &setdebuglist, &showdebuglist);
c906108c 741}
This page took 2.218757 seconds and 4 git commands to generate.