1 /* 2 * Copyright (c) 2011-2012 The Chromium OS Authors. 3 * See file CREDITS for list of people who contributed to this 4 * project. 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License as 8 * published by the Free Software Foundation; either version 2 of 9 * the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 19 * MA 02111-1307 USA 20 */ 21 22 #include <common.h> 23 #include <asm/getopt.h> 24 #include <asm/sections.h> 25 #include <asm/state.h> 26 27 #include <os.h> 28 29 int sandbox_early_getopt_check(void) 30 { 31 struct sandbox_state *state = state_get_current(); 32 struct sb_cmdline_option **sb_opt = __u_boot_sandbox_option_start; 33 size_t num_options = __u_boot_sandbox_option_count(); 34 size_t i; 35 int max_arg_len, max_noarg_len; 36 37 /* parse_err will be a string of the faulting option */ 38 if (!state->parse_err) 39 return 0; 40 41 if (strcmp(state->parse_err, "help")) { 42 printf("u-boot: error: failed while parsing option: %s\n" 43 "\ttry running with --help for more information.\n", 44 state->parse_err); 45 os_exit(1); 46 } 47 48 printf( 49 "u-boot, a command line test interface to U-Boot\n\n" 50 "Usage: u-boot [options]\n" 51 "Options:\n"); 52 53 max_arg_len = 0; 54 for (i = 0; i < num_options; ++i) 55 max_arg_len = max(strlen(sb_opt[i]->flag), max_arg_len); 56 max_noarg_len = max_arg_len + 7; 57 58 for (i = 0; i < num_options; ++i) { 59 struct sb_cmdline_option *opt = sb_opt[i]; 60 61 /* first output the short flag if it has one */ 62 if (opt->flag_short >= 0x100) 63 printf(" "); 64 else 65 printf(" -%c, ", opt->flag_short); 66 67 /* then the long flag */ 68 if (opt->has_arg) 69 printf("--%-*s", max_noarg_len, opt->flag); 70 else 71 printf("--%-*s <arg> ", max_arg_len, opt->flag); 72 73 /* finally the help text */ 74 printf(" %s\n", opt->help); 75 } 76 77 os_exit(0); 78 } 79 80 static int sb_cmdline_cb_help(struct sandbox_state *state, const char *arg) 81 { 82 /* just flag to sandbox_early_getopt_check to show usage */ 83 return 1; 84 } 85 SB_CMDLINE_OPT_SHORT(help, 'h', 0, "Display help"); 86 87 int sandbox_main_loop_init(void) 88 { 89 struct sandbox_state *state = state_get_current(); 90 91 /* Execute command if required */ 92 if (state->cmd) { 93 run_command(state->cmd, 0); 94 os_exit(state->exit_type); 95 } 96 97 return 0; 98 } 99 100 static int sb_cmdline_cb_command(struct sandbox_state *state, const char *arg) 101 { 102 state->cmd = arg; 103 return 0; 104 } 105 SB_CMDLINE_OPT_SHORT(command, 'c', 1, "Execute U-Boot command"); 106 107 int main(int argc, char *argv[]) 108 { 109 struct sandbox_state *state; 110 int err; 111 112 err = state_init(); 113 if (err) 114 return err; 115 116 state = state_get_current(); 117 if (os_parse_args(state, argc, argv)) 118 return 1; 119 120 /* 121 * Do pre- and post-relocation init, then start up U-Boot. This will 122 * never return. 123 */ 124 board_init_f(0); 125 126 /* NOTREACHED - board_init_f() does not return */ 127 return 0; 128 } 129