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 /* TODO: redo this when cmd tidy-up series lands */ 94 #ifdef CONFIG_SYS_HUSH_PARSER 95 run_command(state->cmd, 0); 96 #else 97 parse_string_outer(state->cmd, FLAG_PARSE_SEMICOLON | 98 FLAG_EXIT_FROM_LOOP); 99 #endif 100 os_exit(state->exit_type); 101 } 102 103 return 0; 104 } 105 106 static int sb_cmdline_cb_command(struct sandbox_state *state, const char *arg) 107 { 108 state->cmd = arg; 109 return 0; 110 } 111 SB_CMDLINE_OPT_SHORT(command, 'c', 1, "Execute U-Boot command"); 112 113 int main(int argc, char *argv[]) 114 { 115 struct sandbox_state *state; 116 int err; 117 118 err = state_init(); 119 if (err) 120 return err; 121 122 state = state_get_current(); 123 if (os_parse_args(state, argc, argv)) 124 return 1; 125 126 /* 127 * Do pre- and post-relocation init, then start up U-Boot. This will 128 * never return. 129 */ 130 board_init_f(0); 131 } 132