Mercurial > ecos
changeset 245:a6660704f7a6
Fix problem with x/y-modem load.
author | gthomas |
---|---|
date | Thu, 18 Jul 2002 20:05:22 +0000 |
parents | b558d7de4fda |
children | 3dc95a509824 |
files | packages/redboot/current/ChangeLog packages/redboot/current/include/redboot.h packages/redboot/current/src/fs/disk.c packages/redboot/current/src/load.c packages/redboot/current/src/net/http_client.c packages/redboot/current/src/net/tftp_client.c packages/redboot/current/src/xyzModem.c |
diffstat | 7 files changed, 52 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/redboot/current/ChangeLog +++ b/packages/redboot/current/ChangeLog @@ -1,3 +1,13 @@ +2002-07-18 Gary Thomas <gary@chez-thomas.org> + + * src/net/tftp_client.c: + * src/net/http_client.c: + * src/fs/disk.c: + * src/xyzModem.c: + * src/load.c: + * include/redboot.h: Rework load/mode information tables so that + load I/O methods can detect actual mode (e.g. X-modem vs Y-modem) + 2002-07-16 Hendrik Ruijter <Hendrik.Ruijter@axis.com> 2002-07-16 Mark Salter <msalter@redhat.com>
--- a/packages/redboot/current/include/redboot.h +++ b/packages/redboot/current/include/redboot.h @@ -155,7 +155,7 @@ externC void expand_aliases(char *line, typedef struct { char *filename; - struct load_io_entry *mode; + int mode; int chan; #ifdef CYGPKG_REDBOOT_NETWORKING struct sockaddr_in *server; @@ -176,17 +176,18 @@ getc_io_funcs_t _label_ = { }; struct load_io_entry { - char *mode; + char *name; getc_io_funcs_t *funcs; bool can_verbose; bool need_filename; + int mode; } CYG_HAL_TABLE_TYPE; -#define _RedBoot_load(_mode_,_funcs_,_verbose_,_filename_) \ -struct load_io_entry _load_tab_##_funcs_##_mode_ \ - CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_load,_funcs_##_mode) = \ - { #_mode_, &_funcs_, _verbose_, _filename_ }; -#define RedBoot_load(_mode_,_funcs_,_verbose_,_filename_) \ - _RedBoot_load(_mode_,_funcs_,_verbose_,_filename_) +#define _RedBoot_load(_name_,_funcs_,_verbose_,_filename_,_mode_) \ +struct load_io_entry _load_tab_##_funcs_##_name_ \ + CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_load,_funcs_##_name) = \ + { #_name_, &_funcs_, _verbose_, _filename_, _mode_ }; +#define RedBoot_load(_name_,_funcs_,_verbose_,_filename_, _mode_) \ + _RedBoot_load(_name_,_funcs_,_verbose_,_filename_,_mode_) #ifdef CYGPKG_COMPRESS_ZLIB // Decompression support
--- a/packages/redboot/current/src/fs/disk.c +++ b/packages/redboot/current/src/fs/disk.c @@ -432,4 +432,4 @@ disk_error(int err) // GETC_IO_FUNCS(disk_io, disk_stream_open, disk_stream_close, 0, disk_stream_read, disk_error); -RedBoot_load(disk, disk_io, true, true); +RedBoot_load(disk, disk_io, true, true, 0);
--- a/packages/redboot/current/src/load.c +++ b/packages/redboot/current/src/load.c @@ -387,13 +387,20 @@ load_elf_image(getc_t getc, unsigned lon } } // Save load base/top and entry - load_address = lowest_address; - load_address_end = highest_address; - entry_address = ehdr.e_entry; + if (base) { + load_address = base; + load_address_end = base + (highest_address - lowest_address); + entry_address = base + (ehdr.e_entry - lowest_address); + } else { + load_address = lowest_address; + load_address_end = highest_address; + entry_address = ehdr.e_entry; + } + redboot_getc_terminate(false); if (addr_offset) diag_printf("Address offset = %p\n", (void *)addr_offset); diag_printf("Entry point: %p, address range: %p-%p\n", - (void*)ehdr.e_entry, (void *)lowest_address, (void *)highest_address); + (void*)entry_address, (void *)load_address, (void *)load_address_end); return 1; #else // CYGSEM_REDBOOT_ELF diag_printf("Loading ELF images not supported\n"); @@ -521,18 +528,22 @@ load_srec_image(getc_t getc, unsigned lo case '9': addr = (unsigned char *)_hex2(getc, ('9'-type+2), &sum); offset += ('9'-type+2); - // Save entry address - entry_address = (unsigned long)addr; + // Save load base/top, entry address + if (base) { + load_address = base; + load_address_end = base + (highest_address - lowest_address); + entry_address = (unsigned long)(base + (addr - lowest_address)); + } else { + load_address = lowest_address; + load_address_end = highest_address; + entry_address = (unsigned long)addr; + } redboot_getc_terminate(false); if (addr_offset) diag_printf("Address offset = %p\n", (void *)addr_offset); diag_printf("Entry point: %p, address range: %p-%p\n", - (void*)entry_address, (void *)lowest_address, (void *)highest_address); + (void*)entry_address, (void *)load_address, (void *)load_address_end); - // Save load base/top - load_address = lowest_address; - load_address_end = highest_address; - - return highest_address; + return load_address_end; default: redboot_getc_terminate(true); diag_printf("Invalid S-record at offset 0x%lx, type: %x\n", @@ -640,7 +651,7 @@ do_load(int argc, char *argv[]) io = (getc_io_funcs_t *)NULL; for (io_tab = __RedBoot_LOAD_TAB__; io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) { - if (strncasecmp(&mode_str[0], io_tab->mode, strlen(&mode_str[0])) == 0) { + if (strncasecmp(&mode_str[0], io_tab->name, strlen(&mode_str[0])) == 0) { io = io_tab->funcs; break; } @@ -649,7 +660,7 @@ do_load(int argc, char *argv[]) diag_printf("Invalid 'mode': %s. Valid modes are:", mode_str); for (io_tab = __RedBoot_LOAD_TAB__; io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) { - diag_printf(" %s", io_tab->mode); + diag_printf(" %s", io_tab->name); } diag_printf("\n"); } @@ -685,7 +696,7 @@ do_load(int argc, char *argv[]) } info.filename = filename; info.chan = chan; - info.mode = io_tab; + info.mode = io_tab->mode; #ifdef CYGPKG_REDBOOT_NETWORKING info.server = &host; #endif @@ -741,6 +752,7 @@ do_load(int argc, char *argv[]) ((type[1] >= '0') && (type[1] <= '9'))) { end = load_srec_image(redboot_getc, base); } else { + redboot_getc_terminate(true); diag_printf("Unrecognized image type: 0x%lx\n", *(unsigned long *)type); } }
--- a/packages/redboot/current/src/net/http_client.c +++ b/packages/redboot/current/src/net/http_client.c @@ -238,4 +238,4 @@ http_error(int err) // GETC_IO_FUNCS(http_io, http_stream_open, http_stream_close, 0, http_stream_read, http_error); -RedBoot_load(http, http_io, true, true); +RedBoot_load(http, http_io, true, true, 0);
--- a/packages/redboot/current/src/net/tftp_client.c +++ b/packages/redboot/current/src/net/tftp_client.c @@ -255,5 +255,5 @@ tftp_error(int err) // GETC_IO_FUNCS(tftp_io, tftp_stream_open, tftp_stream_close, 0, tftp_stream_read, tftp_error); -RedBoot_load(tftp, tftp_io, true, true); +RedBoot_load(tftp, tftp_io, true, true, 0);
--- a/packages/redboot/current/src/xyzModem.c +++ b/packages/redboot/current/src/xyzModem.c @@ -145,7 +145,7 @@ zm_flush(void) static void zm_dump_buf(void *buf, int len) { - vdump_buf_with_offset(zm_dprintf, buf, len, 0); + diag_vdump_buf_with_offset(zm_dprintf, buf, len, 0); } static unsigned char zm_buf[2048]; @@ -584,5 +584,5 @@ xyzModem_error(int err) // GETC_IO_FUNCS(xyzModem_io, xyzModem_stream_open, xyzModem_stream_close, xyzModem_stream_terminate, xyzModem_stream_read, xyzModem_error); -RedBoot_load(xmodem, xyzModem_io, false, false); -RedBoot_load(ymodem, xyzModem_io, false, false); +RedBoot_load(xmodem, xyzModem_io, false, false, xyzModem_xmodem); +RedBoot_load(ymodem, xyzModem_io, false, false, xyzModem_ymodem);