annotate packages/redboot/current/src/load.c @ 3292:7f8e529b4d82 default tip

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