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