29 asection * sect,
int sectoff,
int *maxrecsize,
47 int flags,
int hashmark,
int (*waitack) (
void))
54 struct timeval start_time, end_time;
55 unsigned long data_count = 0;
58 srec = (
char *) alloca (maxrecsize + 1);
68 if (bfd_check_format (abfd, bfd_object) == 0)
75 gettimeofday (&start_time, NULL);
81 make_srec (srec, 0, NULL, (asection *) 1, 0, &reclen, flags);
89 for (s = abfd->sections; s; s = s->next)
90 if (s->flags & SEC_LOAD)
94 bfd_vma addr = bfd_get_section_vma (abfd, s) + load_offset;
95 bfd_size_type
size = bfd_get_section_size (s);
96 char *section_name = (
char *) bfd_get_section_name (abfd, s);
109 for (i = 0; i <
size; i += numbytes)
129 error (
_(
"Canceled the download"));
131 while (waitack != NULL && !waitack ());
143 error (
_(
"Canceled the download"));
150 gettimeofday (&end_time, NULL);
155 make_srec (srec, abfd->start_address, NULL, NULL, 0, &reclen, flags);
173 &start_time, &end_time);
223 int sectoff,
int *maxrecsize,
int flags)
225 unsigned char checksum;
227 static const char hextab[] =
"0123456789ABCDEF";
228 static const char data_code_table[] =
"123";
229 static const char term_code_table[] =
"987";
230 static const char header_code_table[] =
"000";
231 char const *code_table;
240 code_table = abfd ? data_code_table : header_code_table;
241 binbuf = alloca (*maxrecsize / 2);
246 code_table = term_code_table;
258 _(
"make_srec: Bad address (%s), or bad flags (0x%x)."),
266 payload_size = (*maxrecsize - (1 + 1 + 2 + addr_size * 2 + 2)) / 2;
267 payload_size =
min (payload_size, bfd_get_section_size (sect) - sectoff);
269 bfd_get_section_contents (abfd, sect, binbuf, sectoff, payload_size);
275 snprintf (srec, (*maxrecsize) + 1,
"S%c%02X%0*X",
276 code_table[addr_size - 2],
277 addr_size + payload_size + 1,
278 addr_size * 2, (
int) targ_addr);
286 checksum += (payload_size + addr_size + 1
288 + ((targ_addr >> 8) & 0xff)
289 + ((targ_addr >> 16) & 0xff)
290 + ((targ_addr >> 24) & 0xff));
294 gdb_assert (strlen (srec) == 1 + 1 + 2 + addr_size * 2);
295 p = srec + 1 + 1 + 2 + addr_size * 2;
298 for (tmp = 0; tmp < payload_size; tmp++)
303 *p++ = hextab[k >> 4];
304 *p++ = hextab[k & 0xf];
308 checksum = ~checksum;
310 *p++ = hextab[checksum >> 4];
311 *p++ = hextab[checksum & 0xf];
314 *maxrecsize = p - srec;
struct gdbarch * target_gdbarch(void)
int putchar_unfiltered(int c)
struct ui_file * gdb_stdout
void internal_error(const char *file, int line, const char *fmt,...)
int serial_write(struct serial *scb, const void *buf, size_t count)
struct bfd * gdb_bfd_open(const char *name, const char *target, int fd)
void printf_filtered(const char *format,...)
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
static int make_srec(char *srec, CORE_ADDR targ_addr, bfd *abfd, asection *sect, int sectoff, int *maxrecsize, int flags)
mach_port_t kern_return_t mach_port_t msgports mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
int serial_flush_input(struct serial *scb)
void print_transfer_performance(struct ui_file *stream, unsigned long data_count, unsigned long write_count, const struct timeval *start_time, const struct timeval *end_time)
void puts_debug(char *prefix, char *string, char *suffix)
struct cleanup * make_cleanup_bfd_unref(bfd *abfd)
void load_srec(struct serial *desc, const char *file, bfd_vma load_offset, int maxrecsize, int flags, int hashmark, int(*waitack)(void))
void gdb_flush(struct ui_file *file)
int(* deprecated_ui_load_progress_hook)(const char *section, unsigned long num)
void error(const char *fmt,...)
void do_cleanups(struct cleanup *old_chain)