annotate packages/redboot/current/src/load.c @ 2144:36bfd6474600

* src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings. * src/flash_load.c (NEW): Implements access to flash * src/load.c: Allow load command to load directly into flash * cdl/redboot.c (CYGBLD_REDBOOT_LOAD_INTO_FLASH) Control new feature, disabled by default. * cdl/main.c (cyg_start): Assert check to see if we have overflowed the workspace. * doc/redboot_cmds.sgml: Document new flag.
author asl
date Sat, 25 Feb 2006 14:21:12 +0000
parents 5841ca1d8824
children 467fd46113f3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
2 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
3 // load.c
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
4 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
5 // RedBoot file/image loader
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
6 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
12 // Copyright (C) 2002, 2003, 2004 Gary Thomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
41 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
43 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
44 // Author(s): gthomas
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
45 // Contributors: gthomas, tsmith
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
46 // Date: 2000-07-14
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
47 // Purpose:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
48 // Description:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
49 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
50 // This code is part of RedBoot (tm).
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
51 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
52 //####DESCRIPTIONEND####
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
53 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
54 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
55
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
56 #include <redboot.h>
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
57 #include <elf.h>
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
58 #ifdef CYGBLD_BUILD_REDBOOT_WITH_XYZMODEM
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
59 #include <xyzModem.h>
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
60 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
61 #ifdef CYGPKG_REDBOOT_DISK
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
62 #include <fs/disk.h>
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
63 #endif
1414
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
64 #ifdef CYGPKG_REDBOOT_FILEIO
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
65 #include <fs/fileio.h>
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
66 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
67 #ifdef CYGPKG_REDBOOT_NETWORKING
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
68 #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
69 #include <net/tftp_support.h>
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
70 #endif
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
71 #ifdef CYGSEM_REDBOOT_NET_HTTP_DOWNLOAD
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
72 #include <net/http.h>
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
73 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
74 #endif
1605
43a89c18d005 Add checking (assert) for size of option arrays. Also fix port for TFTP on little endian systems.
gthomas
parents: 1551
diff changeset
75 #include <cyg/infra/cyg_ass.h> // assertion macros
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
76 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
77 #include <cyg/io/flash.h>
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
78 #include "flash_load.h"
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
79 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
80
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
81 static char usage[] = "[-r] [-v] "
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
82 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
83 "[-d] "
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
84 #endif
1551
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
85 #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
86 "[-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
87 #endif
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
88 "[-m <varies>] "
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
89 #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
90 "[-c <channel_number>] "
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
91 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
92 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
93 "[-f <flash_address>] "
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
94 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
95 "\n [-b <base_address>] <file_name>";
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
96
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
97 // Exported CLI function
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
98 RedBoot_cmd("load",
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
99 "Load a file",
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
100 usage,
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
101 do_load
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
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 // Stream I/O support
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
106 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
107
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
108 // Table describing the various I/O methods
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
109 CYG_HAL_TABLE_BEGIN( __RedBoot_LOAD_TAB__, RedBoot_load );
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
110 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
111 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
112
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
113 // Buffers, data used by redboot_getc
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
114 #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
115 struct {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
116 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
117 int (*fun)(char *, int len, int *err);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
118 unsigned char buf[BUF_SIZE];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
119 unsigned char *bufp;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
120 int avail, len, err;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
121 int verbose, decompress, tick;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
122 #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
123 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
124 _pipe_t load_pipe;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
125 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
126 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
127 } getc_info;
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 117
diff changeset
128
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
129 typedef int (*getc_t)(void);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
130
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
131 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
132 // Read the next data byte from the stream.
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
133 // Returns:
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
134 // >= 0 - actual data
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
135 // -1 - error or EOF, status in getc_info.err
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
136 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
137 static int
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
138 redboot_getc(void)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
139 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
140 static char spin[] = "|/-\\|-";
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
141 if (getc_info.avail < 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
142 return -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
143 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
144 if (getc_info.avail == 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
145 if (getc_info.verbose) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
146 diag_printf("%c\b", spin[getc_info.tick++]);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
147 if (getc_info.tick >= sizeof(spin)) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
148 getc_info.tick = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
149 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
150 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
151 if (getc_info.len < BUF_SIZE) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
152 // No more data available
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
153 if (getc_info.verbose) diag_printf("\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
154 return -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
155 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
156 getc_info.bufp = getc_info.buf;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
157 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
158 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
159 if (getc_info.len < 0) {
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
160 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
161 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
162 if (getc_info.verbose) diag_printf("\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
163 return -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
164 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
165 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
166 getc_info.avail--;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
167 return *getc_info.bufp++;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
168 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
169
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
170 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
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 // 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
173 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
174 static int
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
175 _decompress_stream(char *buf, int len, int *err)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
176 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
177 _pipe_t* p = &getc_info.load_pipe;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
178 int res, total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
179
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
180 total = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
181 while (len > 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
182 if (p->in_avail == 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
183 p->in_buf = &getc_info._buffer[0];
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
184 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
185 &getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
186 if ((p->in_avail = res) <= 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
187 // No more data
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
188 return total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
189 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
190 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
191 p->out_buf = buf;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
192 p->out_size = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
193 p->out_max = len;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
194 res = (*_dc_inflate)(p);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
195 if (res != 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
196 *err = res;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
197 return total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
198 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
199 len -= p->out_size;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
200 buf += p->out_size;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
201 total += p->out_size;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
202 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
203 return total;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
204 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
205 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
206
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
207 static int
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
208 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
209 int verbose, int decompress)
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 int res;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
212
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
213 res = (funcs->open)(info, &getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
214 if (res < 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
215 diag_printf("Can't load '%s': %s\n", info->filename, (funcs->error)(getc_info.err));
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
216 return res;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
217 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
218 getc_info.io = funcs;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
219 getc_info.fun = funcs->read;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
220 getc_info.avail = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
221 getc_info.len = BUF_SIZE;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
222 getc_info.verbose = verbose;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
223 getc_info.decompress = decompress;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
224 getc_info.tick = 0;
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
225 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
226 if (decompress) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
227 _pipe_t* p = &getc_info.load_pipe;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
228 p->out_buf = &getc_info.buf[0];
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
229 p->out_size = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
230 p->in_avail = 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
231 getc_info.raw_fun = getc_info.fun;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
232 getc_info.fun = _decompress_stream;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
233 getc_info.err = (*_dc_init)(p);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
234 if (0 != getc_info.err && p->msg) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
235 diag_printf("open decompression error: %s\n", p->msg);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
236 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
237 }
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
238 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
239 return 0;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
240 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
241
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
242 static void
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
243 redboot_getc_rewind(void)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
244 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
245 getc_info.bufp = getc_info.buf;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
246 getc_info.avail = getc_info.len;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
247 }
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 117
diff changeset
248
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
249 static void
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
250 redboot_getc_terminate(bool abort)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
251 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
252 if (getc_info.io->terminate) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
253 (getc_info.io->terminate)(abort, redboot_getc);
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 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
256
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
257 static void
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
258 redboot_getc_close(void)
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
259 {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
260 (getc_info.io->close)(&getc_info.err);
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
261 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
262 if (getc_info.decompress) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
263 _pipe_t* p = &getc_info.load_pipe;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
264 int err = getc_info.err;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
265 if (0 != err && p->msg) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
266 diag_printf("decompression error: %s\n", p->msg);
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 err = (*_dc_close)(p, getc_info.err);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
269 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
270 #endif
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
271 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
272
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
273 #ifdef CYGSEM_REDBOOT_ELF
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
274 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
275 // Support function - used to read bytes into a buffer
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
276 // 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
277 //
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
278 static int
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
279 _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
280 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
281 int total = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
282 int ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
283 while (len-- > 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
284 ch = (*getc)();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
285 if (ch < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
286 // EOF or error
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
287 break;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
288 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
289 *buf++ = ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
290 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 return total;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
293 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
294 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
295
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
296 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
297 // Load an ELF [binary] image
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
298 //
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
299 static unsigned long
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
300 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
301 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
302 #ifdef CYGSEM_REDBOOT_ELF
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
303 Elf32_Ehdr ehdr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
304 #define MAX_PHDR 8
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
305 Elf32_Phdr phdr[MAX_PHDR];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
306 unsigned long offset = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
307 int phx, len, ch;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
308 unsigned char *addr;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
309 unsigned long addr_offset = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
310 unsigned long highest_address = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
311 unsigned long lowest_address = 0xFFFFFFFF;
1551
996bb9a3d7fe * src/load.c: add -p option to help string and only print it and -h if
asl
parents: 1520
diff changeset
312 unsigned char *SHORT_DATA = "Short data reading ELF file\n";
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
313
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
314 // Read the header
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
315 if (_read(getc, (unsigned char *)&ehdr, sizeof(ehdr)) != sizeof(ehdr)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
316 diag_printf("Can't read ELF header\n");
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
317 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
318 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
319 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
320 offset += sizeof(ehdr);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
321 #if 0 // DEBUG
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
322 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
323 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
324 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
325 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
326 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
327 if (ehdr.e_type != ET_EXEC) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
328 diag_printf("Only absolute ELF images supported\n");
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
329 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
330 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
331 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
332 if (ehdr.e_phnum > MAX_PHDR) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
333 diag_printf("Too many program headers\n");
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
334 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
335 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
336 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
337 while (offset < ehdr.e_phoff) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
338 if ((*getc)() < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
339 diag_printf(SHORT_DATA);
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
340 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
341 return 0;
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 offset++;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
344 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
345 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
346 if (_read(getc, (unsigned char *)&phdr[phx], sizeof(phdr[0])) != sizeof(phdr[0])) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
347 diag_printf("Can't read ELF program header\n");
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
348 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
349 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
350 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
351 #if 0 // DEBUG
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
352 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
353 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
354 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
355 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
356 offset += sizeof(phdr[0]);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
357 }
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
358 if (base) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
359 // 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
360 addr_offset = 0xFFFFFFFF;
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
361 for (phx = 0; phx < ehdr.e_phnum; phx++) {
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
362 #ifdef CYGOPT_REDBOOT_ELF_VIRTUAL_ADDRESS
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
363 if ((phdr[phx].p_type == PT_LOAD) && (phdr[phx].p_vaddr < addr_offset)) {
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
364 addr_offset = phdr[phx].p_vaddr;
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
365 #else
1319
94e373b3fc8d Fix ELF load when -b option used.
gthomas
parents: 1253
diff changeset
366 if ((phdr[phx].p_type == PT_LOAD) && (phdr[phx].p_paddr < addr_offset)) {
1253
9ecd8873f657 Use LMA, not VMA
gthomas
parents: 1223
diff changeset
367 addr_offset = phdr[phx].p_paddr;
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
368 #endif
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
369 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
370 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
371 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
372 } else {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
373 addr_offset = 0;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
374 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
375 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
376 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
377 // Loadable segment
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
378 #ifdef CYGOPT_REDBOOT_ELF_VIRTUAL_ADDRESS
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
379 addr = (unsigned char *)phdr[phx].p_vaddr;
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
380 #else
1253
9ecd8873f657 Use LMA, not VMA
gthomas
parents: 1223
diff changeset
381 addr = (unsigned char *)phdr[phx].p_paddr;
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
382 #endif
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
383 len = phdr[phx].p_filesz;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
384 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
385 lowest_address = (unsigned long)addr;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
386 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
387 addr += addr_offset;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
388 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
389 if ((phdr[phx].p_offset + len) < offset) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
390 diag_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
391 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
392 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
393 }
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
394 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
395 } else {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
396 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
397 if ((*getc)() < 0) {
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
398 diag_printf(SHORT_DATA);
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
399 redboot_getc_terminate(true);
211
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
400 return 0;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
401 }
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
402 offset++;
6eb55882e01c Merge from eCos master repository on 2002-05-29-16:32:18-BST
jlarmour
parents: 210
diff changeset
403 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
404 }
1724
549e69d9a7d0 * cdl/redboot.cdl:
asl
parents: 1605
diff changeset
405
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
406 // Copy data into memory
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
407 while (len-- > 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
408 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
409 if (!(valid_address(addr)
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
410 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
411 || (flash_verify_addr(addr) == FLASH_ERR_OK)
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
412 #endif
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
413 )) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
414 redboot_getc_terminate(true);
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
415 diag_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
416 return 0;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
417 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
418 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
419 if ((ch = (*getc)()) < 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
420 diag_printf(SHORT_DATA);
2067
5841ca1d8824 TFTP ACK/NAK fixes, from Andrew Dyer
gthomas
parents: 1756
diff changeset
421 redboot_getc_terminate(true);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
422 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
423 }
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
424 if (valid_address(addr)) {
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
425 *addr++ = ch;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
426 }
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
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
461 diag_printf("Loading ELF images not supported\n");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
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);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
519 diag_printf("Invalid S-record at offset %p, input: %c\n",
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
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);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
528 diag_printf("Bad S-record count at offset %p\n", (void *)offset);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
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);
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
561 diag_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);
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
569 if (valid_address(addr)) {
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
570 *addr++ = val;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
571 }
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
572 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
573 else {
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
574 flash_load_write(addr, val);
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
575 addr++;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
576 }
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
577 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
578 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
579 cksum = _hex2(getc, 1, 0);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
580 offset += 1;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
581 sum = sum & 0xFF;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
582 cksum = (~cksum & 0xFF);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
583 if (cksum != sum) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
584 redboot_getc_terminate(true);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
585 diag_printf("*** Warning! Checksum failure - Addr: %lx, %02lX <> %02lX\n",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
586 (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
587 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
588 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
589 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
590 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
591 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
592 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
593 case '7':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
594 case '8':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
595 case '9':
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
596 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
597 offset += ('9'-type+2);
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
598 // Save load base/top, entry address
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
599 if (base) {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
600 load_address = base;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
601 load_address_end = base + (highest_address - lowest_address);
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
602 entry_address = (unsigned long)(base + (addr - lowest_address));
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
603 } else {
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
604 load_address = lowest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
605 load_address_end = highest_address;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
606 entry_address = (unsigned long)addr;
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
607 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
608 redboot_getc_terminate(false);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
609 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
610 diag_printf("Entry point: %p, address range: %p-%p\n",
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
611 (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
612
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
613 return load_address_end;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
614 default:
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
615 redboot_getc_terminate(true);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
616 diag_printf("Invalid S-record at offset 0x%lx, type: %x\n",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
617 (unsigned long)offset, type);
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
618 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
619 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
620 while ((c = (*getc)()) != '\n') offset++;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
621 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
622 return 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
623 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
624
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
625 //
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
626 // 'load' CLI command processing
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
627 // -b - specify a load [base] address
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
628 // -m - specify an I/O stream/method
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
629 // -c - Alternate serial I/O channel
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
630 #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
631 // -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
632 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
633 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
634 // -f - specify a flash address
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
635 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
636 //
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
637 void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
638 do_load(int argc, char *argv[])
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
639 {
126
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 124
diff changeset
640 int res, num_options;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
641 int i, err;
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
642 bool verbose, raw;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
643 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
644 char *mode_str;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
645 #ifdef CYGPKG_REDBOOT_NETWORKING
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
646 struct sockaddr_in host;
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
647 bool hostname_set, port_set;
1756
b2a8f9509f6f * src/load.c (do_load): Removed compiler warning when building
asl
parents: 1724
diff changeset
648 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
649 // 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
650 char *hostname;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
651 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
652 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
653 bool flash_addr_set = false;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
654 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
655 bool decompress = false;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
656 int chan = -1;
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 196
diff changeset
657 #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
658 bool chan_set;
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 196
diff changeset
659 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
660 unsigned long base = 0;
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
661 unsigned long end = 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
662 char type[4];
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
663 char *filename = 0;
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
664 struct option_info opts[9];
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
665 connection_info_t info;
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
666 getc_io_funcs_t *io = NULL;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
667 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
668 #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
669 bool spillover_ok = false;
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
670 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
671
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
672 #ifdef CYGPKG_REDBOOT_NETWORKING
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
673 memset((char *)&host, 0, sizeof(host));
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
674 host.sin_len = sizeof(host);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
675 host.sin_family = AF_INET;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
676 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
677 host.sin_port = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
678 #endif
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
679
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
680 init_opts(&opts[0], 'v', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
681 (void *)&verbose, 0, "verbose");
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
682 init_opts(&opts[1], 'r', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
683 (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
684 init_opts(&opts[2], 'b', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
685 (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
686 init_opts(&opts[3], 'm', true, OPTION_ARG_TYPE_STR,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
687 (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
688 num_options = 4;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
689 #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
690 init_opts(&opts[num_options], 'c', true, OPTION_ARG_TYPE_NUM,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
691 (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
692 num_options++;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
693 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
694 #ifdef CYGPKG_REDBOOT_NETWORKING
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 174
diff changeset
695 init_opts(&opts[num_options], 'h', true, OPTION_ARG_TYPE_STR,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
696 (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
697 num_options++;
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
698 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
699 (void *)&port, (bool *)&port_set, "TCP port");
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
700 num_options++;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
701 #endif
1492
8b3549abe4ac * cdl/redboot.cdl: Bring CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER under
jlarmour
parents: 1414
diff changeset
702 #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
703 init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG,
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
704 (void *)&decompress, 0, "decompress");
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
705 num_options++;
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
706 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
707 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
708 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
709 (void *)&base, (bool *)&flash_addr_set, "flash address");
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
710 num_options++;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
711 #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
712 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
713
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
714 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
715 (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
716 return;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
717 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
718 #ifdef CYGPKG_REDBOOT_NETWORKING
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
719 if (hostname_set) {
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
720 ip_route_t rt;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
721 if (!_gethostbyname(hostname, (in_addr_t *)&host)) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
722 diag_printf("Invalid host: %s\n", hostname);
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
723 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
724 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
725 /* 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
726 if (__arp_lookup((ip_addr_t *)&host.sin_addr, &rt) < 0) {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
727 diag_printf("Unable to reach host %s (%s)\n",
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
728 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
729 return;
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
730 }
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
731 }
1520
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
732 if (port_set)
fc4fa5d81cba Allow port for HTTP connections to be overridden - from Jani Monoses
gthomas
parents: 1513
diff changeset
733 host.sin_port = port;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
734 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
735 if (chan >= CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
736 diag_printf("Invalid I/O channel: %d\n", chan);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
737 return;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
738 }
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
739 if (mode_str_set) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
740 for (io_tab = __RedBoot_LOAD_TAB__;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
741 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
742 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
743 io = io_tab->funcs;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
744 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
745 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
746 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
747 if (!io) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
748 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
749 for (io_tab = __RedBoot_LOAD_TAB__;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
750 io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
751 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
752 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
753 diag_printf("\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
754 }
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
755 if (!io) {
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
756 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
757 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
758 verbose &= io_tab->can_verbose;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
759 if (io_tab->need_filename && !filename) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
760 diag_printf("File name required\n");
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
761 diag_printf("usage: load %s\n", usage);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
762 return;
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
763 }
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
764 } else {
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
765 char *which = "";
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
766 io_tab = (struct load_io_entry *)NULL; // Default
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
767 #ifdef CYGPKG_REDBOOT_NETWORKING
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
768 #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
769 which = "TFTP";
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
770 io = &tftp_io;
945
3b9afa204d69 * src/load.c:
jlarmour
parents: 899
diff changeset
771 #elif defined(CYGSEM_REDBOOT_NET_HTTP_DOWNLOAD)
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
772 which = "HTTP";
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
773 io = &http_io;
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
774 #endif
886
a6c0f4a333e5 Make TFTP optional
gthomas
parents: 495
diff changeset
775 #endif
1414
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
776 #ifdef CYGPKG_REDBOOT_FILEIO
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
777 // Make file I/O default if mounted
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
778 if (fileio_mounted) {
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
779 which = "file";
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
780 io = &fileio_io;
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
781 }
9a2e186be457 Add support for mountable file systems (like JFFS2) - from David Woodhouse
gthomas
parents: 1319
diff changeset
782 #endif
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
783 if (!io) {
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
784 #ifdef CYGBLD_BUILD_REDBOOT_WITH_XYZMODEM
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
785 which = "Xmodem";
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
786 io = &xyzModem_io;
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
787 verbose = false;
899
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
788 #else
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
789 diag_printf("No default protocol!\n");
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
790 return;
17dd6922881b Fix build when X-modem is disabled
gthomas
parents: 898
diff changeset
791 #endif
898
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
792 }
6f9085944169 Improve download error handling. Also display more info during load.
gthomas
parents: 886
diff changeset
793 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
794 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
795 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
796 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
797 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
798 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
799 return;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
800 spillover_ok = true;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
801 }
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
802 #endif
1513
c4355f101bf6 Cleanups to remove warnings
gthomas
parents: 1492
diff changeset
803 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
804 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
805 return;
495
248ae32b58f8 Be quieter about out of range memory addresses - ask only once - from Patrick Doyle
gthomas
parents: 330
diff changeset
806 spillover_ok = true;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 132
diff changeset
807 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
808 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
809 if (raw && !(base_addr_set
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
810 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
811 || flash_addr_set
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
812 #endif
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
813 )) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
814 diag_printf("Raw load requires a memory address\n");
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
815 return;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
816 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
817 info.filename = filename;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
818 info.chan = chan;
273
e51742b21f31 Fix problem when load used without -m option.
gthomas
parents: 245
diff changeset
819 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
820 #ifdef CYGPKG_REDBOOT_NETWORKING
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
821 info.server = &host;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
822 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
823 res = redboot_getc_init(&info, io, verbose, decompress);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
824 if (res < 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
825 return;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
826 }
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
827 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
828 flash_load_start();
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
829 #endif
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
830 // 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
831 if (raw) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
832 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
833 err = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
834 while ((res = redboot_getc()) >= 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
835 #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
836 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
837 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
838 // 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
839 // before printing output can we ask confirmation
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
840 // questions.
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
841 redboot_getc_terminate(true);
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
842 diag_printf("*** Abort! RAW data spills over limit of FLASH at %p\n",(void*)mp);
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
843 err = -1;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
844 break;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
845 }
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
846 #endif
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
847 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
848 // 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
849 // 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
850 // questions.
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
851 redboot_getc_terminate(true);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
852 diag_printf("*** Abort! RAW data spills over limit of user RAM at %p\n",(void*)mp);
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
853 err = -1;
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
854 break;
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
855 }
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 154
diff changeset
856 #endif
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
857 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
858 if (flash_addr_set) {
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
859 flash_load_write(mp, res);
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
860 mp++;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
861 res++;
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
862 } else
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
863 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
864 *mp++ = res;
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
865 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
866 end = (unsigned long) mp;
196
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
867
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
868 // Save load base/top
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
869 load_address = base;
9b55e9c69693 Merge from eCos master repository on 2001-11-23-15:32:03-GMT
jlarmour
parents: 184
diff changeset
870 load_address_end = end;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
871 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
872
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
873 redboot_getc_terminate(false);
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
874 if (0 == err)
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
875 diag_printf("Raw file loaded %p-%p, assumed entry at %p\n",
330
2525052c5d76 Fix compressed file loads.
msalter
parents: 273
diff changeset
876 (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
877 } else {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
878 // 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
879 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
880 if ((res = redboot_getc()) < 0) {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
881 err = getc_info.err;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
882 break;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
883 }
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
884 type[i] = res;
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
885 }
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
886 if (res >= 0) {
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 156
diff changeset
887 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
888 // 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
889 if (strncmp(&type[1], "ELF", 3) == 0) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
890 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
891 } else if ((type[0] == 'S') &&
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 126
diff changeset
892 ((type[1] >= '0') && (type[1] <= '9'))) {
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 211
diff changeset
893 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
894 } else {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
895 redboot_getc_terminate(true);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
896 diag_printf("Unrecognized image type: 0x%lx\n", *(unsigned long *)type);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
897 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
898 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
899 }
2144
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
900 #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
901 flash_load_finish();
36bfd6474600 * src/xyzModem.c (xyzModem_stream_open): Fix compiler warnings.
asl
parents: 2067
diff changeset
902 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 171
diff changeset
903
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
904 redboot_getc_close(); // Clean up
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
905 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
906 }