Update copyright year in most headers.
[deliverable/binutils-gdb.git] / gdb / cli / cli-dump.c
CommitLineData
f02df580
MS
1/* Dump-to-file commands, for GDB, the GNU debugger.
2
4c38e0a4
JB
3 Copyright (c) 2002, 2005, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
f02df580
MS
5
6 Contributed by Red Hat.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
f02df580
MS
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
f02df580
MS
22
23#include "defs.h"
24#include "gdb_string.h"
25#include "cli/cli-decode.h"
26#include "cli/cli-cmds.h"
27#include "value.h"
28#include "completer.h"
29#include "cli/cli-dump.h"
30#include "gdb_assert.h"
31#include <ctype.h>
32#include "target.h"
dbda9972 33#include "readline/readline.h"
c0ac0ec7 34#include "gdbcore.h"
f02df580
MS
35
36#define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE)))
37
38
39char *
40skip_spaces (char *chp)
41{
42 if (chp == NULL)
43 return NULL;
44 while (isspace (*chp))
45 chp++;
46 return chp;
47}
48
49char *
50scan_expression_with_cleanup (char **cmd, const char *def)
51{
52 if ((*cmd) == NULL || (**cmd) == '\0')
53 {
54 char *exp = xstrdup (def);
55 make_cleanup (xfree, exp);
56 return exp;
57 }
58 else
59 {
60 char *exp;
61 char *end;
62
63 end = (*cmd) + strcspn (*cmd, " \t");
64 exp = savestring ((*cmd), end - (*cmd));
65 make_cleanup (xfree, exp);
66 (*cmd) = skip_spaces (end);
67 return exp;
68 }
69}
70
71
f02df580
MS
72char *
73scan_filename_with_cleanup (char **cmd, const char *defname)
74{
75 char *filename;
76 char *fullname;
77
78 /* FIXME: Need to get the ``/a(ppend)'' flag from somewhere. */
79
80 /* File. */
81 if ((*cmd) == NULL)
82 {
83 if (defname == NULL)
8a3fe4f8 84 error (_("Missing filename."));
f02df580
MS
85 filename = xstrdup (defname);
86 make_cleanup (xfree, filename);
87 }
88 else
89 {
90 /* FIXME: should parse a possibly quoted string. */
91 char *end;
92
93 (*cmd) = skip_spaces (*cmd);
94 end = *cmd + strcspn (*cmd, " \t");
95 filename = savestring ((*cmd), end - (*cmd));
96 make_cleanup (xfree, filename);
97 (*cmd) = skip_spaces (end);
98 }
99 gdb_assert (filename != NULL);
100
101 fullname = tilde_expand (filename);
102 make_cleanup (xfree, fullname);
103
104 return fullname;
105}
106
107FILE *
c26b8e3b 108fopen_with_cleanup (const char *filename, const char *mode)
f02df580
MS
109{
110 FILE *file = fopen (filename, mode);
111 if (file == NULL)
112 perror_with_name (filename);
113 make_cleanup_fclose (file);
114 return file;
115}
116
117static bfd *
118bfd_openr_with_cleanup (const char *filename, const char *target)
119{
120 bfd *ibfd;
121
5cb316ef
AC
122 ibfd = bfd_openr (filename, target);
123 if (ibfd == NULL)
8a3fe4f8 124 error (_("Failed to open %s: %s."), filename,
f02df580
MS
125 bfd_errmsg (bfd_get_error ()));
126
127 make_cleanup_bfd_close (ibfd);
128 if (!bfd_check_format (ibfd, bfd_object))
8a3fe4f8 129 error (_("'%s' is not a recognized file format."), filename);
f02df580
MS
130
131 return ibfd;
132}
133
134static bfd *
c26b8e3b
AC
135bfd_openw_with_cleanup (const char *filename, const char *target,
136 const char *mode)
f02df580
MS
137{
138 bfd *obfd;
139
140 if (*mode == 'w') /* Write: create new file */
141 {
5cb316ef
AC
142 obfd = bfd_openw (filename, target);
143 if (obfd == NULL)
8a3fe4f8 144 error (_("Failed to open %s: %s."), filename,
f02df580
MS
145 bfd_errmsg (bfd_get_error ()));
146 make_cleanup_bfd_close (obfd);
147 if (!bfd_set_format (obfd, bfd_object))
8a3fe4f8 148 error (_("bfd_openw_with_cleanup: %s."), bfd_errmsg (bfd_get_error ()));
f02df580
MS
149 }
150 else if (*mode == 'a') /* Append to existing file */
151 { /* FIXME -- doesn't work... */
8a3fe4f8 152 error (_("bfd_openw does not work with append."));
f02df580
MS
153 }
154 else
8a3fe4f8 155 error (_("bfd_openw_with_cleanup: unknown mode %s."), mode);
f02df580
MS
156
157 return obfd;
158}
159
160struct cmd_list_element *dump_cmdlist;
161struct cmd_list_element *append_cmdlist;
162struct cmd_list_element *srec_cmdlist;
163struct cmd_list_element *ihex_cmdlist;
164struct cmd_list_element *tekhex_cmdlist;
165struct cmd_list_element *binary_dump_cmdlist;
166struct cmd_list_element *binary_append_cmdlist;
167
168static void
169dump_command (char *cmd, int from_tty)
170{
a3f17187 171 printf_unfiltered (_("\"dump\" must be followed by a subcommand.\n\n"));
f02df580
MS
172 help_list (dump_cmdlist, "dump ", -1, gdb_stdout);
173}
174
175static void
176append_command (char *cmd, int from_tty)
177{
a3f17187 178 printf_unfiltered (_("\"append\" must be followed by a subcommand.\n\n"));
f02df580
MS
179 help_list (dump_cmdlist, "append ", -1, gdb_stdout);
180}
181
182static void
c26b8e3b
AC
183dump_binary_file (const char *filename, const char *mode,
184 const bfd_byte *buf, int len)
f02df580
MS
185{
186 FILE *file;
187 int status;
188
189 file = fopen_with_cleanup (filename, mode);
190 status = fwrite (buf, len, 1, file);
191 if (status != 1)
192 perror_with_name (filename);
193}
194
195static void
c26b8e3b
AC
196dump_bfd_file (const char *filename, const char *mode,
197 const char *target, CORE_ADDR vaddr,
198 const bfd_byte *buf, int len)
f02df580
MS
199{
200 bfd *obfd;
201 asection *osection;
202
203 obfd = bfd_openw_with_cleanup (filename, target, mode);
204 osection = bfd_make_section_anyway (obfd, ".newsec");
205 bfd_set_section_size (obfd, osection, len);
206 bfd_set_section_vma (obfd, osection, vaddr);
207 bfd_set_section_alignment (obfd, osection, 0);
e9c55a7b
AC
208 bfd_set_section_flags (obfd, osection, (SEC_HAS_CONTENTS
209 | SEC_ALLOC
210 | SEC_LOAD));
f02df580
MS
211 osection->entsize = 0;
212 bfd_set_section_contents (obfd, osection, buf, 0, len);
213}
214
215static void
216dump_memory_to_file (char *cmd, char *mode, char *file_format)
217{
218 struct cleanup *old_cleanups = make_cleanup (null_cleanup, NULL);
219 CORE_ADDR lo;
220 CORE_ADDR hi;
221 ULONGEST count;
222 char *filename;
223 void *buf;
224 char *lo_exp;
225 char *hi_exp;
226 int len;
227
228 /* Open the file. */
229 filename = scan_filename_with_cleanup (&cmd, NULL);
230
231 /* Find the low address. */
232 if (cmd == NULL || *cmd == '\0')
8a3fe4f8 233 error (_("Missing start address."));
f02df580
MS
234 lo_exp = scan_expression_with_cleanup (&cmd, NULL);
235
236 /* Find the second address - rest of line. */
237 if (cmd == NULL || *cmd == '\0')
8a3fe4f8 238 error (_("Missing stop address."));
f02df580
MS
239 hi_exp = cmd;
240
241 lo = parse_and_eval_address (lo_exp);
242 hi = parse_and_eval_address (hi_exp);
243 if (hi <= lo)
8a3fe4f8 244 error (_("Invalid memory address range (start >= end)."));
f02df580
MS
245 count = hi - lo;
246
247 /* FIXME: Should use read_memory_partial() and a magic blocking
248 value. */
249 buf = xmalloc (count);
250 make_cleanup (xfree, buf);
c0ac0ec7 251 read_memory (lo, buf, count);
f02df580
MS
252
253 /* Have everything. Open/write the data. */
254 if (file_format == NULL || strcmp (file_format, "binary") == 0)
255 {
256 dump_binary_file (filename, mode, buf, count);
257 }
258 else
259 {
260 dump_bfd_file (filename, mode, file_format, lo, buf, count);
261 }
262
263 do_cleanups (old_cleanups);
264}
265
266static void
267dump_memory_command (char *cmd, char *mode)
268{
269 dump_memory_to_file (cmd, mode, "binary");
270}
271
272static void
273dump_value_to_file (char *cmd, char *mode, char *file_format)
274{
275 struct cleanup *old_cleanups = make_cleanup (null_cleanup, NULL);
276 struct value *val;
277 char *filename;
278
279 /* Open the file. */
280 filename = scan_filename_with_cleanup (&cmd, NULL);
281
282 /* Find the value. */
283 if (cmd == NULL || *cmd == '\0')
8a3fe4f8 284 error (_("No value to %s."), *mode == 'a' ? "append" : "dump");
f02df580
MS
285 val = parse_and_eval (cmd);
286 if (val == NULL)
8a3fe4f8 287 error (_("Invalid expression."));
f02df580
MS
288
289 /* Have everything. Open/write the data. */
290 if (file_format == NULL || strcmp (file_format, "binary") == 0)
291 {
0fd88904 292 dump_binary_file (filename, mode, value_contents (val),
df407dfe 293 TYPE_LENGTH (value_type (val)));
f02df580
MS
294 }
295 else
296 {
297 CORE_ADDR vaddr;
298
299 if (VALUE_LVAL (val))
300 {
42ae5230 301 vaddr = value_address (val);
f02df580
MS
302 }
303 else
304 {
305 vaddr = 0;
8a3fe4f8 306 warning (_("value is not an lval: address assumed to be zero"));
f02df580
MS
307 }
308
309 dump_bfd_file (filename, mode, file_format, vaddr,
0fd88904 310 value_contents (val),
df407dfe 311 TYPE_LENGTH (value_type (val)));
f02df580
MS
312 }
313
314 do_cleanups (old_cleanups);
315}
316
317static void
318dump_value_command (char *cmd, char *mode)
319{
320 dump_value_to_file (cmd, mode, "binary");
321}
322
f02df580
MS
323static void
324dump_srec_memory (char *args, int from_tty)
325{
5d1d95de 326 dump_memory_to_file (args, FOPEN_WB, "srec");
f02df580
MS
327}
328
329static void
330dump_srec_value (char *args, int from_tty)
331{
5d1d95de 332 dump_value_to_file (args, FOPEN_WB, "srec");
f02df580
MS
333}
334
335static void
336dump_ihex_memory (char *args, int from_tty)
337{
5d1d95de 338 dump_memory_to_file (args, FOPEN_WB, "ihex");
f02df580
MS
339}
340
341static void
342dump_ihex_value (char *args, int from_tty)
343{
5d1d95de 344 dump_value_to_file (args, FOPEN_WB, "ihex");
f02df580
MS
345}
346
347static void
348dump_tekhex_memory (char *args, int from_tty)
349{
5d1d95de 350 dump_memory_to_file (args, FOPEN_WB, "tekhex");
f02df580
MS
351}
352
353static void
354dump_tekhex_value (char *args, int from_tty)
355{
5d1d95de 356 dump_value_to_file (args, FOPEN_WB, "tekhex");
f02df580
MS
357}
358
359static void
360dump_binary_memory (char *args, int from_tty)
361{
5d1d95de 362 dump_memory_to_file (args, FOPEN_WB, "binary");
f02df580
MS
363}
364
365static void
366dump_binary_value (char *args, int from_tty)
367{
5d1d95de 368 dump_value_to_file (args, FOPEN_WB, "binary");
f02df580
MS
369}
370
371static void
372append_binary_memory (char *args, int from_tty)
373{
5d1d95de 374 dump_memory_to_file (args, FOPEN_AB, "binary");
f02df580
MS
375}
376
377static void
378append_binary_value (char *args, int from_tty)
379{
5d1d95de 380 dump_value_to_file (args, FOPEN_AB, "binary");
f02df580
MS
381}
382
383struct dump_context
384{
385 void (*func) (char *cmd, char *mode);
386 char *mode;
387};
388
389static void
390call_dump_func (struct cmd_list_element *c, char *args, int from_tty)
391{
392 struct dump_context *d = get_cmd_context (c);
393 d->func (args, d->mode);
394}
395
396void
397add_dump_command (char *name, void (*func) (char *args, char *mode),
398 char *descr)
399
400{
401 struct cmd_list_element *c;
402 struct dump_context *d;
403
404 c = add_cmd (name, all_commands, NULL, descr, &dump_cmdlist);
405 c->completer = filename_completer;
406 d = XMALLOC (struct dump_context);
407 d->func = func;
5d1d95de 408 d->mode = FOPEN_WB;
f02df580
MS
409 set_cmd_context (c, d);
410 c->func = call_dump_func;
411
412 c = add_cmd (name, all_commands, NULL, descr, &append_cmdlist);
413 c->completer = filename_completer;
414 d = XMALLOC (struct dump_context);
415 d->func = func;
5d1d95de 416 d->mode = FOPEN_AB;
f02df580
MS
417 set_cmd_context (c, d);
418 c->func = call_dump_func;
419
cb1a6d5f 420 /* Replace "Dump " at start of docstring with "Append " (borrowed
eefe576e 421 from [deleted] deprecated_add_show_from_set). */
f02df580
MS
422 if ( c->doc[0] == 'W'
423 && c->doc[1] == 'r'
424 && c->doc[2] == 'i'
425 && c->doc[3] == 't'
426 && c->doc[4] == 'e'
427 && c->doc[5] == ' ')
1754f103 428 c->doc = concat ("Append ", c->doc + 6, (char *)NULL);
f02df580
MS
429}
430
431/* Opaque data for restore_section_callback. */
432struct callback_data {
1fac167a 433 CORE_ADDR load_offset;
f02df580
MS
434 CORE_ADDR load_start;
435 CORE_ADDR load_end;
436};
437
438/* Function: restore_section_callback.
439
440 Callback function for bfd_map_over_sections.
441 Selectively loads the sections into memory. */
442
443static void
444restore_section_callback (bfd *ibfd, asection *isec, void *args)
445{
446 struct callback_data *data = args;
447 bfd_vma sec_start = bfd_section_vma (ibfd, isec);
448 bfd_size_type size = bfd_section_size (ibfd, isec);
449 bfd_vma sec_end = sec_start + size;
450 bfd_size_type sec_offset = 0;
451 bfd_size_type sec_load_count = size;
452 struct cleanup *old_chain;
47b667de 453 gdb_byte *buf;
f02df580
MS
454 int ret;
455
456 /* Ignore non-loadable sections, eg. from elf files. */
457 if (!(bfd_get_section_flags (ibfd, isec) & SEC_LOAD))
458 return;
459
460 /* Does the section overlap with the desired restore range? */
461 if (sec_end <= data->load_start
462 || (data->load_end > 0 && sec_start >= data->load_end))
463 {
464 /* No, no useable data in this section. */
a3f17187 465 printf_filtered (_("skipping section %s...\n"),
f02df580
MS
466 bfd_section_name (ibfd, isec));
467 return;
468 }
469
470 /* Compare section address range with user-requested
471 address range (if any). Compute where the actual
472 transfer should start and end. */
473 if (sec_start < data->load_start)
474 sec_offset = data->load_start - sec_start;
475 /* Size of a partial transfer: */
476 sec_load_count -= sec_offset;
477 if (data->load_end > 0 && sec_end > data->load_end)
478 sec_load_count -= sec_end - data->load_end;
479
480 /* Get the data. */
481 buf = xmalloc (size);
482 old_chain = make_cleanup (xfree, buf);
483 if (!bfd_get_section_contents (ibfd, isec, buf, 0, size))
8a3fe4f8 484 error (_("Failed to read bfd file %s: '%s'."), bfd_get_filename (ibfd),
f02df580
MS
485 bfd_errmsg (bfd_get_error ()));
486
487 printf_filtered ("Restoring section %s (0x%lx to 0x%lx)",
488 bfd_section_name (ibfd, isec),
489 (unsigned long) sec_start,
490 (unsigned long) sec_end);
491
492 if (data->load_offset != 0 || data->load_start != 0 || data->load_end != 0)
5af949e3
UW
493 printf_filtered (" into memory (%s to %s)\n",
494 paddress (target_gdbarch,
495 (unsigned long) sec_start
f5db4da3 496 + sec_offset + data->load_offset),
5af949e3
UW
497 paddress (target_gdbarch,
498 (unsigned long) sec_start + sec_offset
499 + data->load_offset + sec_load_count));
f02df580
MS
500 else
501 puts_filtered ("\n");
502
503 /* Write the data. */
504 ret = target_write_memory (sec_start + sec_offset + data->load_offset,
505 buf + sec_offset, sec_load_count);
506 if (ret != 0)
8a3fe4f8 507 warning (_("restore: memory write failed (%s)."), safe_strerror (ret));
f02df580
MS
508 do_cleanups (old_chain);
509 return;
510}
511
512static void
513restore_binary_file (char *filename, struct callback_data *data)
514{
5d1d95de 515 FILE *file = fopen_with_cleanup (filename, FOPEN_RB);
f02df580 516 int status;
47b667de 517 gdb_byte *buf;
f02df580
MS
518 long len;
519
520 /* Get the file size for reading. */
521 if (fseek (file, 0, SEEK_END) == 0)
522 len = ftell (file);
523 else
524 perror_with_name (filename);
525
526 if (len <= data->load_start)
8a3fe4f8 527 error (_("Start address is greater than length of binary file %s."),
f02df580
MS
528 filename);
529
530 /* Chop off "len" if it exceeds the requested load_end addr. */
531 if (data->load_end != 0 && data->load_end < len)
532 len = data->load_end;
533 /* Chop off "len" if the requested load_start addr skips some bytes. */
534 if (data->load_start > 0)
535 len -= data->load_start;
536
537 printf_filtered
538 ("Restoring binary file %s into memory (0x%lx to 0x%lx)\n",
539 filename,
1fac167a
UW
540 (unsigned long) (data->load_start + data->load_offset),
541 (unsigned long) (data->load_start + data->load_offset + len));
f02df580
MS
542
543 /* Now set the file pos to the requested load start pos. */
544 if (fseek (file, data->load_start, SEEK_SET) != 0)
545 perror_with_name (filename);
546
547 /* Now allocate a buffer and read the file contents. */
548 buf = xmalloc (len);
549 make_cleanup (xfree, buf);
550 if (fread (buf, 1, len, file) != len)
551 perror_with_name (filename);
552
553 /* Now write the buffer into target memory. */
554 len = target_write_memory (data->load_start + data->load_offset, buf, len);
555 if (len != 0)
8a3fe4f8 556 warning (_("restore: memory write failed (%s)."), safe_strerror (len));
f02df580
MS
557 return;
558}
559
560static void
561restore_command (char *args, int from_tty)
562{
563 char *filename;
564 struct callback_data data;
565 bfd *ibfd;
566 int binary_flag = 0;
567
568 if (!target_has_execution)
569 noprocess ();
570
571 data.load_offset = 0;
572 data.load_start = 0;
573 data.load_end = 0;
574
575 /* Parse the input arguments. First is filename (required). */
576 filename = scan_filename_with_cleanup (&args, NULL);
577 if (args != NULL && *args != '\0')
578 {
579 char *binary_string = "binary";
580
581 /* Look for optional "binary" flag. */
582 if (strncmp (args, binary_string, strlen (binary_string)) == 0)
583 {
584 binary_flag = 1;
585 args += strlen (binary_string);
586 args = skip_spaces (args);
587 }
588 /* Parse offset (optional). */
589 if (args != NULL && *args != '\0')
590 data.load_offset =
1fac167a 591 parse_and_eval_address (scan_expression_with_cleanup (&args, NULL));
f02df580
MS
592 if (args != NULL && *args != '\0')
593 {
594 /* Parse start address (optional). */
595 data.load_start =
de530e84 596 parse_and_eval_long (scan_expression_with_cleanup (&args, NULL));
f02df580
MS
597 if (args != NULL && *args != '\0')
598 {
599 /* Parse end address (optional). */
de530e84 600 data.load_end = parse_and_eval_long (args);
f02df580 601 if (data.load_end <= data.load_start)
8a3fe4f8 602 error (_("Start must be less than end."));
f02df580
MS
603 }
604 }
605 }
606
607 if (info_verbose)
608 printf_filtered ("Restore file %s offset 0x%lx start 0x%lx end 0x%lx\n",
609 filename, (unsigned long) data.load_offset,
610 (unsigned long) data.load_start,
611 (unsigned long) data.load_end);
612
613 if (binary_flag)
614 {
615 restore_binary_file (filename, &data);
616 }
617 else
618 {
619 /* Open the file for loading. */
620 ibfd = bfd_openr_with_cleanup (filename, NULL);
621
622 /* Process the sections. */
623 bfd_map_over_sections (ibfd, restore_section_callback, &data);
624 }
625 return;
626}
627
628static void
629srec_dump_command (char *cmd, int from_tty)
630{
631 printf_unfiltered ("\"dump srec\" must be followed by a subcommand.\n");
632 help_list (srec_cmdlist, "dump srec ", -1, gdb_stdout);
633}
634
635static void
636ihex_dump_command (char *cmd, int from_tty)
637{
638 printf_unfiltered ("\"dump ihex\" must be followed by a subcommand.\n");
639 help_list (ihex_cmdlist, "dump ihex ", -1, gdb_stdout);
640}
641
642static void
643tekhex_dump_command (char *cmd, int from_tty)
644{
645 printf_unfiltered ("\"dump tekhex\" must be followed by a subcommand.\n");
646 help_list (tekhex_cmdlist, "dump tekhex ", -1, gdb_stdout);
647}
648
649static void
650binary_dump_command (char *cmd, int from_tty)
651{
652 printf_unfiltered ("\"dump binary\" must be followed by a subcommand.\n");
653 help_list (binary_dump_cmdlist, "dump binary ", -1, gdb_stdout);
654}
655
656static void
657binary_append_command (char *cmd, int from_tty)
658{
659 printf_unfiltered ("\"append binary\" must be followed by a subcommand.\n");
660 help_list (binary_append_cmdlist, "append binary ", -1, gdb_stdout);
661}
662
b9362cc7
AC
663extern initialize_file_ftype _initialize_cli_dump; /* -Wmissing-prototypes */
664
f02df580
MS
665void
666_initialize_cli_dump (void)
667{
668 struct cmd_list_element *c;
1bedd215
AC
669 add_prefix_cmd ("dump", class_vars, dump_command, _("\
670Dump target code/data to a local file."),
f02df580
MS
671 &dump_cmdlist, "dump ",
672 0/*allow-unknown*/,
673 &cmdlist);
1bedd215
AC
674 add_prefix_cmd ("append", class_vars, append_command, _("\
675Append target code/data to a local file."),
f02df580
MS
676 &append_cmdlist, "append ",
677 0/*allow-unknown*/,
678 &cmdlist);
679
680 add_dump_command ("memory", dump_memory_command, "\
681Write contents of memory to a raw binary file.\n\
682Arguments are FILE START STOP. Writes the contents of memory within the\n\
683range [START .. STOP) to the specifed FILE in raw target ordered bytes.");
684
685 add_dump_command ("value", dump_value_command, "\
686Write the value of an expression to a raw binary file.\n\
687Arguments are FILE EXPRESSION. Writes the value of EXPRESSION to\n\
688the specified FILE in raw target ordered bytes.");
689
1bedd215
AC
690 add_prefix_cmd ("srec", all_commands, srec_dump_command, _("\
691Write target code/data to an srec file."),
f02df580
MS
692 &srec_cmdlist, "dump srec ",
693 0 /*allow-unknown*/,
694 &dump_cmdlist);
695
1bedd215
AC
696 add_prefix_cmd ("ihex", all_commands, ihex_dump_command, _("\
697Write target code/data to an intel hex file."),
f02df580
MS
698 &ihex_cmdlist, "dump ihex ",
699 0 /*allow-unknown*/,
700 &dump_cmdlist);
701
1bedd215
AC
702 add_prefix_cmd ("tekhex", all_commands, tekhex_dump_command, _("\
703Write target code/data to a tekhex file."),
f02df580
MS
704 &tekhex_cmdlist, "dump tekhex ",
705 0 /*allow-unknown*/,
706 &dump_cmdlist);
707
1bedd215
AC
708 add_prefix_cmd ("binary", all_commands, binary_dump_command, _("\
709Write target code/data to a raw binary file."),
f02df580
MS
710 &binary_dump_cmdlist, "dump binary ",
711 0 /*allow-unknown*/,
712 &dump_cmdlist);
713
1bedd215
AC
714 add_prefix_cmd ("binary", all_commands, binary_append_command, _("\
715Append target code/data to a raw binary file."),
f02df580
MS
716 &binary_append_cmdlist, "append binary ",
717 0 /*allow-unknown*/,
718 &append_cmdlist);
719
1a966eab 720 add_cmd ("memory", all_commands, dump_srec_memory, _("\
f02df580
MS
721Write contents of memory to an srec file.\n\
722Arguments are FILE START STOP. Writes the contents of memory\n\
1a966eab 723within the range [START .. STOP) to the specifed FILE in srec format."),
f02df580
MS
724 &srec_cmdlist);
725
1a966eab 726 add_cmd ("value", all_commands, dump_srec_value, _("\
f02df580
MS
727Write the value of an expression to an srec file.\n\
728Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 729to the specified FILE in srec format."),
f02df580
MS
730 &srec_cmdlist);
731
1a966eab 732 add_cmd ("memory", all_commands, dump_ihex_memory, _("\
f02df580
MS
733Write contents of memory to an ihex file.\n\
734Arguments are FILE START STOP. Writes the contents of memory within\n\
1a966eab 735the range [START .. STOP) to the specifed FILE in intel hex format."),
f02df580
MS
736 &ihex_cmdlist);
737
1a966eab 738 add_cmd ("value", all_commands, dump_ihex_value, _("\
f02df580
MS
739Write the value of an expression to an ihex file.\n\
740Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 741to the specified FILE in intel hex format."),
f02df580
MS
742 &ihex_cmdlist);
743
1a966eab 744 add_cmd ("memory", all_commands, dump_tekhex_memory, _("\
f02df580
MS
745Write contents of memory to a tekhex file.\n\
746Arguments are FILE START STOP. Writes the contents of memory\n\
1a966eab 747within the range [START .. STOP) to the specifed FILE in tekhex format."),
f02df580
MS
748 &tekhex_cmdlist);
749
1a966eab 750 add_cmd ("value", all_commands, dump_tekhex_value, _("\
f02df580
MS
751Write the value of an expression to a tekhex file.\n\
752Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 753to the specified FILE in tekhex format."),
f02df580
MS
754 &tekhex_cmdlist);
755
1a966eab 756 add_cmd ("memory", all_commands, dump_binary_memory, _("\
f02df580
MS
757Write contents of memory to a raw binary file.\n\
758Arguments are FILE START STOP. Writes the contents of memory\n\
1a966eab 759within the range [START .. STOP) to the specifed FILE in binary format."),
f02df580
MS
760 &binary_dump_cmdlist);
761
1a966eab 762 add_cmd ("value", all_commands, dump_binary_value, _("\
f02df580
MS
763Write the value of an expression to a raw binary file.\n\
764Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 765to the specified FILE in raw target ordered bytes."),
f02df580
MS
766 &binary_dump_cmdlist);
767
1a966eab 768 add_cmd ("memory", all_commands, append_binary_memory, _("\
f02df580
MS
769Append contents of memory to a raw binary file.\n\
770Arguments are FILE START STOP. Writes the contents of memory within the\n\
1a966eab 771range [START .. STOP) to the specifed FILE in raw target ordered bytes."),
f02df580
MS
772 &binary_append_cmdlist);
773
1a966eab 774 add_cmd ("value", all_commands, append_binary_value, _("\
f02df580
MS
775Append the value of an expression to a raw binary file.\n\
776Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 777to the specified FILE in raw target ordered bytes."),
f02df580
MS
778 &binary_append_cmdlist);
779
1bedd215
AC
780 c = add_com ("restore", class_vars, restore_command, _("\
781Restore the contents of FILE to target memory.\n\
f02df580
MS
782Arguments are FILE OFFSET START END where all except FILE are optional.\n\
783OFFSET will be added to the base address of the file (default zero).\n\
9eb6e5a1 784If START and END are given, only the file contents within that range\n\
1bedd215 785(file relative) will be restored to target memory."));
f02df580
MS
786 c->completer = filename_completer;
787 /* FIXME: completers for other commands. */
788}
This page took 0.550313 seconds and 4 git commands to generate.