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);