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