maxargs holds the maximum argument count for a command and is currently an int. The largest value any command actually needs is CONFIG_SYS_MAXARGS (256 on the boards that raise it), so a short is ample. Narrowing it frees two bytes in struct cmd_tbl which a later change uses for a flags byte, with no growth in the per-command entry size.
Two commands (the sound command and its play sub-command) pass INT_MAX as maxargs to mean 'accept any number of arguments'. That no longer fits in a short, so add a CMD_MAXARGS sentinel (SHRT_MAX) and use it in those two places. Signed-off-by: Simon Glass <[email protected]> --- Changes in v4: - Add new patch to narrow maxargs to a short, freeing space in struct cmd_tbl for the flags byte cmd/sound.c | 4 ++-- include/command.h | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cmd/sound.c b/cmd/sound.c index 7546059022f..68b878641fe 100644 --- a/cmd/sound.c +++ b/cmd/sound.c @@ -67,7 +67,7 @@ err: static struct cmd_tbl cmd_sound_sub[] = { U_BOOT_CMD_MKENT(init, 0, 1, do_init, "", ""), - U_BOOT_CMD_MKENT(play, INT_MAX, 1, do_play, "", ""), + U_BOOT_CMD_MKENT(play, CMD_MAXARGS, 1, do_play, "", ""), }; /* process sound command */ @@ -92,7 +92,7 @@ static int do_sound(struct cmd_tbl *cmdtp, int flag, int argc, } U_BOOT_CMD( - sound, INT_MAX, 1, do_sound, + sound, CMD_MAXARGS, 1, do_sound, "sound sub-system", "init - initialise the sound driver\n" "sound play [len [freq [len [freq ...]]]] - play sounds\n" diff --git a/include/command.h b/include/command.h index 5d225cd197f..2e9646c97fb 100644 --- a/include/command.h +++ b/include/command.h @@ -11,6 +11,7 @@ #define __COMMAND_H #include <linker_lists.h> +#include <limits.h> #include <linux/compiler_attributes.h> @@ -34,7 +35,7 @@ struct cmd_tbl { char *name; /* Command Name */ - int maxargs; /* maximum number of arguments */ + short maxargs; /* maximum number of arguments */ /* * Same as ->cmd() except the command * tells us if it can be repeated. @@ -59,6 +60,12 @@ struct cmd_tbl { #endif }; +/* + * Use this as a command's maxargs when it accepts any number of arguments. + * maxargs is a short, so this is the largest value it can hold. + */ +#define CMD_MAXARGS SHRT_MAX + /** * cmd_arg_get() - Get a particular argument * -- 2.43.0

