In cmd_bootm.c the function pointer is misused as a flags word. It is better to add a flag word to each command, so that bootm can avoid this hack.
To avoid increasing the size of the U-Boot binary, we can re-use the existing 'repeatable' flag, which only needs a single bit. Signed-off-by: Simon Glass <s...@chromium.org> --- common/cmd_bootm.c | 35 ++++++++++++++++++++++------------- common/cmd_nvedit.c | 10 +++++----- common/command.c | 3 ++- include/command.h | 41 +++++++++++++++++++++++++++++++---------- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 9751edc..14d504b 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -522,19 +522,28 @@ static int do_bootm_standalone(int flag, int argc, char * const argv[], /* we overload the cmd field with our state machine info instead of a * function pointer */ static cmd_tbl_t cmd_bootm_sub[] = { - U_BOOT_CMD_MKENT(start, 0, 1, (void *)BOOTM_STATE_START, "", ""), - U_BOOT_CMD_MKENT(loados, 0, 1, (void *)BOOTM_STATE_LOADOS, "", ""), + U_BOOT_CMD_MKENT_COMPLETE(start, 0, 1, cmd_dummy, "", "", NULL, + BOOTM_STATE_START), + U_BOOT_CMD_MKENT_COMPLETE(loados, 0, 1, cmd_dummy, "", "", NULL, + BOOTM_STATE_LOADOS), #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH - U_BOOT_CMD_MKENT(ramdisk, 0, 1, (void *)BOOTM_STATE_RAMDISK, "", ""), + U_BOOT_CMD_MKENT_COMPLETE(ramdisk, 0, 1, cmd_dummy, "", "", NULL, + BOOTM_STATE_RAMDISK), #endif #ifdef CONFIG_OF_LIBFDT - U_BOOT_CMD_MKENT(fdt, 0, 1, (void *)BOOTM_STATE_FDT, "", ""), -#endif - U_BOOT_CMD_MKENT(cmdline, 0, 1, (void *)BOOTM_STATE_OS_CMDLINE, "", ""), - U_BOOT_CMD_MKENT(bdt, 0, 1, (void *)BOOTM_STATE_OS_BD_T, "", ""), - U_BOOT_CMD_MKENT(prep, 0, 1, (void *)BOOTM_STATE_OS_PREP, "", ""), - U_BOOT_CMD_MKENT(fake, 0, 1, (void *)BOOTM_STATE_OS_FAKE_GO, "", ""), - U_BOOT_CMD_MKENT(go, 0, 1, (void *)BOOTM_STATE_OS_GO, "", ""), + U_BOOT_CMD_MKENT_COMPLETE(fdt, 0, 1, cmd_dummy, "", "", NULL, + BOOTM_STATE_FDT), +#endif + U_BOOT_CMD_MKENT_COMPLETE(cmdline, 0, 1, cmd_dummy, "", "", NULL, + BOOTM_STATE_OS_CMDLINE), + U_BOOT_CMD_MKENT_COMPLETE(bdt, 0, 1, cmd_dummy, "", "", NULL, + BOOTM_STATE_OS_BD_T), + U_BOOT_CMD_MKENT_COMPLETE(prep, 0, 1, cmd_dummy, "", "", NULL, + BOOTM_STATE_OS_PREP), + U_BOOT_CMD_MKENT_COMPLETE(fake, 0, 1, cmd_dummy, "", "", NULL, + BOOTM_STATE_OS_FAKE_GO), + U_BOOT_CMD_MKENT_COMPLETE(go, 0, 1, cmd_dummy, "", "", NULL, + BOOTM_STATE_OS_GO), }; static int boot_selected_os(int argc, char * const argv[], int state, @@ -752,9 +761,7 @@ static int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc, argc--; argv++; if (c) { - state = (long)c->cmd; - if (state == BOOTM_STATE_START) - state |= BOOTM_STATE_FINDOS | BOOTM_STATE_FINDOTHER; + state = cmd_get_info(c); } else { /* Unrecognized command */ return CMD_RET_USAGE; @@ -765,6 +772,8 @@ static int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc, return CMD_RET_USAGE; } + if (state == BOOTM_STATE_START) + state |= BOOTM_STATE_FINDOS | BOOTM_STATE_FINDOTHER; ret = do_bootm_states(cmdtp, flag, argc, argv, state, &images, 0); return ret; diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index c53601c..a09263c 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -1201,7 +1201,7 @@ U_BOOT_CMD_COMPLETE( "edit environment variable", "name\n" " - edit environment variable 'name'", - var_complete + var_complete, 0 ); #endif @@ -1211,7 +1211,7 @@ U_BOOT_CMD_COMPLETE( "[-a]\n - print [all] values of all environment variables\n" "printenv name ...\n" " - print value of environment variable 'name'", - var_complete + var_complete, 0 ); #ifdef CONFIG_CMD_GREPENV @@ -1229,7 +1229,7 @@ U_BOOT_CMD_COMPLETE( #endif " \"-n\": search variable names; \"-v\": search values;\n" " \"-b\": search both names and values (default)", - var_complete + var_complete, 0 ); #endif @@ -1240,7 +1240,7 @@ U_BOOT_CMD_COMPLETE( " - [forcibly] set environment variable 'name' to 'value ...'\n" "setenv [-f] name\n" " - [forcibly] delete environment variable 'name'", - var_complete + var_complete, 0 ); #if defined(CONFIG_CMD_ASKENV) @@ -1259,7 +1259,7 @@ U_BOOT_CMD_COMPLETE( "run commands in an environment variable", "var [...]\n" " - run the commands in the environment variable(s) 'var'", - var_complete + var_complete, 0 ); #endif #endif /* CONFIG_SPL_BUILD */ diff --git a/common/command.c b/common/command.c index 746b7e3..35c9d71 100644 --- a/common/command.c +++ b/common/command.c @@ -536,7 +536,8 @@ enum command_ret_t cmd_process(int flag, int argc, char * const argv[], rc = cmd_call(cmdtp, flag, argc, argv); if (ticks) *ticks = get_timer(*ticks); - *repeatable &= cmdtp->repeatable; + if (!(cmdtp->info & CMD_INFO_REPEATABLE)) + *repeatable = 0; } if (rc == CMD_RET_USAGE) rc = cmd_usage(cmdtp); diff --git a/include/command.h b/include/command.h index d3f700f..53ec853 100644 --- a/include/command.h +++ b/include/command.h @@ -24,6 +24,12 @@ #endif #ifndef __ASSEMBLY__ +enum { + CMD_INFO_MASK = 0xffffff, /* user data */ + CMD_INFO_REPEATABLE_SHIFT = 24, /* commaand is repeatable */ + CMD_INFO_REPEATABLE = 1U << CMD_INFO_REPEATABLE_SHIFT, +}; + /* * Monitor Command Table */ @@ -31,7 +37,7 @@ struct cmd_tbl_s { char *name; /* Command Name */ int maxargs; /* maximum number of arguments */ - int repeatable; /* autorepeat allowed? */ + int info; /* CMD_INFO_... flags */ /* Implementation function */ int (*cmd)(struct cmd_tbl_s *, int, int, char * const []); char *usage; /* Usage message (short) */ @@ -46,6 +52,12 @@ struct cmd_tbl_s { typedef struct cmd_tbl_s cmd_tbl_t; +/* Returns the info word for a command */ +static inline int cmd_get_info(struct cmd_tbl_s *cmd) +{ + return cmd->info & CMD_INFO_MASK; +} + #if defined(CONFIG_CMD_RUN) extern int do_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); @@ -141,8 +153,6 @@ enum command_ret_t { int cmd_process(int flag, int argc, char * const argv[], int *repeatable, unsigned long *ticks); -#endif /* __ASSEMBLY__ */ - /* * Command Flags: */ @@ -161,24 +171,35 @@ int cmd_process(int flag, int argc, char * const argv[], #endif #define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \ - _usage, _help, _comp) \ - { #_name, _maxargs, _rep, _cmd, _usage, \ - _CMD_HELP(_help) _CMD_COMPLETE(_comp) } + _usage, _help, _comp, _info) \ + { #_name, _maxargs, (_rep) << CMD_INFO_REPEATABLE_SHIFT | (_info), \ + _cmd, _usage, _CMD_HELP(_help) _CMD_COMPLETE(_comp) } #define U_BOOT_CMD_MKENT(_name, _maxargs, _rep, _cmd, _usage, _help) \ U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \ - _usage, _help, NULL) + _usage, _help, NULL, 0) -#define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, _comp) \ +#define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, \ + _comp, _info) \ ll_entry_declare(cmd_tbl_t, _name, cmd) = \ U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \ - _usage, _help, _comp); + _usage, _help, _comp, _info); #define U_BOOT_CMD(_name, _maxargs, _rep, _cmd, _usage, _help) \ - U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, NULL) + U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, \ + NULL, 0) #if defined(CONFIG_NEEDS_MANUAL_RELOC) void fixup_cmdtable(cmd_tbl_t *cmdtp, int size); #endif +/* Dummy command for use in U_BOOT_CMD_MKENT() when none is needed */ +static inline int cmd_dummy(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + return 0; +} + +#endif /* __ASSEMBLY__ */ + #endif /* __COMMAND_H */ -- 1.9.1.423.g4596e3a _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot