Blame view

arch/sandbox/cpu/start.c 8.08 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
bace3d00f   Simon Glass   sandbox: Add main...
2
  /*
6fb620782   Simon Glass   sandbox: add conc...
3
   * Copyright (c) 2011-2012 The Chromium OS Authors.
bace3d00f   Simon Glass   sandbox: Add main...
4
5
6
   */
  
  #include <common.h>
380688204   Simon Glass   sandbox: Add miss...
7
  #include <errno.h>
5c2859cdc   Simon Glass   sandbox: Allow re...
8
  #include <os.h>
7dbcb76e7   Rabin Vincent   sandbox: init cli...
9
  #include <cli.h>
1f32ae957   Simon Glass   sandbox: Add a -D...
10
  #include <malloc.h>
70db4212f   Simon Glass   sandbox: add geto...
11
  #include <asm/getopt.h>
4d94dfa05   Simon Glass   sandbox: Set up g...
12
  #include <asm/io.h>
70db4212f   Simon Glass   sandbox: add geto...
13
  #include <asm/sections.h>
6fb620782   Simon Glass   sandbox: add conc...
14
  #include <asm/state.h>
bace3d00f   Simon Glass   sandbox: Add main...
15

808434cdb   Simon Glass   sandbox: Allow re...
16
  DECLARE_GLOBAL_DATA_PTR;
70db4212f   Simon Glass   sandbox: add geto...
17
18
19
  int sandbox_early_getopt_check(void)
  {
  	struct sandbox_state *state = state_get_current();
7b3efc669   Simon Glass   sandbox: Rename s...
20
  	struct sandbox_cmdline_option **sb_opt = __u_boot_sandbox_option_start;
70db4212f   Simon Glass   sandbox: add geto...
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  	size_t num_options = __u_boot_sandbox_option_count();
  	size_t i;
  	int max_arg_len, max_noarg_len;
  
  	/* parse_err will be a string of the faulting option */
  	if (!state->parse_err)
  		return 0;
  
  	if (strcmp(state->parse_err, "help")) {
  		printf("u-boot: error: failed while parsing option: %s
  "
  			"\ttry running with --help for more information.
  ",
  			state->parse_err);
  		os_exit(1);
  	}
  
  	printf(
  		"u-boot, a command line test interface to U-Boot
  
  "
  		"Usage: u-boot [options]
  "
  		"Options:
  ");
  
  	max_arg_len = 0;
  	for (i = 0; i < num_options; ++i)
b41411954   Masahiro Yamada   linux/kernel.h: s...
49
  		max_arg_len = max((int)strlen(sb_opt[i]->flag), max_arg_len);
70db4212f   Simon Glass   sandbox: add geto...
50
51
52
  	max_noarg_len = max_arg_len + 7;
  
  	for (i = 0; i < num_options; ++i) {
7b3efc669   Simon Glass   sandbox: Rename s...
53
  		struct sandbox_cmdline_option *opt = sb_opt[i];
70db4212f   Simon Glass   sandbox: add geto...
54
55
56
57
58
59
60
61
62
  
  		/* first output the short flag if it has one */
  		if (opt->flag_short >= 0x100)
  			printf("      ");
  		else
  			printf("  -%c, ", opt->flag_short);
  
  		/* then the long flag */
  		if (opt->has_arg)
70db4212f   Simon Glass   sandbox: add geto...
63
  			printf("--%-*s <arg> ", max_arg_len, opt->flag);
6ebcab8de   Simon Glass   sandbox: Correct ...
64
65
  		else
  			printf("--%-*s", max_noarg_len, opt->flag);
70db4212f   Simon Glass   sandbox: add geto...
66
67
68
69
70
71
72
73
  
  		/* finally the help text */
  		printf("  %s
  ", opt->help);
  	}
  
  	os_exit(0);
  }
689697785   Simon Glass   board_f: sandbox:...
74
75
76
77
  int misc_init_f(void)
  {
  	return sandbox_early_getopt_check();
  }
7b3efc669   Simon Glass   sandbox: Rename s...
78
  static int sandbox_cmdline_cb_help(struct sandbox_state *state, const char *arg)
70db4212f   Simon Glass   sandbox: add geto...
79
80
81
82
  {
  	/* just flag to sandbox_early_getopt_check to show usage */
  	return 1;
  }
7b3efc669   Simon Glass   sandbox: Rename s...
83
  SANDBOX_CMDLINE_OPT_SHORT(help, 'h', 0, "Display help");
70db4212f   Simon Glass   sandbox: add geto...
84

d0d0746e0   Simon Glass   sandbox: Don't in...
85
  #ifndef CONFIG_SPL_BUILD
ab4e07eb7   Simon Glass   sandbox: allow pr...
86
87
  int sandbox_main_loop_init(void)
  {
70db4212f   Simon Glass   sandbox: add geto...
88
89
90
  	struct sandbox_state *state = state_get_current();
  
  	/* Execute command if required */
ebaa832e9   Sjoerd Simons   sandbox: Don't tr...
91
92
  	if (state->cmd || state->run_distro_boot) {
  		int retval = 0;
88539e443   Joe Hershberger   sandbox: Return '...
93

7dbcb76e7   Rabin Vincent   sandbox: init cli...
94
  		cli_init();
2b6793de2   Simon Glass   sandbox: Avoid ca...
95
  #ifdef CONFIG_CMDLINE
ebaa832e9   Sjoerd Simons   sandbox: Don't tr...
96
97
98
99
100
101
  		if (state->cmd)
  			retval = run_command_list(state->cmd, -1, 0);
  
  		if (state->run_distro_boot)
  			retval = cli_simple_run_command("run distro_bootcmd",
  							0);
2b6793de2   Simon Glass   sandbox: Avoid ca...
102
  #endif
c5a62d4a7   Simon Glass   sandbox: Add -i o...
103
  		if (!state->interactive)
88539e443   Joe Hershberger   sandbox: Return '...
104
  			os_exit(retval);
70db4212f   Simon Glass   sandbox: add geto...
105
  	}
ab4e07eb7   Simon Glass   sandbox: allow pr...
106
107
  	return 0;
  }
d0d0746e0   Simon Glass   sandbox: Don't in...
108
  #endif
ab4e07eb7   Simon Glass   sandbox: allow pr...
109

ebaa832e9   Sjoerd Simons   sandbox: Don't tr...
110
111
112
113
114
115
116
  static int sandbox_cmdline_cb_boot(struct sandbox_state *state,
  				      const char *arg)
  {
  	state->run_distro_boot = true;
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(boot, 'b', 0, "Run distro boot commands");
7b3efc669   Simon Glass   sandbox: Rename s...
117
118
  static int sandbox_cmdline_cb_command(struct sandbox_state *state,
  				      const char *arg)
70db4212f   Simon Glass   sandbox: add geto...
119
120
121
122
  {
  	state->cmd = arg;
  	return 0;
  }
7b3efc669   Simon Glass   sandbox: Rename s...
123
  SANDBOX_CMDLINE_OPT_SHORT(command, 'c', 1, "Execute U-Boot command");
70db4212f   Simon Glass   sandbox: add geto...
124

7b3efc669   Simon Glass   sandbox: Rename s...
125
  static int sandbox_cmdline_cb_fdt(struct sandbox_state *state, const char *arg)
f828bf25f   Simon Glass   sandbox: Add CONF...
126
127
128
129
  {
  	state->fdt_fname = arg;
  	return 0;
  }
7b3efc669   Simon Glass   sandbox: Rename s...
130
  SANDBOX_CMDLINE_OPT_SHORT(fdt, 'd', 1, "Specify U-Boot's control FDT");
f828bf25f   Simon Glass   sandbox: Add CONF...
131

1f32ae957   Simon Glass   sandbox: Add a -D...
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
  static int sandbox_cmdline_cb_default_fdt(struct sandbox_state *state,
  					  const char *arg)
  {
  	const char *fmt = "%s.dtb";
  	char *fname;
  	int len;
  
  	len = strlen(state->argv[0]) + strlen(fmt) + 1;
  	fname = os_malloc(len);
  	if (!fname)
  		return -ENOMEM;
  	snprintf(fname, len, fmt, state->argv[0]);
  	state->fdt_fname = fname;
  
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(default_fdt, 'D', 0,
  		"Use the default u-boot.dtb control FDT in U-Boot directory");
c5a62d4a7   Simon Glass   sandbox: Add -i o...
150
151
152
153
154
155
156
157
  static int sandbox_cmdline_cb_interactive(struct sandbox_state *state,
  					  const char *arg)
  {
  	state->interactive = true;
  	return 0;
  }
  
  SANDBOX_CMDLINE_OPT_SHORT(interactive, 'i', 0, "Enter interactive mode");
bda7773f0   Simon Glass   sandbox: Add -j o...
158
159
160
  static int sandbox_cmdline_cb_jump(struct sandbox_state *state,
  				   const char *arg)
  {
ab839dc3e   Simon Glass   sandbox: Add opti...
161
162
  	/* Remember to delete this U-Boot image later */
  	state->jumped_fname = arg;
bda7773f0   Simon Glass   sandbox: Add -j o...
163
164
165
166
  
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(jump, 'j', 1, "Jumped from previous U-Boot");
5c2859cdc   Simon Glass   sandbox: Allow re...
167
168
169
170
171
172
173
174
  static int sandbox_cmdline_cb_memory(struct sandbox_state *state,
  				     const char *arg)
  {
  	int err;
  
  	/* For now assume we always want to write it */
  	state->write_ram_buf = true;
  	state->ram_buf_fname = arg;
f80a8bbee   Simon Glass   sandbox: Fix warn...
175
176
  	err = os_read_ram_buf(arg);
  	if (err) {
1c5a81d80   Simon Glass   sandbox: Remove t...
177
178
  		printf("Failed to read RAM buffer '%s': %d
  ", arg, err);
5c2859cdc   Simon Glass   sandbox: Allow re...
179
180
  		return err;
  	}
a65d1a06c   Simon Glass   sandbox: Zero the...
181
  	state->ram_buf_read = true;
5c2859cdc   Simon Glass   sandbox: Allow re...
182
183
184
185
186
  
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(memory, 'm', 1,
  			  "Read/write ram_buf memory contents from file");
ab839dc3e   Simon Glass   sandbox: Add opti...
187
188
189
190
191
192
193
194
  static int sandbox_cmdline_cb_rm_memory(struct sandbox_state *state,
  					const char *arg)
  {
  	state->ram_buf_rm = true;
  
  	return 0;
  }
  SANDBOX_CMDLINE_OPT(rm_memory, 0, "Remove memory file after reading");
1209e2727   Simon Glass   sandbox: Add faci...
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
  static int sandbox_cmdline_cb_state(struct sandbox_state *state,
  				    const char *arg)
  {
  	state->state_fname = arg;
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(state, 's', 1, "Specify the sandbox state FDT");
  
  static int sandbox_cmdline_cb_read(struct sandbox_state *state,
  				   const char *arg)
  {
  	state->read_state = true;
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(read, 'r', 0, "Read the state FDT on startup");
  
  static int sandbox_cmdline_cb_write(struct sandbox_state *state,
  				    const char *arg)
  {
  	state->write_state = true;
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(write, 'w', 0, "Write state FDT on exit");
  
  static int sandbox_cmdline_cb_ignore_missing(struct sandbox_state *state,
  					     const char *arg)
  {
  	state->ignore_missing_state_on_read = true;
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(ignore_missing, 'n', 0,
  			  "Ignore missing state on read");
7d95f2a32   Simon Glass   sandbox: Add LCD ...
227
228
229
230
231
232
233
234
  static int sandbox_cmdline_cb_show_lcd(struct sandbox_state *state,
  				       const char *arg)
  {
  	state->show_lcd = true;
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(show_lcd, 'l', 0,
  			  "Show the sandbox LCD display");
ffb87905c   Simon Glass   sandbox: Allow Ct...
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
  static const char *term_args[STATE_TERM_COUNT] = {
  	"raw-with-sigs",
  	"raw",
  	"cooked",
  };
  
  static int sandbox_cmdline_cb_terminal(struct sandbox_state *state,
  				       const char *arg)
  {
  	int i;
  
  	for (i = 0; i < STATE_TERM_COUNT; i++) {
  		if (!strcmp(arg, term_args[i])) {
  			state->term_raw = i;
  			return 0;
  		}
  	}
  
  	printf("Unknown terminal setting '%s' (", arg);
  	for (i = 0; i < STATE_TERM_COUNT; i++)
  		printf("%s%s", i ? ", " : "", term_args[i]);
  	puts(")
  ");
  
  	return 1;
  }
  SANDBOX_CMDLINE_OPT_SHORT(terminal, 't', 1,
  			  "Set terminal to raw/cooked mode");
9ce8b4020   Simon Glass   test: Record and ...
263
264
265
266
267
268
269
  static int sandbox_cmdline_cb_verbose(struct sandbox_state *state,
  				      const char *arg)
  {
  	state->show_test_output = true;
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(verbose, 'v', 0, "Show test output");
2b1dc29a1   Simon Glass   sandbox: Add a fl...
270
271
272
273
274
275
276
277
278
  static int sandbox_cmdline_cb_log_level(struct sandbox_state *state,
  					const char *arg)
  {
  	state->default_log_level = simple_strtol(arg, NULL, 10);
  
  	return 0;
  }
  SANDBOX_CMDLINE_OPT_SHORT(log_level, 'L', 1,
  			  "Set log level (0=panic, 7=debug)");
1ca910be5   Simon Glass   sandbox: Add an o...
279
280
281
282
283
284
285
286
  static int sandbox_cmdline_cb_show_of_platdata(struct sandbox_state *state,
  					       const char *arg)
  {
  	state->show_of_platdata = true;
  
  	return 0;
  }
  SANDBOX_CMDLINE_OPT(show_of_platdata, 0, "Show of-platdata in SPL");
2b6793de2   Simon Glass   sandbox: Avoid ca...
287
288
289
290
291
292
293
  int board_run_command(const char *cmdline)
  {
  	printf("## Commands are disabled. Please enable CONFIG_CMDLINE.
  ");
  
  	return 1;
  }
bb967240b   Simon Glass   board_f: sandbox:...
294
295
  static void setup_ram_buf(struct sandbox_state *state)
  {
a65d1a06c   Simon Glass   sandbox: Zero the...
296
297
298
299
300
301
  	/* Zero the RAM buffer if we didn't read it, to keep valgrind happy */
  	if (!state->ram_buf_read) {
  		memset(state->ram_buf, '\0', state->ram_size);
  		printf("clear %p %x
  ", state->ram_buf, state->ram_size);
  	}
bb967240b   Simon Glass   board_f: sandbox:...
302
303
304
  	gd->arch.ram_buf = state->ram_buf;
  	gd->ram_size = state->ram_size;
  }
d66ddafaf   Simon Glass   sandbox: Add a ne...
305
306
307
308
309
310
311
312
313
314
315
  void state_show(struct sandbox_state *state)
  {
  	char **p;
  
  	printf("Arguments:
  ");
  	for (p = state->argv; *p; p++)
  		printf("%s ", *p);
  	printf("
  ");
  }
bace3d00f   Simon Glass   sandbox: Add main...
316
317
  int main(int argc, char *argv[])
  {
70db4212f   Simon Glass   sandbox: add geto...
318
  	struct sandbox_state *state;
4d94dfa05   Simon Glass   sandbox: Set up g...
319
  	gd_t data;
1209e2727   Simon Glass   sandbox: Add faci...
320
  	int ret;
6fb620782   Simon Glass   sandbox: add conc...
321

1209e2727   Simon Glass   sandbox: Add faci...
322
323
324
  	ret = state_init();
  	if (ret)
  		goto err;
6fb620782   Simon Glass   sandbox: add conc...
325

70db4212f   Simon Glass   sandbox: add geto...
326
327
328
  	state = state_get_current();
  	if (os_parse_args(state, argc, argv))
  		return 1;
1209e2727   Simon Glass   sandbox: Add faci...
329
330
331
  	ret = sandbox_read_state(state, state->state_fname);
  	if (ret)
  		goto err;
4d94dfa05   Simon Glass   sandbox: Set up g...
332
333
  	memset(&data, '\0', sizeof(data));
  	gd = &data;
1fc50d727   Andy Yan   sandbox: use CONF...
334
  #if CONFIG_VAL(SYS_MALLOC_F_LEN)
29afe9e6e   Simon Glass   sandbox: Support ...
335
336
  	gd->malloc_base = CONFIG_MALLOC_F_ADDR;
  #endif
2b1dc29a1   Simon Glass   sandbox: Add a fl...
337
338
339
  #if CONFIG_IS_ENABLED(LOG)
  	gd->default_log_level = state->default_log_level;
  #endif
bb967240b   Simon Glass   board_f: sandbox:...
340
  	setup_ram_buf(state);
4d94dfa05   Simon Glass   sandbox: Set up g...
341

808434cdb   Simon Glass   sandbox: Allow re...
342
  	/* Do pre- and post-relocation init */
bace3d00f   Simon Glass   sandbox: Add main...
343
  	board_init_f(0);
8ec21bbe5   Allen Martin   sandbox: fix comp...
344

808434cdb   Simon Glass   sandbox: Allow re...
345
346
347
  	board_init_r(gd->new_gd, 0);
  
  	/* NOTREACHED - board_init_r() does not return */
8ec21bbe5   Allen Martin   sandbox: fix comp...
348
  	return 0;
1209e2727   Simon Glass   sandbox: Add faci...
349
350
351
352
353
  
  err:
  	printf("Error %d
  ", ret);
  	return 1;
bace3d00f   Simon Glass   sandbox: Add main...
354
  }