gdb/testsuite: make test names unique in gdb.python/py-format-string.exp
[deliverable/binutils-gdb.git] / gdb / cli / cli-dump.c
CommitLineData
f02df580
MS
1/* Dump-to-file commands, for GDB, the GNU debugger.
2
3666a048 3 Copyright (C) 2002-2021 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"
f02df580
MS
23#include "cli/cli-decode.h"
24#include "cli/cli-cmds.h"
25#include "value.h"
26#include "completer.h"
f02df580
MS
27#include <ctype.h>
28#include "target.h"
e0eac551 29#include "readline/tilde.h"
c0ac0ec7 30#include "gdbcore.h"
e9cafbcc 31#include "cli/cli-utils.h"
cbb099e8 32#include "gdb_bfd.h"
268a13a5
TT
33#include "gdbsupport/filestuff.h"
34#include "gdbsupport/byte-vector.h"
0d12e84c 35#include "gdbarch.h"
f02df580 36
ee0c3293
TT
37static gdb::unique_xmalloc_ptr<char>
38scan_expression (const char **cmd, const char *def)
f02df580
MS
39{
40 if ((*cmd) == NULL || (**cmd) == '\0')
b02f78f9 41 return make_unique_xstrdup (def);
f02df580
MS
42 else
43 {
44 char *exp;
93db0d79 45 const char *end;
f02df580
MS
46
47 end = (*cmd) + strcspn (*cmd, " \t");
48 exp = savestring ((*cmd), end - (*cmd));
f1735a53 49 (*cmd) = skip_spaces (end);
ee0c3293 50 return gdb::unique_xmalloc_ptr<char> (exp);
f02df580
MS
51 }
52}
53
54
ee0c3293
TT
55static gdb::unique_xmalloc_ptr<char>
56scan_filename (const char **cmd, const char *defname)
f02df580 57{
ee0c3293 58 gdb::unique_xmalloc_ptr<char> filename;
f02df580
MS
59
60 /* FIXME: Need to get the ``/a(ppend)'' flag from somewhere. */
61
62 /* File. */
63 if ((*cmd) == NULL)
64 {
65 if (defname == NULL)
8a3fe4f8 66 error (_("Missing filename."));
ee0c3293 67 filename.reset (xstrdup (defname));
f02df580
MS
68 }
69 else
70 {
71 /* FIXME: should parse a possibly quoted string. */
93db0d79 72 const char *end;
f02df580 73
f1735a53 74 (*cmd) = skip_spaces (*cmd);
f02df580 75 end = *cmd + strcspn (*cmd, " \t");
ee0c3293 76 filename.reset (savestring ((*cmd), end - (*cmd)));
f1735a53 77 (*cmd) = skip_spaces (end);
f02df580
MS
78 }
79 gdb_assert (filename != NULL);
80
ee0c3293 81 return gdb::unique_xmalloc_ptr<char> (tilde_expand (filename.get ()));
f02df580
MS
82}
83
192b62ce
TT
84static gdb_bfd_ref_ptr
85bfd_openr_or_error (const char *filename, const char *target)
f02df580 86{
192b62ce 87 gdb_bfd_ref_ptr ibfd (gdb_bfd_openr (filename, target));
5cb316ef 88 if (ibfd == NULL)
192b62ce 89 error (_("Failed to open %s: %s."), filename,
f02df580
MS
90 bfd_errmsg (bfd_get_error ()));
91
192b62ce 92 if (!bfd_check_format (ibfd.get (), bfd_object))
8a3fe4f8 93 error (_("'%s' is not a recognized file format."), filename);
f02df580
MS
94
95 return ibfd;
96}
97
192b62ce
TT
98static gdb_bfd_ref_ptr
99bfd_openw_or_error (const char *filename, const char *target, const char *mode)
f02df580 100{
192b62ce 101 gdb_bfd_ref_ptr obfd;
f02df580
MS
102
103 if (*mode == 'w') /* Write: create new file */
104 {
64c31149 105 obfd = gdb_bfd_openw (filename, target);
5cb316ef 106 if (obfd == NULL)
192b62ce 107 error (_("Failed to open %s: %s."), filename,
f02df580 108 bfd_errmsg (bfd_get_error ()));
192b62ce
TT
109 if (!bfd_set_format (obfd.get (), bfd_object))
110 error (_("bfd_openw_or_error: %s."), bfd_errmsg (bfd_get_error ()));
f02df580 111 }
ebcd3b23
MS
112 else if (*mode == 'a') /* Append to existing file. */
113 { /* FIXME -- doesn't work... */
8a3fe4f8 114 error (_("bfd_openw does not work with append."));
f02df580
MS
115 }
116 else
192b62ce 117 error (_("bfd_openw_or_error: unknown mode %s."), mode);
f02df580
MS
118
119 return obfd;
120}
121
28578e6b
YQ
122static struct cmd_list_element *dump_cmdlist;
123static struct cmd_list_element *append_cmdlist;
124static struct cmd_list_element *srec_cmdlist;
125static struct cmd_list_element *ihex_cmdlist;
cf75d6c3 126static struct cmd_list_element *verilog_cmdlist;
28578e6b
YQ
127static struct cmd_list_element *tekhex_cmdlist;
128static struct cmd_list_element *binary_dump_cmdlist;
129static struct cmd_list_element *binary_append_cmdlist;
f02df580 130
f02df580 131static void
c26b8e3b 132dump_binary_file (const char *filename, const char *mode,
5005c8a9 133 const bfd_byte *buf, ULONGEST len)
f02df580 134{
f02df580
MS
135 int status;
136
d419f42d
TT
137 gdb_file_up file = gdb_fopen_cloexec (filename, mode);
138 status = fwrite (buf, len, 1, file.get ());
f02df580
MS
139 if (status != 1)
140 perror_with_name (filename);
141}
142
143static void
c26b8e3b
AC
144dump_bfd_file (const char *filename, const char *mode,
145 const char *target, CORE_ADDR vaddr,
5005c8a9 146 const bfd_byte *buf, ULONGEST len)
f02df580 147{
f02df580
MS
148 asection *osection;
149
192b62ce
TT
150 gdb_bfd_ref_ptr obfd (bfd_openw_or_error (filename, target, mode));
151 osection = bfd_make_section_anyway (obfd.get (), ".newsec");
fd361982
AM
152 bfd_set_section_size (osection, len);
153 bfd_set_section_vma (osection, vaddr);
154 bfd_set_section_alignment (osection, 0);
155 bfd_set_section_flags (osection, (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD));
f02df580 156 osection->entsize = 0;
192b62ce
TT
157 if (!bfd_set_section_contents (obfd.get (), osection, buf, 0, len))
158 warning (_("writing dump file '%s' (%s)"), filename,
53624a93 159 bfd_errmsg (bfd_get_error ()));
f02df580
MS
160}
161
162static void
93db0d79 163dump_memory_to_file (const char *cmd, const char *mode, const char *file_format)
f02df580 164{
f02df580
MS
165 CORE_ADDR lo;
166 CORE_ADDR hi;
167 ULONGEST count;
93db0d79 168 const char *hi_exp;
f02df580
MS
169
170 /* Open the file. */
ee0c3293 171 gdb::unique_xmalloc_ptr<char> filename = scan_filename (&cmd, NULL);
f02df580
MS
172
173 /* Find the low address. */
174 if (cmd == NULL || *cmd == '\0')
8a3fe4f8 175 error (_("Missing start address."));
ee0c3293 176 gdb::unique_xmalloc_ptr<char> lo_exp = scan_expression (&cmd, NULL);
f02df580
MS
177
178 /* Find the second address - rest of line. */
179 if (cmd == NULL || *cmd == '\0')
8a3fe4f8 180 error (_("Missing stop address."));
f02df580
MS
181 hi_exp = cmd;
182
ee0c3293 183 lo = parse_and_eval_address (lo_exp.get ());
f02df580
MS
184 hi = parse_and_eval_address (hi_exp);
185 if (hi <= lo)
8a3fe4f8 186 error (_("Invalid memory address range (start >= end)."));
f02df580
MS
187 count = hi - lo;
188
189 /* FIXME: Should use read_memory_partial() and a magic blocking
190 value. */
d5722aa2
PA
191 gdb::byte_vector buf (count);
192 read_memory (lo, buf.data (), count);
f02df580
MS
193
194 /* Have everything. Open/write the data. */
195 if (file_format == NULL || strcmp (file_format, "binary") == 0)
ee0c3293 196 dump_binary_file (filename.get (), mode, buf.data (), count);
f02df580 197 else
ee0c3293 198 dump_bfd_file (filename.get (), mode, file_format, lo, buf.data (), count);
f02df580
MS
199}
200
201static void
2d0ac106 202dump_memory_command (const char *cmd, const char *mode)
f02df580
MS
203{
204 dump_memory_to_file (cmd, mode, "binary");
205}
206
207static void
93db0d79 208dump_value_to_file (const char *cmd, const char *mode, const char *file_format)
f02df580 209{
f02df580 210 struct value *val;
f02df580
MS
211
212 /* Open the file. */
ee0c3293 213 gdb::unique_xmalloc_ptr<char> filename = scan_filename (&cmd, NULL);
f02df580
MS
214
215 /* Find the value. */
216 if (cmd == NULL || *cmd == '\0')
8a3fe4f8 217 error (_("No value to %s."), *mode == 'a' ? "append" : "dump");
f02df580
MS
218 val = parse_and_eval (cmd);
219 if (val == NULL)
8a3fe4f8 220 error (_("Invalid expression."));
f02df580
MS
221
222 /* Have everything. Open/write the data. */
223 if (file_format == NULL || strcmp (file_format, "binary") == 0)
ee0c3293
TT
224 dump_binary_file (filename.get (), mode, value_contents (val),
225 TYPE_LENGTH (value_type (val)));
f02df580
MS
226 else
227 {
228 CORE_ADDR vaddr;
229
230 if (VALUE_LVAL (val))
231 {
42ae5230 232 vaddr = value_address (val);
f02df580
MS
233 }
234 else
235 {
236 vaddr = 0;
8a3fe4f8 237 warning (_("value is not an lval: address assumed to be zero"));
f02df580
MS
238 }
239
ee0c3293 240 dump_bfd_file (filename.get (), mode, file_format, vaddr,
0fd88904 241 value_contents (val),
df407dfe 242 TYPE_LENGTH (value_type (val)));
f02df580 243 }
f02df580
MS
244}
245
246static void
2d0ac106 247dump_value_command (const char *cmd, const char *mode)
f02df580
MS
248{
249 dump_value_to_file (cmd, mode, "binary");
250}
251
f02df580 252static void
2d0ac106 253dump_srec_memory (const char *args, int from_tty)
f02df580 254{
5d1d95de 255 dump_memory_to_file (args, FOPEN_WB, "srec");
f02df580
MS
256}
257
258static void
2d0ac106 259dump_srec_value (const char *args, int from_tty)
f02df580 260{
5d1d95de 261 dump_value_to_file (args, FOPEN_WB, "srec");
f02df580
MS
262}
263
264static void
2d0ac106 265dump_ihex_memory (const char *args, int from_tty)
f02df580 266{
5d1d95de 267 dump_memory_to_file (args, FOPEN_WB, "ihex");
f02df580
MS
268}
269
270static void
2d0ac106 271dump_ihex_value (const char *args, int from_tty)
f02df580 272{
5d1d95de 273 dump_value_to_file (args, FOPEN_WB, "ihex");
f02df580
MS
274}
275
cf75d6c3 276static void
2d0ac106 277dump_verilog_memory (const char *args, int from_tty)
cf75d6c3
AB
278{
279 dump_memory_to_file (args, FOPEN_WB, "verilog");
280}
281
282static void
2d0ac106 283dump_verilog_value (const char *args, int from_tty)
cf75d6c3
AB
284{
285 dump_value_to_file (args, FOPEN_WB, "verilog");
286}
287
f02df580 288static void
2d0ac106 289dump_tekhex_memory (const char *args, int from_tty)
f02df580 290{
5d1d95de 291 dump_memory_to_file (args, FOPEN_WB, "tekhex");
f02df580
MS
292}
293
294static void
2d0ac106 295dump_tekhex_value (const char *args, int from_tty)
f02df580 296{
5d1d95de 297 dump_value_to_file (args, FOPEN_WB, "tekhex");
f02df580
MS
298}
299
300static void
2d0ac106 301dump_binary_memory (const char *args, int from_tty)
f02df580 302{
5d1d95de 303 dump_memory_to_file (args, FOPEN_WB, "binary");
f02df580
MS
304}
305
306static void
2d0ac106 307dump_binary_value (const char *args, int from_tty)
f02df580 308{
5d1d95de 309 dump_value_to_file (args, FOPEN_WB, "binary");
f02df580
MS
310}
311
312static void
2d0ac106 313append_binary_memory (const char *args, int from_tty)
f02df580 314{
5d1d95de 315 dump_memory_to_file (args, FOPEN_AB, "binary");
f02df580
MS
316}
317
318static void
2d0ac106 319append_binary_value (const char *args, int from_tty)
f02df580 320{
5d1d95de 321 dump_value_to_file (args, FOPEN_AB, "binary");
f02df580
MS
322}
323
324struct dump_context
325{
2d0ac106 326 void (*func) (const char *cmd, const char *mode);
a121b7c1 327 const char *mode;
f02df580
MS
328};
329
330static void
95a6b0a1 331call_dump_func (struct cmd_list_element *c, const char *args, int from_tty)
f02df580 332{
9a3c8263 333 struct dump_context *d = (struct dump_context *) get_cmd_context (c);
cdb27c12 334
f02df580
MS
335 d->func (args, d->mode);
336}
337
db229724 338static void
a121b7c1 339add_dump_command (const char *name,
2d0ac106 340 void (*func) (const char *args, const char *mode),
a121b7c1 341 const char *descr)
f02df580
MS
342
343{
344 struct cmd_list_element *c;
345 struct dump_context *d;
346
0450cc4c 347 c = add_cmd (name, all_commands, descr, &dump_cmdlist);
f02df580 348 c->completer = filename_completer;
70ba0933 349 d = XNEW (struct dump_context);
f02df580 350 d->func = func;
5d1d95de 351 d->mode = FOPEN_WB;
f02df580
MS
352 set_cmd_context (c, d);
353 c->func = call_dump_func;
354
0450cc4c 355 c = add_cmd (name, all_commands, descr, &append_cmdlist);
f02df580 356 c->completer = filename_completer;
70ba0933 357 d = XNEW (struct dump_context);
f02df580 358 d->func = func;
5d1d95de 359 d->mode = FOPEN_AB;
f02df580
MS
360 set_cmd_context (c, d);
361 c->func = call_dump_func;
362
cb1a6d5f 363 /* Replace "Dump " at start of docstring with "Append " (borrowed
eefe576e 364 from [deleted] deprecated_add_show_from_set). */
f02df580
MS
365 if ( c->doc[0] == 'W'
366 && c->doc[1] == 'r'
367 && c->doc[2] == 'i'
368 && c->doc[3] == 't'
369 && c->doc[4] == 'e'
370 && c->doc[5] == ' ')
1754f103 371 c->doc = concat ("Append ", c->doc + 6, (char *)NULL);
f02df580
MS
372}
373
03cd72b8 374/* Selectively loads the sections into memory. */
f02df580
MS
375
376static void
03cd72b8
TT
377restore_one_section (bfd *ibfd, asection *isec,
378 CORE_ADDR load_offset,
379 CORE_ADDR load_start,
380 CORE_ADDR load_end)
f02df580 381{
fd361982
AM
382 bfd_vma sec_start = bfd_section_vma (isec);
383 bfd_size_type size = bfd_section_size (isec);
f02df580
MS
384 bfd_vma sec_end = sec_start + size;
385 bfd_size_type sec_offset = 0;
386 bfd_size_type sec_load_count = size;
f02df580
MS
387 int ret;
388
ebcd3b23 389 /* Ignore non-loadable sections, eg. from elf files. */
fd361982 390 if (!(bfd_section_flags (isec) & SEC_LOAD))
f02df580
MS
391 return;
392
393 /* Does the section overlap with the desired restore range? */
03cd72b8
TT
394 if (sec_end <= load_start
395 || (load_end > 0 && sec_start >= load_end))
f02df580 396 {
ebcd3b23 397 /* No, no useable data in this section. */
a3f17187 398 printf_filtered (_("skipping section %s...\n"),
fd361982 399 bfd_section_name (isec));
f02df580
MS
400 return;
401 }
402
403 /* Compare section address range with user-requested
404 address range (if any). Compute where the actual
405 transfer should start and end. */
03cd72b8
TT
406 if (sec_start < load_start)
407 sec_offset = load_start - sec_start;
ebcd3b23 408 /* Size of a partial transfer. */
f02df580 409 sec_load_count -= sec_offset;
03cd72b8
TT
410 if (load_end > 0 && sec_end > load_end)
411 sec_load_count -= sec_end - load_end;
f02df580
MS
412
413 /* Get the data. */
26fcd5d7
TT
414 gdb::byte_vector buf (size);
415 if (!bfd_get_section_contents (ibfd, isec, buf.data (), 0, size))
8a3fe4f8 416 error (_("Failed to read bfd file %s: '%s'."), bfd_get_filename (ibfd),
f02df580
MS
417 bfd_errmsg (bfd_get_error ()));
418
419 printf_filtered ("Restoring section %s (0x%lx to 0x%lx)",
fd361982 420 bfd_section_name (isec),
f02df580
MS
421 (unsigned long) sec_start,
422 (unsigned long) sec_end);
423
03cd72b8 424 if (load_offset != 0 || load_start != 0 || load_end != 0)
5af949e3 425 printf_filtered (" into memory (%s to %s)\n",
f5656ead 426 paddress (target_gdbarch (),
5af949e3 427 (unsigned long) sec_start
03cd72b8 428 + sec_offset + load_offset),
f5656ead 429 paddress (target_gdbarch (),
5af949e3 430 (unsigned long) sec_start + sec_offset
03cd72b8 431 + load_offset + sec_load_count));
f02df580
MS
432 else
433 puts_filtered ("\n");
434
435 /* Write the data. */
03cd72b8 436 ret = target_write_memory (sec_start + sec_offset + load_offset,
26fcd5d7 437 &buf[sec_offset], sec_load_count);
f02df580 438 if (ret != 0)
8a3fe4f8 439 warning (_("restore: memory write failed (%s)."), safe_strerror (ret));
f02df580
MS
440}
441
442static void
03cd72b8
TT
443restore_binary_file (const char *filename, CORE_ADDR load_offset,
444 CORE_ADDR load_start, CORE_ADDR load_end)
445
f02df580 446{
d419f42d 447 gdb_file_up file = gdb_fopen_cloexec (filename, FOPEN_RB);
f02df580
MS
448 long len;
449
94c18618
SDJ
450 if (file == NULL)
451 error (_("Failed to open %s: %s"), filename, safe_strerror (errno));
452
f02df580 453 /* Get the file size for reading. */
d419f42d 454 if (fseek (file.get (), 0, SEEK_END) == 0)
5e9e105f 455 {
d419f42d 456 len = ftell (file.get ());
5e9e105f
MS
457 if (len < 0)
458 perror_with_name (filename);
459 }
f02df580
MS
460 else
461 perror_with_name (filename);
462
03cd72b8 463 if (len <= load_start)
8a3fe4f8 464 error (_("Start address is greater than length of binary file %s."),
f02df580
MS
465 filename);
466
ebcd3b23 467 /* Chop off "len" if it exceeds the requested load_end addr. */
03cd72b8
TT
468 if (load_end != 0 && load_end < len)
469 len = load_end;
ebcd3b23 470 /* Chop off "len" if the requested load_start addr skips some bytes. */
03cd72b8
TT
471 if (load_start > 0)
472 len -= load_start;
f02df580
MS
473
474 printf_filtered
475 ("Restoring binary file %s into memory (0x%lx to 0x%lx)\n",
476 filename,
03cd72b8
TT
477 (unsigned long) (load_start + load_offset),
478 (unsigned long) (load_start + load_offset + len));
f02df580
MS
479
480 /* Now set the file pos to the requested load start pos. */
03cd72b8 481 if (fseek (file.get (), load_start, SEEK_SET) != 0)
f02df580
MS
482 perror_with_name (filename);
483
484 /* Now allocate a buffer and read the file contents. */
d5722aa2 485 gdb::byte_vector buf (len);
d419f42d 486 if (fread (buf.data (), 1, len, file.get ()) != len)
f02df580
MS
487 perror_with_name (filename);
488
ebcd3b23 489 /* Now write the buffer into target memory. */
03cd72b8 490 len = target_write_memory (load_start + load_offset, buf.data (), len);
f02df580 491 if (len != 0)
8a3fe4f8 492 warning (_("restore: memory write failed (%s)."), safe_strerror (len));
f02df580
MS
493}
494
495static void
0b39b52e 496restore_command (const char *args, int from_tty)
f02df580 497{
f02df580
MS
498 int binary_flag = 0;
499
55f6301a 500 if (!target_has_execution ())
f02df580
MS
501 noprocess ();
502
03cd72b8
TT
503 CORE_ADDR load_offset = 0;
504 CORE_ADDR load_start = 0;
505 CORE_ADDR load_end = 0;
f02df580 506
ebcd3b23 507 /* Parse the input arguments. First is filename (required). */
ee0c3293 508 gdb::unique_xmalloc_ptr<char> filename = scan_filename (&args, NULL);
f02df580
MS
509 if (args != NULL && *args != '\0')
510 {
a121b7c1 511 static const char binary_string[] = "binary";
f02df580
MS
512
513 /* Look for optional "binary" flag. */
61012eef 514 if (startswith (args, binary_string))
f02df580
MS
515 {
516 binary_flag = 1;
517 args += strlen (binary_string);
f1735a53 518 args = skip_spaces (args);
f02df580 519 }
ebcd3b23 520 /* Parse offset (optional). */
f02df580 521 if (args != NULL && *args != '\0')
03cd72b8
TT
522 load_offset
523 = (binary_flag
524 ? parse_and_eval_address (scan_expression (&args, NULL).get ())
525 : parse_and_eval_long (scan_expression (&args, NULL).get ()));
f02df580
MS
526 if (args != NULL && *args != '\0')
527 {
ebcd3b23 528 /* Parse start address (optional). */
03cd72b8 529 load_start =
ee0c3293 530 parse_and_eval_long (scan_expression (&args, NULL).get ());
f02df580
MS
531 if (args != NULL && *args != '\0')
532 {
ebcd3b23 533 /* Parse end address (optional). */
03cd72b8
TT
534 load_end = parse_and_eval_long (args);
535 if (load_end <= load_start)
8a3fe4f8 536 error (_("Start must be less than end."));
f02df580
MS
537 }
538 }
539 }
540
541 if (info_verbose)
542 printf_filtered ("Restore file %s offset 0x%lx start 0x%lx end 0x%lx\n",
03cd72b8
TT
543 filename.get (), (unsigned long) load_offset,
544 (unsigned long) load_start,
545 (unsigned long) load_end);
f02df580
MS
546
547 if (binary_flag)
548 {
03cd72b8
TT
549 restore_binary_file (filename.get (), load_offset, load_start,
550 load_end);
f02df580
MS
551 }
552 else
553 {
ebcd3b23 554 /* Open the file for loading. */
ee0c3293 555 gdb_bfd_ref_ptr ibfd (bfd_openr_or_error (filename.get (), NULL));
f02df580 556
ebcd3b23 557 /* Process the sections. */
03cd72b8
TT
558 for (asection *sect : gdb_bfd_sections (ibfd))
559 restore_one_section (ibfd.get (), sect, load_offset, load_start,
560 load_end);
f02df580 561 }
f02df580
MS
562}
563
6c265988 564void _initialize_cli_dump ();
f02df580 565void
6c265988 566_initialize_cli_dump ()
f02df580
MS
567{
568 struct cmd_list_element *c;
cdb27c12 569
0743fc83
TT
570 add_basic_prefix_cmd ("dump", class_vars,
571 _("Dump target code/data to a local file."),
572 &dump_cmdlist, "dump ",
573 0/*allow-unknown*/,
574 &cmdlist);
575 add_basic_prefix_cmd ("append", class_vars,
576 _("Append target code/data to a local file."),
577 &append_cmdlist, "append ",
578 0/*allow-unknown*/,
579 &cmdlist);
f02df580
MS
580
581 add_dump_command ("memory", dump_memory_command, "\
582Write contents of memory to a raw binary file.\n\
583Arguments are FILE START STOP. Writes the contents of memory within the\n\
64b9b334 584range [START .. STOP) to the specified FILE in raw target ordered bytes.");
f02df580
MS
585
586 add_dump_command ("value", dump_value_command, "\
587Write the value of an expression to a raw binary file.\n\
588Arguments are FILE EXPRESSION. Writes the value of EXPRESSION to\n\
589the specified FILE in raw target ordered bytes.");
590
0743fc83
TT
591 add_basic_prefix_cmd ("srec", all_commands,
592 _("Write target code/data to an srec file."),
593 &srec_cmdlist, "dump srec ",
594 0 /*allow-unknown*/,
595 &dump_cmdlist);
596
597 add_basic_prefix_cmd ("ihex", all_commands,
598 _("Write target code/data to an intel hex file."),
599 &ihex_cmdlist, "dump ihex ",
600 0 /*allow-unknown*/,
601 &dump_cmdlist);
602
603 add_basic_prefix_cmd ("verilog", all_commands,
604 _("Write target code/data to a verilog hex file."),
605 &verilog_cmdlist, "dump verilog ",
606 0 /*allow-unknown*/,
607 &dump_cmdlist);
608
609 add_basic_prefix_cmd ("tekhex", all_commands,
610 _("Write target code/data to a tekhex file."),
611 &tekhex_cmdlist, "dump tekhex ",
612 0 /*allow-unknown*/,
613 &dump_cmdlist);
614
615 add_basic_prefix_cmd ("binary", all_commands,
616 _("Write target code/data to a raw binary file."),
617 &binary_dump_cmdlist, "dump binary ",
618 0 /*allow-unknown*/,
619 &dump_cmdlist);
620
621 add_basic_prefix_cmd ("binary", all_commands,
622 _("Append target code/data to a raw binary file."),
623 &binary_append_cmdlist, "append binary ",
624 0 /*allow-unknown*/,
625 &append_cmdlist);
f02df580 626
1a966eab 627 add_cmd ("memory", all_commands, dump_srec_memory, _("\
f02df580
MS
628Write contents of memory to an srec file.\n\
629Arguments are FILE START STOP. Writes the contents of memory\n\
64b9b334 630within the range [START .. STOP) to the specified FILE in srec format."),
f02df580
MS
631 &srec_cmdlist);
632
1a966eab 633 add_cmd ("value", all_commands, dump_srec_value, _("\
f02df580
MS
634Write the value of an expression to an srec file.\n\
635Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 636to the specified FILE in srec format."),
f02df580
MS
637 &srec_cmdlist);
638
1a966eab 639 add_cmd ("memory", all_commands, dump_ihex_memory, _("\
f02df580
MS
640Write contents of memory to an ihex file.\n\
641Arguments are FILE START STOP. Writes the contents of memory within\n\
64b9b334 642the range [START .. STOP) to the specified FILE in intel hex format."),
f02df580
MS
643 &ihex_cmdlist);
644
1a966eab 645 add_cmd ("value", all_commands, dump_ihex_value, _("\
f02df580
MS
646Write the value of an expression to an ihex file.\n\
647Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 648to the specified FILE in intel hex format."),
f02df580
MS
649 &ihex_cmdlist);
650
cf75d6c3
AB
651 add_cmd ("memory", all_commands, dump_verilog_memory, _("\
652Write contents of memory to a verilog hex file.\n\
653Arguments are FILE START STOP. Writes the contents of memory within\n\
654the range [START .. STOP) to the specified FILE in verilog hex format."),
655 &verilog_cmdlist);
656
657 add_cmd ("value", all_commands, dump_verilog_value, _("\
658Write the value of an expression to a verilog hex file.\n\
659Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
660to the specified FILE in verilog hex format."),
661 &verilog_cmdlist);
662
1a966eab 663 add_cmd ("memory", all_commands, dump_tekhex_memory, _("\
f02df580
MS
664Write contents of memory to a tekhex file.\n\
665Arguments are FILE START STOP. Writes the contents of memory\n\
64b9b334 666within the range [START .. STOP) to the specified FILE in tekhex format."),
f02df580
MS
667 &tekhex_cmdlist);
668
1a966eab 669 add_cmd ("value", all_commands, dump_tekhex_value, _("\
f02df580
MS
670Write the value of an expression to a tekhex file.\n\
671Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 672to the specified FILE in tekhex format."),
f02df580
MS
673 &tekhex_cmdlist);
674
1a966eab 675 add_cmd ("memory", all_commands, dump_binary_memory, _("\
f02df580
MS
676Write contents of memory to a raw binary file.\n\
677Arguments are FILE START STOP. Writes the contents of memory\n\
64b9b334 678within the range [START .. STOP) to the specified FILE in binary format."),
f02df580
MS
679 &binary_dump_cmdlist);
680
1a966eab 681 add_cmd ("value", all_commands, dump_binary_value, _("\
f02df580
MS
682Write the value of an expression to a raw binary file.\n\
683Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 684to the specified FILE in raw target ordered bytes."),
f02df580
MS
685 &binary_dump_cmdlist);
686
1a966eab 687 add_cmd ("memory", all_commands, append_binary_memory, _("\
f02df580
MS
688Append contents of memory to a raw binary file.\n\
689Arguments are FILE START STOP. Writes the contents of memory within the\n\
64b9b334 690range [START .. STOP) to the specified FILE in raw target ordered bytes."),
f02df580
MS
691 &binary_append_cmdlist);
692
1a966eab 693 add_cmd ("value", all_commands, append_binary_value, _("\
f02df580
MS
694Append the value of an expression to a raw binary file.\n\
695Arguments are FILE EXPRESSION. Writes the value of EXPRESSION\n\
1a966eab 696to the specified FILE in raw target ordered bytes."),
f02df580
MS
697 &binary_append_cmdlist);
698
1bedd215
AC
699 c = add_com ("restore", class_vars, restore_command, _("\
700Restore the contents of FILE to target memory.\n\
f02df580
MS
701Arguments are FILE OFFSET START END where all except FILE are optional.\n\
702OFFSET will be added to the base address of the file (default zero).\n\
9eb6e5a1 703If START and END are given, only the file contents within that range\n\
1bedd215 704(file relative) will be restored to target memory."));
f02df580 705 c->completer = filename_completer;
ebcd3b23 706 /* FIXME: completers for other commands. */
f02df580 707}
This page took 1.253585 seconds and 4 git commands to generate.