@@ -1035,6 +1035,14 @@ The following options need to be configured:
XXX - this list needs to get updated!
+- Removal of commands
+ If no commands are needed to boot, you can undefine
+ CONFIG_CMDLINE in your board config file to remove them.
+ In this case, the command line will not be available, and
+ when U-Boot wants to execute the boot command (on start-up)
+ it will call board_run_command() instead. This can reduce
+ image size significantly for very simple boot procedures.
+
- Regular expression support:
CONFIG_REGEX
If this variable is defined, U-Boot is linked against
@@ -12,6 +12,10 @@ ENTRY(_start)
SECTIONS
{
+#ifndef CONFIG_CMDLINE
+ /DISCARD/ : { *(.u_boot_list_2_cmd_*) }
+#endif
+
. = CONFIG_SYS_TEXT_BASE; /* Location of bootcode in flash */
__text_start = .;
.text : { *(.text*); }
@@ -44,7 +44,8 @@ U_BOOT_CMD(
" CBFS is in. It defaults to 0xFFFFFFFF\n"
);
-int do_cbfs_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+static int do_cbfs_fsload(cmd_tbl_t *cmdtp, int flag, int argc,
+ char *const argv[])
{
const struct cbfs_cachenode *file;
unsigned long offset;
@@ -10,9 +10,13 @@
static int do_help(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
+#ifdef CONFIG_CMDLINE
cmd_tbl_t *start = ll_entry_start(cmd_tbl_t, cmd);
const int len = ll_entry_count(cmd_tbl_t, cmd);
return _do_help(start, len, cmdtp, flag, argc, argv);
+#else
+ return 0;
+#endif
}
U_BOOT_CMD(
@@ -87,6 +87,7 @@ int _do_help (cmd_tbl_t *cmd_start, int cmd_items, cmd_tbl_t * cmdtp, int
*/
cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len)
{
+#ifdef CONFIG_CMDLINE
cmd_tbl_t *cmdtp;
cmd_tbl_t *cmdtp_temp = table; /*Init value */
const char *p;
@@ -115,6 +116,7 @@ cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len)
if (n_found == 1) { /* exactly one match */
return cmdtp_temp;
}
+#endif /* CONFIG_CMDLINE */
return NULL; /* not found or ambiguous command */
}
@@ -270,7 +270,9 @@ static int abortboot(int bootdelay)
#if defined(CONFIG_BOOTDELAY) && defined(CONFIG_OF_CONTROL)
static void secure_boot_cmd(char *cmd)
{
+#ifdef CONFIG_CMDLINE
cmd_tbl_t *cmdtp;
+#endif
int rc;
if (!cmd) {
@@ -282,6 +284,7 @@ static void secure_boot_cmd(char *cmd)
disable_ctrlc(1);
/* Find the command directly. */
+#ifdef CONFIG_CMDLINE
cmdtp = find_cmd(cmd);
if (!cmdtp) {
printf("## Error: \"%s\" not defined\n", cmd);
@@ -290,6 +293,9 @@ static void secure_boot_cmd(char *cmd)
/* Run the command, forcing no flags and faking argc and argv. */
rc = (cmdtp->cmd)(cmdtp, 0, 1, &cmd);
+#else
+ rc = board_run_command(cmd);
+#endif
/* Shouldn't ever return from boot command. */
printf("## Error: \"%s\" returned (code %d)\n", cmd, rc);
@@ -184,6 +184,7 @@ int cmd_process(int flag, int argc, char * const argv[],
*
* We need to ensure that a command is placed between each entry
*/
+#ifdef CONFIG_CMDLINE
#define U_BOOT_SUBCMD_START(name) static cmd_tbl_t name[] = {
#define U_BOOT_SUBCMD_END };
#define U_BOOT_CMD_MKENT_LINE(_name, _maxargs, _rep, _cmd, _usage, \
@@ -203,6 +204,26 @@ int cmd_process(int flag, int argc, char * const argv[],
ll_entry_declare(cmd_tbl_t, _name, cmd) = \
U_BOOT_CMD_MKENT_LINE(_name, _maxargs, _rep, _cmd, \
_usage, _help, _comp, _info);
+#else
+#define U_BOOT_SUBCMD_START(name) static cmd_tbl_t name[] = {};
+#define U_BOOT_SUBCMD_END
+
+#define _CMD_REMOVE(_name, _cmd) \
+ int __remove_ ## _name(void) \
+ { \
+ if (0) \
+ _cmd(NULL, 0, 0, NULL); \
+ return 0; \
+ }
+#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, \
+ _help, _comp, _info) \
+ _CMD_REMOVE(_name ## _cmd, _cmd)
+
+#define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, \
+ _comp, _info) \
+ _CMD_REMOVE(sub_ ## _name, _cmd)
+
+#endif /* CONFIG_CMDLINE */
#define U_BOOT_CMD_MKENT(_name, _maxargs, _rep, _cmd, _usage, _help) \
U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
@@ -223,6 +244,15 @@ static inline int cmd_dummy(cmd_tbl_t *cmdtp, int flag, int argc,
return 0;
}
+/*
+ * When there is no U-Boot command line, the board must provide a way of
+ * executing commands.
+ *
+ * @cmd: Command string to execute
+ * @return Result of command, CMD_RET_...
+ */
+int board_run_command(const char *cmd);
+
#endif /* __ASSEMBLY__ */
#endif /* __COMMAND_H */
@@ -20,4 +20,6 @@
#define CONFIG_ZLIB 1
#define CONFIG_PARTITIONS 1
+#define CONFIG_CMDLINE
+
#endif
@@ -63,4 +63,11 @@
#define CONFIG_SYS_HZ 1000
#endif
+#ifndef CONFIG_CMDLINE
+#undef CONFIG_CMDLINE_EDITING
+#undef CONFIG_SYS_LONGHELP
+#undef CONFIG_CMD_RUN
+#undef CONFIG_SYS_HUSH_PARSER
+#endif
+
#endif /* __CONFIG_FALLBACKS_H */
A large chunk of the U-Boot code is the command line. For some applications this is not needed, since the boot can be controlled by a board-specific hard-coded boot procedure. This saves a significant amount of space. This makes U-Boot proper look a little more like SPL in terms of size. Signed-off-by: Simon Glass <sjg@chromium.org> --- README | 8 ++++++++ arch/x86/cpu/u-boot.lds | 4 ++++ common/cmd_cbfs.c | 3 ++- common/cmd_help.c | 4 ++++ common/command.c | 2 ++ common/main.c | 6 ++++++ include/command.h | 30 ++++++++++++++++++++++++++++++ include/config_defaults.h | 2 ++ include/config_fallbacks.h | 7 +++++++ 9 files changed, 65 insertions(+), 1 deletion(-)