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