gdb/testsuite/gdb.base/stap-probe: Minor clean-up
[deliverable/binutils-gdb.git] / gdb / serial.c
CommitLineData
c906108c 1/* Generic serial interface routines
4fcf66da 2
b811d2c2 3 Copyright (C) 1992-2020 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. */
431f22cc 213 else if (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;
431f22cc 221 if (stat (name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFSOCK)
c1168a2f
JD
222 ops = serial_interface_lookup ("local");
223 else
224#endif
225 ops = serial_interface_lookup ("hardwire");
226 }
c906108c
SS
227
228 if (!ops)
229 return NULL;
230
00340e1b
PA
231 return serial_open_ops_1 (ops, open_name);
232}
c906108c 233
00340e1b 234/* Open up a serial for OPS, passing OPEN_NAME to the open method. */
c906108c 235
00340e1b
PA
236static struct serial *
237serial_open_ops_1 (const struct serial_ops *ops, const char *open_name)
238{
239 struct serial *scb;
240
241 scb = new_serial (ops);
c906108c 242
766062f6 243 /* `...->open (...)' would get expanded by the open(2) syscall macro. */
652aaa24 244 if ((*scb->ops->open) (scb, open_name))
c906108c 245 {
b8c9b27d 246 xfree (scb);
c906108c
SS
247 return NULL;
248 }
249
5eb3b062 250 scb->next = scb_base;
5eb3b062 251 scb_base = scb;
c906108c
SS
252
253 if (serial_logfile != NULL)
254 {
d7e74731
PA
255 stdio_file_up file (new stdio_file ());
256
257 if (!file->open (serial_logfile, "w"))
c906108c 258 perror_with_name (serial_logfile);
d7e74731
PA
259
260 serial_logfp = file.release ();
c906108c
SS
261 }
262
263 return scb;
264}
265
00340e1b
PA
266/* See serial.h. */
267
268struct serial *
269serial_open_ops (const struct serial_ops *ops)
270{
271 return serial_open_ops_1 (ops, NULL);
272}
273
58f07bae
PA
274/* Open a new serial stream using a file handle, using serial
275 interface ops OPS. */
276
277static struct serial *
fcd488ca 278serial_fdopen_ops (const int fd, const struct serial_ops *ops)
c906108c 279{
819cc324 280 struct serial *scb;
c906108c 281
0ea3f30e 282 if (!ops)
58f07bae
PA
283 {
284 ops = serial_interface_lookup ("terminal");
285 if (!ops)
286 ops = serial_interface_lookup ("hardwire");
287 }
c906108c
SS
288
289 if (!ops)
290 return NULL;
291
00340e1b 292 scb = new_serial (ops);
c906108c 293
5eb3b062 294 scb->next = scb_base;
5eb3b062 295 scb_base = scb;
c906108c 296
58f07bae
PA
297 if ((ops->fdopen) != NULL)
298 (*ops->fdopen) (scb, fd);
299 else
300 scb->fd = fd;
301
c906108c
SS
302 return scb;
303}
304
58f07bae
PA
305struct serial *
306serial_fdopen (const int fd)
307{
308 return serial_fdopen_ops (fd, NULL);
309}
310
c2c6d25f 311static void
819cc324 312do_serial_close (struct serial *scb, int really_close)
c906108c 313{
819cc324 314 struct serial *tmp_scb;
c906108c 315
c906108c
SS
316 if (serial_logfp)
317 {
318 fputs_unfiltered ("\nEnd of log\n", serial_logfp);
319 serial_current_type = 0;
320
c378eb4e 321 /* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */
d7e74731 322 delete serial_logfp;
c906108c
SS
323 serial_logfp = NULL;
324 }
325
c378eb4e 326 /* ensure that the FD has been taken out of async mode. */
c2c6d25f
JM
327 if (scb->async_handler != NULL)
328 serial_async (scb, NULL, NULL);
329
c906108c
SS
330 if (really_close)
331 scb->ops->close (scb);
332
ddefb60f
PA
333 /* For serial_is_open. */
334 scb->bufp = NULL;
335
5eb3b062
PA
336 if (scb_base == scb)
337 scb_base = scb_base->next;
338 else
339 for (tmp_scb = scb_base; tmp_scb; tmp_scb = tmp_scb->next)
340 {
341 if (tmp_scb->next != scb)
342 continue;
343
344 tmp_scb->next = tmp_scb->next->next;
345 break;
346 }
347
ddefb60f 348 serial_unref (scb);
c906108c
SS
349}
350
c2c6d25f 351void
819cc324 352serial_close (struct serial *scb)
c2c6d25f
JM
353{
354 do_serial_close (scb, 1);
355}
356
357void
819cc324 358serial_un_fdopen (struct serial *scb)
c2c6d25f
JM
359{
360 do_serial_close (scb, 0);
361}
362
ddefb60f
PA
363int
364serial_is_open (struct serial *scb)
365{
366 return scb->bufp != NULL;
367}
368
369void
370serial_ref (struct serial *scb)
371{
372 scb->refcnt++;
373}
374
375void
376serial_unref (struct serial *scb)
377{
378 --scb->refcnt;
379 if (scb->refcnt == 0)
380 xfree (scb);
381}
382
c2c6d25f 383int
819cc324 384serial_readchar (struct serial *scb, int timeout)
c2c6d25f
JM
385{
386 int ch;
387
2df3850c 388 /* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC
c378eb4e 389 code is finished. */
2cd58942 390 if (0 && serial_is_async_p (scb) && timeout < 0)
8e65ff28 391 internal_error (__FILE__, __LINE__,
e2e0b3e5 392 _("serial_readchar: blocking read in async mode"));
2df3850c 393
c2c6d25f
JM
394 ch = scb->ops->readchar (scb, timeout);
395 if (serial_logfp != NULL)
396 {
2acceee2 397 serial_logchar (serial_logfp, 'r', ch, timeout);
c2c6d25f
JM
398
399 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 400 in case we are getting ready to dump core or something. */
c2c6d25f
JM
401 gdb_flush (serial_logfp);
402 }
2cd58942 403 if (serial_debug_p (scb))
2acceee2
JM
404 {
405 fprintf_unfiltered (gdb_stdlog, "[");
406 serial_logchar (gdb_stdlog, 'r', ch, timeout);
407 fprintf_unfiltered (gdb_stdlog, "]");
408 gdb_flush (gdb_stdlog);
409 }
c2c6d25f
JM
410
411 return (ch);
412}
413
414int
c628b528 415serial_write (struct serial *scb, const void *buf, size_t count)
c2c6d25f
JM
416{
417 if (serial_logfp != NULL)
418 {
19ba03f4 419 const char *str = (const char *) buf;
c628b528 420 size_t c;
c2c6d25f 421
c628b528
PA
422 for (c = 0; c < count; c++)
423 serial_logchar (serial_logfp, 'w', str[c] & 0xff, 0);
c2c6d25f
JM
424
425 /* Make sure that the log file is as up-to-date as possible,
c378eb4e 426 in case we are getting ready to dump core or something. */
c2c6d25f
JM
427 gdb_flush (serial_logfp);
428 }
9214d371
DE
429 if (serial_debug_p (scb))
430 {
19ba03f4 431 const char *str = (const char *) buf;
c628b528 432 size_t c;
9214d371 433
c628b528 434 for (c = 0; c < count; c++)
9214d371
DE
435 {
436 fprintf_unfiltered (gdb_stdlog, "[");
0e58ee40 437 serial_logchar (gdb_stdlog, 'w', str[c] & 0xff, 0);
9214d371
DE
438 fprintf_unfiltered (gdb_stdlog, "]");
439 }
440 gdb_flush (gdb_stdlog);
441 }
c2c6d25f 442
c628b528 443 return (scb->ops->write (scb, buf, count));
c2c6d25f
JM
444}
445
446void
467dc1e2 447serial_printf (struct serial *desc, const char *format, ...)
c2c6d25f
JM
448{
449 va_list args;
c2c6d25f
JM
450 va_start (args, format);
451
467dc1e2
SM
452 std::string buf = string_vprintf (format, args);
453 serial_write (desc, buf.c_str (), buf.length ());
c2c6d25f 454
c2c6d25f
JM
455 va_end (args);
456}
457
458int
819cc324 459serial_drain_output (struct serial *scb)
c2c6d25f
JM
460{
461 return scb->ops->drain_output (scb);
462}
463
464int
819cc324 465serial_flush_output (struct serial *scb)
c2c6d25f
JM
466{
467 return scb->ops->flush_output (scb);
468}
469
470int
819cc324 471serial_flush_input (struct serial *scb)
c2c6d25f
JM
472{
473 return scb->ops->flush_input (scb);
474}
475
476int
819cc324 477serial_send_break (struct serial *scb)
c2c6d25f
JM
478{
479 if (serial_logfp != NULL)
2acceee2 480 serial_logchar (serial_logfp, 'w', SERIAL_BREAK, 0);
c2c6d25f
JM
481
482 return (scb->ops->send_break (scb));
483}
484
485void
819cc324 486serial_raw (struct serial *scb)
c2c6d25f
JM
487{
488 scb->ops->go_raw (scb);
489}
490
491serial_ttystate
819cc324 492serial_get_tty_state (struct serial *scb)
c2c6d25f
JM
493{
494 return scb->ops->get_tty_state (scb);
495}
496
1e182ce8
UW
497serial_ttystate
498serial_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
499{
500 return scb->ops->copy_tty_state (scb, ttystate);
501}
502
c2c6d25f 503int
819cc324 504serial_set_tty_state (struct serial *scb, serial_ttystate ttystate)
c2c6d25f
JM
505{
506 return scb->ops->set_tty_state (scb, ttystate);
507}
508
509void
819cc324 510serial_print_tty_state (struct serial *scb,
c2c6d25f 511 serial_ttystate ttystate,
d9fcf2fb 512 struct ui_file *stream)
c2c6d25f
JM
513{
514 scb->ops->print_tty_state (scb, ttystate, stream);
515}
516
c2c6d25f 517int
819cc324 518serial_setbaudrate (struct serial *scb, int rate)
c2c6d25f
JM
519{
520 return scb->ops->setbaudrate (scb, rate);
521}
522
523int
819cc324 524serial_setstopbits (struct serial *scb, int num)
c2c6d25f
JM
525{
526 return scb->ops->setstopbits (scb, num);
527}
528
236af5e3
YG
529/* See serial.h. */
530
531int
532serial_setparity (struct serial *scb, int parity)
533{
534 return scb->ops->setparity (scb, parity);
535}
536
c2c6d25f 537int
819cc324 538serial_can_async_p (struct serial *scb)
c2c6d25f
JM
539{
540 return (scb->ops->async != NULL);
541}
542
543int
819cc324 544serial_is_async_p (struct serial *scb)
c2c6d25f
JM
545{
546 return (scb->ops->async != NULL) && (scb->async_handler != NULL);
547}
548
549void
819cc324 550serial_async (struct serial *scb,
c2c6d25f
JM
551 serial_event_ftype *handler,
552 void *context)
553{
05ce04a4 554 int changed = ((scb->async_handler == NULL) != (handler == NULL));
433759f7 555
c2c6d25f
JM
556 scb->async_handler = handler;
557 scb->async_context = context;
05ce04a4
VP
558 /* Only change mode if there is a need. */
559 if (changed)
560 scb->ops->async (scb, handler != NULL);
c2c6d25f
JM
561}
562
2acceee2 563void
819cc324 564serial_debug (struct serial *scb, int debug_p)
2acceee2
JM
565{
566 scb->debug_p = debug_p;
567}
568
569int
819cc324 570serial_debug_p (struct serial *scb)
2acceee2
JM
571{
572 return scb->debug_p || global_serial_debug_p;
573}
574
0ea3f30e
DJ
575#ifdef USE_WIN32API
576void
577serial_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
578{
579 if (scb->ops->wait_handle)
580 scb->ops->wait_handle (scb, read, except);
581 else
582 {
583 *read = (HANDLE) _get_osfhandle (scb->fd);
584 *except = NULL;
585 }
586}
c3e2b812
DJ
587
588void
589serial_done_wait_handle (struct serial *scb)
590{
591 if (scb->ops->done_wait_handle)
592 scb->ops->done_wait_handle (scb);
593}
0ea3f30e 594#endif
2acceee2 595
58f07bae
PA
596int
597serial_pipe (struct serial *scbs[2])
598{
fcd488ca 599 const struct serial_ops *ops;
58f07bae
PA
600 int fildes[2];
601
602 ops = serial_interface_lookup ("pipe");
603 if (!ops)
604 {
605 errno = ENOSYS;
606 return -1;
607 }
608
609 if (gdb_pipe (fildes) == -1)
610 return -1;
611
612 scbs[0] = serial_fdopen_ops (fildes[0], ops);
613 scbs[1] = serial_fdopen_ops (fildes[1], ops);
614 return 0;
615}
616
e3abfe1d
AC
617/* Serial set/show framework. */
618
619static struct cmd_list_element *serial_set_cmdlist;
620static struct cmd_list_element *serial_show_cmdlist;
621
622static void
981a3fb3 623serial_set_cmd (const char *args, int from_tty)
e3abfe1d 624{
3e43a32a
MS
625 printf_unfiltered ("\"set serial\" must be followed "
626 "by the name of a command.\n");
635c7e8a 627 help_list (serial_set_cmdlist, "set serial ", all_commands, gdb_stdout);
e3abfe1d
AC
628}
629
630static void
981a3fb3 631serial_show_cmd (const char *args, int from_tty)
e3abfe1d
AC
632{
633 cmd_show_list (serial_show_cmdlist, from_tty, "");
634}
635
0d12017b
JB
636/* Baud rate specified for talking to serial target systems. Default
637 is left as -1, so targets can choose their own defaults. */
638/* FIXME: This means that "show serial baud" and gr_files_info can
639 print -1 or (unsigned int)-1. This is a Bad User Interface. */
640
641int baud_rate = -1;
642
643static void
644serial_baud_show_cmd (struct ui_file *file, int from_tty,
645 struct cmd_list_element *c, const char *value)
646{
647 fprintf_filtered (file, _("Baud rate for remote serial I/O is %s.\n"),
648 value);
649}
e3abfe1d 650
236af5e3
YG
651/* Parity for serial port. */
652
653int serial_parity = GDBPARITY_NONE;
654
655static const char parity_none[] = "none";
656static const char parity_odd[] = "odd";
657static const char parity_even[] = "even";
658static const char *const parity_enums[] =
659 {parity_none, parity_odd, parity_even, NULL};
660static const char *parity = parity_none;
661
662/* Set serial_parity value. */
663
664static void
eb4c3f4a 665set_parity (const char *ignore_args, int from_tty, struct cmd_list_element *c)
236af5e3
YG
666{
667 if (parity == parity_odd)
668 serial_parity = GDBPARITY_ODD;
669 else if (parity == parity_even)
670 serial_parity = GDBPARITY_EVEN;
671 else
672 serial_parity = GDBPARITY_NONE;
673}
674
c906108c 675void
c2c6d25f 676_initialize_serial (void)
c906108c
SS
677{
678#if 0
1bedd215
AC
679 add_com ("connect", class_obscure, connect_command, _("\
680Connect the terminal directly up to the command monitor.\n\
681Use <CR>~. or <CR>~^D to break out."));
c906108c
SS
682#endif /* 0 */
683
1bedd215
AC
684 add_prefix_cmd ("serial", class_maintenance, serial_set_cmd, _("\
685Set default serial/parallel port configuration."),
e3abfe1d
AC
686 &serial_set_cmdlist, "set serial ",
687 0/*allow-unknown*/,
688 &setlist);
689
1bedd215
AC
690 add_prefix_cmd ("serial", class_maintenance, serial_show_cmd, _("\
691Show default serial/parallel port configuration."),
e3abfe1d
AC
692 &serial_show_cmdlist, "show serial ",
693 0/*allow-unknown*/,
694 &showlist);
695
0d12017b
JB
696 /* If target is open when baud changes, it doesn't take effect until
697 the next open (I think, not sure). */
698 add_setshow_zinteger_cmd ("baud", no_class, &baud_rate, _("\
699Set baud rate for remote serial I/O."), _("\
700Show baud rate for remote serial I/O."), _("\
701This value is used to set the speed of the serial port when debugging\n\
702using remote targets."),
703 NULL,
704 serial_baud_show_cmd,
705 &serial_set_cmdlist, &serial_show_cmdlist);
706
236af5e3
YG
707 add_setshow_enum_cmd ("parity", no_class, parity_enums,
708 &parity, _("\
590042fc
PW
709Set parity for remote serial I/O."), _("\
710Show parity for remote serial I/O."), NULL,
236af5e3
YG
711 set_parity,
712 NULL, /* FIXME: i18n: */
713 &serial_set_cmdlist, &serial_show_cmdlist);
714
f397e303
AC
715 add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\
716Set filename for remote session recording."), _("\
717Show filename for remote session recording."), _("\
c906108c 718This file is used to record the remote session for future playback\n\
f397e303
AC
719by gdbserver."),
720 NULL,
721 NULL, /* FIXME: i18n: */
722 &setlist, &showlist);
c906108c 723
7ab04401
AC
724 add_setshow_enum_cmd ("remotelogbase", no_class, logbase_enums,
725 &serial_logbase, _("\
590042fc
PW
726Set numerical base for remote session logging."), _("\
727Show numerical base for remote session logging."), NULL,
7ab04401
AC
728 NULL,
729 NULL, /* FIXME: i18n: */
730 &setlist, &showlist);
2acceee2 731
ccce17b0
YQ
732 add_setshow_zuinteger_cmd ("serial", class_maintenance,
733 &global_serial_debug_p, _("\
85c07804
AC
734Set serial debugging."), _("\
735Show serial debugging."), _("\
736When non-zero, serial port debugging is enabled."),
ccce17b0
YQ
737 NULL,
738 NULL, /* FIXME: i18n: */
739 &setdebuglist, &showdebuglist);
c906108c 740}
This page took 1.932322 seconds and 4 git commands to generate.