Skip to content

Commit

Permalink
cmd: add a new command "config" to show .config contents
Browse files Browse the repository at this point in the history
This feature is inspired by /proc/config.gz of Linux.  In Linux,
if CONFIG_IKCONFIG is enabled, the ".config" file contents are
embedded in the kernel image.  If CONFIG_IKCONFIG_PROC is also
enabled, the ".config" contents are exposed to /proc/config.gz.
Users can do "zcat /proc/config.gz" to check which config options
are enabled on the running kernel image.

The idea is almost the same here; if CONFIG_CMD_CONFIG is enabled,
the ".config" contents are compressed and saved in the U-Boot image,
then printed by the new command "config".

The usage is quite simple.  Enable CONFIG_CMD_CONFIG, then run
 > config
from the command line interface.  The ".config" contents will be
printed on the console.

This feature increases the U-Boot image size by about 4KB (this is
mostly due to the gzip-compressed .config file).  By default, it is
enabled only for Sandbox because we do not care about the memory
footprint on it.  Of course, this feature is architecture agnostic,
so you can enable it on any board if the image size increase is
acceptable for you.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
  • Loading branch information
masahir0y authored and trini committed Feb 8, 2017
1 parent 6fb631e commit 61304db
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 5 deletions.
2 changes: 2 additions & 0 deletions Kconfig
Expand Up @@ -325,3 +325,5 @@ source "fs/Kconfig"
source "lib/Kconfig"

source "test/Kconfig"

source "scripts/Kconfig"
12 changes: 7 additions & 5 deletions Makefile
Expand Up @@ -482,6 +482,13 @@ else
# Build targets only - this includes vmlinux, arch specific targets, clean
# targets and others. In general all targets except *config targets.

# Additional helpers built in scripts/
# Carefully list dependencies so we do not try to build scripts twice
# in parallel
PHONY += scripts
scripts: scripts_basic include/config/auto.conf
$(Q)$(MAKE) $(build)=$(@)

ifeq ($(dot-config),1)
# Read in config
-include include/config/auto.conf
Expand Down Expand Up @@ -1539,11 +1546,6 @@ tests:
$(Q)$(MAKE) $(build)=scripts build_docproc
$(Q)$(MAKE) $(build)=doc/DocBook $@

# Dummies...
PHONY += prepare scripts
prepare: ;
scripts: ;

endif #ifeq ($(config-targets),1)
endif #ifeq ($(mixed-targets),1)

Expand Down
3 changes: 3 additions & 0 deletions cmd/.gitignore
@@ -0,0 +1,3 @@
config_data.gz
config_data_gz.h
config_data_size.h
12 changes: 12 additions & 0 deletions cmd/Kconfig
Expand Up @@ -126,6 +126,18 @@ config CMD_BDI
help
Print board info

config CMD_CONFIG
bool "config"
select BUILD_BIN2C
default SANDBOX
help
Print ".config" contents.

If this option is enabled, the ".config" file contents are embedded
in the U-Boot image and can be printed on the console by the "config"
command. This provides information of which options are enabled on
the running U-Boot.

config CMD_CONSOLE
bool "coninfo"
default y
Expand Down
22 changes: 22 additions & 0 deletions cmd/Makefile
Expand Up @@ -31,6 +31,7 @@ obj-$(CONFIG_CMD_BOOTI) += booti.o
obj-$(CONFIG_CMD_CACHE) += cache.o
obj-$(CONFIG_CMD_CBFS) += cbfs.o
obj-$(CONFIG_CMD_CLK) += clk.o
obj-$(CONFIG_CMD_CONFIG) += config.o
obj-$(CONFIG_CMD_CONSOLE) += console.o
obj-$(CONFIG_CMD_CPLBINFO) += cplbinfo.o
obj-$(CONFIG_CMD_CPU) += cpu.o
Expand Down Expand Up @@ -165,3 +166,24 @@ obj-$(CONFIG_CMD_BLOB) += blob.o
obj-y += nvedit.o

obj-$(CONFIG_ARCH_MVEBU) += mvebu/

filechk_data_gz = (echo "static const char data_gz[] ="; cat $< | scripts/bin2c; echo ";")

filechk_data_size = \
(echo "static const size_t data_size = "; \
cat $< | wc -c; echo ";")

# "config" command
$(obj)/config.o: $(obj)/config_data_gz.h $(obj)/config_data_size.h

targets += config_data.gz
$(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE
$(call if_changed,gzip)

targets += config_data_gz.h
$(obj)/config_data_gz.h: $(obj)/config_data.gz FORCE
$(call filechk,data_gz)

targets += config_data_size.h
$(obj)/config_data_size.h: $(KCONFIG_CONFIG) FORCE
$(call filechk,data_size)
44 changes: 44 additions & 0 deletions cmd/config.c
@@ -0,0 +1,44 @@
/*
* Copyright (C) 2017 Masahiro Yamada <yamada.masahiro@socionext.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/

#include <common.h>
#include <command.h>
#include <malloc.h>

#include "config_data_gz.h"
#include "config_data_size.h"

static int do_config(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
char *dst;
unsigned long len = data_size;
int ret = CMD_RET_SUCCESS;

dst = malloc(data_size + 1);
if (!dst)
return CMD_RET_FAILURE;

ret = gunzip(dst, data_size, (unsigned char *)data_gz, &len);
if (ret) {
printf("failed to uncompress .config data\n");
ret = CMD_RET_FAILURE;
goto free;
}

dst[data_size] = 0;
puts(dst);

free:
free(dst);

return ret;
}

U_BOOT_CMD(
config, 1, 1, do_config,
"print .config",
""
);
1 change: 1 addition & 0 deletions scripts/.gitignore
@@ -1,4 +1,5 @@
#
# Generated files
#
bin2c
docproc
2 changes: 2 additions & 0 deletions scripts/Kconfig
@@ -0,0 +1,2 @@
config BUILD_BIN2C
bool
4 changes: 4 additions & 0 deletions scripts/Makefile
Expand Up @@ -7,6 +7,10 @@
# SPDX-License-Identifier: GPL-2.0
#

hostprogs-$(CONFIG_BUILD_BIN2C) += bin2c

always := $(hostprogs-y)

# The following hostprogs-y programs are only build on demand
hostprogs-y += docproc

Expand Down

0 comments on commit 61304db

Please sign in to comment.