tsave: Make tilde-expanded filename visible.
[deliverable/binutils-gdb.git] / gdb / cli / cli-dump.c
CommitLineData
f02df580
MS
1/* Dump-to-file commands, for GDB, the GNU debugger.
2
0b1afbb3 3 Copyright (C) 2002-2013 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"
c0ac0ec7 33#include "gdbcore.h"
e9cafbcc 34#include "cli/cli-utils.h"
cbb099e8 35#include "gdb_bfd.h"
614c279d 36#include "filestuff.h"
f02df580
MS
37
38#define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE)))
39
40
f02df580
MS
41char *
42scan_expression_with_cleanup (char **cmd, const char *def)
43{
44 if ((*cmd) == NULL || (**cmd) == '\0')
45 {
46 char *exp = xstrdup (def);
cdb27c12 47
f02df580
MS
48 make_cleanup (xfree, exp);
49 return exp;
50 }
51 else
52 {
53 char *exp;
54 char *end;
55
56 end = (*cmd) + strcspn (*cmd, " \t");
57 exp = savestring ((*cmd), end - (*cmd));
58 make_cleanup (xfree, exp);
59 (*cmd) = skip_spaces (end);
60 return exp;
61 }
62}
63
64
f02df580
MS
65char *
66scan_filename_with_cleanup (char **cmd, const char *defname)
67{
68 char *filename;
69 char *fullname;
70
71 /* FIXME: Need to get the ``/a(ppend)'' flag from somewhere. */
72
73 /* File. */
74 if ((*cmd) == NULL)
75 {
76 if (defname == NULL)
8a3fe4f8 77 error (_("Missing filename."));
f02df580
MS
78 filename = xstrdup (defname);
79 make_cleanup (xfree, filename);
80 }
81 else
82 {
83 /* FIXME: should parse a possibly quoted string. */
84 char *end;
85
86 (*cmd) = skip_spaces (*cmd);
87 end = *cmd + strcspn (*cmd, " \t");
88 filename = savestring ((*cmd), end - (*cmd));
89 make_cleanup (xfree, filename);
90 (*cmd) = skip_spaces (end);
91 }
92 gdb_assert (filename != NULL);
93
94 fullname = tilde_expand (filename);
95 make_cleanup (xfree, fullname);
96
97 return fullname;
98}
99
100FILE *
c26b8e3b 101fopen_with_cleanup (const char *filename, const char *mode)
f02df580 102{
614c279d 103 FILE *file = gdb_fopen_cloexec (filename, mode);
cdb27c12 104
f02df580
MS
105 if (file == NULL)
106 perror_with_name (filename);
107 make_cleanup_fclose (file);
108 return file;
109}
110
111static bfd *
112bfd_openr_with_cleanup (const char *filename, const char *target)
113{
114 bfd *ibfd;
115
64c31149 116 ibfd = gdb_bfd_openr (filename, target);
5cb316ef 117 if (ibfd == NULL)
8a3fe4f8 118 error (_("Failed to open %s: %s."), filename,
f02df580
MS
119 bfd_errmsg (bfd_get_error ()));
120
f9a062ff 121 make_cleanup_bfd_unref (ibfd);
f02df580 122 if (!bfd_check_format (ibfd, bfd_object))
8a3fe4f8 123 error (_("'%s' is not a recognized file format."), filename);
f02df580
MS
124
125 return ibfd;
126}
127
128static bfd *
c26b8e3b
AC
129bfd_openw_with_cleanup (const char *filename, const char *target,
130 const char *mode)
f02df580
MS
131{
132 bfd *obfd;
133
134 if (*mode == 'w') /* Write: create new file */
135 {
64c31149 136 obfd = gdb_bfd_openw (filename, target);
5cb316ef 137 if (obfd == NULL)
8a3fe4f8 138 error (_("Failed to open %s: %s."), filename,
f02df580 139 bfd_errmsg (bfd_get_error ()));
f9a062ff 140 make_cleanup_bfd_unref (obfd);
f02df580 141 if (!bfd_set_format (obfd, bfd_object))
8a3fe4f8 142 error (_("bfd_openw_with_cleanup: %s."), bfd_errmsg (bfd_get_error ()));
f02df580 143 }
ebcd3b23
MS
144 else if (*mode == 'a') /* Append to existing file. */
145 { /* FIXME -- doesn't work... */
8a3fe4f8 146 error (_("bfd_openw does not work with append."));
f02df580
MS
147 }
148 else
8a3fe4f8 149 error (_("bfd_openw_with_cleanup: unknown mode %s."), mode);
f02df580
MS
150
151 return obfd;
152}
153
28578e6b
YQ
154static struct cmd_list_element *dump_cmdlist;
155static struct cmd_list_element *append_cmdlist;
156static struct cmd_list_element *srec_cmdlist;
157static struct cmd_list_element *ihex_cmdlist;
158static struct cmd_list_element *tekhex_cmdlist;
159static struct cmd_list_element *binary_dump_cmdlist;
160static struct cmd_list_element *binary_append_cmdlist;
f02df580
MS
161
162static void
163dump_command (char *cmd, int from_tty)
164{
a3f17187 165 printf_unfiltered (_("\"dump\" must be followed by a subcommand.\n\n"));
f02df580
MS
166 help_list (dump_cmdlist, "dump ", -1, gdb_stdout);
167}
168
169static void
170append_command (char *cmd, int from_tty)
171{
a3f17187 172 printf_unfiltered (_("\"append\" must be followed by a subcommand.\n\n"));
f02df580
MS
173 help_list (dump_cmdlist, "append ", -1, gdb_stdout);
174}
175
176static void
c26b8e3b 177dump_binary_file (const char *filename, const char *mode,
5005c8a9 178 const bfd_byte *buf, ULONGEST len)
f02df580
MS
179{
180 FILE *file;
181 int status;
182
183 file = fopen_with_cleanup (filename, mode);
184 status = fwrite (buf, len, 1, file);
185 if (status != 1)
186 perror_with_name (filename);
187}
188
189static void
c26b8e3b
AC
190dump_bfd_file (const char *filename, const char *mode,
191 const char *target, CORE_ADDR vaddr,
5005c8a9 192 const bfd_byte *buf, ULONGEST len)
f02df580
MS
193{
194 bfd *obfd;
195 asection *osection;
196
197 obfd = bfd_openw_with_cleanup (filename, target, mode);
198 osection = bfd_make_section_anyway (obfd, ".newsec");
199 bfd_set_section_size (obfd, osection, len);
200 bfd_set_section_vma (obfd, osection, vaddr);
201 bfd_set_section_alignment (obfd, osection, 0);
e9c55a7b
AC
202 bfd_set_section_flags (obfd, osection, (SEC_HAS_CONTENTS
203 | SEC_ALLOC
204 | SEC_LOAD));
f02df580 205 osection->entsize = 0;
53624a93
MS
206 if (!bfd_set_section_contents (obfd, osection, buf, 0, len))
207 warning (_("writing dump file '%s' (%s)"), filename,
208 bfd_errmsg (bfd_get_error ()));
f02df580
MS
209}
210
211static void
212dump_memory_to_file (char *cmd, char *mode, char *file_format)
213{
214 struct cleanup *old_cleanups = make_cleanup (null_cleanup, NULL);
215 CORE_ADDR lo;
216 CORE_ADDR hi;
217 ULONGEST count;
218 char *filename;
219 void *buf;
220 char *lo_exp;
221 char *hi_exp;
f02df580
MS
222
223 /* Open the file. */
224 filename = scan_filename_with_cleanup (&cmd, NULL);
225
226 /* Find the low address. */
227 if (cmd == NULL || *cmd == '\0')
8a3fe4f8 228 error (_("Missing start address."));
f02df580
MS
229 lo_exp = scan_expression_with_cleanup (&cmd, NULL);
230
231 /* Find the second address - rest of line. */
232 if (cmd == NULL || *cmd == '\0')
8a3fe4f8 233 error (_("Missing stop address."));
f02df580
MS
234 hi_exp = cmd;
235
236 lo = parse_and_eval_address (lo_exp);
237 hi = parse_and_eval_address (hi_exp);
238 if (hi <= lo)
8a3fe4f8 239 error (_("Invalid memory address range (start >= end)."));
f02df580
MS
240 count = hi - lo;
241
242 /* FIXME: Should use read_memory_partial() and a magic blocking
243 value. */
244 buf = xmalloc (count);
245 make_cleanup (xfree, buf);
c0ac0ec7 246 read_memory (lo, buf, count);
f02df580
MS
247
248 /* Have everything. Open/write the data. */
249 if (file_format == NULL || strcmp (file_format, "binary") == 0)
250 {
251 dump_binary_file (filename, mode, buf, count);
252 }
253 else
254 {
255 dump_bfd_file (filename, mode, file_format, lo, buf, count);
256 }
257
258 do_cleanups (old_cleanups);
259}
260
261static void
262dump_memory_command (char *cmd, char *mode)
263{
264 dump_memory_to_file (cmd, mode, "binary");
265}
266
267static void
268dump_value_to_file (char *cmd, char *mode, char *file_format)
269{
270 struct cleanup *old_cleanups = make_cleanup (null_cleanup, NULL);
271 struct value *val;
272 char *filename;
273
274 /* Open the file. */
275 filename = scan_filename_with_cleanup (&cmd, NULL);
276
277 /* Find the value. */
278 if (cmd == NULL || *cmd == '\0')
8a3fe4f8 279 error (_("No value to %s."), *mode == 'a' ? "append" : "dump");
f02df580
MS
280 val = parse_and_eval (cmd);
281 if (val == NULL)
8a3fe4f8 282 error (_("Invalid expression."));
f02df580
MS
283
284 /* Have everything. Open/write the data. */
285 if (file_format == NULL || strcmp (file_format, "binary") == 0)
286 {
0fd88904 287 dump_binary_file (filename, mode, value_contents (val),
df407dfe 288 TYPE_LENGTH (value_type (val)));
f02df580
MS
289 }
290 else
291 {
292 CORE_ADDR vaddr;
293
294 if (VALUE_LVAL (val))
295 {
42ae5230 296 vaddr = value_address (val);
f02df580
MS
297 }
298 else
299 {
300 vaddr = 0;
8a3fe4f8 301 warning (_("value is not an lval: address assumed to be zero"));
f02df580
MS
302 }
303
304 dump_bfd_file (filename, mode, file_format, vaddr,
0fd88904 305 value_contents (val),
df407dfe 306 TYPE_LENGTH (value_type (val)));
f02df580
MS
307 }
308
309 do_cleanups (old_cleanups);
310}
311
312static void
313dump_value_command (char *cmd, char *mode)
314{
315 dump_value_to_file (cmd, mode, "binary");
316}
317
f02df580
MS
318static void
319dump_srec_memory (char *args, int from_tty)
320{
5d1d95de 321 dump_memory_to_file (args, FOPEN_WB, "srec");
f02df580
MS
322}
323
324static void
325dump_srec_value (char *args, int from_tty)
326{
5d1d95de 327 dump_value_to_file (args, FOPEN_WB, "srec");
f02df580
MS
328}
329
330static void
331dump_ihex_memory (char *args, int from_tty)
332{
5d1d95de 333 dump_memory_to_file (args, FOPEN_WB, "ihex");
f02df580
MS
334}
335
336static void
337dump_ihex_value (char *args, int from_tty)
338{
5d1d95de 339 dump_value_to_file (args, FOPEN_WB, "ihex");
f02df580
MS
340}
341
342static void
343dump_tekhex_memory (char *args, int from_tty)
344{
5d1d95de 345 dump_memory_to_file (args, FOPEN_WB, "tekhex");
f02df580
MS
346}
347
348static void
349dump_tekhex_value (char *args, int from_tty)
350{
5d1d95de 351 dump_value_to_file (args, FOPEN_WB, "tekhex");
f02df580
MS
352}
353
354static void
355dump_binary_memory (char *args, int from_tty)
356{
5d1d95de 357 dump_memory_to_file (args, FOPEN_WB, "binary");
f02df580
MS
358}
359
360static void
361dump_binary_value (char *args, int from_tty)
362{
5d1d95de 363 dump_value_to_file (args, FOPEN_WB, "binary");
f02df580
MS
364}
365
366static void
367append_binary_memory (char *args, int from_tty)
368{
5d1d95de 369 dump_memory_to_file (args, FOPEN_AB, "binary");
f02df580
MS
370}
371
372static void
373append_binary_value (char *args, int from_tty)
374{
5d1d95de 375 dump_value_to_file (args, FOPEN_AB, "binary");
f02df580
MS
376}
377
378struct dump_context
379{
380 void (*func) (char *cmd, char *mode);
381 char *mode;
382};
383
384static void
385call_dump_func (struct cmd_list_element *c, char *args, int from_tty)
386{
387 struct dump_context *d = get_cmd_context (c);
cdb27c12 388
f02df580
MS
389 d->func (args, d->mode);
390}
391
392void
393add_dump_command (char *name, void (*func) (char *args, char *mode),
394 char *descr)
395
396{
397 struct cmd_list_element *c;
398 struct dump_context *d;
399
400 c = add_cmd (name, all_commands, NULL, descr, &dump_cmdlist);
401 c->completer = filename_completer;
402 d = XMALLOC (struct dump_context);
403 d->func = func;
5d1d95de 404 d->mode = FOPEN_WB;
f02df580
MS
405 set_cmd_context (c, d);
406 c->func = call_dump_func;
407
408 c = add_cmd (name, all_commands, NULL, descr, &append_cmdlist);
409 c->completer = filename_completer;
410 d = XMALLOC (struct dump_context);
411 d->func = func;
5d1d95de 412 d->mode = FOPEN_AB;
f02df580
MS
413 set_cmd_context (c, d);
414 c->func = call_dump_func;
415
cb1a6d5f 416 /* Replace "Dump " at start of docstring with "Append " (borrowed
eefe576e 417 from [deleted] deprecated_add_show_from_set). */
f02df580
MS
418 if ( c->doc[0] == 'W'
419 && c->doc[1] == 'r'
420 && c->doc[2] == 'i'
421 && c->doc[3] == 't'
422 && c->doc[4] == 'e'
423 && c->doc[5] == ' ')
1754f103 424 c->doc = concat ("Append ", c->doc + 6, (char *)NULL);
f02df580
MS
425}
426
ebcd3b23 427/* Opaque data for restore_section_callback. */
f02df580 428struct callback_data {
1fac167a 429 CORE_ADDR load_offset;
f02df580
MS
430 CORE_ADDR load_start;
431 CORE_ADDR load_end;
432};
433
434/* Function: restore_section_callback.
435
436 Callback function for bfd_map_over_sections.
437 Selectively loads the sections into memory. */
438
439static void
440restore_section_callback (bfd *ibfd, asection *isec, void *args)
441{
442 struct callback_data *data = args;
443 bfd_vma sec_start = bfd_section_vma (ibfd, isec);
444 bfd_size_type size = bfd_section_size (ibfd, isec);
445 bfd_vma sec_end = sec_start + size;
446 bfd_size_type sec_offset = 0;
447 bfd_size_type sec_load_count = size;
448 struct cleanup *old_chain;
47b667de 449 gdb_byte *buf;
f02df580
MS
450 int ret;
451
ebcd3b23 452 /* Ignore non-loadable sections, eg. from elf files. */
f02df580
MS
453 if (!(bfd_get_section_flags (ibfd, isec) & SEC_LOAD))
454 return;
455
456 /* Does the section overlap with the desired restore range? */
457 if (sec_end <= data->load_start
458 || (data->load_end > 0 && sec_start >= data->load_end))
459 {
ebcd3b23 460 /* No, no useable data in this section. */
a3f17187 461 printf_filtered (_("skipping section %s...\n"),
f02df580
MS
462 bfd_section_name (ibfd, isec));
463 return;
464 }
465
466 /* Compare section address range with user-requested
467 address range (if any). Compute where the actual
468 transfer should start and end. */
469 if (sec_start < data->load_start)
470 sec_offset = data->load_start - sec_start;
ebcd3b23 471 /* Size of a partial transfer. */
f02df580
MS
472 sec_load_count -= sec_offset;
473 if (data->load_end > 0 && sec_end > data->load_end)
474 sec_load_count -= sec_end - data->load_end;
475
476 /* Get the data. */
477 buf = xmalloc (size);
478 old_chain = make_cleanup (xfree, buf);
479 if (!bfd_get_section_contents (ibfd, isec, buf, 0, size))
8a3fe4f8 480 error (_("Failed to read bfd file %s: '%s'."), bfd_get_filename (ibfd),
f02df580
MS
481 bfd_errmsg (bfd_get_error ()));
482
483 printf_filtered ("Restoring section %s (0x%lx to 0x%lx)",
484 bfd_section_name (ibfd, isec),
485 (unsigned long) sec_start,
486 (unsigned long) sec_end);
487
488 if (data->load_offset != 0 || data->load_start != 0 || data->load_end != 0)
5af949e3 489 printf_filtered (" into memory (%s to %s)\n",
f5656ead 490 paddress (target_gdbarch (),
5af949e3 491 (unsigned long) sec_start
f5db4da3 492 + sec_offset + data->load_offset),
f5656ead 493 paddress (target_gdbarch (),
5af949e3
UW
494 (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{
5b3fca71 511 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
5d1d95de 512 FILE *file = fopen_with_cleanup (filename, FOPEN_RB);
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)
5e9e105f
MS
518 {
519 len = ftell (file);
520 if (len < 0)
521 perror_with_name (filename);
522 }
f02df580
MS
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
ebcd3b23 530 /* Chop off "len" if it exceeds the requested load_end addr. */
f02df580
MS
531 if (data->load_end != 0 && data->load_end < len)
532 len = data->load_end;
ebcd3b23 533 /* Chop off "len" if the requested load_start addr skips some bytes. */
f02df580
MS
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
ebcd3b23 553 /* Now write the buffer into target memory. */
f02df580
MS
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));
5b3fca71 557 do_cleanups (cleanup);
f02df580
MS
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
ebcd3b23 575 /* Parse the input arguments. First is filename (required). */
f02df580
MS
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 }
ebcd3b23 588 /* Parse offset (optional). */
f02df580
MS
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 {
ebcd3b23 594 /* Parse start address (optional). */
f02df580 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 {
ebcd3b23 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 {
ebcd3b23 619 /* Open the file for loading. */
f02df580
MS
620 ibfd = bfd_openr_with_cleanup (filename, NULL);
621
ebcd3b23 622 /* Process the sections. */
f02df580
MS
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;
cdb27c12 669
9a2b4c1b
MS
670 add_prefix_cmd ("dump", class_vars, dump_command,
671 _("Dump target code/data to a local file."),
f02df580
MS
672 &dump_cmdlist, "dump ",
673 0/*allow-unknown*/,
674 &cmdlist);
9a2b4c1b
MS
675 add_prefix_cmd ("append", class_vars, append_command,
676 _("Append target code/data to a local file."),
f02df580
MS
677 &append_cmdlist, "append ",
678 0/*allow-unknown*/,
679 &cmdlist);
680
681 add_dump_command ("memory", dump_memory_command, "\
682Write contents of memory to a raw binary file.\n\
683Arguments are FILE START STOP. Writes the contents of memory within the\n\
64b9b334 684range [START .. STOP) to the specified FILE in raw target ordered bytes.");
f02df580
MS
685
686 add_dump_command ("value", dump_value_command, "\
687Write the value of an expression to a raw binary file.\n\
688Arguments are FILE EXPRESSION. Writes the value of EXPRESSION to\n\
689the specified FILE in raw target ordered bytes.");
690
9a2b4c1b
MS
691 add_prefix_cmd ("srec", all_commands, srec_dump_command,
692 _("Write target code/data to an srec file."),
f02df580
MS
693 &srec_cmdlist, "dump srec ",
694 0 /*allow-unknown*/,
695 &dump_cmdlist);
696
9a2b4c1b
MS
697 add_prefix_cmd ("ihex", all_commands, ihex_dump_command,
698 _("Write target code/data to an intel hex file."),
f02df580
MS
699 &ihex_cmdlist, "dump ihex ",
700 0 /*allow-unknown*/,
701 &dump_cmdlist);
702
9a2b4c1b
MS
703 add_prefix_cmd ("tekhex", all_commands, tekhex_dump_command,
704 _("Write target code/data to a tekhex file."),
f02df580
MS
705 &tekhex_cmdlist, "dump tekhex ",
706 0 /*allow-unknown*/,
707 &dump_cmdlist);
708
9a2b4c1b
MS
709 add_prefix_cmd ("binary", all_commands, binary_dump_command,
710 _("Write target code/data to a raw binary file."),
f02df580
MS
711 &binary_dump_cmdlist, "dump binary ",
712 0 /*allow-unknown*/,
713 &dump_cmdlist);
714
9a2b4c1b
MS
715 add_prefix_cmd ("binary", all_commands, binary_append_command,
716 _("Append target code/data to a raw binary file."),
f02df580
MS
717 &binary_append_cmdlist, "append binary ",
718 0 /*allow-unknown*/,
719 &append_cmdlist);
720
1a966eab 721 add_cmd ("memory", all_commands, dump_srec_memory, _("\
f02df580
MS
722Write contents of memory to an srec file.\n\
723Arguments are FILE START STOP. Writes the contents of memory\n\
64b9b334 724within the range [START .. STOP) to the specified FILE in srec format."),
f02df580
MS
725 &srec_cmdlist);
726
1a966eab 727 add_cmd ("value", all_commands, dump_srec_value, _("\
f02df580
MS
728Write the value of an expression to an srec file.\n\
729Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 730to the specified FILE in srec format."),
f02df580
MS
731 &srec_cmdlist);
732
1a966eab 733 add_cmd ("memory", all_commands, dump_ihex_memory, _("\
f02df580
MS
734Write contents of memory to an ihex file.\n\
735Arguments are FILE START STOP. Writes the contents of memory within\n\
64b9b334 736the range [START .. STOP) to the specified FILE in intel hex format."),
f02df580
MS
737 &ihex_cmdlist);
738
1a966eab 739 add_cmd ("value", all_commands, dump_ihex_value, _("\
f02df580
MS
740Write the value of an expression to an ihex file.\n\
741Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 742to the specified FILE in intel hex format."),
f02df580
MS
743 &ihex_cmdlist);
744
1a966eab 745 add_cmd ("memory", all_commands, dump_tekhex_memory, _("\
f02df580
MS
746Write contents of memory to a tekhex file.\n\
747Arguments are FILE START STOP. Writes the contents of memory\n\
64b9b334 748within the range [START .. STOP) to the specified FILE in tekhex format."),
f02df580
MS
749 &tekhex_cmdlist);
750
1a966eab 751 add_cmd ("value", all_commands, dump_tekhex_value, _("\
f02df580
MS
752Write the value of an expression to a tekhex file.\n\
753Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 754to the specified FILE in tekhex format."),
f02df580
MS
755 &tekhex_cmdlist);
756
1a966eab 757 add_cmd ("memory", all_commands, dump_binary_memory, _("\
f02df580
MS
758Write contents of memory to a raw binary file.\n\
759Arguments are FILE START STOP. Writes the contents of memory\n\
64b9b334 760within the range [START .. STOP) to the specified FILE in binary format."),
f02df580
MS
761 &binary_dump_cmdlist);
762
1a966eab 763 add_cmd ("value", all_commands, dump_binary_value, _("\
f02df580
MS
764Write the value of an expression to a raw binary file.\n\
765Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 766to the specified FILE in raw target ordered bytes."),
f02df580
MS
767 &binary_dump_cmdlist);
768
1a966eab 769 add_cmd ("memory", all_commands, append_binary_memory, _("\
f02df580
MS
770Append contents of memory to a raw binary file.\n\
771Arguments are FILE START STOP. Writes the contents of memory within the\n\
64b9b334 772range [START .. STOP) to the specified FILE in raw target ordered bytes."),
f02df580
MS
773 &binary_append_cmdlist);
774
1a966eab 775 add_cmd ("value", all_commands, append_binary_value, _("\
f02df580
MS
776Append the value of an expression to a raw binary file.\n\
777Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 778to the specified FILE in raw target ordered bytes."),
f02df580
MS
779 &binary_append_cmdlist);
780
1bedd215
AC
781 c = add_com ("restore", class_vars, restore_command, _("\
782Restore the contents of FILE to target memory.\n\
f02df580
MS
783Arguments are FILE OFFSET START END where all except FILE are optional.\n\
784OFFSET will be added to the base address of the file (default zero).\n\
9eb6e5a1 785If START and END are given, only the file contents within that range\n\
1bedd215 786(file relative) will be restored to target memory."));
f02df580 787 c->completer = filename_completer;
ebcd3b23 788 /* FIXME: completers for other commands. */
f02df580 789}
This page took 0.747075 seconds and 4 git commands to generate.