Dear Tero,

On 6/12/20 9:41 PM, Tero Kristo wrote:
> These cases are typically fatal and are difficult to debug for random
> users. Add checks for detecting overlapping images and abort if overlap
> is detected.

I have a question about your patch.. because I have confused...
So i want to clear what i missed.


During booting with ramdisk, my target is stopped.

ramdisk start address = 0x2700000
size = 0x800000
kernel start - 0x2F00000

bootm 0x2f00000 0x2700000:0x800000 0x02600000


ramdisk.end is ramdisk_start + size (0x2F00000) 

Then it will be used until 0x2efffff, not 0x2f00000.
When i have checked, it doesn't overwrite RD image.

> +     /* check if ramdisk overlaps OS image */
> +     if (images.rd_start && (((ulong)images.rd_start >= start &&
> +                              (ulong)images.rd_start <= start + size) ||
> +                             ((ulong)images.rd_end >= start &&
> +                              (ulong)images.rd_end <= start + size))) {
> +             printf("ERROR: RD image overlaps OS image (OS=0x%lx..0x%lx)\n",
> +                    start, start + size);> +         return 1;
> +     }

Because of hit this condition...So doesn't boot...

I think that it needs to change the below conditions..

images.rd_start < start + size or images.rd_start < start + size - 1.
images.rd_end > start or image.rd_end - 1 >= start 

If i misunderstood something, let me know, plz.

Best Regards,
Jaehoon Chung

> 
> Signed-off-by: Tero Kristo <t-kri...@ti.com>
> ---
>  cmd/booti.c       |  2 +-
>  cmd/bootz.c       |  2 +-
>  common/bootm.c    | 29 +++++++++++++++++++++++++++--
>  common/bootm_os.c |  4 ++--
>  include/bootm.h   |  3 ++-
>  5 files changed, 33 insertions(+), 7 deletions(-)
> 
> diff --git a/cmd/booti.c b/cmd/booti.c
> index ae37975494..6153b229cf 100644
> --- a/cmd/booti.c
> +++ b/cmd/booti.c
> @@ -93,7 +93,7 @@ static int booti_start(struct cmd_tbl *cmdtp, int flag, int 
> argc,
>        * Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not
>        * have a header that provide this informaiton.
>        */
> -     if (bootm_find_images(flag, argc, argv))
> +     if (bootm_find_images(flag, argc, argv, relocated_addr, image_size))
>               return 1;
>  
>       return 0;
> diff --git a/cmd/bootz.c b/cmd/bootz.c
> index bc15fd8ec4..1c8b0cf89f 100644
> --- a/cmd/bootz.c
> +++ b/cmd/bootz.c
> @@ -54,7 +54,7 @@ static int bootz_start(struct cmd_tbl *cmdtp, int flag, int 
> argc,
>        * Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not
>        * have a header that provide this informaiton.
>        */
> -     if (bootm_find_images(flag, argc, argv))
> +     if (bootm_find_images(flag, argc, argv, zi_start, zi_end - zi_start))
>               return 1;
>  
>       return 0;
> diff --git a/common/bootm.c b/common/bootm.c
> index 2ed7521520..247b600d9c 100644
> --- a/common/bootm.c
> +++ b/common/bootm.c
> @@ -228,6 +228,8 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
> int argc,
>   * @flag: Ignored Argument
>   * @argc: command argument count
>   * @argv: command argument list
> + * @start: OS image start address
> + * @size: OS image size
>   *
>   * boot_find_images() will attempt to load an available ramdisk,
>   * flattened device tree, as well as specifically marked
> @@ -239,7 +241,8 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
> int argc,
>   *     0, if all existing images were loaded correctly
>   *     1, if an image is found but corrupted, or invalid
>   */
> -int bootm_find_images(int flag, int argc, char *const argv[])
> +int bootm_find_images(int flag, int argc, char *const argv[], ulong start,
> +                   ulong size)
>  {
>       int ret;
>  
> @@ -251,6 +254,16 @@ int bootm_find_images(int flag, int argc, char *const 
> argv[])
>               return 1;
>       }
>  
> +     /* check if ramdisk overlaps OS image */
> +     if (images.rd_start && (((ulong)images.rd_start >= start &&
> +                              (ulong)images.rd_start <= start + size) ||
> +                             ((ulong)images.rd_end >= start &&
> +                              (ulong)images.rd_end <= start + size))) {
> +             printf("ERROR: RD image overlaps OS image (OS=0x%lx..0x%lx)\n",
> +                    start, start + size);
> +             return 1;
> +     }
> +
>  #if IMAGE_ENABLE_OF_LIBFDT
>       /* find flattened device tree */
>       ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, &images,
> @@ -259,6 +272,18 @@ int bootm_find_images(int flag, int argc, char *const 
> argv[])
>               puts("Could not find a valid device tree\n");
>               return 1;
>       }
> +
> +     /* check if FDT overlaps OS image */
> +     if (images.ft_addr &&
> +         (((ulong)images.ft_addr >= start &&
> +           (ulong)images.ft_addr <= start + size) ||
> +          ((ulong)images.ft_addr + images.ft_len >= start &&
> +           (ulong)images.ft_addr + images.ft_len <= start + size))) {
> +             printf("ERROR: FDT image overlaps OS image (OS=0x%lx..0x%lx)\n",
> +                    start, start + size);
> +             return 1;
> +     }
> +
>       if (CONFIG_IS_ENABLED(CMD_FDT))
>               set_working_fdt_addr(map_to_sysmem(images.ft_addr));
>  #endif
> @@ -294,7 +319,7 @@ static int bootm_find_other(struct cmd_tbl *cmdtp, int 
> flag, int argc,
>            (images.os.type == IH_TYPE_MULTI)) &&
>           (images.os.os == IH_OS_LINUX ||
>                images.os.os == IH_OS_VXWORKS))
> -             return bootm_find_images(flag, argc, argv);
> +             return bootm_find_images(flag, argc, argv, 0, 0);
>  
>       return 0;
>  }
> diff --git a/common/bootm_os.c b/common/bootm_os.c
> index 55296483f7..a3c360e80a 100644
> --- a/common/bootm_os.c
> +++ b/common/bootm_os.c
> @@ -495,7 +495,7 @@ static int do_bootm_tee(int flag, int argc, char *const 
> argv[],
>               return ret;
>  
>       /* Locate FDT etc */
> -     ret = bootm_find_images(flag, argc, argv);
> +     ret = bootm_find_images(flag, argc, argv, 0, 0);
>       if (ret)
>               return ret;
>  
> @@ -516,7 +516,7 @@ static int do_bootm_efi(int flag, int argc, char *const 
> argv[],
>               return 0;
>  
>       /* Locate FDT, if provided */
> -     ret = bootm_find_images(flag, argc, argv);
> +     ret = bootm_find_images(flag, argc, argv, 0, 0);
>       if (ret)
>               return ret;
>  
> diff --git a/include/bootm.h b/include/bootm.h
> index 1e7f29e134..0350c349f3 100644
> --- a/include/bootm.h
> +++ b/include/bootm.h
> @@ -53,7 +53,8 @@ int boot_selected_os(int argc, char *const argv[], int 
> state,
>  ulong bootm_disable_interrupts(void);
>  
>  /* This is a special function used by booti/bootz */
> -int bootm_find_images(int flag, int argc, char *const argv[]);
> +int bootm_find_images(int flag, int argc, char *const argv[], ulong start,
> +                   ulong size);
>  
>  int do_bootm_states(struct cmd_tbl *cmdtp, int flag, int argc,
>                   char *const argv[], int states, bootm_headers_t *images,
> 

Reply via email to