xref: /openbmc/u-boot/arch/sandbox/cpu/start.c (revision cb3761ea)
1 /*
2  * Copyright (c) 2011-2012 The Chromium OS Authors.
3  * SPDX-License-Identifier:	GPL-2.0+
4  */
5 
6 #include <common.h>
7 #include <asm/getopt.h>
8 #include <asm/sections.h>
9 #include <asm/state.h>
10 
11 #include <os.h>
12 
13 int sandbox_early_getopt_check(void)
14 {
15 	struct sandbox_state *state = state_get_current();
16 	struct sb_cmdline_option **sb_opt = __u_boot_sandbox_option_start;
17 	size_t num_options = __u_boot_sandbox_option_count();
18 	size_t i;
19 	int max_arg_len, max_noarg_len;
20 
21 	/* parse_err will be a string of the faulting option */
22 	if (!state->parse_err)
23 		return 0;
24 
25 	if (strcmp(state->parse_err, "help")) {
26 		printf("u-boot: error: failed while parsing option: %s\n"
27 			"\ttry running with --help for more information.\n",
28 			state->parse_err);
29 		os_exit(1);
30 	}
31 
32 	printf(
33 		"u-boot, a command line test interface to U-Boot\n\n"
34 		"Usage: u-boot [options]\n"
35 		"Options:\n");
36 
37 	max_arg_len = 0;
38 	for (i = 0; i < num_options; ++i)
39 		max_arg_len = max(strlen(sb_opt[i]->flag), max_arg_len);
40 	max_noarg_len = max_arg_len + 7;
41 
42 	for (i = 0; i < num_options; ++i) {
43 		struct sb_cmdline_option *opt = sb_opt[i];
44 
45 		/* first output the short flag if it has one */
46 		if (opt->flag_short >= 0x100)
47 			printf("      ");
48 		else
49 			printf("  -%c, ", opt->flag_short);
50 
51 		/* then the long flag */
52 		if (opt->has_arg)
53 			printf("--%-*s", max_noarg_len, opt->flag);
54 		else
55 			printf("--%-*s <arg> ", max_arg_len, opt->flag);
56 
57 		/* finally the help text */
58 		printf("  %s\n", opt->help);
59 	}
60 
61 	os_exit(0);
62 }
63 
64 static int sb_cmdline_cb_help(struct sandbox_state *state, const char *arg)
65 {
66 	/* just flag to sandbox_early_getopt_check to show usage */
67 	return 1;
68 }
69 SB_CMDLINE_OPT_SHORT(help, 'h', 0, "Display help");
70 
71 int sandbox_main_loop_init(void)
72 {
73 	struct sandbox_state *state = state_get_current();
74 
75 	/* Execute command if required */
76 	if (state->cmd) {
77 		run_command_list(state->cmd, -1, 0);
78 		os_exit(state->exit_type);
79 	}
80 
81 	return 0;
82 }
83 
84 static int sb_cmdline_cb_command(struct sandbox_state *state, const char *arg)
85 {
86 	state->cmd = arg;
87 	return 0;
88 }
89 SB_CMDLINE_OPT_SHORT(command, 'c', 1, "Execute U-Boot command");
90 
91 static int sb_cmdline_cb_fdt(struct sandbox_state *state, const char *arg)
92 {
93 	state->fdt_fname = arg;
94 	return 0;
95 }
96 SB_CMDLINE_OPT_SHORT(fdt, 'd', 1, "Specify U-Boot's control FDT");
97 
98 int main(int argc, char *argv[])
99 {
100 	struct sandbox_state *state;
101 	int err;
102 
103 	err = state_init();
104 	if (err)
105 		return err;
106 
107 	state = state_get_current();
108 	if (os_parse_args(state, argc, argv))
109 		return 1;
110 
111 	/*
112 	 * Do pre- and post-relocation init, then start up U-Boot. This will
113 	 * never return.
114 	 */
115 	board_init_f(0);
116 
117 	/* NOTREACHED - board_init_f() does not return */
118 	return 0;
119 }
120