[PATCH] fdt_support.c: Allow late kernel cmdline modification

Niko Mauno niko.mauno at vaisala.com
Thu Mar 11 08:34:09 CET 2021


On 2/25/21 6:09 PM, Niko Mauno wrote:
> On 2/24/21 3:51 PM, Tom Rini wrote:
>> On Tue, Feb 23, 2021 at 08:33:36AM +0200, Niko Mauno wrote:
>>> On 2/22/21 10:21 PM, Tom Rini wrote:
>>>> On Mon, Feb 22, 2021 at 07:18:51PM +0000, Niko Mauno wrote:
>>>>
>>>>> By declaring board-specific board_fdt_chosen_bootargs() the kernel
>>>>> command line arguments can be adjusted before injecting to flat dt
>>>>> chosen node.
>>>>>
>>>>> Signed-off-by: Niko Mauno <niko.mauno at vaisala.com>
>>>>> ---
>>>>>    common/fdt_support.c  | 12 +++++++++++-
>>>>>    include/fdt_support.h | 10 ++++++++++
>>>>>    2 files changed, 21 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/common/fdt_support.c b/common/fdt_support.c
>>>>> index 08d540bfc8..4379507e30 100644
>>>>> --- a/common/fdt_support.c
>>>>> +++ b/common/fdt_support.c
>>>>> @@ -269,6 +269,15 @@ int fdt_initrd(void *fdt, ulong initrd_start, 
>>>>> ulong initrd_end)
>>>>>        return 0;
>>>>>    }
>>>>> +/**
>>>>> + * board_fdt_chosen_bootargs - boards may override this function 
>>>>> to use
>>>>> + *                             alternative kernel command line 
>>>>> arguments
>>>>> + */
>>>>> +__weak char *board_fdt_chosen_bootargs(void)
>>>>> +{
>>>>> +    return env_get("bootargs");
>>>>> +}
>>>>> +
>>>>>    int fdt_chosen(void *fdt)
>>>>>    {
>>>>>        int   nodeoffset;
>>>>> @@ -286,7 +295,8 @@ int fdt_chosen(void *fdt)
>>>>>        if (nodeoffset < 0)
>>>>>            return nodeoffset;
>>>>> -    str = env_get("bootargs");
>>>>> +    str = board_fdt_chosen_bootargs();
>>>>> +
>>>>>        if (str) {
>>>>>            err = fdt_setprop(fdt, nodeoffset, "bootargs", str,
>>>>>                      strlen(str) + 1);
>>>>
>>>> What's this look like in practice?  I'm very wary about changing "set
>>>> bootargs to what you pass to the kernel" logic that's been there for
>>>> forever and a constant of every platform.  Thanks!
>>>>
>>> Hi Tom,
>>>
>>>     Effectively this change as such should introduce no changes to 
>>> prevalent
>>> "bootargs" logic when an overriding board_fdt_chosen_bootargs() is not
>>> defined. Our motivation for proposing this change is that it provides us
>>> with a means to introduce an entry point where we can append rootfs 
>>> specific
>>> dm-verity kernel command line metrics (such as described in
>>> https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/verity.html) 
>>>
>>> by reading a property from within a kernel tier FIT image header, in 
>>> order
>>> to facilitate secure boot process all the way to root filesystem.
>>
>> Right.  But what does that logic look like, and why must it be done in
>> C?  People have used dm-verity with U-Boot for ages, for example.
>>
> 
> Our build time implementation injects rootfs specific dm-verity metrics 
> in FIT conf node property, effectively coupling the particular (kernel 
> tier) FIT image and particular rootfs image containing trailing verity 
> hash tree.
> 
> Below is a sample of such conf node - please note also that the two 
> '${rootdev}' placeholder strings in the injected property are replaced 
> with device node path to 'active' rootfs (in a dual bank scheme where 
> the 'active' rootfs bank is resolved runtime).
> 
>      configurations {
>          default = "conf-c";
>          conf-c {
>              description = "Linux kernel and FDT blob";
>              kernel = "kernel";
>              fdt = "fdt-c";
>              vaisala,dm-verity-args = "dm-mod.create="dm-verity, 
> ec077aa7-78e5-43b7-9605-0d7f72fc65b9, , ro,  0 136220 verity 1 
> ${rootdev} ${rootdev} 1024 4096 68110 17028 sha256 
> 2dcd25db0f5b94603843316e5a16ca7717585802bf9a3fbced1443d7f83ec5f6 
> fec6bf67513d044bc704c63e37508b223d75867842ac828ba0147c6080578698 1 
> restart_on_corruption" root=/dev/dm-0 ro";
>              signature {
>                  ...
>              };
>          };
> 
> In the boot flow the FIT needs to be signature verified and is processed 
> only after boot command has been issued. Resorting to u-boot scripting 
> means it would require parsing FIT twice and do all verifications twice. 
> Using C avoids this redundancy.
> 
> The command line approach is supported since Linux kernel version 5.1 
> onwards (CONFIG_DM_INIT), and it avoids us the need to bundle a 
> "trampoline" initramfs with Linux kernel for issuing veritysetup and 
> mount commands. The bundling approach struck as more time consuming and 
> also more cumbersome on Yocto to build for various different image types 
> in same build, and introduces additional booting overhead on target.
> 
> Related to existing dm-verity support in U-Boot, I observed there is 
> Android Verified Boot 2.0 code which seemed to resort to appending the 
> kernel command line, which lead us to propose this change which would 
> allow us to perform the picking of the property from the FIT image, 
> processing it and appending it to our default "bootargs" in a board 
> specific function.
> 
> -Niko

Since discussion seems discontinued, adding Mr. Simon Glass to 
recipients as custodian of common/fdt_support.c as reported by 
scripts/get_maintainer.pl


More information about the U-Boot mailing list