[U-Boot] [PATCH 07/10] x86: fsp: Make sure HOB list is not overwritten by U-Boot

Simon Glass sjg at chromium.org
Sat Dec 19 03:52:12 CET 2015


Hi Bin,

On 11 December 2015 at 03:55, Bin Meng <bmeng.cn at gmail.com> wrote:
> Intel IvyBridge FSP seems to be buggy that it does not report memory
> used by FSP itself as reserved in the resource descriptor HOB. The
> FSP specification does not describe how resource descriptor HOBs are
> generated by the FSP to describe what memory regions. It looks newer
> FSPs like Queensbay and BayTrail do not have such issue. This causes
> U-Boot relocation overwrites the important boot service data which is
> used by FSP, and the subsequent call to fsp_notify() will fail.
>
> To resolve this, we find out the lowest memory base address allocated
> by FSP for the boot service data when walking through the HOB list in
> fsp_get_usable_lowmem_top(). Check whether the memory top address is
> below the FSP HOB list, and if not, use the lowest memory base address
> allocated by FSP as the memory top address.
>
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
>  arch/x86/lib/fsp/fsp_support.c | 27 +++++++++++++++++++++++++++
>  1 file changed, 27 insertions(+)

Acked-by: Simon Glass <sjg at chromium.org>
Tested on link (ivybridge non-FSP)
Tested-by: Simon Glass <sjg at chromium.org>

But if this is a bug I'd prefer to have it behind an #iffdef, or with
a large comment in the code. Otherwise we might think it is an
important feature for all platforms.

>
> diff --git a/arch/x86/lib/fsp/fsp_support.c b/arch/x86/lib/fsp/fsp_support.c
> index 875c96a..d6bbe1a 100644
> --- a/arch/x86/lib/fsp/fsp_support.c
> +++ b/arch/x86/lib/fsp/fsp_support.c
> @@ -223,7 +223,9 @@ u32 fsp_get_usable_lowmem_top(const void *hob_list)
>  {
>         const struct hob_header *hdr;
>         struct hob_res_desc *res_desc;
> +       struct hob_mem_alloc *res_mem;
>         phys_addr_t phys_start;
> +       phys_addr_t mem_base = 0;
>         u32 top;
>
>         /* Get the HOB list for processing */
> @@ -242,9 +244,34 @@ u32 fsp_get_usable_lowmem_top(const void *hob_list)
>                                         top += (u32)(res_desc->len);
>                         }
>                 }
> +
> +               /*
> +                * Find out the lowest memory base address allocated by FSP
> +                * for the boot service data
> +                */
> +               if (hdr->type == HOB_TYPE_MEM_ALLOC) {
> +                       res_mem = (struct hob_mem_alloc *)hdr;
> +                       if (!mem_base)
> +                               mem_base = res_mem->mem_base;
> +                       if (res_mem->mem_base < mem_base)
> +                               mem_base = res_mem->mem_base;
> +               }
> +
>                 hdr = get_next_hob(hdr);
>         }
>
> +       /*
> +        * Check whether the memory top address is below the FSP HOB list.
> +        * If not, use the lowest memory base address allocated by FSP as
> +        * the memory top address. This is to prevent U-Boot relocation
> +        * overwrites the important boot service data which is used by FSP,
> +        * otherwise the subsequent call to fsp_notify() will fail.
> +        */
> +       if (top > (u32)hob_list) {
> +               debug("Adjust memory top address due to a buggy FSP\n");
> +               top = (u32)mem_base;
> +       }
> +
>         return top;
>  }
>
> --
> 1.8.2.1
>

Regards,
Simon


More information about the U-Boot mailing list