annotate packages/redboot/current/src/load.c @ 1777:c16341b1bac6 default tip

* Added execute permissions to files missed in conversion from CVS
author alexs
date Mon, 12 Oct 2009 02:26:09 +0100
parents 43a89c18d005
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
3 // load.c
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
4 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
5 // RedBoot file/image loader
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
6 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
12 // Copyright (C) 2002, 2003, 2004 Gary Thomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
41 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
43 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
44 // Author(s): gthomas
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
45 // Contributors: gthomas, tsmith
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
46 // Date: 2000-07-14
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
47 // Purpose:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
48 // Description:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
49 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
50 // This code is part of RedBoot (tm).
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
51 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
52 //####DESCRIPTIONEND####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
53 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
54 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
55
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
56 #include <redboot.h>
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
57 #include <elf.h>
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
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
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
60 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
61 #ifdef CYGPKG_REDBOOT_DISK
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
62 #include <fs/disk.h>
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
63 #endif
1414
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
64 #ifdef CYGPKG_REDBOOT_FILEIO
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
65 #include <fs/fileio.h>
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
66 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
67 #ifdef CYGPKG_REDBOOT_NETWORKING
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
68 #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
69 #include <net/tftp_support.h>
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
70 #endif
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
71 #ifdef CYGSEM_REDBOOT_NET_HTTP_DOWNLOAD
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
72 #include <net/http.h>
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
73 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
74 #endif
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
75 #include <cyg/infra/cyg_ass.h> // assertion macros
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
76
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
77 static char usage[] = "[-r] [-v] "
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
78 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
79 "[-d] "
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
80 #endif
1551
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
81 #ifdef CYGPKG_REDBOOT_NETWORKING
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
82 "[-h <host>] [-p <TCP port>]"
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
83 #endif
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
84 "[-m <varies>] "
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
85 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
86 "[-c <channel_number>] "
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
87 #endif
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
88 "\n [-b <base_address>] <file_name>";
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
89
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
90 // Exported CLI function
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
91 RedBoot_cmd("load",
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
92 "Load a file",
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
93 usage,
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
94 do_load
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
95 );
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
96
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
97 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
98 // Stream I/O support
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
99 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
100
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
101 // Table describing the various I/O methods
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
102 CYG_HAL_TABLE_BEGIN( __RedBoot_LOAD_TAB__, RedBoot_load );
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
103 CYG_HAL_TABLE_END( __RedBoot_LOAD_TAB_END__, RedBoot_load );
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
104 extern struct load_io_entry __RedBoot_LOAD_TAB__[], __RedBoot_LOAD_TAB_END__;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
105
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
106 // Buffers, data used by redboot_getc
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
107 #define BUF_SIZE 256
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
108 struct {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
109 getc_io_funcs_t *io;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
110 int (*fun)(char *, int len, int *err);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
111 unsigned char buf[BUF_SIZE];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
112 unsigned char *bufp;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
113 int avail, len, err;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
114 int verbose, decompress, tick;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
115 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
116 int (*raw_fun)(char *, int len, int *err);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
117 _pipe_t load_pipe;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
118 unsigned char _buffer[CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
119 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
120 } getc_info;
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 117
diff changeset
121
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
122 typedef int (*getc_t)(void);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
123
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
124 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
125 // Read the next data byte from the stream.
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
126 // Returns:
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
127 // >= 0 - actual data
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
128 // -1 - error or EOF, status in getc_info.err
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
129 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
130 static int
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
131 redboot_getc(void)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
132 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
133 static char spin[] = "|/-\\|-";
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
134 if (getc_info.avail < 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
135 return -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
136 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
137 if (getc_info.avail == 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
138 if (getc_info.verbose) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
139 diag_printf("%c\b", spin[getc_info.tick++]);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
140 if (getc_info.tick >= sizeof(spin)) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
141 getc_info.tick = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
142 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
143 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
144 if (getc_info.len < BUF_SIZE) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
145 // No more data available
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
146 if (getc_info.verbose) diag_printf("\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
147 return -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
148 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
149 getc_info.bufp = getc_info.buf;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
150 getc_info.len = (*getc_info.fun)(getc_info.bufp, BUF_SIZE, &getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
151 if ((getc_info.avail = getc_info.len) <= 0) {
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
152 if (getc_info.len < 0) {
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
153 diag_printf("I/O error: %s\n", (getc_info.io->error)(getc_info.err));
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
154 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
155 if (getc_info.verbose) diag_printf("\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
156 return -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
157 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
158 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
159 getc_info.avail--;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
160 return *getc_info.bufp++;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
161 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
162
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
163 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
164 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
165 // Called to fetch a new chunk of data and decompress it
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
166 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
167 static int
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
168 _decompress_stream(char *buf, int len, int *err)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
169 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
170 _pipe_t* p = &getc_info.load_pipe;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
171 int res, total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
172
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
173 total = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
174 while (len > 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
175 if (p->in_avail == 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
176 p->in_buf = &getc_info._buffer[0];
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
177 res = (*getc_info.raw_fun)(p->in_buf, CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER,
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
178 &getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
179 if ((p->in_avail = res) <= 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
180 // No more data
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
181 return total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
182 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
183 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
184 p->out_buf = buf;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
185 p->out_size = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
186 p->out_max = len;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
187 res = (*_dc_inflate)(p);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
188 if (res != 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
189 *err = res;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
190 return total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
191 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
192 len -= p->out_size;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
193 buf += p->out_size;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
194 total += p->out_size;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
195 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
196 return total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
197 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
198 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
199
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
200 static int
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
201 redboot_getc_init(connection_info_t *info, getc_io_funcs_t *funcs,
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
202 int verbose, int decompress)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
203 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
204 int res;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
205
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
206 res = (funcs->open)(info, &getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
207 if (res < 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
208 diag_printf("Can't load '%s': %s\n", info->filename, (funcs->error)(getc_info.err));
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
209 return res;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
210 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
211 getc_info.io = funcs;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
212 getc_info.fun = funcs->read;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
213 getc_info.avail = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
214 getc_info.len = BUF_SIZE;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
215 getc_info.verbose = verbose;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
216 getc_info.decompress = decompress;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
217 getc_info.tick = 0;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
218 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
219 if (decompress) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
220 _pipe_t* p = &getc_info.load_pipe;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
221 p->out_buf = &getc_info.buf[0];
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
222 p->out_size = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
223 p->in_avail = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
224 getc_info.raw_fun = getc_info.fun;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
225 getc_info.fun = _decompress_stream;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
226 getc_info.err = (*_dc_init)(p);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
227 if (0 != getc_info.err && p->msg) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
228 diag_printf("open decompression error: %s\n", p->msg);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
229 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
230 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
231 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
232 return 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
233 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
234
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
235 static void
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
236 redboot_getc_rewind(void)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
237 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
238 getc_info.bufp = getc_info.buf;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
239 getc_info.avail = getc_info.len;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
240 }
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 117
diff changeset
241
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
242 static void
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
243 redboot_getc_terminate(bool abort)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
244 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
245 if (getc_info.io->terminate) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
246 (getc_info.io->terminate)(abort, redboot_getc);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
247 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
248 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
249
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
250 static void
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
251 redboot_getc_close(void)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
252 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
253 (getc_info.io->close)(&getc_info.err);
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
254 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
255 if (getc_info.decompress) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
256 _pipe_t* p = &getc_info.load_pipe;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
257 int err = getc_info.err;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
258 if (0 != err && p->msg) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
259 diag_printf("decompression error: %s\n", p->msg);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
260 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
261 err = (*_dc_close)(p, getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
262 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
263 #endif
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
264 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
265
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
266 #ifdef CYGSEM_REDBOOT_ELF
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
267 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
268 // Support function - used to read bytes into a buffer
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
269 // Returns the number of bytes read (stops short on errors)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
270 //
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
271 static int
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
272 _read(int (*getc)(void), unsigned char *buf, int len)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
273 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
274 int total = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
275 int ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
276 while (len-- > 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
277 ch = (*getc)();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
278 if (ch < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
279 // EOF or error
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
280 break;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
281 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
282 *buf++ = ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
283 total++;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
284 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
285 return total;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
286 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
287 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
288
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
289 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
290 // Load an ELF [binary] image
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
291 //
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
292 static unsigned long
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
293 load_elf_image(getc_t getc, unsigned long base)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
294 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
295 #ifdef CYGSEM_REDBOOT_ELF
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
296 Elf32_Ehdr ehdr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
297 #define MAX_PHDR 8
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
298 Elf32_Phdr phdr[MAX_PHDR];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
299 unsigned long offset = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
300 int phx, len, ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
301 unsigned char *addr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
302 unsigned long addr_offset = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
303 unsigned long highest_address = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
304 unsigned long lowest_address = 0xFFFFFFFF;
1551
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
305 unsigned char *SHORT_DATA = "Short data reading ELF file\n";
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
306
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
307 // Read the header
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
308 if (_read(getc, (unsigned char *)&ehdr, sizeof(ehdr)) != sizeof(ehdr)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
309 diag_printf("Can't read ELF header\n");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
310 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
311 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
312 offset += sizeof(ehdr);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
313 #if 0 // DEBUG
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
314 diag_printf("Type: %d, Machine: %d, Version: %d, Entry: %p, PHoff: %p/%d/%d, SHoff: %p/%d/%d\n",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
315 ehdr.e_type, ehdr.e_machine, ehdr.e_version, ehdr.e_entry,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
316 ehdr.e_phoff, ehdr.e_phentsize, ehdr.e_phnum,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
317 ehdr.e_shoff, ehdr.e_shentsize, ehdr.e_shnum);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
318 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
319 if (ehdr.e_type != ET_EXEC) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
320 diag_printf("Only absolute ELF images supported\n");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
321 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
322 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
323 if (ehdr.e_phnum > MAX_PHDR) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
324 diag_printf("Too many program headers\n");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
325 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
326 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
327 while (offset < ehdr.e_phoff) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
328 if ((*getc)() < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
329 diag_printf(SHORT_DATA);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
330 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
331 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
332 offset++;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
333 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
334 for (phx = 0; phx < ehdr.e_phnum; phx++) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
335 if (_read(getc, (unsigned char *)&phdr[phx], sizeof(phdr[0])) != sizeof(phdr[0])) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
336 diag_printf("Can't read ELF program header\n");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
337 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
338 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
339 #if 0 // DEBUG
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
340 diag_printf("Program header: type: %d, off: %p, va: %p, pa: %p, len: %d/%d, flags: %d\n",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
341 phdr[phx].p_type, phdr[phx].p_offset, phdr[phx].p_vaddr, phdr[phx].p_paddr,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
342 phdr[phx].p_filesz, phdr[phx].p_memsz, phdr[phx].p_flags);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
343 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
344 offset += sizeof(phdr[0]);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
345 }
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
346 if (base) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
347 // Set address offset based on lowest address in file.
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
348 addr_offset = 0xFFFFFFFF;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
349 for (phx = 0; phx < ehdr.e_phnum; phx++) {
1319
94e373b3fc8d Fix ELF load when -b option used.
gthomas
parents: 1253
diff changeset
350 if ((phdr[phx].p_type == PT_LOAD) && (phdr[phx].p_paddr < addr_offset)) {
1253
9ecd8873f657 Use LMA, not VMA
gthomas
parents: 1223
diff changeset
351 addr_offset = phdr[phx].p_paddr;
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
352 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
353 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
354 addr_offset = (unsigned long)base - addr_offset;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
355 } else {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
356 addr_offset = 0;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
357 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
358 for (phx = 0; phx < ehdr.e_phnum; phx++) {
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
359 if (phdr[phx].p_type == PT_LOAD) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
360 // Loadable segment
1253
9ecd8873f657 Use LMA, not VMA
gthomas
parents: 1223
diff changeset
361 addr = (unsigned char *)phdr[phx].p_paddr;
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
362 len = phdr[phx].p_filesz;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
363 if ((unsigned long)addr < lowest_address) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
364 lowest_address = (unsigned long)addr;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
365 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
366 addr += addr_offset;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
367 if (offset > phdr[phx].p_offset) {
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
368 if ((phdr[phx].p_offset + len) < offset) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
369 diag_printf("Can't load ELF file - program headers out of order\n");
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
370 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
371 }
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
372 addr += offset - phdr[phx].p_offset;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
373 } else {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
374 while (offset < phdr[phx].p_offset) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
375 if ((*getc)() < 0) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
376 diag_printf(SHORT_DATA);
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
377 return 0;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
378 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
379 offset++;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
380 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
381 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
382 // Copy data into memory
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
383 while (len-- > 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
384 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 945
diff changeset
385 if (!valid_address(addr)) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
386 redboot_getc_terminate(true);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
387 diag_printf("*** Abort! Attempt to load ELF data to address: %p which is not in RAM\n", (void*)addr);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
388 return 0;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
389 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
390 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
391 if ((ch = (*getc)()) < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
392 diag_printf(SHORT_DATA);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
393 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
394 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
395 *addr++ = ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
396 offset++;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
397 if ((unsigned long)(addr-addr_offset) > highest_address) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
398 highest_address = (unsigned long)(addr - addr_offset);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
399 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
400 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
401 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
402 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
403 // Save load base/top and entry
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
404 if (base) {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
405 load_address = base;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
406 load_address_end = base + (highest_address - lowest_address);
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
407 entry_address = base + (ehdr.e_entry - lowest_address);
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
408 } else {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
409 load_address = lowest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
410 load_address_end = highest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
411 entry_address = ehdr.e_entry;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
412 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
413
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
414 redboot_getc_terminate(false);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
415 if (addr_offset) diag_printf("Address offset = %p\n", (void *)addr_offset);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
416 diag_printf("Entry point: %p, address range: %p-%p\n",
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
417 (void*)entry_address, (void *)load_address, (void *)load_address_end);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
418 return 1;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
419 #else // CYGSEM_REDBOOT_ELF
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
420 diag_printf("Loading ELF images not supported\n");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
421 return 0;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
422 #endif // CYGSEM_REDBOOT_ELF
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
423 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
424
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
425
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
426 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
427 // Scan a string of hex bytes and update the checksum
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
428 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
429 static long
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
430 _hex2(int (*getc)(void), int len, long *sum)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
431 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
432 int val, byte;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
433 char c1, c2;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
434
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
435 val = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
436 while (len-- > 0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
437 c1 = (*getc)();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
438 c2 = (*getc)();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
439 if (_is_hex(c1) && _is_hex(c2)) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
440 val <<= 8;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
441 byte = (_from_hex(c1)<<4) | _from_hex(c2);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
442 val |= byte;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
443 if (sum) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
444 *sum += byte;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
445 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
446 } else {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
447 return (-1);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
448 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
449 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
450 return (val);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
451 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
452
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
453 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
454 // Process a set of S-records, loading the contents into memory.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
455 // Note: if a "base" value is provided, the data will be relocated
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
456 // relative to that location. Of course, this can only work for
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
457 // the first section of the data, so if there are non-contiguous
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
458 // pieces of data, they will end up relocated in the same fashion.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
459 // Because of this, "base" probably only makes sense for a set of
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
460 // data which has only one section, e.g. a ROM image.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
461 //
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
462 static unsigned long
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
463 load_srec_image(getc_t getc, unsigned long base)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
464 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
465 int c;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
466 long offset = 0, count, sum, val, cksum;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
467 unsigned char *addr, *base_addr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
468 char type;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
469 bool first_addr = true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
470 unsigned long addr_offset = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
471 unsigned long highest_address = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
472 unsigned long lowest_address = 0xFFFFFFFF;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
473
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
474 while ((c = (*getc)()) > 0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
475 // Start of line
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
476 if (c != 'S') {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
477 redboot_getc_terminate(true);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
478 diag_printf("Invalid S-record at offset %p, input: %c\n",
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
479 (void *)offset, c);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
480 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
481 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
482 type = (*getc)();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
483 offset += 2;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
484 sum = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
485 if ((count = _hex2(getc, 1, &sum)) < 0) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
486 redboot_getc_terminate(true);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
487 diag_printf("Bad S-record count at offset %p\n", (void *)offset);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
488 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
489 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
490 offset += 1;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
491 switch (type) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
492 case '0':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
493 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
494 case '1':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
495 case '2':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
496 case '3':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
497 base_addr = addr = (unsigned char *)_hex2(getc, (type-'1'+2), &sum);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
498 offset += (type-'1'+2);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
499 if (first_addr) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
500 if (base) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
501 addr_offset = (unsigned long)base - (unsigned long)addr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
502 } else {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
503 addr_offset = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
504 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
505 first_addr = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
506 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
507 addr += addr_offset;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
508 if ((unsigned long)(addr-addr_offset) < lowest_address) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
509 lowest_address = (unsigned long)(addr - addr_offset);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
510 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
511 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 945
diff changeset
512 if (!valid_address(addr)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
513 // Only if there is no need to stop the download before printing
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
514 // output can we ask confirmation questions.
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
515 redboot_getc_terminate(true);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
516 diag_printf("*** Abort! Attempt to load S-record to address: %p, which is not in RAM\n",(void*)addr);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
517 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
518 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
519 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
520 count -= ((type-'1'+2)+1);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
521 offset += count;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
522 while (count-- > 0) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
523 val = _hex2(getc, 1, &sum);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
524 *addr++ = val;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
525 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
526 cksum = _hex2(getc, 1, 0);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
527 offset += 1;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
528 sum = sum & 0xFF;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
529 cksum = (~cksum & 0xFF);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
530 if (cksum != sum) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
531 redboot_getc_terminate(true);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
532 diag_printf("*** Warning! Checksum failure - Addr: %lx, %02lX <> %02lX\n",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
533 (unsigned long)base_addr, sum, cksum);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
534 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
535 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
536 if ((unsigned long)(addr-addr_offset) > highest_address) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
537 highest_address = (unsigned long)(addr - addr_offset);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
538 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
539 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
540 case '7':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
541 case '8':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
542 case '9':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
543 addr = (unsigned char *)_hex2(getc, ('9'-type+2), &sum);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
544 offset += ('9'-type+2);
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
545 // Save load base/top, entry address
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
546 if (base) {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
547 load_address = base;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
548 load_address_end = base + (highest_address - lowest_address);
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
549 entry_address = (unsigned long)(base + (addr - lowest_address));
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
550 } else {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
551 load_address = lowest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
552 load_address_end = highest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
553 entry_address = (unsigned long)addr;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
554 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
555 redboot_getc_terminate(false);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
556 if (addr_offset) diag_printf("Address offset = %p\n", (void *)addr_offset);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
557 diag_printf("Entry point: %p, address range: %p-%p\n",
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
558 (void*)entry_address, (void *)load_address, (void *)load_address_end);
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
559
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
560 return load_address_end;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
561 default:
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
562 redboot_getc_terminate(true);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
563 diag_printf("Invalid S-record at offset 0x%lx, type: %x\n",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
564 (unsigned long)offset, type);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
565 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
566 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
567 while ((c = (*getc)()) != '\n') offset++;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
568 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
569 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
570 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
571
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
572 //
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
573 // 'load' CLI command processing
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
574 // -b - specify a load [base] address
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
575 // -m - specify an I/O stream/method
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
576 // -c - Alternate serial I/O channel
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
577 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
578 // -d - Decompress data [packed via 'zlib']
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
579 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
580 //
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
581 void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
582 do_load(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
583 {
126
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 124
diff changeset
584 int res, num_options;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
585 int i, err;
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
586 bool verbose, raw;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
587 bool base_addr_set, mode_str_set;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
588 char *mode_str;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
589 #ifdef CYGPKG_REDBOOT_NETWORKING
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
590 struct sockaddr_in host;
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
591 bool hostname_set, port_set;
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
592 char *hostname;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
593 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
594 bool decompress = false;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
595 int chan = -1;
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 196
diff changeset
596 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
597 bool chan_set;
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 196
diff changeset
598 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
599 unsigned long base = 0;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
600 unsigned long end = 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
601 char type[4];
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
602 char *filename = 0;
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
603 struct option_info opts[8];
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
604 connection_info_t info;
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
605 getc_io_funcs_t *io = NULL;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
606 struct load_io_entry *io_tab;
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
607 unsigned int port; //int because it's an OPTION_ARG_TYPE_NUM, but will be cast to short
495
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
608 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
609 bool spillover_ok = false;
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
610 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
611
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
612 #ifdef CYGPKG_REDBOOT_NETWORKING
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
613 memset((char *)&host, 0, sizeof(host));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
614 host.sin_len = sizeof(host);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
615 host.sin_family = AF_INET;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
616 host.sin_addr = my_bootp_info.bp_siaddr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
617 host.sin_port = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
618 #endif
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
619
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
620 init_opts(&opts[0], 'v', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
621 (void *)&verbose, 0, "verbose");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
622 init_opts(&opts[1], 'r', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
623 (void *)&raw, 0, "load raw data");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
624 init_opts(&opts[2], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
625 (void *)&base, (bool *)&base_addr_set, "load address");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
626 init_opts(&opts[3], 'm', true, OPTION_ARG_TYPE_STR,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
627 (void *)&mode_str, (bool *)&mode_str_set, "download mode (TFTP, xyzMODEM, or disk)");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
628 num_options = 4;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
629 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
630 init_opts(&opts[num_options], 'c', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
631 (void *)&chan, (bool *)&chan_set, "I/O channel");
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
632 num_options++;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
633 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
634 #ifdef CYGPKG_REDBOOT_NETWORKING
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 174
diff changeset
635 init_opts(&opts[num_options], 'h', true, OPTION_ARG_TYPE_STR,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
636 (void *)&hostname, (bool *)&hostname_set, "host name or IP address");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
637 num_options++;
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
638 init_opts(&opts[num_options], 'p', true, OPTION_ARG_TYPE_NUM,
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
639 (void *)&port, (bool *)&port_set, "TCP port");
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
640 num_options++;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
641 #endif
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
642 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 174
diff changeset
643 init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
644 (void *)&decompress, 0, "decompress");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
645 num_options++;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
646 #endif
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
647
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
648 CYG_ASSERT(num_options <= NUM_ELEMS(opts), "Too many options");
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
649
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
650 if (!scan_opts(argc, argv, 1, opts, num_options,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
651 (void *)&filename, OPTION_ARG_TYPE_STR, "file name")) {
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
652 return;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
653 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
654 #ifdef CYGPKG_REDBOOT_NETWORKING
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
655 if (hostname_set) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
656 ip_route_t rt;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
657 if (!_gethostbyname(hostname, (in_addr_t *)&host)) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
658 diag_printf("Invalid host: %s\n", hostname);
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
659 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
660 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
661 /* check that the host can be accessed */
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
662 if (__arp_lookup((ip_addr_t *)&host.sin_addr, &rt) < 0) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
663 diag_printf("Unable to reach host %s (%s)\n",
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
664 hostname, inet_ntoa((in_addr_t *)&host));
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
665 return;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
666 }
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
667 }
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
668 if (port_set)
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
669 host.sin_port = port;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
670 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
671 if (chan >= CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
672 diag_printf("Invalid I/O channel: %d\n", chan);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
673 return;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
674 }
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
675 if (mode_str_set) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
676 for (io_tab = __RedBoot_LOAD_TAB__;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
677 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
678 if (strncasecmp(&mode_str[0], io_tab->name, strlen(&mode_str[0])) == 0) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
679 io = io_tab->funcs;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
680 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
681 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
682 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
683 if (!io) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
684 diag_printf("Invalid 'mode': %s. Valid modes are:", mode_str);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
685 for (io_tab = __RedBoot_LOAD_TAB__;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
686 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
687 diag_printf(" %s", io_tab->name);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
688 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
689 diag_printf("\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
690 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
691 if (!io) {
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
692 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
693 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
694 verbose &= io_tab->can_verbose;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
695 if (io_tab->need_filename && !filename) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
696 diag_printf("File name required\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
697 diag_printf("usage: load %s\n", usage);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
698 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
699 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
700 } else {
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
701 char *which;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
702 io_tab = (struct load_io_entry *)NULL; // Default
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
703 #ifdef CYGPKG_REDBOOT_NETWORKING
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
704 #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
705 which = "TFTP";
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
706 io = &tftp_io;
945
3b9afa204d69 * src/load.c:
jlarmour
parents: 899
diff changeset
707 #elif defined(CYGSEM_REDBOOT_NET_HTTP_DOWNLOAD)
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
708 which = "HTTP";
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
709 io = &http_io;
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
710 #endif
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
711 #endif
1414
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
712 #ifdef CYGPKG_REDBOOT_FILEIO
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
713 // Make file I/O default if mounted
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
714 if (fileio_mounted) {
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
715 which = "file";
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
716 io = &fileio_io;
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
717 }
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
718 #endif
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
719 if (!io) {
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
720 #ifdef CYGBLD_BUILD_REDBOOT_WITH_XYZMODEM
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
721 which = "Xmodem";
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
722 io = &xyzModem_io;
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
723 verbose = false;
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
724 #else
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
725 diag_printf("No default protocol!\n");
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
726 return;
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
727 #endif
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
728 }
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
729 diag_printf("Using default protocol (%s)\n", which);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
730 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
731 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
732 if (base_addr_set && !valid_address((unsigned char *)base)) {
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 157
diff changeset
733 if (!verify_action("Specified address (%p) is not believed to be in RAM", (void*)base))
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 157
diff changeset
734 return;
495
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
735 spillover_ok = true;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 132
diff changeset
736 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
737 #endif
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
738 if (raw && !base_addr_set) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
739 diag_printf("Raw load requires a memory address\n");
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
740 return;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
741 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
742 info.filename = filename;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
743 info.chan = chan;
273
e51742b21f31 Fix problem when load used without -m option.
gthomas
parents: 245
diff changeset
744 info.mode = io_tab ? io_tab->mode : 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
745 #ifdef CYGPKG_REDBOOT_NETWORKING
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
746 info.server = &host;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
747 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
748 res = redboot_getc_init(&info, io, verbose, decompress);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
749 if (res < 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
750 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
751 }
163
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 162
diff changeset
752
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
753 // Stream open, process the data
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
754 if (raw) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
755 unsigned char *mp = (unsigned char *)base;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
756 err = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
757 while ((res = redboot_getc()) >= 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
758 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
1223
dbcfe4e0dbd2 New platform - TAMS MOAB - and generic changes to support it
gthomas
parents: 945
diff changeset
759 if (!valid_address(mp) && !spillover_ok) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
760 // Only if there is no need to stop the download
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
761 // before printing output can we ask confirmation
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
762 // questions.
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
763 redboot_getc_terminate(true);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
764 diag_printf("*** Abort! RAW data spills over limit of user RAM at %p\n",(void*)mp);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
765 err = -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
766 break;
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
767 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
768 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
769 *mp++ = res;
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
770 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
771 end = (unsigned long) mp;
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
772
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
773 // Save load base/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
774 load_address = base;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
775 load_address_end = end;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
776 entry_address = base; // best guess
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
777
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
778 redboot_getc_terminate(false);
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
779 if (0 == err)
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
780 diag_printf("Raw file loaded %p-%p, assumed entry at %p\n",
330
2525052c5d76 Fix compressed file loads.
msalter
parents: 273
diff changeset
781 (void *)base, (void *)(end - 1), (void*)base);
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
782 } else {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
783 // Read initial header - to determine file [image] type
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
784 for (i = 0; i < sizeof(type); i++) {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
785 if ((res = redboot_getc()) < 0) {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
786 err = getc_info.err;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
787 break;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
788 }
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
789 type[i] = res;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
790 }
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
791 if (res >= 0) {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
792 redboot_getc_rewind(); // Restore header to stream
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
793 // Treat data as some sort of executable image
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
794 if (strncmp(&type[1], "ELF", 3) == 0) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
795 end = load_elf_image(redboot_getc, base);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
796 } else if ((type[0] == 'S') &&
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
797 ((type[1] >= '0') && (type[1] <= '9'))) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
798 end = load_srec_image(redboot_getc, base);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
799 } else {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
800 redboot_getc_terminate(true);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
801 diag_printf("Unrecognized image type: 0x%lx\n", *(unsigned long *)type);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
802 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
803 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
804 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
805
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
806 redboot_getc_close(); // Clean up
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
807 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
808 }