This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
RedBoot - fix load I/O problem
- From: Gary Thomas <gary at chez-thomas dot org>
- To: eCos patches <ecos-patches at sources dot redhat dot com>
- Date: 18 Jul 2002 14:05:49 -0600
- Subject: 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);