From nobody Tue Jun 23 01:46:45 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0974FC433EF for ; Sun, 13 Mar 2022 13:56:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234257AbiCMN5f (ORCPT ); Sun, 13 Mar 2022 09:57:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233419AbiCMN5b (ORCPT ); Sun, 13 Mar 2022 09:57:31 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AF8CC5F26F; Sun, 13 Mar 2022 06:56:23 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 3D9AD61132; Sun, 13 Mar 2022 13:56:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 507B4C340E8; Sun, 13 Mar 2022 13:56:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1647179782; bh=JzzzQoL0GbYCQzlYz/yEZ+EV3sEjDtQ9rE0YeOlbuRI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aajCR6iU5GNO0BM0edEqBmoxaDfYv9j8hg//7hghdxCFOTrr/+nfIG7S+TTCn5A9A 3mLslCc5tXYYRob+np3frOQyDX400ukq3hdLlqENWV6jFYO5jfSy6ykenQPSYJCEh7 5owyAiWqTvbbB/RbuWuHhyPqXF0bZ4qjCSEUQew5B+8a0m1VuEsN+UJtMAH5Z1c4sJ lBWgKihmUXlihiXcz0SxkTBEi7l1vzlpALruWEDCb7lrWC04xfLZvbpMZG1ph29+nd g9DqsbTC/33Q2p8rh+l1eLnUrf5kcGVX8AXyxSJNzeYxOTKsvvxiDQ+YfHjggJOLee ulcFCvXaOmFEw== From: Masami Hiramatsu To: Steven Rostedt Cc: Masami Hiramatsu , Padmanabha Srinivasaiah , LKML , Jonathan Corbet , linux-doc@vger.kernel.org Subject: [PATCH 1/3] bootconfig: Check the checksum before removing the bootconfig from initrd Date: Sun, 13 Mar 2022 22:56:18 +0900 Message-Id: <164717977849.656425.521984791585777500.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <164717976871.656425.6189991392886085524.stgit@devnote2> References: <164717976871.656425.6189991392886085524.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Check the bootconfig's checksum before removing the bootcinfig data from initrd to avoid modifying initrd by mistake. This will also simplifies the get_boot_config_from_initrd() interface. Signed-off-by: Masami Hiramatsu --- init/main.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/init/main.c b/init/main.c index 65fa2e41a9c0..421050be5039 100644 --- a/init/main.c +++ b/init/main.c @@ -265,7 +265,7 @@ static int __init loglevel(char *str) early_param("loglevel", loglevel); =20 #ifdef CONFIG_BLK_DEV_INITRD -static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum) +static void * __init get_boot_config_from_initrd(u32 *_size) { u32 size, csum; char *data; @@ -299,17 +299,20 @@ static void * __init get_boot_config_from_initrd(u32 = *_size, u32 *_csum) return NULL; } =20 + if (xbc_calc_checksum(data, size) !=3D csum) { + pr_err("bootconfig checksum failed\n"); + return NULL; + } + /* Remove bootconfig from initramfs/initrd */ initrd_end =3D (unsigned long)data; if (_size) *_size =3D size; - if (_csum) - *_csum =3D csum; =20 return data; } #else -static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum) +static void * __init get_boot_config_from_initrd(u32 *_size) { return NULL; } @@ -408,12 +411,12 @@ static void __init setup_boot_config(void) static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; const char *msg; int pos; - u32 size, csum; + u32 size; char *data, *err; int ret; =20 /* Cut out the bootconfig data even if we have no bootconfig option */ - data =3D get_boot_config_from_initrd(&size, &csum); + data =3D get_boot_config_from_initrd(&size); =20 strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); err =3D parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, @@ -437,11 +440,6 @@ static void __init setup_boot_config(void) return; } =20 - if (xbc_calc_checksum(data, size) !=3D csum) { - pr_err("bootconfig checksum failed\n"); - return; - } - ret =3D xbc_init(data, size, &msg, &pos); if (ret < 0) { if (pos < 0) @@ -470,7 +468,7 @@ static void __init exit_boot_config(void) static void __init setup_boot_config(void) { /* Remove bootconfig data from initrd */ - get_boot_config_from_initrd(NULL, NULL); + get_boot_config_from_initrd(NULL); } =20 static int __init warn_bootconfig(char *str) From nobody Tue Jun 23 01:46:45 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EBFB6C433EF for ; Sun, 13 Mar 2022 13:56:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234280AbiCMN5m (ORCPT ); Sun, 13 Mar 2022 09:57:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41344 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233626AbiCMN5k (ORCPT ); Sun, 13 Mar 2022 09:57:40 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 137DE5EDF9; Sun, 13 Mar 2022 06:56:33 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id A52666112F; Sun, 13 Mar 2022 13:56:32 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BDFDCC340E8; Sun, 13 Mar 2022 13:56:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1647179792; bh=yR9X6l6nshQ2ueNse50V7C3RqIErXIt//9LNe5HY0Ao=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ekO8RbncygmPoPV5FdnIw4n9HmS6/tsQpqA2z20h/7XQmX17u52Yvhg0VR/DI4NPD 5sCmcDbhJS0FUsVxYLB6ZIIP35Mh3WsI4NSpVsqrSdnTLTOrIl0/rggt/2trAQkysS 952CXtoQpIUl+xtHLnl+U82l1JjGHwDVi+Kllr5XrfBQITP9khFpT66AFKrSiCrj68 j4nlVuGiSVk+RIR9svuXJpPZ1SrJW8ICdIcwMl8EUumScpZ69j5+Ap7OMhiqFYqaad s4xQI/ICp+/YKJJ5XCdB2pzYD39LUaZ3N91gaD7lq2loSLFZ/ebgQr0IKPsT2POKrV f31HcfValDwPg== From: Masami Hiramatsu To: Steven Rostedt Cc: Masami Hiramatsu , Padmanabha Srinivasaiah , LKML , Jonathan Corbet , linux-doc@vger.kernel.org Subject: [PATCH 2/3] bootconfig: Support embedding a bootconfig file in kernel Date: Sun, 13 Mar 2022 22:56:28 +0900 Message-Id: <164717978802.656425.5404523823256215813.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <164717976871.656425.6189991392886085524.stgit@devnote2> References: <164717976871.656425.6189991392886085524.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This allows kernel developer to embed a default bootconfig file in the kernel instead of embedding it in the initrd. This will be good for who are using the kernel without initrd, or who needs a default bootconfigs. This needs 2 options: CONFIG_EMBED_BOOT_CONFIG=3Dy and set the file path to CONFIG_EMBED_BOOT_CONFIG_FILE. Note that you still need 'bootconfig' command line option to load the embedded bootconfig. And if you boot with the initrd which has another bootconfig, the kernel will use the bootconfig in the initrd, instead of embedding one. Signed-off-by: Masami Hiramatsu --- include/linux/bootconfig.h | 10 ++++++++++ init/Kconfig | 21 +++++++++++++++++++++ init/main.c | 13 ++++++++----- lib/.gitignore | 1 + lib/Makefile | 12 ++++++++++++ lib/bootconfig.c | 23 +++++++++++++++++++++++ 6 files changed, 75 insertions(+), 5 deletions(-) diff --git a/include/linux/bootconfig.h b/include/linux/bootconfig.h index a4665c7ab07c..5dbda5e3e9bb 100644 --- a/include/linux/bootconfig.h +++ b/include/linux/bootconfig.h @@ -289,4 +289,14 @@ int __init xbc_get_info(int *node_size, size_t *data_s= ize); /* XBC cleanup data structures */ void __init xbc_exit(void); =20 +/* XBC embedded bootconfig data in kernel */ +#ifdef CONFIG_EMBED_BOOT_CONFIG +char * __init xbc_get_embedded_bootconfig(size_t *size); +#else +static inline char *xbc_get_embedded_bootconfig(size_t *size) +{ + return NULL; +} +#endif + #endif diff --git a/init/Kconfig b/init/Kconfig index e9119bf54b1f..70440804874d 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1357,6 +1357,27 @@ config BOOT_CONFIG =20 If unsure, say Y. =20 +config EMBED_BOOT_CONFIG + bool "Embed bootconfig file in the kernel" + depends on BOOT_CONFIG + default n + help + Embed a bootconfig file given by EMBED_BOOT_CONFIG_FILE in the + kernel. Usually, the bootconfig file is loaded with the initrd + image. But if the system doesn't support initrd, this option will + help you by embedding a bootconfig file while building the kernel. + + If unsure, say N. + +config EMBED_BOOT_CONFIG_FILE + string "Embedded bootconfig file path" + default "" + depends on EMBED_BOOT_CONFIG + help + Specify a bootconfig file which will be embedded to the kernel. + This bootconfig will be used if there is no initrd or no other + bootconfig in the initrd. + choice prompt "Compiler optimization level" default CC_OPTIMIZE_FOR_PERFORMANCE diff --git a/init/main.c b/init/main.c index 421050be5039..3803bf2e22ea 100644 --- a/init/main.c +++ b/init/main.c @@ -265,7 +265,7 @@ static int __init loglevel(char *str) early_param("loglevel", loglevel); =20 #ifdef CONFIG_BLK_DEV_INITRD -static void * __init get_boot_config_from_initrd(u32 *_size) +static void * __init get_boot_config_from_initrd(size_t *_size) { u32 size, csum; char *data; @@ -411,12 +411,15 @@ static void __init setup_boot_config(void) static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; const char *msg; int pos; - u32 size; + size_t size; char *data, *err; int ret; =20 /* Cut out the bootconfig data even if we have no bootconfig option */ data =3D get_boot_config_from_initrd(&size); + /* If there is no bootconfig in initrd, try embedded one. */ + if (!data) + data =3D xbc_get_embedded_bootconfig(&size); =20 strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); err =3D parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, @@ -435,8 +438,8 @@ static void __init setup_boot_config(void) } =20 if (size >=3D XBC_DATA_MAX) { - pr_err("bootconfig size %d greater than max size %d\n", - size, XBC_DATA_MAX); + pr_err("bootconfig size %ld greater than max size %d\n", + (long)size, XBC_DATA_MAX); return; } =20 @@ -449,7 +452,7 @@ static void __init setup_boot_config(void) msg, pos); } else { xbc_get_info(&ret, NULL); - pr_info("Load bootconfig: %d bytes %d nodes\n", size, ret); + pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret); /* keys starting with "kernel." are passed via cmdline */ extra_command_line =3D xbc_make_cmdline("kernel"); /* Also, "init." keys are init arguments */ diff --git a/lib/.gitignore b/lib/.gitignore index e5e217b8307b..30a2a5db7033 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -6,3 +6,4 @@ /oid_registry_data.c /test_fortify.log /test_fortify/*.log +/default.bconf diff --git a/lib/Makefile b/lib/Makefile index 300f569c626b..8183785ee99d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -279,6 +279,18 @@ $(foreach file, $(libfdt_files), \ $(eval CFLAGS_$(file) =3D -I $(srctree)/scripts/dtc/libfdt)) lib-$(CONFIG_LIBFDT) +=3D $(libfdt_files) =20 +ifeq ($(CONFIG_EMBED_BOOT_CONFIG),y) +# Since the specified bootconfig file can be switched, we forcibly update = the +# default.bconf file always. +$(obj)/default.bconf: FORCE + $(call cmd,defbconf) + +quiet_cmd_defbconf =3D GEN $@ + cmd_defbconf =3D cat < /dev/null $(CONFIG_EMBED_BOOT_CONFIG_FILE) > = $@ +clean-files +=3D default.bconf +$(obj)/bootconfig.o: $(obj)/default.bconf +endif + lib-$(CONFIG_BOOT_CONFIG) +=3D bootconfig.o =20 obj-$(CONFIG_RBTREE_TEST) +=3D rbtree_test.o diff --git a/lib/bootconfig.c b/lib/bootconfig.c index 74f3201ab8e5..3a3bf3a208e3 100644 --- a/lib/bootconfig.c +++ b/lib/bootconfig.c @@ -12,6 +12,29 @@ #include #include #include + +#ifdef CONFIG_EMBED_BOOT_CONFIG +asm ( +" .pushsection .init.data, \"aw\" \n" +" .global embedded_bootconfig_data \n" +"embedded_bootconfig_data: \n" +" .incbin \"lib/default.bconf\" \n" +" .global embedded_bootconfig_data_end \n" +"embedded_bootconfig_data_end: \n" +" .popsection \n" +); + +extern __visible char embedded_bootconfig_data[]; +extern __visible char embedded_bootconfig_data_end[]; + +char * __init xbc_get_embedded_bootconfig(size_t *size) +{ + *size =3D embedded_bootconfig_data_end - embedded_bootconfig_data; + return (*size) ? embedded_bootconfig_data : NULL; +} + +#endif + #else /* !__KERNEL__ */ /* * NOTE: This is only for tools/bootconfig, because tools/bootconfig will From nobody Tue Jun 23 01:46:45 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 86173C433F5 for ; Sun, 13 Mar 2022 13:56:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234299AbiCMN5y (ORCPT ); Sun, 13 Mar 2022 09:57:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234071AbiCMN5v (ORCPT ); Sun, 13 Mar 2022 09:57:51 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3DC245F270; Sun, 13 Mar 2022 06:56:43 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id E4C3EB80CAA; Sun, 13 Mar 2022 13:56:41 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9019BC340E8; Sun, 13 Mar 2022 13:56:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1647179800; bh=73rd6F+wRPyuWn2PJNKyBIpSAN5NcV1wb/fm3qTL78Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=peVZnn05PjSL2hwSxpz5p92QIVWGRZOLkqotSVgZlb1A+/Bg9V/kLVPhWN7FNZpOU VrQy98bFfmAWUAT3VJ0UCKMMP9DY0i3i3LO9RNKjEqHYcd9wnZt7ct7ETfCH+mK8Vx bw1bng52fFQaK2KUkhpnQXFvIBYhATajRm+e9MXeHpIsHyRNmTvwSWeBVz0mGT/FBT BzOnJ1auXxo0NJrx/EnHNeePv4kESHbEXVYzS4fHCx80lcFimDC78cc1aYI4PVHbT5 ta+6xJn6udE5CUjezBjYG/5hlQbBXK0NKxreq6Ahj03R9rfPgYEvuhGc6e1NzkGJVd +pyAYagnI5CiQ== From: Masami Hiramatsu To: Steven Rostedt Cc: Masami Hiramatsu , Padmanabha Srinivasaiah , LKML , Jonathan Corbet , linux-doc@vger.kernel.org Subject: [PATCH 3/3] docs: bootconfig: Add how to embed the bootconfig into kernel Date: Sun, 13 Mar 2022 22:56:37 +0900 Message-Id: <164717979739.656425.17945326639021989871.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <164717976871.656425.6189991392886085524.stgit@devnote2> References: <164717976871.656425.6189991392886085524.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a description how to embed the bootconfig file into kernel. Signed-off-by: Masami Hiramatsu --- Documentation/admin-guide/bootconfig.rst | 31 ++++++++++++++++++++++++++= +--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/Documentation/admin-guide/bootconfig.rst b/Documentation/admin= -guide/bootconfig.rst index a1860fc0ca88..a172c669997a 100644 --- a/Documentation/admin-guide/bootconfig.rst +++ b/Documentation/admin-guide/bootconfig.rst @@ -158,9 +158,15 @@ Each key-value pair is shown in each line with followi= ng style:: Boot Kernel With a Boot Config =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D =20 -Since the boot configuration file is loaded with initrd, it will be added -to the end of the initrd (initramfs) image file with padding, size, -checksum and 12-byte magic word as below. +There are 2 options to boot the kernel with bootconfig, one is attaching +bootconfig to initrd image, and embedding the kernel itself. + +Attaching a Boot Config to Initrd +--------------------------------- + +Since the boot configuration file is loaded with initrd by default, +it will be added to the end of the initrd (initramfs) image file with +padding, size, checksum and 12-byte magic word as below. =20 [initrd][bootconfig][padding][size(le32)][checksum(le32)][#BOOTCONFIG\n] =20 @@ -196,6 +202,25 @@ To remove the config from the image, you can use -d op= tion as below:: Then add "bootconfig" on the normal kernel command line to tell the kernel to look for the bootconfig at the end of the initrd file. =20 +Embedding a Boot Config into Kernel +----------------------------------- + +If you can not use initrd, you can also embed the bootconfig file to the +kernel by Kconfig options. In This case, you need to recompile the kernel +with the following configs:: + + COFNIG_EMBED_BOOT_CONFIG=3Dy + CONFIG_EMBED_BOOT_CONFIG_FILE=3D"/PATH/TO/BOOTCONFIG/FILE" + +You need to set the correct path (relative path from kernel build directory +or absolute path) to the ``CONFIG_EMBED_BOOT_CONFIG_FILE`` option. +Then the kernel will embed the bootconfig file as a default bootconfig. + +As same as attaching to initrd, you need ``bootconfig`` option to the +kernel command line to enable the embedded bootconfig. + +Note that even if you set this option, you can override the embedded +bootconfig by another bootconfig which attached to the initrd. =20 Kernel parameters via Boot Config =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D