* dsrec.c: Cosmetic improvements.

(make-srec): Change indexing of format and code tables to
	remove confusing empty entries.
This commit is contained in:
Stan Shebs 1997-12-24 12:51:55 +00:00
parent af36ce35ef
commit 8c3bd6a40e
2 changed files with 62 additions and 39 deletions

View file

@ -1,3 +1,9 @@
Wed Dec 24 12:48:48 1997 Stan Shebs <shebs@andros.cygnus.com>
* dsrec.c: Cosmetic improvements.
(make-srec): Change indexing of format and code tables to
remove confusing empty entries.
Mon Dec 22 21:51:53 1997 Mark Alexander <marka@cygnus.com> Mon Dec 22 21:51:53 1997 Mark Alexander <marka@cygnus.com>
* remote-mips.c (_initialize_remote_mips): Fix DDB doc string. * remote-mips.c (_initialize_remote_mips): Fix DDB doc string.

View file

@ -1,5 +1,5 @@
/* S-record download support for GDB, the GNU debugger. /* S-record download support for GDB, the GNU debugger.
Copyright 1995, 1996 Free Software Foundation, Inc. Copyright 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of GDB. This file is part of GDB.
@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "srec.h" #include "srec.h"
#include <time.h> #include <time.h>
int (*ui_load_progress_hook) PARAMS ((char *, unsigned long));
extern void report_transfer_performance PARAMS ((unsigned long, time_t, time_t)); extern void report_transfer_performance PARAMS ((unsigned long, time_t, time_t));
extern int remote_debug; extern int remote_debug;
@ -30,16 +31,17 @@ static int make_srec PARAMS ((char *srec, CORE_ADDR targ_addr, bfd *abfd,
asection *sect, int sectoff, int *maxrecsize, asection *sect, int sectoff, int *maxrecsize,
int flags)); int flags));
/* Download an executable by converting it to S records. DESC is a serial_t /* Download an executable by converting it to S records. DESC is a
to send the data to. FILE is the name of the file to be loaded. serial_t to send the data to. FILE is the name of the file to be
LOAD_OFFSET is the offset into memory to load data into. It is usually loaded. LOAD_OFFSET is the offset into memory to load data into.
specified by the user and is useful with the a.out file format. It is usually specified by the user and is useful with the a.out
MAXRECSIZE is the length in chars of the largest S-record the host can file format. MAXRECSIZE is the length in chars of the largest
accomodate. This is measured from the starting `S' to the last char of the S-record the host can accomodate. This is measured from the
checksum. FLAGS is various random flags, and HASHMARK is non-zero to cause starting `S' to the last char of the checksum. FLAGS is various
a `#' to be printed out for each record loaded. WAITACK, if non-NULL, is random flags, and HASHMARK is non-zero to cause a `#' to be
a function that waits for an acknowledgement after each S-record, and printed out for each record loaded. WAITACK, if non-NULL, is a
returns non-zero if the ack is read correctly. */ function that waits for an acknowledgement after each S-record,
and returns non-zero if the ack is read correctly. */
void void
load_srec (desc, file, load_offset, maxrecsize, flags, hashmark, waitack) load_srec (desc, file, load_offset, maxrecsize, flags, hashmark, waitack)
@ -59,7 +61,7 @@ load_srec (desc, file, load_offset, maxrecsize, flags, hashmark, waitack)
time_t start_time, end_time; time_t start_time, end_time;
unsigned long data_count = 0; unsigned long data_count = 0;
srec = (char *)alloca (maxrecsize + 1); srec = (char *) alloca (maxrecsize + 1);
abfd = bfd_openr (file, 0); abfd = bfd_openr (file, 0);
if (!abfd) if (!abfd)
@ -75,17 +77,26 @@ load_srec (desc, file, load_offset, maxrecsize, flags, hashmark, waitack)
} }
start_time = time (NULL); start_time = time (NULL);
/* Write a type 0 header record. no data for a type 0, and there
is no data, so len is 0. */
reclen = maxrecsize;
make_srec (srec, 0, NULL, NULL, 0, &reclen, flags);
if (remote_debug)
fprintf_unfiltered (gdb_stderr, "%.*s\\r\n", reclen-1, srec);
SERIAL_WRITE (desc, srec, reclen);
for (s = abfd->sections; s; s = s->next) for (s = abfd->sections; s; s = s->next)
if (s->flags & SEC_LOAD) if (s->flags & SEC_LOAD)
{ {
int numbytes; int numbytes;
bfd_vma addr = bfd_get_section_vma (abfd, s) + load_offset; bfd_vma addr = bfd_get_section_vma (abfd, s) + load_offset;
bfd_size_type size = bfd_get_section_size_before_reloc (s); bfd_size_type size = bfd_get_section_size_before_reloc (s);
char * section_name = bfd_get_section_name (abfd, s);
printf_filtered ("%s\t: 0x%08x .. 0x%08x ", printf_filtered ("%s\t: 0x%08x .. 0x%08x ",
bfd_get_section_name (abfd, s), section_name, (int) addr, (int) addr + size);
(int) addr, (int) addr + size);
gdb_flush (gdb_stdout); gdb_flush (gdb_stdout);
data_count += size; data_count += size;
@ -99,13 +110,16 @@ load_srec (desc, file, load_offset, maxrecsize, flags, hashmark, waitack)
if (remote_debug) if (remote_debug)
fprintf_unfiltered (gdb_stderr, "%.*s\\r\n", reclen-1, srec); fprintf_unfiltered (gdb_stderr, "%.*s\\r\n", reclen-1, srec);
/* Repeatedly send the S-record until a good acknowledgement /* Repeatedly send the S-record until a good
is sent back. */ acknowledgement is sent back. */
do do
{ {
SERIAL_WRITE (desc, srec, reclen); SERIAL_WRITE (desc, srec, reclen);
if (ui_load_progress_hook)
if (ui_load_progress_hook (section_name, (unsigned long) i))
error ("Canceled the download");
} }
while (waitack != NULL && !waitack()); while (waitack != NULL && !waitack ());
if (hashmark) if (hashmark)
{ {
@ -114,16 +128,18 @@ load_srec (desc, file, load_offset, maxrecsize, flags, hashmark, waitack)
} }
} /* Per-packet (or S-record) loop */ } /* Per-packet (or S-record) loop */
if (ui_load_progress_hook)
if (ui_load_progress_hook (section_name, (unsigned long) i))
error ("Canceled the download");
putchar_unfiltered ('\n'); putchar_unfiltered ('\n');
} /* Loadable sections */ }
if (hashmark) if (hashmark)
putchar_unfiltered ('\n'); putchar_unfiltered ('\n');
end_time = time (NULL); end_time = time (NULL);
/* Write a type 7 terminator record. no data for a type 7, and there /* Write a terminator record. */
is no data, so len is 0. */
reclen = maxrecsize; reclen = maxrecsize;
make_srec (srec, abfd->start_address, NULL, NULL, 0, &reclen, flags); make_srec (srec, abfd->start_address, NULL, NULL, 0, &reclen, flags);
@ -132,7 +148,8 @@ load_srec (desc, file, load_offset, maxrecsize, flags, hashmark, waitack)
fprintf_unfiltered (gdb_stderr, "%.*s\\r\n", reclen-1, srec); fprintf_unfiltered (gdb_stderr, "%.*s\\r\n", reclen-1, srec);
SERIAL_WRITE (desc, srec, reclen); SERIAL_WRITE (desc, srec, reclen);
SERIAL_WRITE (desc, "\r\r", 2); /* Some monitors need these to wake up */ /* Some monitors need these to wake up properly. (Which ones? -sts) */
SERIAL_WRITE (desc, "\r\r", 2);
SERIAL_FLUSH_INPUT (desc); SERIAL_FLUSH_INPUT (desc);
@ -196,14 +213,14 @@ make_srec (srec, targ_addr, abfd, sect, sectoff, maxrecsize, flags)
unsigned char checksum; unsigned char checksum;
int tmp; int tmp;
const static char hextab[] = "0123456789ABCDEF"; const static char hextab[] = "0123456789ABCDEF";
const static char data_code_table[] = "xx123"; const static char data_code_table[] = "123";
const static char term_code_table[] = "xx987"; const static char term_code_table[] = "987";
const static char *formats[] = {NULL, NULL, "S%c%02X%04X", "S%c%02X%06X", const static char *formats[] = { "S%c%02X%04X",
"S%c%02X%08X"}; "S%c%02X%06X",
"S%c%02X%08X" };
char const *code_table; char const *code_table;
int addr_size; int addr_size;
int payload_size; int payload_size;
int type_code;
char *binbuf; char *binbuf;
char *p; char *p;
@ -226,11 +243,11 @@ make_srec (srec, targ_addr, abfd, sect, sectoff, maxrecsize, flags)
else if (tmp & SREC_4_BYTE_ADDR) else if (tmp & SREC_4_BYTE_ADDR)
addr_size = 4; addr_size = 4;
else else
fatal ("make_srec: Bad address (0x%x), or bad flags (0x%x).", targ_addr, fatal ("make_srec: Bad address (0x%x), or bad flags (0x%x).",
flags); targ_addr, flags);
/* Now that we know the address size, we can figure out how much data this /* Now that we know the address size, we can figure out how much
record can hold. */ data this record can hold. */
if (sect) if (sect)
{ {
@ -242,26 +259,26 @@ make_srec (srec, targ_addr, abfd, sect, sectoff, maxrecsize, flags)
else else
payload_size = 0; /* Term packets have no payload */ payload_size = 0; /* Term packets have no payload */
/* Output the header. */ /* Output the header. */
sprintf (srec, formats[addr_size], code_table[addr_size], sprintf (srec, formats[addr_size - 2], code_table[addr_size - 2],
addr_size + payload_size + 1, targ_addr); addr_size + payload_size + 1, targ_addr);
/* Note that the checksum is calculated on the raw data, not the hexified /* Note that the checksum is calculated on the raw data, not the
data. It includes the length, address and the data portions of the hexified data. It includes the length, address and the data
packet. */ portions of the packet. */
checksum = 0; checksum = 0;
checksum += (payload_size + addr_size + 1 /* Packet length */ checksum += (payload_size + addr_size + 1 /* Packet length */
+ (targ_addr & 0xff) /* Address... */ + (targ_addr & 0xff) /* Address... */
+ ((targ_addr >> 8) & 0xff) + ((targ_addr >> 8) & 0xff)
+ ((targ_addr >> 16) & 0xff) + ((targ_addr >> 16) & 0xff)
+ ((targ_addr >> 24) & 0xff)); + ((targ_addr >> 24) & 0xff));
p = srec + 1 + 1 + 2 + addr_size * 2; p = srec + 1 + 1 + 2 + addr_size * 2;
/* build the srecord */ /* Build the Srecord. */
for (tmp = 0; tmp < payload_size; tmp++) for (tmp = 0; tmp < payload_size; tmp++)
{ {
unsigned char k; unsigned char k;