Mercurial > flash_v2
annotate packages/redboot/current/src/load.c @ 330:2525052c5d76
Fix compressed file loads.
| author | msalter |
|---|---|
| date | Thu, 12 Sep 2002 21:23:10 +0000 |
| parents | e51742b21f31 |
| children | 248ae32b58f8 |
| 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. |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
12 // Copyright (C) 2002 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> |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
57 #include <xyzModem.h> |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
58 #include <elf.h> |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
59 #ifdef CYGPKG_REDBOOT_DISK |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
60 #include <fs/disk.h> |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
61 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
62 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
63 #include <net/tftp_support.h> |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
64 #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
|
65 #include <net/http.h> |
|
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
66 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
67 #endif |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
68 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
69 static char usage[] = "[-r] [-v] " |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
70 #ifdef CYGPKG_COMPRESS_ZLIB |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
71 "[-d] " |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
72 #endif |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
73 "[-h <host>] [-m <varies>] " |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
74 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
75 "[-c <channel_number>] " |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
76 #endif |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
77 "\n [-b <base_address>] <file_name>"; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
78 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
79 // Exported CLI function |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
80 RedBoot_cmd("load", |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
81 "Load a file", |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
82 usage, |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
83 do_load |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
84 ); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
85 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
86 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
87 // Stream I/O support |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
88 // |
|
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 // Table describing the various I/O methods |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
91 CYG_HAL_TABLE_BEGIN( __RedBoot_LOAD_TAB__, RedBoot_load ); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
92 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
|
93 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
|
94 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
95 // 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
|
96 #define BUF_SIZE 256 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
97 struct { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
98 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
|
99 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
|
100 unsigned char buf[BUF_SIZE]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
101 unsigned char *bufp; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
102 int avail, len, err; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
103 int verbose, decompress, tick; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
104 #ifdef CYGPKG_COMPRESS_ZLIB |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
105 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
|
106 _pipe_t load_pipe; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
107 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
|
108 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
109 } getc_info; |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
117
diff
changeset
|
110 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
111 typedef int (*getc_t)(void); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
112 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
113 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
114 // Read the next data byte from the stream. |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
115 // Returns: |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
116 // >= 0 - actual data |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
117 // -1 - error or EOF, status in getc_info.err |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
118 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
119 static int |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
120 redboot_getc(void) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
121 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
122 static char spin[] = "|/-\\|-"; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
123 if (getc_info.avail < 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
124 return -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
125 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
126 if (getc_info.avail == 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
127 if (getc_info.verbose) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
128 diag_printf("%c\b", spin[getc_info.tick++]); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
129 if (getc_info.tick >= sizeof(spin)) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
130 getc_info.tick = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
131 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
132 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
133 if (getc_info.len < BUF_SIZE) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
134 // No more data available |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
135 if (getc_info.verbose) diag_printf("\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
136 return -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
137 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
138 getc_info.bufp = getc_info.buf; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
139 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
|
140 if ((getc_info.avail = getc_info.len) <= 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
141 if (getc_info.verbose) diag_printf("\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
142 return -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
143 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
144 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
145 getc_info.avail--; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
146 return *getc_info.bufp++; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
147 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
148 |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
149 #ifdef CYGPKG_COMPRESS_ZLIB |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
150 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
151 // 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
|
152 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
153 static int |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
154 _decompress_stream(char *buf, int len, int *err) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
155 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
156 _pipe_t* p = &getc_info.load_pipe; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
157 int res, total; |
|
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 total = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
160 while (len > 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
161 if (p->in_avail == 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
162 p->in_buf = &getc_info._buffer[0]; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
163 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
|
164 &getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
165 if ((p->in_avail = res) <= 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
166 // No more data |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
167 return total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
168 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
169 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
170 p->out_buf = buf; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
171 p->out_size = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
172 p->out_max = len; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
173 res = (*_dc_inflate)(p); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
174 if (res != 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
175 *err = res; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
176 return total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
177 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
178 len -= p->out_size; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
179 buf += p->out_size; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
180 total += p->out_size; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
181 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
182 return total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
183 } |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
184 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
185 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
186 static int |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
187 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
|
188 int verbose, int decompress) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
189 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
190 int res; |
|
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 res = (funcs->open)(info, &getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
193 if (res < 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
194 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
|
195 return res; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
196 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
197 getc_info.io = funcs; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
198 getc_info.fun = funcs->read; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
199 getc_info.avail = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
200 getc_info.len = BUF_SIZE; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
201 getc_info.verbose = verbose; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
202 getc_info.decompress = decompress; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
203 getc_info.tick = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
204 #ifdef CYGPKG_COMPRESS_ZLIB |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
205 if (decompress) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
206 _pipe_t* p = &getc_info.load_pipe; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
207 p->out_buf = &getc_info.buf[0]; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
208 p->out_size = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
209 p->in_avail = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
210 getc_info.raw_fun = getc_info.fun; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
211 getc_info.fun = _decompress_stream; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
212 getc_info.err = (*_dc_init)(p); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
213 if (0 != getc_info.err && p->msg) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
214 diag_printf("open decompression error: %s\n", p->msg); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
215 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
216 } |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
217 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
218 return 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
219 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
220 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
221 static void |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
222 redboot_getc_rewind(void) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
223 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
224 getc_info.bufp = getc_info.buf; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
225 getc_info.avail = getc_info.len; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
226 } |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
117
diff
changeset
|
227 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
228 static void |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
229 redboot_getc_terminate(bool abort) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
230 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
231 if (getc_info.io->terminate) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
232 (getc_info.io->terminate)(abort, redboot_getc); |
|
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 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
236 static void |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
237 redboot_getc_close(void) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
238 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
239 (getc_info.io->close)(&getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
240 #ifdef CYGPKG_COMPRESS_ZLIB |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
241 if (getc_info.decompress) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
242 _pipe_t* p = &getc_info.load_pipe; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
243 int err = getc_info.err; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
244 if (0 != err && p->msg) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
245 diag_printf("decompression error: %s\n", p->msg); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
246 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
247 err = (*_dc_close)(p, getc_info.err); |
|
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 #endif |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
250 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
251 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
252 #ifdef CYGSEM_REDBOOT_ELF |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
253 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
254 // Support function - used to read bytes into a buffer |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
255 // 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
|
256 // |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
257 static int |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
258 _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
|
259 { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
260 int total = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
261 int ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
262 while (len-- > 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
263 ch = (*getc)(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
264 if (ch < 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
265 // EOF or error |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
266 break; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
267 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
268 *buf++ = ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
269 total++; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
270 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
271 return total; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
272 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
273 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
274 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
275 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
276 // Load an ELF [binary] image |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
277 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
278 static unsigned long |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
279 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
|
280 { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
281 #ifdef CYGSEM_REDBOOT_ELF |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
282 Elf32_Ehdr ehdr; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
283 #define MAX_PHDR 8 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
284 Elf32_Phdr phdr[MAX_PHDR]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
285 unsigned long offset = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
286 int phx, len, ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
287 unsigned char *addr; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
288 unsigned long addr_offset = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
289 unsigned long highest_address = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
290 unsigned long lowest_address = 0xFFFFFFFF; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
291 unsigned char *SHORT_DATA = "Short data reading ELF file"; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
292 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
293 // Read the header |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
294 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
|
295 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
|
296 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
297 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
298 offset += sizeof(ehdr); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
299 #if 0 // DEBUG |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
300 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
|
301 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
|
302 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
|
303 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
|
304 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
305 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
|
306 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
|
307 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
308 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
309 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
|
310 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
|
311 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
312 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
313 while (offset < ehdr.e_phoff) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
314 if ((*getc)() < 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
315 diag_printf(SHORT_DATA); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
316 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
317 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
318 offset++; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
319 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
320 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
|
321 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
|
322 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
|
323 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
324 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
325 #if 0 // DEBUG |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
326 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
|
327 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
|
328 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
|
329 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
330 offset += sizeof(phdr[0]); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
331 } |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
332 if (base) { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
333 // 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
|
334 addr_offset = 0xFFFFFFFF; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
335 for (phx = 0; phx < ehdr.e_phnum; phx++) { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
336 if (phdr[phx].p_vaddr < addr_offset) { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
337 addr_offset = phdr[phx].p_vaddr; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
338 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
339 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
340 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
|
341 } else { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
342 addr_offset = 0; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
343 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
344 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
|
345 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
|
346 // Loadable segment |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
347 addr = (unsigned char *)phdr[phx].p_vaddr; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
348 len = phdr[phx].p_filesz; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
349 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
|
350 lowest_address = (unsigned long)addr; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
351 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
352 addr += addr_offset; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
353 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
|
354 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
|
355 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
|
356 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
357 } |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
358 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
|
359 } else { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
360 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
|
361 if ((*getc)() < 0) { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
362 diag_printf(SHORT_DATA); |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
363 return 0; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
364 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
365 offset++; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
366 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
367 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
368 // Copy data into memory |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
369 while (len-- > 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
370 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
371 if ((addr < user_ram_start) || (addr > user_ram_end)) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
372 redboot_getc_terminate(true); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
373 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
|
374 return 0; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
375 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
376 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
377 if ((ch = (*getc)()) < 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
378 diag_printf(SHORT_DATA); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
379 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
380 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
381 *addr++ = ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
382 offset++; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
383 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
|
384 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
|
385 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
386 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
387 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
388 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
389 // Save load base/top and entry |
| 245 | 390 if (base) { |
| 391 load_address = base; | |
| 392 load_address_end = base + (highest_address - lowest_address); | |
| 393 entry_address = base + (ehdr.e_entry - lowest_address); | |
| 394 } else { | |
| 395 load_address = lowest_address; | |
| 396 load_address_end = highest_address; | |
| 397 entry_address = ehdr.e_entry; | |
| 398 } | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
399 |
| 245 | 400 redboot_getc_terminate(false); |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
401 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
|
402 diag_printf("Entry point: %p, address range: %p-%p\n", |
| 245 | 403 (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
|
404 return 1; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
405 #else // CYGSEM_REDBOOT_ELF |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
406 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
|
407 return 0; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
408 #endif // CYGSEM_REDBOOT_ELF |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
409 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
410 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
411 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
412 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
413 // 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
|
414 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
415 static long |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
416 _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
|
417 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
418 int val, byte; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
419 char c1, c2; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
420 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
421 val = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
422 while (len-- > 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
423 c1 = (*getc)(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
424 c2 = (*getc)(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
425 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
|
426 val <<= 8; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
427 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
|
428 val |= byte; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
429 if (sum) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
430 *sum += byte; |
|
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 } else { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
433 return (-1); |
|
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 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
436 return (val); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
437 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
438 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
439 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
440 // 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
|
441 // 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
|
442 // 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
|
443 // 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
|
444 // 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
|
445 // 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
|
446 // 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
|
447 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
448 static unsigned long |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
449 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
|
450 { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
451 int c; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
452 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
|
453 unsigned char *addr, *base_addr; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
454 char type; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
455 bool first_addr = true; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
456 unsigned long addr_offset = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
457 unsigned long highest_address = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
458 unsigned long lowest_address = 0xFFFFFFFF; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
459 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
460 while ((c = (*getc)()) > 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
461 // Start of line |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
462 if (c != 'S') { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
463 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
464 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
|
465 (void *)offset, c); |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
466 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
467 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
468 type = (*getc)(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
469 offset += 2; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
470 sum = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
471 if ((count = _hex2(getc, 1, &sum)) < 0) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
472 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
473 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
|
474 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
475 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
476 offset += 1; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
477 switch (type) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
478 case '0': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
479 break; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
480 case '1': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
481 case '2': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
482 case '3': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
483 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
|
484 offset += (type-'1'+2); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
485 if (first_addr) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
486 if (base) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
487 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
|
488 } else { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
489 addr_offset = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
490 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
491 first_addr = false; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
492 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
493 addr += addr_offset; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
494 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
|
495 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
|
496 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
497 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
498 if ((addr < user_ram_start) || (addr > user_ram_end)) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
499 // 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
|
500 // output can we ask confirmation questions. |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
501 redboot_getc_terminate(true); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
502 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
|
503 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
504 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
505 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
506 count -= ((type-'1'+2)+1); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
507 offset += count; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
508 while (count-- > 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
509 val = _hex2(getc, 1, &sum); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
510 *addr++ = val; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
511 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
512 cksum = _hex2(getc, 1, 0); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
513 offset += 1; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
514 sum = sum & 0xFF; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
515 cksum = (~cksum & 0xFF); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
516 if (cksum != sum) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
517 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
518 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
|
519 (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
|
520 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
521 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
522 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
|
523 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
|
524 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
525 break; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
526 case '7': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
527 case '8': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
528 case '9': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
529 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
|
530 offset += ('9'-type+2); |
| 245 | 531 // Save load base/top, entry address |
| 532 if (base) { | |
| 533 load_address = base; | |
| 534 load_address_end = base + (highest_address - lowest_address); | |
| 535 entry_address = (unsigned long)(base + (addr - lowest_address)); | |
| 536 } else { | |
| 537 load_address = lowest_address; | |
| 538 load_address_end = highest_address; | |
| 539 entry_address = (unsigned long)addr; | |
| 540 } | |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
541 redboot_getc_terminate(false); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
542 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
|
543 diag_printf("Entry point: %p, address range: %p-%p\n", |
| 245 | 544 (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
|
545 |
| 245 | 546 return load_address_end; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
547 default: |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
548 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
549 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
|
550 (unsigned long)offset, type); |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
551 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
552 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
553 while ((c = (*getc)()) != '\n') offset++; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
554 } |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
555 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
556 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
557 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
558 // |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
559 // 'load' CLI command processing |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
560 // -b - specify a load [base] address |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
561 // -m - specify an I/O stream/method |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
562 // -c - Alternate serial I/O channel |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
563 #ifdef CYGPKG_COMPRESS_ZLIB |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
564 // -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
|
565 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
566 // |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
567 void |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
568 do_load(int argc, char *argv[]) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
569 { |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
124
diff
changeset
|
570 int res, num_options; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
571 int i, err; |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
572 bool verbose, raw; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
573 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
|
574 char *mode_str; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
575 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
576 struct sockaddr_in host; |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
577 bool hostname_set; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
578 char *hostname; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
579 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
580 bool decompress = false; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
581 int chan = -1; |
|
198
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
582 #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
|
583 bool chan_set; |
|
198
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
584 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
585 unsigned long base = 0; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
586 unsigned long end = 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
587 char type[4]; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
588 char *filename = 0; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
589 struct option_info opts[7]; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
590 connection_info_t info; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
591 getc_io_funcs_t *io; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
592 struct load_io_entry *io_tab; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
593 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
594 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
595 memset((char *)&host, 0, sizeof(host)); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
596 host.sin_len = sizeof(host); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
597 host.sin_family = AF_INET; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
598 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
|
599 host.sin_port = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
600 #endif |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
601 |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
602 init_opts(&opts[0], 'v', false, OPTION_ARG_TYPE_FLG, |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
603 (void **)&verbose, 0, "verbose"); |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
604 init_opts(&opts[1], 'r', false, OPTION_ARG_TYPE_FLG, |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
605 (void **)&raw, 0, "load raw data"); |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
606 init_opts(&opts[2], 'b', true, OPTION_ARG_TYPE_NUM, |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
607 (void **)&base, (bool *)&base_addr_set, "load address"); |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
608 init_opts(&opts[3], 'm', true, OPTION_ARG_TYPE_STR, |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
609 (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
|
610 num_options = 4; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
611 #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
|
612 init_opts(&opts[num_options], 'c', true, OPTION_ARG_TYPE_NUM, |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
613 (void **)&chan, (bool *)&chan_set, "I/O channel"); |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
614 num_options++; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
615 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
616 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
179
391299f9e541
Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents:
174
diff
changeset
|
617 init_opts(&opts[num_options], 'h', true, OPTION_ARG_TYPE_STR, |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
618 (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
|
619 num_options++; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
620 #endif |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
621 #ifdef CYGPKG_COMPRESS_ZLIB |
|
179
391299f9e541
Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents:
174
diff
changeset
|
622 init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG, |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
623 (void **)&decompress, 0, "decompress"); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
624 num_options++; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
625 #endif |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
626 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
627 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
|
628 (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
|
629 return; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
630 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
631 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
632 if (hostname_set) { |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
633 ip_route_t rt; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
634 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
|
635 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
|
636 return; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
637 } |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
638 /* 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
|
639 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
|
640 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
|
641 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
|
642 return; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
643 } |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
644 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
645 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
646 if (chan >= CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
647 diag_printf("Invalid I/O channel: %d\n", chan); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
648 return; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
649 } |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
650 if (mode_str_set) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
651 io = (getc_io_funcs_t *)NULL; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
652 for (io_tab = __RedBoot_LOAD_TAB__; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
653 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) { |
| 245 | 654 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
|
655 io = io_tab->funcs; |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
656 break; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
657 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
658 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
659 if (!io) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
660 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
|
661 for (io_tab = __RedBoot_LOAD_TAB__; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
662 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) { |
| 245 | 663 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
|
664 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
665 diag_printf("\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
666 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
667 if (!io) { |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
668 return; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
669 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
670 verbose &= io_tab->can_verbose; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
671 if (io_tab->need_filename && !filename) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
672 diag_printf("File name required\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
673 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
|
674 return; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
675 } |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
676 } else { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
677 io_tab = (struct load_io_entry *)NULL; // Default |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
678 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
679 io = &tftp_io; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
680 #else |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
681 io = &xyzModem_io; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
682 verbose = false; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
683 #endif |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
684 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
685 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
153
5e8f3b328bb3
Merge from eCos master repository on 2001-02-19-15:48:12-GMT
jlarmour
parents:
143
diff
changeset
|
686 if (base_addr_set && |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
687 ((base < (unsigned long)user_ram_start) || |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
688 (base > (unsigned long)user_ram_end))) { |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
157
diff
changeset
|
689 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
|
690 return; |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
132
diff
changeset
|
691 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
692 #endif |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
693 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
|
694 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
|
695 return; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
696 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
697 info.filename = filename; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
698 info.chan = chan; |
| 273 | 699 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
|
700 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
701 info.server = &host; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
702 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
703 res = redboot_getc_init(&info, io, verbose, decompress); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
704 if (res < 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
705 return; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
706 } |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
707 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
708 // 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
|
709 if (raw) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
710 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
|
711 err = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
712 while ((res = redboot_getc()) >= 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
713 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
714 if (mp >= user_ram_end) { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
715 // 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
|
716 // 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
|
717 // questions. |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
718 redboot_getc_terminate(true); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
719 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
|
720 err = -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
721 break; |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
722 } |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
723 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
724 *mp++ = res; |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
725 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
726 end = (unsigned long) mp; |
|
196
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
727 |
|
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
728 // Save load base/top |
|
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
729 load_address = base; |
|
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
730 load_address_end = end; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
731 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
|
732 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
733 redboot_getc_terminate(false); |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
734 if (0 == err) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
735 diag_printf("Raw file loaded %p-%p, assumed entry at %p\n", |
| 330 | 736 (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
|
737 } else { |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
738 // 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
|
739 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
|
740 if ((res = redboot_getc()) < 0) { |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
741 err = getc_info.err; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
742 break; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
743 } |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
744 type[i] = res; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
745 } |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
746 if (res >= 0) { |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
747 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
|
748 // 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
|
749 if (strncmp(&type[1], "ELF", 3) == 0) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
750 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
|
751 } else if ((type[0] == 'S') && |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
752 ((type[1] >= '0') && (type[1] <= '9'))) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
753 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
|
754 } else { |
| 245 | 755 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
756 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
|
757 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
758 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
759 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
760 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
761 redboot_getc_close(); // Clean up |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
762 return; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
763 } |
