Mercurial > ecos
annotate packages/redboot/current/src/load.c @ 1253:9ecd8873f657
Use LMA, not VMA
| author | gthomas |
|---|---|
| date | Mon, 29 Sep 2003 14:49:46 +0000 |
| parents | dbcfe4e0dbd2 |
| children | 94e373b3fc8d |
| 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. |
| 886 | 12 // Copyright (C) 2002, 2003 Gary Thomas |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
13 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
14 // eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
15 // the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
16 // Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
17 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
21 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
22 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
23 // You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
24 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
26 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
27 // As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
28 // or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
29 // with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
30 // by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
31 // License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
32 // in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
33 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
34 // This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
35 // this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
36 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
38 // at http://sources.redhat.com/ecos/ecos-license/ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
39 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
40 //####ECOSGPLCOPYRIGHTEND#### |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
41 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
42 //#####DESCRIPTIONBEGIN#### |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
43 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
44 // Author(s): gthomas |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
45 // Contributors: gthomas, tsmith |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
46 // Date: 2000-07-14 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
47 // Purpose: |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
48 // Description: |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
49 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
50 // This code is part of RedBoot (tm). |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
51 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
52 //####DESCRIPTIONEND#### |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
53 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
54 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
55 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
56 #include <redboot.h> |
| 899 | 57 #include <elf.h> |
| 58 #ifdef CYGBLD_BUILD_REDBOOT_WITH_XYZMODEM | |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
59 #include <xyzModem.h> |
| 899 | 60 #endif |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
61 #ifdef CYGPKG_REDBOOT_DISK |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
62 #include <fs/disk.h> |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
63 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
64 #ifdef CYGPKG_REDBOOT_NETWORKING |
| 886 | 65 #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
66 #include <net/tftp_support.h> |
| 886 | 67 #endif |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
68 #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
|
69 #include <net/http.h> |
|
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
70 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
71 #endif |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
72 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
73 static char usage[] = "[-r] [-v] " |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
74 #ifdef CYGPKG_COMPRESS_ZLIB |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
75 "[-d] " |
|
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 "[-h <host>] [-m <varies>] " |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
78 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
79 "[-c <channel_number>] " |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
80 #endif |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
81 "\n [-b <base_address>] <file_name>"; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
82 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
83 // Exported CLI function |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
84 RedBoot_cmd("load", |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
85 "Load a file", |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
86 usage, |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
87 do_load |
|
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 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
91 // Stream I/O support |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
92 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
93 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
94 // Table describing the various I/O methods |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
95 CYG_HAL_TABLE_BEGIN( __RedBoot_LOAD_TAB__, RedBoot_load ); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
96 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
|
97 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
|
98 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
99 // 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
|
100 #define BUF_SIZE 256 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
101 struct { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
102 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
|
103 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
|
104 unsigned char buf[BUF_SIZE]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
105 unsigned char *bufp; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
106 int avail, len, err; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
107 int verbose, decompress, tick; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
108 #ifdef CYGPKG_COMPRESS_ZLIB |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
109 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
|
110 _pipe_t load_pipe; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
111 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
|
112 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
113 } getc_info; |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
117
diff
changeset
|
114 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
115 typedef int (*getc_t)(void); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
116 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
117 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
118 // Read the next data byte from the stream. |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
119 // Returns: |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
120 // >= 0 - actual data |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
121 // -1 - error or EOF, status in getc_info.err |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
122 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
123 static int |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
124 redboot_getc(void) |
|
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 static char spin[] = "|/-\\|-"; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
127 if (getc_info.avail < 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
128 return -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
129 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
130 if (getc_info.avail == 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
131 if (getc_info.verbose) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
132 diag_printf("%c\b", spin[getc_info.tick++]); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
133 if (getc_info.tick >= sizeof(spin)) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
134 getc_info.tick = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
135 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
136 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
137 if (getc_info.len < BUF_SIZE) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
138 // No more data available |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
139 if (getc_info.verbose) diag_printf("\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
140 return -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
141 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
142 getc_info.bufp = getc_info.buf; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
143 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
|
144 if ((getc_info.avail = getc_info.len) <= 0) { |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
145 if (getc_info.len < 0) { |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
146 diag_printf("I/O error: %s\n", (getc_info.io->error)(getc_info.err)); |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
147 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
148 if (getc_info.verbose) diag_printf("\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
149 return -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
150 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
151 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
152 getc_info.avail--; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
153 return *getc_info.bufp++; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
154 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
155 |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
156 #ifdef CYGPKG_COMPRESS_ZLIB |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
157 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
158 // 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
|
159 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
160 static int |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
161 _decompress_stream(char *buf, int len, int *err) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
162 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
163 _pipe_t* p = &getc_info.load_pipe; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
164 int res, total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
165 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
166 total = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
167 while (len > 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
168 if (p->in_avail == 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
169 p->in_buf = &getc_info._buffer[0]; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
170 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
|
171 &getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
172 if ((p->in_avail = res) <= 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
173 // No more data |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
174 return total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
175 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
176 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
177 p->out_buf = buf; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
178 p->out_size = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
179 p->out_max = len; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
180 res = (*_dc_inflate)(p); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
181 if (res != 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
182 *err = res; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
183 return total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
184 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
185 len -= p->out_size; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
186 buf += p->out_size; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
187 total += p->out_size; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
188 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
189 return total; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
190 } |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
191 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
192 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
193 static int |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
194 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
|
195 int verbose, int decompress) |
|
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 int res; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
198 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
199 res = (funcs->open)(info, &getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
200 if (res < 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
201 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
|
202 return res; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
203 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
204 getc_info.io = funcs; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
205 getc_info.fun = funcs->read; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
206 getc_info.avail = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
207 getc_info.len = BUF_SIZE; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
208 getc_info.verbose = verbose; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
209 getc_info.decompress = decompress; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
210 getc_info.tick = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
211 #ifdef CYGPKG_COMPRESS_ZLIB |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
212 if (decompress) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
213 _pipe_t* p = &getc_info.load_pipe; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
214 p->out_buf = &getc_info.buf[0]; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
215 p->out_size = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
216 p->in_avail = 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
217 getc_info.raw_fun = getc_info.fun; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
218 getc_info.fun = _decompress_stream; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
219 getc_info.err = (*_dc_init)(p); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
220 if (0 != getc_info.err && p->msg) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
221 diag_printf("open decompression error: %s\n", p->msg); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
222 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
223 } |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
224 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
225 return 0; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
226 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
227 |
|
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_rewind(void) |
|
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 getc_info.bufp = getc_info.buf; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
232 getc_info.avail = getc_info.len; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
233 } |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
117
diff
changeset
|
234 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
235 static void |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
236 redboot_getc_terminate(bool abort) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
237 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
238 if (getc_info.io->terminate) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
239 (getc_info.io->terminate)(abort, redboot_getc); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
240 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
241 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
242 |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
243 static void |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
244 redboot_getc_close(void) |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
245 { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
246 (getc_info.io->close)(&getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
247 #ifdef CYGPKG_COMPRESS_ZLIB |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
248 if (getc_info.decompress) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
249 _pipe_t* p = &getc_info.load_pipe; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
250 int err = getc_info.err; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
251 if (0 != err && p->msg) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
252 diag_printf("decompression error: %s\n", p->msg); |
|
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 err = (*_dc_close)(p, getc_info.err); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
255 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
256 #endif |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
257 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
258 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
259 #ifdef CYGSEM_REDBOOT_ELF |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
260 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
261 // Support function - used to read bytes into a buffer |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
262 // 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
|
263 // |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
264 static int |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
265 _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
|
266 { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
267 int total = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
268 int ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
269 while (len-- > 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
270 ch = (*getc)(); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
271 if (ch < 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
272 // EOF or error |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
273 break; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
274 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
275 *buf++ = ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
276 total++; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
277 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
278 return total; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
279 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
280 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
281 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
282 // |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
283 // Load an ELF [binary] image |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
284 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
285 static unsigned long |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
286 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
|
287 { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
288 #ifdef CYGSEM_REDBOOT_ELF |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
289 Elf32_Ehdr ehdr; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
290 #define MAX_PHDR 8 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
291 Elf32_Phdr phdr[MAX_PHDR]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
292 unsigned long offset = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
293 int phx, len, ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
294 unsigned char *addr; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
295 unsigned long addr_offset = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
296 unsigned long highest_address = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
297 unsigned long lowest_address = 0xFFFFFFFF; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
298 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
|
299 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
300 // Read the header |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
301 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
|
302 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
|
303 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
304 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
305 offset += sizeof(ehdr); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
306 #if 0 // DEBUG |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 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
|
311 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
312 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
|
313 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
|
314 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
315 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
316 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
|
317 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
|
318 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
319 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
320 while (offset < ehdr.e_phoff) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
321 if ((*getc)() < 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
322 diag_printf(SHORT_DATA); |
|
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 offset++; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
326 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
327 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
|
328 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
|
329 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
|
330 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
331 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
332 #if 0 // DEBUG |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
333 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
|
334 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
|
335 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
|
336 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
337 offset += sizeof(phdr[0]); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
338 } |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
339 if (base) { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
340 // 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
|
341 addr_offset = 0xFFFFFFFF; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
342 for (phx = 0; phx < ehdr.e_phnum; phx++) { |
| 1253 | 343 if (phdr[phx].p_paddr < addr_offset) { |
| 344 addr_offset = phdr[phx].p_paddr; | |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
345 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
346 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
347 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
|
348 } else { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
349 addr_offset = 0; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
350 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
351 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
|
352 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
|
353 // Loadable segment |
| 1253 | 354 addr = (unsigned char *)phdr[phx].p_paddr; |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
355 len = phdr[phx].p_filesz; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
356 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
|
357 lowest_address = (unsigned long)addr; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
358 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
359 addr += addr_offset; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
360 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
|
361 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
|
362 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
|
363 return 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
364 } |
|
211
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
365 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
|
366 } else { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
367 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
|
368 if ((*getc)() < 0) { |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
369 diag_printf(SHORT_DATA); |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
370 return 0; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
371 } |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
372 offset++; |
|
6eb55882e01c
Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents:
210
diff
changeset
|
373 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
374 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
375 // Copy data into memory |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
376 while (len-- > 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
377 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
1223
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
945
diff
changeset
|
378 if (!valid_address(addr)) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
379 redboot_getc_terminate(true); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
380 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
|
381 return 0; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
382 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
383 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
384 if ((ch = (*getc)()) < 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
385 diag_printf(SHORT_DATA); |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
386 return 0; |
|
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 *addr++ = ch; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
389 offset++; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
390 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
|
391 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
|
392 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
393 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
394 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
395 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
396 // Save load base/top and entry |
| 245 | 397 if (base) { |
| 398 load_address = base; | |
| 399 load_address_end = base + (highest_address - lowest_address); | |
| 400 entry_address = base + (ehdr.e_entry - lowest_address); | |
| 401 } else { | |
| 402 load_address = lowest_address; | |
| 403 load_address_end = highest_address; | |
| 404 entry_address = ehdr.e_entry; | |
| 405 } | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
406 |
| 245 | 407 redboot_getc_terminate(false); |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
408 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
|
409 diag_printf("Entry point: %p, address range: %p-%p\n", |
| 245 | 410 (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
|
411 return 1; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
412 #else // CYGSEM_REDBOOT_ELF |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
413 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
|
414 return 0; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
415 #endif // CYGSEM_REDBOOT_ELF |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
416 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
417 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
418 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
419 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
420 // 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
|
421 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
422 static long |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
423 _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
|
424 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
425 int val, byte; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
426 char c1, c2; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
427 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
428 val = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
429 while (len-- > 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
430 c1 = (*getc)(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
431 c2 = (*getc)(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
432 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
|
433 val <<= 8; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
434 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
|
435 val |= byte; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
436 if (sum) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
437 *sum += byte; |
|
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 } else { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
440 return (-1); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
441 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
442 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
443 return (val); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
444 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
445 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
446 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
447 // 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
|
448 // 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
|
449 // 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
|
450 // 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
|
451 // 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
|
452 // 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
|
453 // 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
|
454 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
455 static unsigned long |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
456 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
|
457 { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
458 int c; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
459 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
|
460 unsigned char *addr, *base_addr; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
461 char type; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
462 bool first_addr = true; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
463 unsigned long addr_offset = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
464 unsigned long highest_address = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
465 unsigned long lowest_address = 0xFFFFFFFF; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
466 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
467 while ((c = (*getc)()) > 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
468 // Start of line |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
469 if (c != 'S') { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
470 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
471 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
|
472 (void *)offset, c); |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
473 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
474 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
475 type = (*getc)(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
476 offset += 2; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
477 sum = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
478 if ((count = _hex2(getc, 1, &sum)) < 0) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
479 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
480 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
|
481 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
482 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
483 offset += 1; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
484 switch (type) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
485 case '0': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
486 break; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
487 case '1': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
488 case '2': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
489 case '3': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
490 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
|
491 offset += (type-'1'+2); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
492 if (first_addr) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
493 if (base) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
494 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
|
495 } else { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
496 addr_offset = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
497 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
498 first_addr = false; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
499 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
500 addr += addr_offset; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
501 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
|
502 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
|
503 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
504 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
1223
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
945
diff
changeset
|
505 if (!valid_address(addr)) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
506 // 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
|
507 // output can we ask confirmation questions. |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
508 redboot_getc_terminate(true); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
509 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
|
510 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
511 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
512 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
513 count -= ((type-'1'+2)+1); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
514 offset += count; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
515 while (count-- > 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
516 val = _hex2(getc, 1, &sum); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
517 *addr++ = val; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
518 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
519 cksum = _hex2(getc, 1, 0); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
520 offset += 1; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
521 sum = sum & 0xFF; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
522 cksum = (~cksum & 0xFF); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
523 if (cksum != sum) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
524 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
525 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
|
526 (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
|
527 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
528 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
529 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
|
530 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
|
531 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
532 break; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
533 case '7': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
534 case '8': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
535 case '9': |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
536 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
|
537 offset += ('9'-type+2); |
| 245 | 538 // Save load base/top, entry address |
| 539 if (base) { | |
| 540 load_address = base; | |
| 541 load_address_end = base + (highest_address - lowest_address); | |
| 542 entry_address = (unsigned long)(base + (addr - lowest_address)); | |
| 543 } else { | |
| 544 load_address = lowest_address; | |
| 545 load_address_end = highest_address; | |
| 546 entry_address = (unsigned long)addr; | |
| 547 } | |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
548 redboot_getc_terminate(false); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
549 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
|
550 diag_printf("Entry point: %p, address range: %p-%p\n", |
| 245 | 551 (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
|
552 |
| 245 | 553 return load_address_end; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
554 default: |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
555 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
556 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
|
557 (unsigned long)offset, type); |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
558 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
559 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
560 while ((c = (*getc)()) != '\n') offset++; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
561 } |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
562 return 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
563 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
564 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
565 // |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
566 // 'load' CLI command processing |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
567 // -b - specify a load [base] address |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
568 // -m - specify an I/O stream/method |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
569 // -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
|
570 #ifdef CYGPKG_COMPRESS_ZLIB |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
571 // -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
|
572 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
573 // |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
574 void |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
575 do_load(int argc, char *argv[]) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
576 { |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
124
diff
changeset
|
577 int res, num_options; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
578 int i, err; |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
579 bool verbose, raw; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
580 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
|
581 char *mode_str; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
582 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
583 struct sockaddr_in host; |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
584 bool hostname_set; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
585 char *hostname; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
586 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
587 bool decompress = false; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
588 int chan = -1; |
|
198
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
589 #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
|
590 bool chan_set; |
|
198
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
196
diff
changeset
|
591 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
592 unsigned long base = 0; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
593 unsigned long end = 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
594 char type[4]; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
595 char *filename = 0; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
596 struct option_info opts[7]; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
597 connection_info_t info; |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
598 getc_io_funcs_t *io = NULL; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
599 struct load_io_entry *io_tab; |
|
495
248ae32b58f8
Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents:
330
diff
changeset
|
600 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
248ae32b58f8
Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents:
330
diff
changeset
|
601 bool spillover_ok = false; |
|
248ae32b58f8
Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents:
330
diff
changeset
|
602 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
603 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
604 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
605 memset((char *)&host, 0, sizeof(host)); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
606 host.sin_len = sizeof(host); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
607 host.sin_family = AF_INET; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
608 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
|
609 host.sin_port = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
610 #endif |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
611 |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
612 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
|
613 (void **)&verbose, 0, "verbose"); |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
614 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
|
615 (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
|
616 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
|
617 (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
|
618 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
|
619 (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
|
620 num_options = 4; |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
621 #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
|
622 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
|
623 (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
|
624 num_options++; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
625 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
626 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
179
391299f9e541
Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents:
174
diff
changeset
|
627 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
|
628 (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
|
629 num_options++; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
630 #endif |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
631 #ifdef CYGPKG_COMPRESS_ZLIB |
|
179
391299f9e541
Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents:
174
diff
changeset
|
632 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
|
633 (void **)&decompress, 0, "decompress"); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
634 num_options++; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
635 #endif |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
636 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
637 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
|
638 (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
|
639 return; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
640 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
641 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
642 if (hostname_set) { |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
643 ip_route_t rt; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
644 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
|
645 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
|
646 return; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
647 } |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
648 /* 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
|
649 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
|
650 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
|
651 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
|
652 return; |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
653 } |
|
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
654 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
655 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
656 if (chan >= CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
657 diag_printf("Invalid I/O channel: %d\n", chan); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
658 return; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
659 } |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
660 if (mode_str_set) { |
|
228
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 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
|
664 io = io_tab->funcs; |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
665 break; |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
666 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
667 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
668 if (!io) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
669 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
|
670 for (io_tab = __RedBoot_LOAD_TAB__; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
671 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) { |
| 245 | 672 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
|
673 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
674 diag_printf("\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
675 } |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
676 if (!io) { |
|
117
bd1a71e3e476
Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents:
115
diff
changeset
|
677 return; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
678 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
679 verbose &= io_tab->can_verbose; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
680 if (io_tab->need_filename && !filename) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
681 diag_printf("File name required\n"); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
682 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
|
683 return; |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
684 } |
|
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
685 } else { |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
686 char *which; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
687 io_tab = (struct load_io_entry *)NULL; // Default |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
688 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
689 #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
690 which = "TFTP"; |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
691 io = &tftp_io; |
| 945 | 692 #elif defined(CYGSEM_REDBOOT_NET_HTTP_DOWNLOAD) |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
693 which = "HTTP"; |
| 886 | 694 io = &http_io; |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
695 #endif |
| 886 | 696 #endif |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
697 if (!io) { |
| 899 | 698 #ifdef CYGBLD_BUILD_REDBOOT_WITH_XYZMODEM |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
699 which = "Xmodem"; |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
700 io = &xyzModem_io; |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
701 verbose = false; |
| 899 | 702 #else |
| 703 diag_printf("No default protocol!\n"); | |
| 704 return; | |
| 705 #endif | |
|
898
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
706 } |
|
6f9085944169
Improve download error handling. Also display more info during load.
gthomas
parents:
886
diff
changeset
|
707 diag_printf("Using default protocol (%s)\n", which); |
|
184
022f1e506033
Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents:
182
diff
changeset
|
708 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
709 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
1223
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
945
diff
changeset
|
710 if (base_addr_set && !valid_address(base)) { |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
157
diff
changeset
|
711 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
|
712 return; |
|
495
248ae32b58f8
Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents:
330
diff
changeset
|
713 spillover_ok = true; |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
132
diff
changeset
|
714 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
715 #endif |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
716 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
|
717 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
|
718 return; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
719 } |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
720 info.filename = filename; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
721 info.chan = chan; |
| 273 | 722 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
|
723 #ifdef CYGPKG_REDBOOT_NETWORKING |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
724 info.server = &host; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
725 #endif |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
726 res = redboot_getc_init(&info, io, verbose, decompress); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
727 if (res < 0) { |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
728 return; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
729 } |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
162
diff
changeset
|
730 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
731 // 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
|
732 if (raw) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
733 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
|
734 err = 0; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
735 while ((res = redboot_getc()) >= 0) { |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
736 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS |
|
1223
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
945
diff
changeset
|
737 if (!valid_address(mp) && !spillover_ok) { |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
738 // 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
|
739 // 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
|
740 // questions. |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
741 redboot_getc_terminate(true); |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
742 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
|
743 err = -1; |
|
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
744 break; |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
745 } |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
746 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
747 *mp++ = res; |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
748 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
749 end = (unsigned long) mp; |
|
196
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
750 |
|
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
751 // Save load base/top |
|
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
752 load_address = base; |
|
9b55e9c69693
Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents:
184
diff
changeset
|
753 load_address_end = end; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
754 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
|
755 |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
756 redboot_getc_terminate(false); |
|
157
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
757 if (0 == err) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
758 diag_printf("Raw file loaded %p-%p, assumed entry at %p\n", |
| 330 | 759 (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
|
760 } else { |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
761 // 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
|
762 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
|
763 if ((res = redboot_getc()) < 0) { |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
764 err = getc_info.err; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
765 break; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
766 } |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
767 type[i] = res; |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
768 } |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
769 if (res >= 0) { |
|
b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents:
156
diff
changeset
|
770 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
|
771 // 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
|
772 if (strncmp(&type[1], "ELF", 3) == 0) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
773 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
|
774 } else if ((type[0] == 'S') && |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
126
diff
changeset
|
775 ((type[1] >= '0') && (type[1] <= '9'))) { |
|
228
e1b642d73533
Improve load command - make I/O methods table driven.
gthomas
parents:
211
diff
changeset
|
776 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
|
777 } else { |
| 245 | 778 redboot_getc_terminate(true); |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
779 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
|
780 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
781 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
782 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
171
diff
changeset
|
783 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
784 redboot_getc_close(); // Clean up |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
785 return; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
786 } |
