diff mbox

[U-Boot,v2,2/3] cmd: add a new command "config" to show .config contents

Message ID 1485742328-32398-3-git-send-email-yamada.masahiro@socionext.com
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Masahiro Yamada Jan. 30, 2017, 2:12 a.m. UTC
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>
---

Changes in v2: None

 Kconfig            |  2 ++
 Makefile           | 12 +++++++-----
 cmd/.gitignore     |  3 +++
 cmd/Kconfig        | 12 ++++++++++++
 cmd/Makefile       | 22 ++++++++++++++++++++++
 cmd/config.c       | 44 ++++++++++++++++++++++++++++++++++++++++++++
 scripts/.gitignore |  1 +
 scripts/Kconfig    |  2 ++
 scripts/Makefile   |  4 ++++
 9 files changed, 97 insertions(+), 5 deletions(-)
 create mode 100644 cmd/.gitignore
 create mode 100644 cmd/config.c
 create mode 100644 scripts/Kconfig

Comments

Simon Glass Feb. 6, 2017, 3:33 p.m. UTC | #1
Hi Masahiro,

On 29 January 2017 at 18:12, Masahiro Yamada
<yamada.masahiro@socionext.com> wrote:
> 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>
> ---
>
> Changes in v2: None
>
>  Kconfig            |  2 ++
>  Makefile           | 12 +++++++-----
>  cmd/.gitignore     |  3 +++
>  cmd/Kconfig        | 12 ++++++++++++
>  cmd/Makefile       | 22 ++++++++++++++++++++++
>  cmd/config.c       | 44 ++++++++++++++++++++++++++++++++++++++++++++
>  scripts/.gitignore |  1 +
>  scripts/Kconfig    |  2 ++
>  scripts/Makefile   |  4 ++++
>  9 files changed, 97 insertions(+), 5 deletions(-)
>  create mode 100644 cmd/.gitignore
>  create mode 100644 cmd/config.c
>  create mode 100644 scripts/Kconfig

Reviewed-by: Simon Glass <sjg@chromium.org>

But I wonder why we shouldn't use a mechanism like cmd_dt_S_dtb in
Makefile.lib to embed the file?

Regards,
Simon
Masahiro Yamada Feb. 6, 2017, 3:59 p.m. UTC | #2
Hi Simon,

2017-02-07 0:33 GMT+09:00 Simon Glass <sjg@chromium.org>:
> Hi Masahiro,
>
> On 29 January 2017 at 18:12, Masahiro Yamada
> <yamada.masahiro@socionext.com> wrote:
>> 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>
>> ---
>>
>> Changes in v2: None
>>
>>  Kconfig            |  2 ++
>>  Makefile           | 12 +++++++-----
>>  cmd/.gitignore     |  3 +++
>>  cmd/Kconfig        | 12 ++++++++++++
>>  cmd/Makefile       | 22 ++++++++++++++++++++++
>>  cmd/config.c       | 44 ++++++++++++++++++++++++++++++++++++++++++++
>>  scripts/.gitignore |  1 +
>>  scripts/Kconfig    |  2 ++
>>  scripts/Makefile   |  4 ++++
>>  9 files changed, 97 insertions(+), 5 deletions(-)
>>  create mode 100644 cmd/.gitignore
>>  create mode 100644 cmd/config.c
>>  create mode 100644 scripts/Kconfig
>
> Reviewed-by: Simon Glass <sjg@chromium.org>
>
> But I wonder why we shouldn't use a mechanism like cmd_dt_S_dtb in
> Makefile.lib to embed the file?

I thought of this when I saw the implementation
of kernel/configs.c of Linux.

My first guess was, they wanted to implement it
in an arch-independent way.

The cmd_dt_S_dtb mechanism also seems
(mostly) arch-independent, but I am not 100% sure.

For example, underscore must the added/stripped
for conversion between C and assembly for Blackfin architecture.

One more reason is, I think, kernel/configs.c was added
in older days than the Device Tree.
Tom Rini Feb. 9, 2017, 3:01 a.m. UTC | #3
On Mon, Jan 30, 2017 at 11:12:07AM +0900, Masahiro Yamada wrote:

> 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>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/Kconfig b/Kconfig
index 8f9ea97..0dd21df 100644
--- a/Kconfig
+++ b/Kconfig
@@ -325,3 +325,5 @@  source "fs/Kconfig"
 source "lib/Kconfig"
 
 source "test/Kconfig"
+
+source "scripts/Kconfig"
diff --git a/Makefile b/Makefile
index 262df7c..fb1ec20 100644
--- a/Makefile
+++ b/Makefile
@@ -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
@@ -1537,11 +1544,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)
 
diff --git a/cmd/.gitignore b/cmd/.gitignore
new file mode 100644
index 0000000..7800586
--- /dev/null
+++ b/cmd/.gitignore
@@ -0,0 +1,3 @@ 
+config_data.gz
+config_data_gz.h
+config_data_size.h
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 4a0d489..57e8e42 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -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
diff --git a/cmd/Makefile b/cmd/Makefile
index 566fed9..1a04e7e 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -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
@@ -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)
diff --git a/cmd/config.c b/cmd/config.c
new file mode 100644
index 0000000..0c7f4e0
--- /dev/null
+++ b/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",
+	""
+);
diff --git a/scripts/.gitignore b/scripts/.gitignore
index 82bc06e..17b903b 100644
--- a/scripts/.gitignore
+++ b/scripts/.gitignore
@@ -1,4 +1,5 @@ 
 #
 # Generated files
 #
+bin2c
 docproc
diff --git a/scripts/Kconfig b/scripts/Kconfig
new file mode 100644
index 0000000..2a2c18e
--- /dev/null
+++ b/scripts/Kconfig
@@ -0,0 +1,2 @@ 
+config BUILD_BIN2C
+	bool
diff --git a/scripts/Makefile b/scripts/Makefile
index 2f081f7..3e10c16 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -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