[PATCH v3 16/18] pxe: Refactor sysboot to have one helper

Ramon Fried rfried.dev at gmail.com
Tue Nov 9 09:09:07 CET 2021


On Thu, Oct 14, 2021 at 9:51 PM Simon Glass <sjg at chromium.org> wrote:
>
> The only difference between the three helpers is the filesystem type.
> Factor this out and call the filesystem functions directly, instead of
> through the command-line interpreter. This allows the file size to be
> obtained directly, instead of via an environment variable.
>
> We cannot do the same thing with PXE's tftpboot since there is no API
> at present to obtain information about the file that was read. So there
> is no point in changing pxe_getfile_func to use a ulong for the address,
> for example.
>
> This is as far as the refactoring can go for the present.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> (no changes since v1)
>
>  cmd/sysboot.c | 94 ++++++++++++++++++++-------------------------------
>  1 file changed, 36 insertions(+), 58 deletions(-)
>
> diff --git a/cmd/sysboot.c b/cmd/sysboot.c
> index 6344ecd357b..04c07020269 100644
> --- a/cmd/sysboot.c
> +++ b/cmd/sysboot.c
> @@ -6,63 +6,40 @@
>  #include <fs.h>
>  #include <pxe_utils.h>
>
> -static char *fs_argv[5];
> -
> -static int do_get_ext2(struct pxe_context *ctx, const char *file_path,
> -                      char *file_addr, ulong *sizep)
> +/**
> + * struct sysboot_info - useful information for sysboot helpers
> + *
> + * @fstype: Filesystem type (FS_TYPE_...)
> + * @ifname: Interface name (e.g. "ide", "scsi")
> + * @dev_part_str is in the format:
> + *     <dev>.<hw_part>:<part> where <dev> is the device number,
> + *     <hw_part> is the optional hardware partition number and
> + *     <part> is the partition number
> + */
> +struct sysboot_info {
> +       int fstype;
> +       const char *ifname;
> +       const char *dev_part_str;
> +};
> +
> +static int sysboot_read_file(struct pxe_context *ctx, const char *file_path,
> +                            char *file_addr, ulong *sizep)
>  {
> -#ifdef CONFIG_CMD_EXT2
> +       struct sysboot_info *info = ctx->userdata;
> +       loff_t len_read;
> +       ulong addr;
>         int ret;
>
> -       fs_argv[0] = "ext2load";
> -       fs_argv[3] = file_addr;
> -       fs_argv[4] = (void *)file_path;
> -
> -       if (!do_ext2load(ctx->cmdtp, 0, 5, fs_argv))
> -               return 1;
> -       ret = pxe_get_file_size(sizep);
> +       addr = simple_strtoul(file_addr, NULL, 16);
> +       ret = fs_set_blk_dev(info->ifname, info->dev_part_str, info->fstype);
>         if (ret)
> -               return log_msg_ret("tftp", ret);
> -#endif
> -       return -ENOENT;
> -}
> -
> -static int do_get_fat(struct pxe_context *ctx, const char *file_path,
> -                     char *file_addr, ulong *sizep)
> -{
> -#ifdef CONFIG_CMD_FAT
> -       int ret;
> -
> -       fs_argv[0] = "fatload";
> -       fs_argv[3] = file_addr;
> -       fs_argv[4] = (void *)file_path;
> -
> -       if (!do_fat_fsload(ctx->cmdtp, 0, 5, fs_argv))
> -               return 1;
> -       ret = pxe_get_file_size(sizep);
> +               return ret;
> +       ret = fs_read(file_path, addr, 0, 0, &len_read);
>         if (ret)
> -               return log_msg_ret("tftp", ret);
> -#endif
> -       return -ENOENT;
> -}
> -
> -static int do_get_any(struct pxe_context *ctx, const char *file_path,
> -                     char *file_addr, ulong *sizep)
> -{
> -#ifdef CONFIG_CMD_FS_GENERIC
> -       int ret;
> -
> -       fs_argv[0] = "load";
> -       fs_argv[3] = file_addr;
> -       fs_argv[4] = (void *)file_path;
> +               return ret;
> +       *sizep = len_read;
>
> -       if (!do_load(ctx->cmdtp, 0, 5, fs_argv, FS_TYPE_ANY))
> -               return 1;
> -       ret = pxe_get_file_size(sizep);
> -       if (ret)
> -               return log_msg_ret("tftp", ret);
> -#endif
> -       return -ENOENT;
> +       return 0;
>  }
>
>  /*
> @@ -74,9 +51,9 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc,
>                       char *const argv[])
>  {
>         unsigned long pxefile_addr_r;
> -       pxe_getfile_func getfile;
>         struct pxe_context ctx;
>         char *pxefile_addr_str;
> +       struct sysboot_info info;
>         char *filename;
>         int prompt = 0;
>         int ret;
> @@ -106,24 +83,25 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc,
>         }
>
>         if (strstr(argv[3], "ext2")) {
> -               getfile = do_get_ext2;
> +               info.fstype = FS_TYPE_EXT;
>         } else if (strstr(argv[3], "fat")) {
> -               getfile = do_get_fat;
> +               info.fstype = FS_TYPE_FAT;
>         } else if (strstr(argv[3], "any")) {
> -               getfile = do_get_any;
> +               info.fstype = FS_TYPE_ANY;
>         } else {
>                 printf("Invalid filesystem: %s\n", argv[3]);
>                 return 1;
>         }
> -       fs_argv[1] = argv[1];
> -       fs_argv[2] = argv[2];
> +       info.ifname = argv[1];
> +       info.dev_part_str = argv[2];
>
>         if (strict_strtoul(pxefile_addr_str, 16, &pxefile_addr_r) < 0) {
>                 printf("Invalid pxefile address: %s\n", pxefile_addr_str);
>                 return 1;
>         }
>
> -       if (pxe_setup_ctx(&ctx, cmdtp, getfile, NULL, true, filename)) {
> +       if (pxe_setup_ctx(&ctx, cmdtp, sysboot_read_file, &info, true,
> +                         filename)) {
>                 printf("Out of memory\n");
>                 return CMD_RET_FAILURE;
>         }
> --
> 2.33.0.1079.g6e70778dc9-goog
>
Reviewed-by: Ramon Fried <rfried.dev at gmail.com>


More information about the U-Boot mailing list