]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - common/cmd_autoscript.c
[new uImage] Update naming convention for bootm/uImage related code
[karo-tx-uboot.git] / common / cmd_autoscript.c
1 /*
2  * (C) Copyright 2001
3  * Kyle Harris, kharris@nexus-tech.net
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  */
23
24 /*
25  * autoscript allows a remote host to download a command file and,
26  * optionally, binary data for automatically updating the target. For
27  * example, you create a new kernel image and want the user to be
28  * able to simply download the image and the machine does the rest.
29  * The kernel image is postprocessed with mkimage, which creates an
30  * image with a script file prepended. If enabled, autoscript will
31  * verify the script and contents of the download and execute the
32  * script portion. This would be responsible for erasing flash,
33  * copying the new image, and rebooting the machine.
34  */
35
36 /* #define DEBUG */
37
38 #include <common.h>
39 #include <command.h>
40 #include <image.h>
41 #include <malloc.h>
42 #include <asm/byteorder.h>
43 #if defined(CONFIG_8xx)
44 #include <mpc8xx.h>
45 #endif
46 #ifdef CFG_HUSH_PARSER
47 #include <hush.h>
48 #endif
49
50 #if defined(CONFIG_AUTOSCRIPT) || defined(CONFIG_CMD_AUTOSCRIPT)
51
52 int
53 autoscript (ulong addr)
54 {
55         ulong len;
56         image_header_t *hdr;
57         ulong *data;
58         char *cmd;
59         int rcode = 0;
60         int verify;
61
62         verify = getenv_verify ();
63
64         switch (genimg_get_format ((void *)addr)) {
65         case IMAGE_FORMAT_LEGACY:
66                 hdr = (image_header_t *)addr;
67
68                 if (!image_check_magic (hdr)) {
69                         puts ("Bad magic number\n");
70                         return 1;
71                 }
72
73                 if (!image_check_hcrc (hdr)) {
74                         puts ("Bad header crc\n");
75                         return 1;
76                 }
77
78                 if (verify) {
79                         if (!image_check_dcrc (hdr)) {
80                                 puts ("Bad data crc\n");
81                                 return 1;
82                         }
83                 }
84
85                 if (!image_check_type (hdr, IH_TYPE_SCRIPT)) {
86                         puts ("Bad image type\n");
87                         return 1;
88                 }
89
90                 /* get length of script */
91                 data = (ulong *)image_get_data (hdr);
92
93                 if ((len = uimage_to_cpu (*data)) == 0) {
94                         puts ("Empty Script\n");
95                         return 1;
96                 }
97                 break;
98 #if defined(CONFIG_FIT)
99         case IMAGE_FORMAT_FIT:
100                 fit_unsupported ("autoscript");
101                 return 1;
102 #endif
103         default:
104                 puts ("Wrong image format for autoscript\n");
105                 return 1;
106         }
107
108         debug ("** Script length: %ld\n", len);
109
110         if ((cmd = malloc (len + 1)) == NULL) {
111                 return 1;
112         }
113
114         while (*data++);
115
116         /* make sure cmd is null terminated */
117         memmove (cmd, (char *)data, len);
118         *(cmd + len) = 0;
119
120 #ifdef CFG_HUSH_PARSER /*?? */
121         rcode = parse_string_outer (cmd, FLAG_PARSE_SEMICOLON);
122 #else
123         {
124                 char *line = cmd;
125                 char *next = cmd;
126
127                 /*
128                  * break into individual lines,
129                  * and execute each line;
130                  * terminate on error.
131                  */
132                 while (*next) {
133                         if (*next == '\n') {
134                                 *next = '\0';
135                                 /* run only non-empty commands */
136                                 if ((next - line) > 1) {
137                                         debug ("** exec: \"%s\"\n",
138                                                 line);
139                                         if (run_command (line, 0) < 0) {
140                                                 rcode = 1;
141                                                 break;
142                                         }
143                                 }
144                                 line = next + 1;
145                         }
146                         ++next;
147                 }
148         }
149 #endif
150         free (cmd);
151         return rcode;
152 }
153
154 #endif
155
156 /**************************************************/
157 #if defined(CONFIG_CMD_AUTOSCRIPT)
158 int
159 do_autoscript (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
160 {
161         ulong addr;
162         int rcode;
163
164         if (argc < 2) {
165                 addr = CFG_LOAD_ADDR;
166         } else {
167                 addr = simple_strtoul (argv[1],0,16);
168         }
169
170         printf ("## Executing script at %08lx\n",addr);
171         rcode = autoscript (addr);
172         return rcode;
173 }
174
175 #if defined(CONFIG_CMD_AUTOSCRIPT)
176 U_BOOT_CMD(
177         autoscr, 2, 0,  do_autoscript,
178         "autoscr - run script from memory\n",
179         "[addr] - run script starting at addr"
180         " - A valid autoscr header must be present\n"
181 );
182 #endif
183
184 #endif