annotate packages/redboot/current/src/load.c @ 2614:6cbecf3cc2e4

* src/fconfig.c, src/flash.c, src/io.c, src/load.c, src/main.c, src/xyzModem.c, include/redboot.h: more signed vs. unsigned char issues. * src/fs/e2fs.c (e2fs_mount): Avoid compiler strict aliasing problem. * include/fis.h (struct fis_image_desc): Make fis name be signed char to reduce warnings. * include/flash_config.h (struct _config): Make config_data be signed char to reduce warnings. * include/redboot.h: mon_write_char and mon_read_char_with_timeout take unsigned char, to reduce warnings. * src/parse.c: Add const to err_printf format. * src/fconfig.c: Many signed/unsigned warning cleanups. * src/io.c: Ditto. * src/xyzModem.c: Ditto. * src/load.c: Ditto. * src/flash.c: Ditto. * src/fconfig.c (flash_write_config): Warning cleanup. * src/net/net_io.c (do_ip_addr): Warning cleanup. * src/flash.c (fis_create): Warning cleanup. * include/net/net.h: Include redboot.h for tick functions. * include/net/net.h: Pull tick functions into redboot.h as they are used more widely than the net stack. * include/redboot.h: Declare tick functions. * src/main.c (cyg_start): Correctly compute workspace_end so it works even on high RAM values [bug #1000202]. Don't use workspace_end directly for context init - it gets modified. (do_go): Don't use workspace_end directly for context init - it gets modified.
author jlarmour
date Tue, 11 Nov 2008 04:32:10 +0000
parents 460b70d39a50
children 74dbf4c3f2e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
3 // load.c
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
4 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
5 // RedBoot file/image loader
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
6 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
12 // Copyright (C) 2002, 2003, 2004 Gary Thomas
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
13 // Copyright (C) 2004 eCosCentric Limited
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
14 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
15 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
16 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
17 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
18 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
19 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
20 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
21 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
22 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
23 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
24 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
25 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
26 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
27 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
28 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
29 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
30 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
31 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
32 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
33 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
34 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
35 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
36 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
37 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
38 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
39 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
40 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
41 //####ECOSGPLCOPYRIGHTEND####
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
42 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
43 //#####DESCRIPTIONBEGIN####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
44 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
45 // Author(s): gthomas
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
46 // Contributors: gthomas, tsmith
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
47 // Date: 2000-07-14
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
48 // Purpose:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
49 // Description:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
50 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
51 // This code is part of RedBoot (tm).
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
52 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
53 //####DESCRIPTIONEND####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
54 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
55 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
56
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
57 #include <redboot.h>
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
58 #include <elf.h>
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
59 #ifdef CYGBLD_BUILD_REDBOOT_WITH_XYZMODEM
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
60 #include <xyzModem.h>
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
61 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
62 #ifdef CYGPKG_REDBOOT_DISK
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
63 #include <fs/disk.h>
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
64 #endif
1414
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
65 #ifdef CYGPKG_REDBOOT_FILEIO
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
66 #include <fs/fileio.h>
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
67 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
68 #ifdef CYGPKG_REDBOOT_NETWORKING
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
69 #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
70 #include <net/tftp_support.h>
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
71 #endif
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
72 #ifdef CYGSEM_REDBOOT_NET_HTTP_DOWNLOAD
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
73 #include <net/http.h>
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
74 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
75 #endif
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
76 #include <cyg/infra/cyg_ass.h> // assertion macros
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
77 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
78 #include <cyg/io/flash.h>
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
79 #include "flash_load.h"
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
80 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
81
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
82 static char usage[] = "[-r] [-v] "
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
83 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
84 "[-d] "
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
85 #endif
1551
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
86 #ifdef CYGPKG_REDBOOT_NETWORKING
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
87 "[-h <host>] [-p <TCP port>]"
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
88 #endif
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
89 "[-m <varies>] "
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
90 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
91 "[-c <channel_number>] "
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
92 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
93 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
94 "[-f <flash_address>] "
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
95 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
96 "\n [-b <base_address>] <file_name>";
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
97
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
98 // Exported CLI function
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
99 RedBoot_cmd("load",
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
100 "Load a file",
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
101 usage,
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
102 do_load
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
103 );
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
104
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
105 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
106 // Stream I/O support
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
107 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
108
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
109 // Table describing the various I/O methods
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
110 CYG_HAL_TABLE_BEGIN( __RedBoot_LOAD_TAB__, RedBoot_load );
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
111 CYG_HAL_TABLE_END( __RedBoot_LOAD_TAB_END__, RedBoot_load );
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
112 extern struct load_io_entry __RedBoot_LOAD_TAB__[], __RedBoot_LOAD_TAB_END__;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
113
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
114 // Buffers, data used by redboot_getc
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
115 #define BUF_SIZE CYGNUM_REDBOOT_GETC_BUFFER
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
116 struct {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
117 getc_io_funcs_t *io;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
118 int (*fun)(char *, int len, int *err);
2614
6cbecf3cc2e4 * src/fconfig.c, src/flash.c, src/io.c, src/load.c, src/main.c,
jlarmour
parents: 2355
diff changeset
119 char buf[BUF_SIZE];
6cbecf3cc2e4 * src/fconfig.c, src/flash.c, src/io.c, src/load.c, src/main.c,
jlarmour
parents: 2355
diff changeset
120 char *bufp;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
121 int avail, len, err;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
122 int verbose, decompress, tick;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
123 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
124 int (*raw_fun)(char *, int len, int *err);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
125 _pipe_t load_pipe;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
126 unsigned char _buffer[CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
127 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
128 } getc_info;
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 117
diff changeset
129
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
130 typedef int (*getc_t)(void);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
131
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
132 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
133 // Read the next data byte from the stream.
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
134 // Returns:
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
135 // >= 0 - actual data
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
136 // -1 - error or EOF, status in getc_info.err
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
137 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
138 static int
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
139 redboot_getc(void)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
140 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
141 static char spin[] = "|/-\\|-";
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
142 if (getc_info.avail < 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
143 return -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
144 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
145 if (getc_info.avail == 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
146 if (getc_info.verbose) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
147 err_printf("%c\b", spin[getc_info.tick++]);
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
148 if (getc_info.tick >= sizeof(spin)) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
149 getc_info.tick = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
150 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
151 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
152 if (getc_info.len < BUF_SIZE) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
153 // No more data available
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
154 if (getc_info.verbose) diag_printf("\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
155 return -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
156 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
157 getc_info.bufp = getc_info.buf;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
158 getc_info.len = (*getc_info.fun)(getc_info.bufp, BUF_SIZE, &getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
159 if ((getc_info.avail = getc_info.len) <= 0) {
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
160 if (getc_info.len < 0) {
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
161 diag_printf("I/O error: %s\n", (getc_info.io->error)(getc_info.err));
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
162 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
163 if (getc_info.verbose) diag_printf("\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
164 return -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
165 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
166 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
167 getc_info.avail--;
2614
6cbecf3cc2e4 * src/fconfig.c, src/flash.c, src/io.c, src/load.c, src/main.c,
jlarmour
parents: 2355
diff changeset
168 return ((int)*getc_info.bufp++) & 0x00FF;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
169 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
170
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
171 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
172 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
173 // Called to fetch a new chunk of data and decompress it
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
174 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
175 static int
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
176 _decompress_stream(char *buf, int len, int *err)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
177 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
178 _pipe_t* p = &getc_info.load_pipe;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
179 int res, total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
180
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
181 total = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
182 while (len > 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
183 if (p->in_avail == 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
184 p->in_buf = &getc_info._buffer[0];
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
185 res = (*getc_info.raw_fun)(p->in_buf, CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER,
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
186 &getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
187 if ((p->in_avail = res) <= 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
188 // No more data
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
189 return total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
190 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
191 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
192 p->out_buf = buf;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
193 p->out_size = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
194 p->out_max = len;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
195 res = (*_dc_inflate)(p);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
196 if (res != 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
197 *err = res;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
198 return total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
199 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
200 len -= p->out_size;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
201 buf += p->out_size;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
202 total += p->out_size;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
203 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
204 return total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
205 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
206 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
207
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
208 static int
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
209 redboot_getc_init(connection_info_t *info, getc_io_funcs_t *funcs,
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
210 int verbose, int decompress)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
211 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
212 int res;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
213
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
214 res = (funcs->open)(info, &getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
215 if (res < 0) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
216 err_printf("Can't load '%s': %s\n", info->filename, (funcs->error)(getc_info.err));
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
217 return res;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
218 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
219 getc_info.io = funcs;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
220 getc_info.fun = funcs->read;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
221 getc_info.avail = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
222 getc_info.len = BUF_SIZE;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
223 getc_info.verbose = verbose;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
224 getc_info.decompress = decompress;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
225 getc_info.tick = 0;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
226 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
227 if (decompress) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
228 _pipe_t* p = &getc_info.load_pipe;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
229 p->out_buf = &getc_info.buf[0];
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
230 p->out_size = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
231 p->in_avail = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
232 getc_info.raw_fun = getc_info.fun;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
233 getc_info.fun = _decompress_stream;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
234 getc_info.err = (*_dc_init)(p);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
235 if (0 != getc_info.err && p->msg) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
236 err_printf("open decompression error: %s\n", p->msg);
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
237 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
238 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
239 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
240 return 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
241 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
242
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
243 static void
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
244 redboot_getc_rewind(void)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
245 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
246 getc_info.bufp = getc_info.buf;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
247 getc_info.avail = getc_info.len;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
248 }
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 117
diff changeset
249
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
250 static void
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
251 redboot_getc_terminate(bool abort)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
252 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
253 if (getc_info.io->terminate) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
254 (getc_info.io->terminate)(abort, redboot_getc);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
255 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
256 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
257
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
258 static void
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
259 redboot_getc_close(void)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
260 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
261 (getc_info.io->close)(&getc_info.err);
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
262 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
263 if (getc_info.decompress) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
264 _pipe_t* p = &getc_info.load_pipe;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
265 int err = getc_info.err;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
266 if (0 != err && p->msg) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
267 diag_printf("decompression error: %s\n", p->msg);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
268 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
269 err = (*_dc_close)(p, getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
270 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
271 #endif
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
272 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
273
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
274 #ifdef CYGSEM_REDBOOT_ELF
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
275 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
276 // Support function - used to read bytes into a buffer
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
277 // Returns the number of bytes read (stops short on errors)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
278 //
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
279 static int
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
280 _read(int (*getc)(void), unsigned char *buf, int len)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
281 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
282 int total = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
283 int ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
284 while (len-- > 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
285 ch = (*getc)();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
286 if (ch < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
287 // EOF or error
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
288 break;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
289 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
290 *buf++ = ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
291 total++;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
292 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
293 return total;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
294 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
295 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
296
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
297 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
298 // Load an ELF [binary] image
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
299 //
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
300 static unsigned long
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
301 load_elf_image(getc_t getc, unsigned long base)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
302 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
303 #ifdef CYGSEM_REDBOOT_ELF
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
304 Elf32_Ehdr ehdr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
305 #define MAX_PHDR 8
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
306 Elf32_Phdr phdr[MAX_PHDR];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
307 unsigned long offset = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
308 int phx, len, ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
309 unsigned char *addr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
310 unsigned long addr_offset = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
311 unsigned long highest_address = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
312 unsigned long lowest_address = 0xFFFFFFFF;
2614
6cbecf3cc2e4 * src/fconfig.c, src/flash.c, src/io.c, src/load.c, src/main.c,
jlarmour
parents: 2355
diff changeset
313 const char SHORT_DATA[] = "Short data reading ELF file\n";
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
314
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
315 // Read the header
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
316 if (_read(getc, (unsigned char *)&ehdr, sizeof(ehdr)) != sizeof(ehdr)) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
317 err_printf("Can't read ELF header\n");
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
318 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
319 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
320 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
321 offset += sizeof(ehdr);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
322 #if 0 // DEBUG
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
323 diag_printf("Type: %d, Machine: %d, Version: %d, Entry: %p, PHoff: %p/%d/%d, SHoff: %p/%d/%d\n",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
324 ehdr.e_type, ehdr.e_machine, ehdr.e_version, ehdr.e_entry,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
325 ehdr.e_phoff, ehdr.e_phentsize, ehdr.e_phnum,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
326 ehdr.e_shoff, ehdr.e_shentsize, ehdr.e_shnum);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
327 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
328 if (ehdr.e_type != ET_EXEC) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
329 err_printf("Only absolute ELF images supported\n");
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
330 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
331 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
332 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
333 if (ehdr.e_phnum > MAX_PHDR) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
334 err_printf("Too many program headers\n");
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
335 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
336 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
337 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
338 while (offset < ehdr.e_phoff) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
339 if ((*getc)() < 0) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
340 err_printf(SHORT_DATA);
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
341 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
342 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
343 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
344 offset++;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
345 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
346 for (phx = 0; phx < ehdr.e_phnum; phx++) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
347 if (_read(getc, (unsigned char *)&phdr[phx], sizeof(phdr[0])) != sizeof(phdr[0])) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
348 err_printf("Can't read ELF program header\n");
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
349 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
350 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
351 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
352 #if 0 // DEBUG
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
353 diag_printf("Program header: type: %d, off: %p, va: %p, pa: %p, len: %d/%d, flags: %d\n",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
354 phdr[phx].p_type, phdr[phx].p_offset, phdr[phx].p_vaddr, phdr[phx].p_paddr,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
355 phdr[phx].p_filesz, phdr[phx].p_memsz, phdr[phx].p_flags);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
356 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
357 offset += sizeof(phdr[0]);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
358 }
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
359 if (base) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
360 // Set address offset based on lowest address in file.
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
361 addr_offset = 0xFFFFFFFF;
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
362 for (phx = 0; phx < ehdr.e_phnum; phx++) {
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
363 #ifdef CYGOPT_REDBOOT_ELF_VIRTUAL_ADDRESS
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
364 if ((phdr[phx].p_type == PT_LOAD) && (phdr[phx].p_vaddr < addr_offset)) {
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
365 addr_offset = phdr[phx].p_vaddr;
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
366 #else
1319
94e373b3fc8d Fix ELF load when -b option used.
gthomas
parents: 1253
diff changeset
367 if ((phdr[phx].p_type == PT_LOAD) && (phdr[phx].p_paddr < addr_offset)) {
1253
9ecd8873f657 Use LMA, not VMA
gthomas
parents: 1223
diff changeset
368 addr_offset = phdr[phx].p_paddr;
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
369 #endif
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
370 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
371 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
372 addr_offset = (unsigned long)base - addr_offset;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
373 } else {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
374 addr_offset = 0;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
375 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
376 for (phx = 0; phx < ehdr.e_phnum; phx++) {
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
377 if (phdr[phx].p_type == PT_LOAD) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
378 // Loadable segment
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
379 #ifdef CYGOPT_REDBOOT_ELF_VIRTUAL_ADDRESS
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
380 addr = (unsigned char *)phdr[phx].p_vaddr;
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
381 #else
1253
9ecd8873f657 Use LMA, not VMA
gthomas
parents: 1223
diff changeset
382 addr = (unsigned char *)phdr[phx].p_paddr;
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
383 #endif
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
384 len = phdr[phx].p_filesz;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
385 if ((unsigned long)addr < lowest_address) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
386 lowest_address = (unsigned long)addr;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
387 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
388 addr += addr_offset;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
389 if (offset > phdr[phx].p_offset) {
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
390 if ((phdr[phx].p_offset + len) < offset) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
391 err_printf("Can't load ELF file - program headers out of order\n");
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
392 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
393 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
394 }
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
395 addr += offset - phdr[phx].p_offset;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
396 } else {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
397 while (offset < phdr[phx].p_offset) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
398 if ((*getc)() < 0) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
399 err_printf(SHORT_DATA);
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
400 redboot_getc_terminate(true);
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
401 return 0;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
402 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
403 offset++;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
404 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
405 }
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
406
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
407 // Copy data into memory
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
408 while (len-- > 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
409 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
410 if (!(valid_address(addr)
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
411 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
412 || (flash_verify_addr(addr) == FLASH_ERR_OK)
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
413 #endif
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
414 )) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
415 redboot_getc_terminate(true);
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
416 err_printf("*** Abort! Attempt to load ELF data to address: %p which is not valid\n", (void*)addr);
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
417 return 0;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
418 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
419 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
420 if ((ch = (*getc)()) < 0) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
421 err_printf(SHORT_DATA);
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
422 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
423 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
424 }
2329
9279e39bd38d * src/load.c: Only call valid_address() if
asl
parents: 2257
diff changeset
425 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
9279e39bd38d * src/load.c: Only call valid_address() if
asl
parents: 2257
diff changeset
426 if (valid_address(addr))
9279e39bd38d * src/load.c: Only call valid_address() if
asl
parents: 2257
diff changeset
427 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
428 *addr++ = ch;
2329
9279e39bd38d * src/load.c: Only call valid_address() if
asl
parents: 2257
diff changeset
429
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
430 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
431 else {
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
432 flash_load_write(addr, ch);
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
433 addr++;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
434 }
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
435 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
436 offset++;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
437 if ((unsigned long)(addr-addr_offset) > highest_address) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
438 highest_address = (unsigned long)(addr - addr_offset);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
439 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
440 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
441 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
442 }
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
443
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
444 // Save load base/top and entry
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
445 if (base) {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
446 load_address = base;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
447 load_address_end = base + (highest_address - lowest_address);
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
448 entry_address = base + (ehdr.e_entry - lowest_address);
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
449 } else {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
450 load_address = lowest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
451 load_address_end = highest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
452 entry_address = ehdr.e_entry;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
453 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
454
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
455 // nak everything to stop the transfer, since redboot
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
456 // usually doesn't read all the way to the end of the
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
457 // elf files.
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
458 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
459 if (addr_offset) diag_printf("Address offset = %p\n", (void *)addr_offset);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
460 diag_printf("Entry point: %p, address range: %p-%p\n",
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
461 (void*)entry_address, (void *)load_address, (void *)load_address_end);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
462 return 1;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
463 #else // CYGSEM_REDBOOT_ELF
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
464 err_printf("Loading ELF images not supported\n");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
465 return 0;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
466 #endif // CYGSEM_REDBOOT_ELF
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
467 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
468
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
469
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
470 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
471 // Scan a string of hex bytes and update the checksum
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
472 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
473 static long
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
474 _hex2(int (*getc)(void), int len, long *sum)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
475 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
476 int val, byte;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
477 char c1, c2;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
478
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
479 val = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
480 while (len-- > 0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
481 c1 = (*getc)();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
482 c2 = (*getc)();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
483 if (_is_hex(c1) && _is_hex(c2)) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
484 val <<= 8;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
485 byte = (_from_hex(c1)<<4) | _from_hex(c2);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
486 val |= byte;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
487 if (sum) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
488 *sum += byte;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
489 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
490 } else {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
491 return (-1);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
492 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
493 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
494 return (val);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
495 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
496
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
497 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
498 // Process a set of S-records, loading the contents into memory.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
499 // Note: if a "base" value is provided, the data will be relocated
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
500 // relative to that location. Of course, this can only work for
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
501 // the first section of the data, so if there are non-contiguous
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
502 // pieces of data, they will end up relocated in the same fashion.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
503 // Because of this, "base" probably only makes sense for a set of
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
504 // data which has only one section, e.g. a ROM image.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
505 //
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
506 static unsigned long
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
507 load_srec_image(getc_t getc, unsigned long base)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
508 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
509 int c;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
510 long offset = 0, count, sum, val, cksum;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
511 unsigned char *addr, *base_addr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
512 char type;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
513 bool first_addr = true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
514 unsigned long addr_offset = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
515 unsigned long highest_address = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
516 unsigned long lowest_address = 0xFFFFFFFF;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
517
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
518 while ((c = (*getc)()) > 0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
519 // Start of line
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
520 if (c != 'S') {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
521 redboot_getc_terminate(true);
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
522 err_printf("Invalid S-record at offset %p, input: %c\n",
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
523 (void *)offset, c);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
524 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
525 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
526 type = (*getc)();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
527 offset += 2;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
528 sum = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
529 if ((count = _hex2(getc, 1, &sum)) < 0) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
530 redboot_getc_terminate(true);
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
531 err_printf("Bad S-record count at offset %p\n", (void *)offset);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
532 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
533 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
534 offset += 1;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
535 switch (type) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
536 case '0':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
537 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
538 case '1':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
539 case '2':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
540 case '3':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
541 base_addr = addr = (unsigned char *)_hex2(getc, (type-'1'+2), &sum);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
542 offset += (type-'1'+2);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
543 if (first_addr) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
544 if (base) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
545 addr_offset = (unsigned long)base - (unsigned long)addr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
546 } else {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
547 addr_offset = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
548 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
549 first_addr = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
550 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
551 addr += addr_offset;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
552 if ((unsigned long)(addr-addr_offset) < lowest_address) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
553 lowest_address = (unsigned long)(addr - addr_offset);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
554 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
555 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
556 if (!(valid_address(addr)
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
557 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
558 || (flash_verify_addr(addr) == FLASH_ERR_OK)
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
559 #endif
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
560 )) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
561 // Only if there is no need to stop the download before printing
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
562 // output can we ask confirmation questions.
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
563 redboot_getc_terminate(true);
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
564 err_printf("*** Abort! Attempt to load S-record to address: %p, which is not valid\n",(void*)addr);
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
565 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
566 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
567 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
568 count -= ((type-'1'+2)+1);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
569 offset += count;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
570 while (count-- > 0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
571 val = _hex2(getc, 1, &sum);
2329
9279e39bd38d * src/load.c: Only call valid_address() if
asl
parents: 2257
diff changeset
572 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
9279e39bd38d * src/load.c: Only call valid_address() if
asl
parents: 2257
diff changeset
573 if (valid_address(addr))
9279e39bd38d * src/load.c: Only call valid_address() if
asl
parents: 2257
diff changeset
574 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
575 *addr++ = val;
2329
9279e39bd38d * src/load.c: Only call valid_address() if
asl
parents: 2257
diff changeset
576
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
577 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
578 else {
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
579 flash_load_write(addr, val);
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
580 addr++;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
581 }
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
582 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
583 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
584 cksum = _hex2(getc, 1, 0);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
585 offset += 1;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
586 sum = sum & 0xFF;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
587 cksum = (~cksum & 0xFF);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
588 if (cksum != sum) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
589 redboot_getc_terminate(true);
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
590 err_printf("*** Warning! Checksum failure - Addr: %lx, %02lX <> %02lX\n",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
591 (unsigned long)base_addr, sum, cksum);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
592 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
593 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
594 if ((unsigned long)(addr-addr_offset) > highest_address) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
595 highest_address = (unsigned long)(addr - addr_offset);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
596 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
597 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
598 case '7':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
599 case '8':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
600 case '9':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
601 addr = (unsigned char *)_hex2(getc, ('9'-type+2), &sum);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
602 offset += ('9'-type+2);
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
603 // Save load base/top, entry address
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
604 if (base) {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
605 load_address = base;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
606 load_address_end = base + (highest_address - lowest_address);
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
607 entry_address = (unsigned long)(base + (addr - lowest_address));
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
608 } else {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
609 load_address = lowest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
610 load_address_end = highest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
611 entry_address = (unsigned long)addr;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
612 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
613 redboot_getc_terminate(false);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
614 if (addr_offset) diag_printf("Address offset = %p\n", (void *)addr_offset);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
615 diag_printf("Entry point: %p, address range: %p-%p\n",
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
616 (void*)entry_address, (void *)load_address, (void *)load_address_end);
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
617
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
618 return load_address_end;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
619 default:
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
620 redboot_getc_terminate(true);
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
621 err_printf("Invalid S-record at offset 0x%lx, type: %x\n",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
622 (unsigned long)offset, type);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
623 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
624 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
625 while ((c = (*getc)()) != '\n') offset++;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
626 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
627 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
628 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
629
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
630 //
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
631 // 'load' CLI command processing
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
632 // -b - specify a load [base] address
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
633 // -m - specify an I/O stream/method
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
634 // -c - Alternate serial I/O channel
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
635 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
636 // -d - Decompress data [packed via 'zlib']
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
637 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
638 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
639 // -f - specify a flash address
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
640 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
641 //
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
642 void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
643 do_load(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
644 {
126
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 124
diff changeset
645 int res, num_options;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
646 int i, err;
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
647 bool verbose, raw;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
648 bool base_addr_set, mode_str_set;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
649 char *mode_str;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
650 #ifdef CYGPKG_REDBOOT_NETWORKING
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
651 struct sockaddr_in host;
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
652 bool hostname_set, port_set;
1756
b2a8f9509f6f * src/load.c (do_load): Removed compiler warning when building
asl
parents: 1724
diff changeset
653 unsigned int port; // int because it's an OPTION_ARG_TYPE_NUM,
b2a8f9509f6f * src/load.c (do_load): Removed compiler warning when building
asl
parents: 1724
diff changeset
654 // but will be cast to short
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
655 char *hostname;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
656 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
657 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
658 bool flash_addr_set = false;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
659 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
660 bool decompress = false;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
661 int chan = -1;
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 196
diff changeset
662 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
663 bool chan_set;
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 196
diff changeset
664 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
665 unsigned long base = 0;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
666 unsigned long end = 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
667 char type[4];
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
668 char *filename = 0;
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
669 struct option_info opts[9];
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
670 connection_info_t info;
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
671 getc_io_funcs_t *io = NULL;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
672 struct load_io_entry *io_tab;
495
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
673 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
674 bool spillover_ok = false;
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
675 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
676
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
677 #ifdef CYGPKG_REDBOOT_NETWORKING
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
678 memset((char *)&host, 0, sizeof(host));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
679 host.sin_len = sizeof(host);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
680 host.sin_family = AF_INET;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
681 host.sin_addr = my_bootp_info.bp_siaddr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
682 host.sin_port = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
683 #endif
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
684
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
685 init_opts(&opts[0], 'v', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
686 (void *)&verbose, 0, "verbose");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
687 init_opts(&opts[1], 'r', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
688 (void *)&raw, 0, "load raw data");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
689 init_opts(&opts[2], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
690 (void *)&base, (bool *)&base_addr_set, "load address");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
691 init_opts(&opts[3], 'm', true, OPTION_ARG_TYPE_STR,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
692 (void *)&mode_str, (bool *)&mode_str_set, "download mode (TFTP, xyzMODEM, or disk)");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
693 num_options = 4;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
694 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
695 init_opts(&opts[num_options], 'c', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
696 (void *)&chan, (bool *)&chan_set, "I/O channel");
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
697 num_options++;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
698 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
699 #ifdef CYGPKG_REDBOOT_NETWORKING
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 174
diff changeset
700 init_opts(&opts[num_options], 'h', true, OPTION_ARG_TYPE_STR,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
701 (void *)&hostname, (bool *)&hostname_set, "host name or IP address");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
702 num_options++;
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
703 init_opts(&opts[num_options], 'p', true, OPTION_ARG_TYPE_NUM,
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
704 (void *)&port, (bool *)&port_set, "TCP port");
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
705 num_options++;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
706 #endif
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
707 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 174
diff changeset
708 init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
709 (void *)&decompress, 0, "decompress");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
710 num_options++;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
711 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
712 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
713 init_opts(&opts[num_options], 'f', true, OPTION_ARG_TYPE_NUM,
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
714 (void *)&base, (bool *)&flash_addr_set, "flash address");
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
715 num_options++;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
716 #endif
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
717 CYG_ASSERT(num_options <= NUM_ELEMS(opts), "Too many options");
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
718
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
719 if (!scan_opts(argc, argv, 1, opts, num_options,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
720 (void *)&filename, OPTION_ARG_TYPE_STR, "file name")) {
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
721 return;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
722 }
2355
460b70d39a50 * src/load.c (do_load): Reset entry address before load so
asl
parents: 2329
diff changeset
723
460b70d39a50 * src/load.c (do_load): Reset entry address before load so
asl
parents: 2329
diff changeset
724 /* make sure any future go/exec's will fail until a successful upload */
460b70d39a50 * src/load.c (do_load): Reset entry address before load so
asl
parents: 2329
diff changeset
725 entry_address = (unsigned long)NO_MEMORY;
460b70d39a50 * src/load.c (do_load): Reset entry address before load so
asl
parents: 2329
diff changeset
726
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
727 #ifdef CYGPKG_REDBOOT_NETWORKING
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
728 if (hostname_set) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
729 ip_route_t rt;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
730 if (!_gethostbyname(hostname, (in_addr_t *)&host)) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
731 err_printf("Invalid host: %s\n", hostname);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
732 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
733 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
734 /* check that the host can be accessed */
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
735 if (__arp_lookup((ip_addr_t *)&host.sin_addr, &rt) < 0) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
736 err_printf("Unable to reach host %s (%s)\n",
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
737 hostname, inet_ntoa((in_addr_t *)&host));
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
738 return;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
739 }
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
740 }
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
741 if (port_set)
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
742 host.sin_port = port;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
743 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
744 if (chan >= CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
745 err_printf("Invalid I/O channel: %d\n", chan);
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
746 return;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
747 }
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
748 if (mode_str_set) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
749 for (io_tab = __RedBoot_LOAD_TAB__;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
750 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
751 if (strncasecmp(&mode_str[0], io_tab->name, strlen(&mode_str[0])) == 0) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
752 io = io_tab->funcs;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
753 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
754 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
755 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
756 if (!io) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
757 diag_printf("Invalid 'mode': %s. Valid modes are:", mode_str);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
758 for (io_tab = __RedBoot_LOAD_TAB__;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
759 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
760 diag_printf(" %s", io_tab->name);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
761 }
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
762 err_printf("\n");
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
763 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
764 if (!io) {
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
765 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
766 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
767 verbose &= io_tab->can_verbose;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
768 if (io_tab->need_filename && !filename) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
769 diag_printf("File name required\n");
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
770 err_printf("usage: load %s\n", usage);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
771 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
772 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
773 } else {
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
774 char *which = "";
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
775 io_tab = (struct load_io_entry *)NULL; // Default
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
776 #ifdef CYGPKG_REDBOOT_NETWORKING
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
777 #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
778 which = "TFTP";
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
779 io = &tftp_io;
945
3b9afa204d69 * src/load.c:
jlarmour
parents: 899
diff changeset
780 #elif defined(CYGSEM_REDBOOT_NET_HTTP_DOWNLOAD)
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
781 which = "HTTP";
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
782 io = &http_io;
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
783 #endif
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
784 #endif
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
785 #if 0 //def CYGPKG_REDBOOT_FILEIO
1414
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
786 // Make file I/O default if mounted
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
787 if (fileio_mounted) {
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
788 which = "file";
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
789 io = &fileio_io;
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
790 }
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
791 #endif
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
792 if (!io) {
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
793 #ifdef CYGBLD_BUILD_REDBOOT_WITH_XYZMODEM
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
794 which = "Xmodem";
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
795 io = &xyzModem_io;
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
796 verbose = false;
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
797 #else
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
798 err_printf("No default protocol!\n");
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
799 return;
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
800 #endif
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
801 }
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
802 diag_printf("Using default protocol (%s)\n", which);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
803 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
804 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
805 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
806 if (flash_addr_set && flash_verify_addr((unsigned char *)base)) {
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
807 if (!verify_action("Specified address (%p) is not believed to be in FLASH", (void*)base))
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
808 return;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
809 spillover_ok = true;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
810 }
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
811 #endif
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
812 if (base_addr_set && !valid_address((unsigned char *)base)) {
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 157
diff changeset
813 if (!verify_action("Specified address (%p) is not believed to be in RAM", (void*)base))
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 157
diff changeset
814 return;
495
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
815 spillover_ok = true;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 132
diff changeset
816 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
817 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
818 if (raw && !(base_addr_set
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
819 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
820 || flash_addr_set
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
821 #endif
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
822 )) {
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
823 err_printf("Raw load requires a memory address\n");
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
824 return;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
825 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
826 info.filename = filename;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
827 info.chan = chan;
273
e51742b21f31 Fix problem when load used without -m option.
gthomas
parents: 245
diff changeset
828 info.mode = io_tab ? io_tab->mode : 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
829 #ifdef CYGPKG_REDBOOT_NETWORKING
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
830 info.server = &host;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
831 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
832 res = redboot_getc_init(&info, io, verbose, decompress);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
833 if (res < 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
834 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
835 }
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
836 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
837 flash_load_start();
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
838 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
839 // Stream open, process the data
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
840 if (raw) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
841 unsigned char *mp = (unsigned char *)base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
842 err = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
843 while ((res = redboot_getc()) >= 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
844 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
845 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
846 if (flash_addr_set && flash_verify_addr(mp) && !spillover_ok) {
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
847 // Only if there is no need to stop the download
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
848 // before printing output can we ask confirmation
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
849 // questions.
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
850 redboot_getc_terminate(true);
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
851 err_printf("*** Abort! RAW data spills over limit of FLASH at %p\n",(void*)mp);
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
852 err = -1;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
853 break;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
854 }
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
855 #endif
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
856 if (base_addr_set && !valid_address(mp) && !spillover_ok) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
857 // Only if there is no need to stop the download
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
858 // before printing output can we ask confirmation
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
859 // questions.
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
860 redboot_getc_terminate(true);
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
861 err_printf("*** Abort! RAW data spills over limit of user RAM at %p\n",(void*)mp);
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
862 err = -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
863 break;
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
864 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
865 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
866 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
867 if (flash_addr_set) {
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
868 flash_load_write(mp, res);
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
869 mp++;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
870 res++;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
871 } else
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
872 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
873 *mp++ = res;
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
874 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
875 end = (unsigned long) mp;
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
876
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
877 // Save load base/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
878 load_address = base;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
879 load_address_end = end;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
880 entry_address = base; // best guess
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
881
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
882 redboot_getc_terminate(false);
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
883 if (0 == err)
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
884 diag_printf("Raw file loaded %p-%p, assumed entry at %p\n",
330
2525052c5d76 Fix compressed file loads.
msalter
parents: 273
diff changeset
885 (void *)base, (void *)(end - 1), (void*)base);
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
886 } else {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
887 // Read initial header - to determine file [image] type
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
888 for (i = 0; i < sizeof(type); i++) {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
889 if ((res = redboot_getc()) < 0) {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
890 err = getc_info.err;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
891 break;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
892 }
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
893 type[i] = res;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
894 }
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
895 if (res >= 0) {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
896 redboot_getc_rewind(); // Restore header to stream
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
897 // Treat data as some sort of executable image
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
898 if (strncmp(&type[1], "ELF", 3) == 0) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
899 end = load_elf_image(redboot_getc, base);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
900 } else if ((type[0] == 'S') &&
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
901 ((type[1] >= '0') && (type[1] <= '9'))) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
902 end = load_srec_image(redboot_getc, base);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
903 } else {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
904 redboot_getc_terminate(true);
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 2144
diff changeset
905 err_printf("Unrecognized image type: 0x%lx\n", *(unsigned long *)type);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
906 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
907 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
908 }
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
909 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
910 flash_load_finish();
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
911 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
912
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
913 redboot_getc_close(); // Clean up
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
914 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
915 }