This is the mail archive of the ecos-patches@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RedBoot - fix load I/O problem


Index: redboot/current/ChangeLog
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/redboot/current/ChangeLog,v
retrieving revision 1.62
diff -u -5 -p -r1.62 ChangeLog
--- redboot/current/ChangeLog	16 Jul 2002 16:25:42 -0000	1.62
+++ redboot/current/ChangeLog	18 Jul 2002 20:05:01 -0000
@@ -1,5 +1,15 @@
+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>
 
 	* include/net/net.h: Add __tcp_abort prototype.
 
Index: redboot/current/include/redboot.h
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/redboot/current/include/redboot.h,v
retrieving revision 1.24
diff -u -5 -p -r1.24 redboot.h
--- redboot/current/include/redboot.h	1 Jul 2002 20:55:27 -0000	1.24
+++ redboot/current/include/redboot.h	18 Jul 2002 19:57:26 -0000
@@ -153,11 +153,11 @@ externC void expand_aliases(char *line, 
 // Stream I/O support
 //
 
 typedef struct {
     char *filename;
-    struct load_io_entry *mode;
+    int   mode;
     int   chan;
 #ifdef CYGPKG_REDBOOT_NETWORKING
     struct sockaddr_in *server;
 #endif
 } connection_info_t;
@@ -174,21 +174,22 @@ typedef struct {
 getc_io_funcs_t _label_ = {                                                     \
     _open_, _close_, _terminate_, _read_, _error_                               \
 };
 
 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
 typedef struct _pipe {
     unsigned char* in_buf;              // only changed by producer
Index: redboot/current/src/load.c
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/redboot/current/src/load.c,v
retrieving revision 1.25
diff -u -5 -p -r1.25 load.c
--- redboot/current/src/load.c	1 Jul 2002 20:55:28 -0000	1.25
+++ redboot/current/src/load.c	18 Jul 2002 20:01:59 -0000
@@ -385,17 +385,24 @@ 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");
     return 0;
 #endif // CYGSEM_REDBOOT_ELF
@@ -519,22 +526,26 @@ load_srec_image(getc_t getc, unsigned lo
         case '7':
         case '8':
         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);
-
-            // Save load base/top
-            load_address = lowest_address;
-            load_address_end = highest_address;
+                   (void*)entry_address, (void *)load_address, (void *)load_address_end);
 
-            return highest_address;
+            return load_address_end;
         default:
             redboot_getc_terminate(true);
             diag_printf("Invalid S-record at offset 0x%lx, type: %x\n", 
                    (unsigned long)offset, type);
             return 0;
@@ -638,20 +649,20 @@ do_load(int argc, char *argv[])
     }
     if (mode_str_set) {
         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;
             }
         }
         if (!io) {
             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");
         }
         if (!io) {
             return;
@@ -683,11 +694,11 @@ do_load(int argc, char *argv[])
         diag_printf("Raw load requires a memory address\n");
         return;
     }
     info.filename = filename;
     info.chan = chan;
-    info.mode = io_tab;
+    info.mode = io_tab->mode;
 #ifdef CYGPKG_REDBOOT_NETWORKING
     info.server = &host;
 #endif
     res = redboot_getc_init(&info, io, verbose, decompress);
     if (res < 0) {
@@ -739,10 +750,11 @@ do_load(int argc, char *argv[])
                 end = load_elf_image(redboot_getc, base);
             } else if ((type[0] == 'S') &&
                        ((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);
             }
         }
     }
 
Index: redboot/current/src/xyzModem.c
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/redboot/current/src/xyzModem.c,v
retrieving revision 1.15
diff -u -5 -p -r1.15 xyzModem.c
--- redboot/current/src/xyzModem.c	1 Jul 2002 20:55:28 -0000	1.15
+++ redboot/current/src/xyzModem.c	18 Jul 2002 19:40:18 -0000
@@ -143,11 +143,11 @@ zm_flush(void)
 #endif
 
 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];
 static unsigned char *zm_bp;
 
@@ -582,7 +582,7 @@ xyzModem_error(int err)
 //
 // RedBoot interface
 //
 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);
Index: redboot/current/src/fs/disk.c
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/redboot/current/src/fs/disk.c,v
retrieving revision 1.9
diff -u -5 -p -r1.9 disk.c
--- redboot/current/src/fs/disk.c	1 Jul 2002 20:55:29 -0000	1.9
+++ redboot/current/src/fs/disk.c	18 Jul 2002 19:26:48 -0000
@@ -430,6 +430,6 @@ disk_error(int err)
 //
 // RedBoot interface
 //
 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);
Index: redboot/current/src/net/http_client.c
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/redboot/current/src/net/http_client.c,v
retrieving revision 1.2
diff -u -5 -p -r1.2 http_client.c
--- redboot/current/src/net/http_client.c	1 Jul 2002 20:55:29 -0000	1.2
+++ redboot/current/src/net/http_client.c	18 Jul 2002 19:26:49 -0000
@@ -236,6 +236,6 @@ http_error(int err)
 //
 // RedBoot interface
 //
 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);
Index: redboot/current/src/net/tftp_client.c
===================================================================
RCS file: /misc/cvsfiles/ecos/packages/redboot/current/src/net/tftp_client.c,v
retrieving revision 1.10
diff -u -5 -p -r1.10 tftp_client.c
--- redboot/current/src/net/tftp_client.c	1 Jul 2002 20:55:30 -0000	1.10
+++ redboot/current/src/net/tftp_client.c	18 Jul 2002 19:26:49 -0000
@@ -253,7 +253,7 @@ tftp_error(int err)
 //
 // RedBoot interface
 //
 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);
 




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]