[PATCH v7 1/4] Add fdt_kaslrseed function to add kaslr-seed to chosen node
Tim Harvey
tharvey at gateworks.com
Mon Jun 24 17:47:47 CEST 2024
On Thu, Jun 20, 2024 at 6:58 AM Caleb Connolly
<caleb.connolly at linaro.org> wrote:
>
> Hi Tim,
>
> On 18/06/2024 23:06, Tim Harvey wrote:
> > If RANDOMIZE_BASE is enabled in the Linux kernel instructing it to
> > randomize the virtual address at which the kernel image is loaded, it
> > expects entropy to be provided by the bootloader by populating
> > /chosen/kaslr-seed with a 64-bit value from source of entropy at boot.
> >
> > Add a fdt_kaslrseed function to accommodate this allowing an existing
> > node to be overwritten if present. For now use the first rng device
> > but it would be good to enhance this in the future to allow some sort
> > of selection or policy in choosing the rng device used.
> >
> > Signed-off-by: Tim Harvey <tharvey at gateworks.com>
> > Reviewed-by: Simon Glass <sjg at chromium.org>
> > Cc: Michal Simek <michal.simek at amd.com>
> > Cc: Andy Yan <andy.yan at rock-chips.com>
> > Cc: Akash Gajjar <gajjar04akash at gmail.com>
> > Cc: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> > Cc: Simon Glass <sjg at chromium.org>
> > Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
> > Cc: Patrice Chotard <patrice.chotard at foss.st.com>
> > Cc: Devarsh Thakkar <devarsht at ti.com>
> > Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
> > Cc: Hugo Villeneuve <hvilleneuve at dimonoff.com>
> > Cc: Marek Vasut <marex at denx.de>
> > Cc: Tom Rini <trini at konsulko.com>
> > Cc: Chris Morgan <macromorgan at hotmail.com>
> > ---
> > v6:
> > - collected tags
> > v5:
> > - move function to boot/fdt_support.c
> > - remove ability to select rng index and note in the commit log
> > something like this as a future enhancement.
> > - fixed typo in commit message s/it's/its/
> > - use cmd_process_error per Michal's suggestion
> > v4:
> > - add missing /n to notice in kaslrseed cmd
> > - combine ints in declaration
> > - remove unused vars from board/xilinx/common/board.c ft_board_setup
> > v3:
> > - skip if CONFIG_MEASURED_BOOT
> > - fix skip for CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT
> > - pass in rng index and bool to specify overwrite
> > - remove duplicate error strings printed outside of fdt_kaslrseed
> > - added note to commit log about how EFI STUB weeds out kalsr-seed
> > v2:
> > - fix typo in commit msg
> > - use stack for seed to avoid unecessary malloc/free
> > - move to a library function and deduplicate code by using it
> > elsewhere
> > ---
> > boot/fdt_support.c | 44 +++++++++++++++++++++++++++++++++++++++++++
> > include/fdt_support.h | 10 ++++++++++
> > 2 files changed, 54 insertions(+)
> >
> > diff --git a/boot/fdt_support.c b/boot/fdt_support.c
> > index 2bd80a9dfb18..b1b2679dea0c 100644
> > --- a/boot/fdt_support.c
> > +++ b/boot/fdt_support.c
> > @@ -7,12 +7,15 @@
> > */
> >
> > #include <common.h>
> > +#include <dm.h>
> > #include <abuf.h>
> > #include <env.h>
> > #include <log.h>
> > #include <mapmem.h>
> > #include <net.h>
> > +#include <rng.h>
> > #include <stdio_dev.h>
> > +#include <dm/device_compat.h>
> > #include <dm/ofnode.h>
> > #include <linux/ctype.h>
> > #include <linux/types.h>
> > @@ -274,6 +277,47 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end)
> > return 0;
> > }
> >
> > +int fdt_kaslrseed(void *fdt, bool overwrite)
> > +{
> > + int len, err, nodeoffset;
> > + struct udevice *dev;
> > + const u64 *orig;
> > + u64 data = 0;
> > +
> > + err = fdt_check_header(fdt);
> > + if (err < 0)
> > + return err;
>
> All the paths that call fdt_kaslrseed() call fdt_check_header()
> beforehand, I think it's safe to drop this.
Hi Caleb,
The do_kaslr_seed path does not check for this and instead passes
working_fdt - perhaps your point is still valid if working_fdt is
guaranteed to always be a valid fdt?
> > +
> > + /* find or create "/chosen" node. */
> > + nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen");
> > + if (nodeoffset < 0)
> > + return nodeoffset;
>
> Arguably, this shouldn't be the responsibility of this function, maybe
> it would be better to error our here?
I'm not sure what your point is here... it is erroring out.
Best Regards,
Tim
> > +
> > + /* return without error if we are not overwriting and existing non-zero node */
> > + orig = fdt_getprop(fdt, nodeoffset, "kaslr-seed", &len);
> > + if (orig && len == sizeof(*orig))
> > + data = fdt64_to_cpu(*orig);
> > + if (data && !overwrite) {
> > + debug("not overwriting existing kaslr-seed\n");
> > + return 0;
> > + }
> > + err = uclass_get_device(UCLASS_RNG, 0, &dev);
> > + if (err) {
> > + printf("No RNG device\n");
> > + return err;
> > + }
> > + err = dm_rng_read(dev, &data, sizeof(data));
> > + if (err) {
> > + dev_err(dev, "dm_rng_read failed: %d\n", err);
> > + return err;
> > + }
> > + err = fdt_setprop(fdt, nodeoffset, "kaslr-seed", &data, sizeof(data));
> > + if (err < 0)
> > + printf("WARNING: could not set kaslr-seed %s.\n", fdt_strerror(err));
> > +
> > + return err;
> > +}
> > +
> > /**
> > * board_fdt_chosen_bootargs - boards may override this function to use
> > * alternative kernel command line arguments
> > diff --git a/include/fdt_support.h b/include/fdt_support.h
> > index 4b71b8948d99..741e2360c224 100644
> > --- a/include/fdt_support.h
> > +++ b/include/fdt_support.h
> > @@ -463,4 +463,14 @@ void fdt_fixup_board_enet(void *blob);
> > #ifdef CONFIG_CMD_PSTORE
> > void fdt_fixup_pstore(void *blob);
> > #endif
> > +
> > +/**
> > + * fdt_kaslrseed() - create a 'kaslr-seed' node in chosen
> > + *
> > + * @blob: fdt blob
> > + * @overwrite: do not overwrite existing non-zero node unless true
> > + * Return: 0 if OK, -ve on error
> > + */
> > +int fdt_kaslrseed(void *blob, bool overwrite);
> > +
> > #endif /* ifndef __FDT_SUPPORT_H */
>
> --
> // Caleb (they/them)
More information about the U-Boot
mailing list