Mercurial > flash_v2
annotate packages/redboot/current/src/load.c @ 1777:c16341b1bac6 default tip
* Added execute permissions to files missed in conversion from CVS
| author | alexs |
|---|---|
| date | Mon, 12 Oct 2009 02:26:09 +0100 |
| parents | 43a89c18d005 |
| children |
| rev | line source |
|---|---|
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
2 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
3 // load.c |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
4 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
5 // RedBoot file/image loader |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
6 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
7 //========================================================================== |
|
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 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
76 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
77 static char usage[] = "[-r] [-v] " |
|
1492
8b3549abe4ac
* cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents:
1414
diff
changeset
|
78 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
79 "[-d] " |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
80 #endif |
|
1551
996bb9a3d7fe
* src/load.c: add -p option to help string and only print it and -h if
asl
parents:
1520
diff
changeset
|
81 #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
|
82 "[-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
|
83 #endif |
|
996bb9a3d7fe
* src/load.c: add -p option to help string and only print it and -h if
asl
parents:
1520
diff
changeset
|
84 "[-m <varies>] " |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
85 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
86 "[-c <channel_number>] " |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
87 #endif |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
88 "\n [-b <base_address>] <file_name>"; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
89 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
90 // Exported CLI function |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
91 RedBoot_cmd("load", |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
92 "Load a file", |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
93 usage, |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
94 do_load |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
95 ); |
|
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 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
98 // Stream I/O support |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
99 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
100 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
101 // Table describing the various I/O methods |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
102 CYG_HAL_TABLE_BEGIN( __RedBoot_LOAD_TAB__, RedBoot_load ); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
103 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
|
104 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
|
105 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
106 // Buffers, data used by redboot_getc |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
107 #define BUF_SIZE 256 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
108 struct { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
109 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
|
110 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
|
111 unsigned char buf[BUF_SIZE]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
112 unsigned char *bufp; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
113 int avail, len, err; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
114 int verbose, decompress, tick; |
|
1492
8b3549abe4ac
* cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents:
1414
diff
changeset
|
115 #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
|
116 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
|
117 _pipe_t load_pipe; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
118 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
|
119 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
120 } getc_info; |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
117
diff
changeset
|
121 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
122 typedef int (*getc_t)(void); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
123 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
124 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
125 // Read the next data byte from the stream. |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
126 // Returns: |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
127 // >= 0 - actual data |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
128 // -1 - error or EOF, status in getc_info.err |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
129 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
130 static int |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
131 redboot_getc(void) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
132 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
133 static char spin[] = "|/-\\|-"; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
134 if (getc_info.avail < 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
135 return -1; |
|
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 if (getc_info.avail == 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
138 if (getc_info.verbose) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
139 diag_printf("%c\b", spin[getc_info.tick++]); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
140 if (getc_info.tick >= sizeof(spin)) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
141 getc_info.tick = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
142 } |
|
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.len < BUF_SIZE) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
145 // No more data available |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
146 if (getc_info.verbose) diag_printf("\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
147 return -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
148 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
149 getc_info.bufp = getc_info.buf; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
150 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
|
151 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
|
152 if (getc_info.len < 0) { |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
153 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
|
154 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
155 if (getc_info.verbose) diag_printf("\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
156 return -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
157 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
158 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
159 getc_info.avail--; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
160 return *getc_info.bufp++; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
161 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
162 |
|
1492
8b3549abe4ac
* cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents:
1414
diff
changeset
|
163 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB |
|
228
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 // 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
|
166 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
167 static int |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
168 _decompress_stream(char *buf, int len, int *err) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
169 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
170 _pipe_t* p = &getc_info.load_pipe; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
171 int res, total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
172 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
173 total = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
174 while (len > 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
175 if (p->in_avail == 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
176 p->in_buf = &getc_info._buffer[0]; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
177 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
|
178 &getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
179 if ((p->in_avail = res) <= 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
180 // No more data |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
181 return total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
182 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
183 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
184 p->out_buf = buf; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
185 p->out_size = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
186 p->out_max = len; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
187 res = (*_dc_inflate)(p); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
188 if (res != 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
189 *err = res; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
190 return total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
191 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
192 len -= p->out_size; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
193 buf += p->out_size; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
194 total += p->out_size; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
195 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
196 return total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
197 } |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
198 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
199 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
200 static int |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
201 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
|
202 int verbose, int decompress) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
203 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
204 int res; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
205 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
206 res = (funcs->open)(info, &getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
207 if (res < 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
208 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
|
209 return res; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
210 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
211 getc_info.io = funcs; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
212 getc_info.fun = funcs->read; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
213 getc_info.avail = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
214 getc_info.len = BUF_SIZE; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
215 getc_info.verbose = verbose; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
216 getc_info.decompress = decompress; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
217 getc_info.tick = 0; |
|
1492
8b3549abe4ac
* cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents:
1414
diff
changeset
|
218 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
219 if (decompress) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
220 _pipe_t* p = &getc_info.load_pipe; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
221 p->out_buf = &getc_info.buf[0]; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
222 p->out_size = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
223 p->in_avail = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
224 getc_info.raw_fun = getc_info.fun; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
225 getc_info.fun = _decompress_stream; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
226 getc_info.err = (*_dc_init)(p); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
227 if (0 != getc_info.err && p->msg) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
228 diag_printf("open decompression error: %s\n", p->msg); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
229 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
230 } |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
231 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
232 return 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
233 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
234 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
235 static void |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
236 redboot_getc_rewind(void) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
237 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
238 getc_info.bufp = getc_info.buf; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
239 getc_info.avail = getc_info.len; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
240 } |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
117
diff
changeset
|
241 |
|
228
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_terminate(bool abort) |
|
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 if (getc_info.io->terminate) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
246 (getc_info.io->terminate)(abort, redboot_getc); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
247 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
248 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
249 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
250 static void |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
251 redboot_getc_close(void) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
252 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
253 (getc_info.io->close)(&getc_info.err); |
|
1492
8b3549abe4ac
* cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents:
1414
diff
changeset
|
254 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
255 if (getc_info.decompress) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
256 _pipe_t* p = &getc_info.load_pipe; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
257 int err = getc_info.err; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
258 if (0 != err && p->msg) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
259 diag_printf("decompression error: %s\n", p->msg); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
260 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
261 err = (*_dc_close)(p, getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
262 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
263 #endif |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
264 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
265 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
266 #ifdef CYGSEM_REDBOOT_ELF |
|
228
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 // Support function - used to read bytes into a buffer |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
269 // 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
|
270 // |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
271 static int |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
272 _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
|
273 { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
274 int total = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
275 int ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
276 while (len-- > 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
277 ch = (*getc)(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
278 if (ch < 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
279 // EOF or error |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
280 break; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
281 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
282 *buf++ = ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
283 total++; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
284 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
285 return total; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
286 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
287 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
288 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
289 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
290 // Load an ELF [binary] image |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
291 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
292 static unsigned long |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
293 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
|
294 { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
295 #ifdef CYGSEM_REDBOOT_ELF |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
296 Elf32_Ehdr ehdr; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
297 #define MAX_PHDR 8 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
298 Elf32_Phdr phdr[MAX_PHDR]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
299 unsigned long offset = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
300 int phx, len, ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
301 unsigned char *addr; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
302 unsigned long addr_offset = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
303 unsigned long highest_address = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
304 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
|
305 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
|
306 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
307 // Read the header |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
308 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
|
309 diag_printf("Can't read ELF header\n"); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
310 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
311 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
312 offset += sizeof(ehdr); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
313 #if 0 // DEBUG |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
314 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
|
315 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
|
316 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
|
317 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
|
318 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
319 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
|
320 diag_printf("Only absolute ELF images supported\n"); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
321 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
322 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
323 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
|
324 diag_printf("Too many program headers\n"); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
325 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
326 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
327 while (offset < ehdr.e_phoff) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
328 if ((*getc)() < 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
329 diag_printf(SHORT_DATA); |
|
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 offset++; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
333 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
334 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
|
335 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
|
336 diag_printf("Can't read ELF program header\n"); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
337 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
338 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
339 #if 0 // DEBUG |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
340 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
|
341 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
|
342 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
|
343 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
344 offset += sizeof(phdr[0]); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
345 } |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
346 if (base) { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
347 // 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
|
348 addr_offset = 0xFFFFFFFF; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
349 for (phx = 0; phx < ehdr.e_phnum; phx++) { |
| 1319 | 350 if ((phdr[phx].p_type == PT_LOAD) && (phdr[phx].p_paddr < addr_offset)) { |
| 1253 | 351 addr_offset = phdr[phx].p_paddr; |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
352 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
353 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
354 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
|
355 } else { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
356 addr_offset = 0; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
357 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
358 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
|
359 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
|
360 // Loadable segment |
| 1253 | 361 addr = (unsigned char *)phdr[phx].p_paddr; |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
362 len = phdr[phx].p_filesz; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
363 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
|
364 lowest_address = (unsigned long)addr; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
365 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
366 addr += addr_offset; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
367 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
|
368 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
|
369 diag_printf("Can't load ELF file - program headers out of order\n"); |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
370 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
371 } |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
372 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
|
373 } else { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
374 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
|
375 if ((*getc)() < 0) { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
376 diag_printf(SHORT_DATA); |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
377 return 0; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
378 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
379 offset++; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
380 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
381 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
382 // Copy data into memory |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
383 while (len-- > 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
384 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
1223
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
945
diff
changeset
|
385 if (!valid_address(addr)) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
386 redboot_getc_terminate(true); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
387 diag_printf("*** Abort! Attempt to load ELF data to address: %p which is not in RAM\n", (void*)addr); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
388 return 0; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
389 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
390 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
391 if ((ch = (*getc)()) < 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
392 diag_printf(SHORT_DATA); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
393 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
394 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
395 *addr++ = ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
396 offset++; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
397 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
|
398 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
|
399 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
400 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
401 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
402 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
403 // Save load base/top and entry |
| 245 | 404 if (base) { |
| 405 load_address = base; | |
| 406 load_address_end = base + (highest_address - lowest_address); | |
| 407 entry_address = base + (ehdr.e_entry - lowest_address); | |
| 408 } else { | |
| 409 load_address = lowest_address; | |
| 410 load_address_end = highest_address; | |
| 411 entry_address = ehdr.e_entry; | |
| 412 } | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
413 |
| 245 | 414 redboot_getc_terminate(false); |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
415 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
|
416 diag_printf("Entry point: %p, address range: %p-%p\n", |
| 245 | 417 (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
|
418 return 1; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
419 #else // CYGSEM_REDBOOT_ELF |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
420 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
|
421 return 0; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
422 #endif // CYGSEM_REDBOOT_ELF |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
423 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
424 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
425 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
426 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
427 // 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
|
428 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
429 static long |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
430 _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
|
431 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
432 int val, byte; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
433 char c1, c2; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
434 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
435 val = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
436 while (len-- > 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
437 c1 = (*getc)(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
438 c2 = (*getc)(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
439 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
|
440 val <<= 8; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
441 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
|
442 val |= byte; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
443 if (sum) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
444 *sum += byte; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
445 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
446 } else { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
447 return (-1); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
448 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
449 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
450 return (val); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
451 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
452 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
453 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
454 // 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
|
455 // 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
|
456 // 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
|
457 // 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
|
458 // 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
|
459 // 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
|
460 // 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
|
461 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
462 static unsigned long |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
463 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
|
464 { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
465 int c; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
466 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
|
467 unsigned char *addr, *base_addr; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
468 char type; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
469 bool first_addr = true; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
470 unsigned long addr_offset = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
471 unsigned long highest_address = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
472 unsigned long lowest_address = 0xFFFFFFFF; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
473 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
474 while ((c = (*getc)()) > 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
475 // Start of line |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
476 if (c != 'S') { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
477 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
478 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
|
479 (void *)offset, c); |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
480 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
481 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
482 type = (*getc)(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
483 offset += 2; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
484 sum = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
485 if ((count = _hex2(getc, 1, &sum)) < 0) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
486 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
487 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
|
488 return 0; |
|
115
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 offset += 1; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
491 switch (type) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
492 case '0': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
493 break; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
494 case '1': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
495 case '2': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
496 case '3': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
497 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
|
498 offset += (type-'1'+2); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
499 if (first_addr) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
500 if (base) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
501 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
|
502 } else { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
503 addr_offset = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
504 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
505 first_addr = false; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
506 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
507 addr += addr_offset; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
508 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
|
509 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
|
510 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
511 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
1223
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
945
diff
changeset
|
512 if (!valid_address(addr)) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
513 // 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
|
514 // output can we ask confirmation questions. |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
515 redboot_getc_terminate(true); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
516 diag_printf("*** Abort! Attempt to load S-record to address: %p, which is not in RAM\n",(void*)addr); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
517 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
518 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
519 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
520 count -= ((type-'1'+2)+1); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
521 offset += count; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
522 while (count-- > 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
523 val = _hex2(getc, 1, &sum); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
524 *addr++ = val; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
525 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
526 cksum = _hex2(getc, 1, 0); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
527 offset += 1; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
528 sum = sum & 0xFF; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
529 cksum = (~cksum & 0xFF); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
530 if (cksum != sum) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
531 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
532 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
|
533 (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
|
534 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
535 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
536 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
|
537 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
|
538 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
539 break; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
540 case '7': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
541 case '8': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
542 case '9': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
543 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
|
544 offset += ('9'-type+2); |
| 245 | 545 // Save load base/top, entry address |
| 546 if (base) { | |
| 547 load_address = base; | |
| 548 load_address_end = base + (highest_address - lowest_address); | |
| 549 entry_address = (unsigned long)(base + (addr - lowest_address)); | |
| 550 } else { | |
| 551 load_address = lowest_address; | |
| 552 load_address_end = highest_address; | |
| 553 entry_address = (unsigned long)addr; | |
| 554 } | |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
555 redboot_getc_terminate(false); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
556 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
|
557 diag_printf("Entry point: %p, address range: %p-%p\n", |
| 245 | 558 (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
|
559 |
| 245 | 560 return load_address_end; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
561 default: |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
562 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
563 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
|
564 (unsigned long)offset, type); |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
565 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
566 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
567 while ((c = (*getc)()) != '\n') offset++; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
568 } |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
569 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
570 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
571 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
572 // |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
573 // 'load' CLI command processing |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
574 // -b - specify a load [base] address |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
575 // -m - specify an I/O stream/method |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
576 // -c - Alternate serial I/O channel |
|
1492
8b3549abe4ac
* cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents:
1414
diff
changeset
|
577 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
578 // -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
|
579 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
580 // |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
581 void |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
582 do_load(int argc, char *argv[]) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
583 { |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
124
diff
changeset
|
584 int res, num_options; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
585 int i, err; |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
586 bool verbose, raw; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
587 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
|
588 char *mode_str; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
589 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
590 struct sockaddr_in host; |
|
1520
fc4fa5d81cba
Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents:
1513
diff
changeset
|
591 bool hostname_set, port_set; |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
592 char *hostname; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
593 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
594 bool decompress = false; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
595 int chan = -1; |
|
198
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
596 #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
|
597 bool chan_set; |
|
198
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
598 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
599 unsigned long base = 0; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
600 unsigned long end = 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
601 char type[4]; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
602 char *filename = 0; |
|
1605
43a89c18d005
Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents:
1551
diff
changeset
|
603 struct option_info opts[8]; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
604 connection_info_t info; |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
605 getc_io_funcs_t *io = NULL; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
606 struct load_io_entry *io_tab; |
|
1520
fc4fa5d81cba
Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents:
1513
diff
changeset
|
607 unsigned int port; //int because it's an OPTION_ARG_TYPE_NUM, but will be cast to short |
|
495
248ae32b58f8
Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents:
330
diff
changeset
|
608 #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
|
609 bool spillover_ok = false; |
|
248ae32b58f8
Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents:
330
diff
changeset
|
610 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
611 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
612 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
613 memset((char *)&host, 0, sizeof(host)); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
614 host.sin_len = sizeof(host); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
615 host.sin_family = AF_INET; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
616 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
|
617 host.sin_port = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
618 #endif |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
619 |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
620 init_opts(&opts[0], 'v', false, OPTION_ARG_TYPE_FLG, |
| 1513 | 621 (void *)&verbose, 0, "verbose"); |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
622 init_opts(&opts[1], 'r', false, OPTION_ARG_TYPE_FLG, |
| 1513 | 623 (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
|
624 init_opts(&opts[2], 'b', true, OPTION_ARG_TYPE_NUM, |
| 1513 | 625 (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
|
626 init_opts(&opts[3], 'm', true, OPTION_ARG_TYPE_STR, |
| 1513 | 627 (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
|
628 num_options = 4; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
629 #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
|
630 init_opts(&opts[num_options], 'c', true, OPTION_ARG_TYPE_NUM, |
| 1513 | 631 (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
|
632 num_options++; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
633 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
634 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
179
391299f9e541
Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents:
174
diff
changeset
|
635 init_opts(&opts[num_options], 'h', true, OPTION_ARG_TYPE_STR, |
| 1513 | 636 (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
|
637 num_options++; |
|
1520
fc4fa5d81cba
Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents:
1513
diff
changeset
|
638 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
|
639 (void *)&port, (bool *)&port_set, "TCP port"); |
|
fc4fa5d81cba
Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents:
1513
diff
changeset
|
640 num_options++; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
641 #endif |
|
1492
8b3549abe4ac
* cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents:
1414
diff
changeset
|
642 #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
|
643 init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG, |
| 1513 | 644 (void *)&decompress, 0, "decompress"); |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
645 num_options++; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
646 #endif |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
647 |
|
1605
43a89c18d005
Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents:
1551
diff
changeset
|
648 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
|
649 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
650 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
|
651 (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
|
652 return; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
653 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
654 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
655 if (hostname_set) { |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
656 ip_route_t rt; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
657 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
|
658 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
|
659 return; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
660 } |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
661 /* 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
|
662 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
|
663 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
|
664 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
|
665 return; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
666 } |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
667 } |
|
1520
fc4fa5d81cba
Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents:
1513
diff
changeset
|
668 if (port_set) |
|
fc4fa5d81cba
Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents:
1513
diff
changeset
|
669 host.sin_port = port; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
670 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
671 if (chan >= CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
672 diag_printf("Invalid I/O channel: %d\n", chan); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
673 return; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
674 } |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
675 if (mode_str_set) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
676 for (io_tab = __RedBoot_LOAD_TAB__; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
677 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) { |
| 245 | 678 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
|
679 io = io_tab->funcs; |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
680 break; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
681 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
682 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
683 if (!io) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
684 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
|
685 for (io_tab = __RedBoot_LOAD_TAB__; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
686 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) { |
| 245 | 687 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
|
688 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
689 diag_printf("\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
690 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
691 if (!io) { |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
692 return; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
693 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
694 verbose &= io_tab->can_verbose; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
695 if (io_tab->need_filename && !filename) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
696 diag_printf("File name required\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
697 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
|
698 return; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
699 } |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
700 } else { |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
701 char *which; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
702 io_tab = (struct load_io_entry *)NULL; // Default |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
703 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
704 #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
705 which = "TFTP"; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
706 io = &tftp_io; |
| 945 | 707 #elif defined(CYGSEM_REDBOOT_NET_HTTP_DOWNLOAD) |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
708 which = "HTTP"; |
| 886 | 709 io = &http_io; |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
710 #endif |
| 886 | 711 #endif |
|
1414
9a2e186be457
Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents:
1319
diff
changeset
|
712 #ifdef CYGPKG_REDBOOT_FILEIO |
|
9a2e186be457
Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents:
1319
diff
changeset
|
713 // Make file I/O default if mounted |
|
9a2e186be457
Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents:
1319
diff
changeset
|
714 if (fileio_mounted) { |
|
9a2e186be457
Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents:
1319
diff
changeset
|
715 which = "file"; |
|
9a2e186be457
Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents:
1319
diff
changeset
|
716 io = &fileio_io; |
|
9a2e186be457
Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents:
1319
diff
changeset
|
717 } |
|
9a2e186be457
Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents:
1319
diff
changeset
|
718 #endif |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
719 if (!io) { |
| 899 | 720 #ifdef CYGBLD_BUILD_REDBOOT_WITH_XYZMODEM |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
721 which = "Xmodem"; |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
722 io = &xyzModem_io; |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
723 verbose = false; |
| 899 | 724 #else |
| 725 diag_printf("No default protocol!\n"); | |
| 726 return; | |
| 727 #endif | |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
728 } |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
729 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
|
730 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
731 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
| 1513 | 732 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
|
733 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
|
734 return; |
|
495
248ae32b58f8
Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents:
330
diff
changeset
|
735 spillover_ok = true; |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
132
diff
changeset
|
736 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
737 #endif |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
738 if (raw && !base_addr_set) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
739 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
|
740 return; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
741 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
742 info.filename = filename; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
743 info.chan = chan; |
| 273 | 744 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
|
745 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
746 info.server = &host; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
747 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
748 res = redboot_getc_init(&info, io, verbose, decompress); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
749 if (res < 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
750 return; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
751 } |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
752 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
753 // 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
|
754 if (raw) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
755 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
|
756 err = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
757 while ((res = redboot_getc()) >= 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
758 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
1223
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
945
diff
changeset
|
759 if (!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
|
760 // 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
|
761 // 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
|
762 // questions. |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
763 redboot_getc_terminate(true); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
764 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
|
765 err = -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
766 break; |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
767 } |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
768 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
769 *mp++ = res; |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
770 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
771 end = (unsigned long) mp; |
|
196
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
772 |
|
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
773 // Save load base/top |
|
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
774 load_address = base; |
|
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
775 load_address_end = end; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
776 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
|
777 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
778 redboot_getc_terminate(false); |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
779 if (0 == err) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
780 diag_printf("Raw file loaded %p-%p, assumed entry at %p\n", |
| 330 | 781 (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
|
782 } else { |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
783 // 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
|
784 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
|
785 if ((res = redboot_getc()) < 0) { |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
786 err = getc_info.err; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
787 break; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
788 } |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
789 type[i] = res; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
790 } |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
791 if (res >= 0) { |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
792 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
|
793 // 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
|
794 if (strncmp(&type[1], "ELF", 3) == 0) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
795 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
|
796 } else if ((type[0] == 'S') && |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
797 ((type[1] >= '0') && (type[1] <= '9'))) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
798 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
|
799 } else { |
| 245 | 800 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
801 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
|
802 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
803 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
804 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
805 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
806 redboot_getc_close(); // Clean up |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
807 return; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
808 } |
