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