1
2
3
4
5
6
7
8
9
10
11#include <common.h>
12#include <bootstage.h>
13#include <cli.h>
14#include <cli_hush.h>
15#include <command.h>
16#include <console.h>
17#include <env.h>
18#include <fdtdec.h>
19#include <hang.h>
20#include <malloc.h>
21#include <asm/global_data.h>
22#include <dm/ofnode.h>
23
24#ifdef CONFIG_CMDLINE
25
26
27
28
29
30
31
32int run_command(const char *cmd, int flag)
33{
34#if !CONFIG_IS_ENABLED(HUSH_PARSER)
35
36
37
38
39 if (cli_simple_run_command(cmd, flag) == -1)
40 return 1;
41
42 return 0;
43#else
44 int hush_flags = FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP;
45
46 if (flag & CMD_FLAG_ENV)
47 hush_flags |= FLAG_CONT_ON_NEWLINE;
48 return parse_string_outer(cmd, hush_flags);
49#endif
50}
51
52
53
54
55
56
57
58
59int run_command_repeatable(const char *cmd, int flag)
60{
61#ifndef CONFIG_HUSH_PARSER
62 return cli_simple_run_command(cmd, flag);
63#else
64
65
66
67
68 if (parse_string_outer(cmd,
69 FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP))
70 return -1;
71
72 return 0;
73#endif
74}
75#else
76__weak int board_run_command(const char *cmdline)
77{
78 printf("## Commands are disabled. Please enable CONFIG_CMDLINE.\n");
79
80 return 1;
81}
82#endif
83
84int run_command_list(const char *cmd, int len, int flag)
85{
86 int need_buff = 1;
87 char *buff = (char *)cmd;
88 int rcode = 0;
89
90 if (len == -1) {
91 len = strlen(cmd);
92#ifdef CONFIG_HUSH_PARSER
93
94 need_buff = 0;
95#else
96
97 need_buff = strchr(cmd, '\n') != NULL;
98#endif
99 }
100 if (need_buff) {
101 buff = malloc(len + 1);
102 if (!buff)
103 return 1;
104 memcpy(buff, cmd, len);
105 buff[len] = '\0';
106 }
107#ifdef CONFIG_HUSH_PARSER
108 rcode = parse_string_outer(buff, FLAG_PARSE_SEMICOLON);
109#else
110
111
112
113
114
115
116
117#ifdef CONFIG_CMDLINE
118 rcode = cli_simple_run_command_list(buff, flag);
119#else
120 rcode = board_run_command(buff);
121#endif
122#endif
123 if (need_buff)
124 free(buff);
125
126 return rcode;
127}
128
129
130
131#if defined(CONFIG_CMD_RUN)
132int do_run(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
133{
134 int i;
135
136 if (argc < 2)
137 return CMD_RET_USAGE;
138
139 for (i = 1; i < argc; ++i) {
140 char *arg;
141
142 arg = env_get(argv[i]);
143 if (arg == NULL) {
144 printf("## Error: \"%s\" not defined\n", argv[i]);
145 return 1;
146 }
147
148 if (run_command(arg, flag | CMD_FLAG_ENV) != 0)
149 return 1;
150 }
151 return 0;
152}
153#endif
154
155#if CONFIG_IS_ENABLED(OF_CONTROL)
156bool cli_process_fdt(const char **cmdp)
157{
158
159 const char *env = ofnode_conf_read_str("bootcmd");
160 if (env)
161 *cmdp = env;
162
163
164
165
166
167 return ofnode_conf_read_int("bootsecure", 0);
168}
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183void cli_secure_boot_cmd(const char *cmd)
184{
185#ifdef CONFIG_CMDLINE
186 struct cmd_tbl *cmdtp;
187#endif
188 int rc;
189
190 if (!cmd) {
191 printf("## Error: Secure boot command not specified\n");
192 goto err;
193 }
194
195
196 disable_ctrlc(1);
197
198
199#ifdef CONFIG_CMDLINE
200 cmdtp = find_cmd(cmd);
201 if (!cmdtp) {
202 printf("## Error: \"%s\" not defined\n", cmd);
203 goto err;
204 }
205
206
207 rc = (cmdtp->cmd)(cmdtp, 0, 1, (char **)&cmd);
208
209#else
210 rc = board_run_command(cmd);
211#endif
212
213
214 printf("## Error: \"%s\" returned (code %d)\n", cmd, rc);
215
216err:
217
218
219
220
221 hang();
222}
223#endif
224
225void cli_loop(void)
226{
227 bootstage_mark(BOOTSTAGE_ID_ENTER_CLI_LOOP);
228#ifdef CONFIG_HUSH_PARSER
229 parse_file_outer();
230
231 for (;;);
232#elif defined(CONFIG_CMDLINE)
233 cli_simple_loop();
234#else
235 printf("## U-Boot command line is disabled. Please enable CONFIG_CMDLINE\n");
236#endif
237}
238
239void cli_init(void)
240{
241#ifdef CONFIG_HUSH_PARSER
242 u_boot_hush_start();
243#endif
244
245#if defined(CONFIG_HUSH_INIT_VAR)
246 hush_init_var();
247#endif
248}
249