grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] sparc64: OBP available region contains grub. Start at grub_p


From: Vladimir 'phcoder' Serbinenko
Subject: Re: [PATCH] sparc64: OBP available region contains grub. Start at grub_phys_end
Date: Sat, 13 Feb 2016 13:56:44 +0000



Le sam. 13 févr. 2016 06:30, Andrei Borzenkov <address@hidden> a écrit :
13.02.2016 00:35, Eric Snowberg пишет:
> OBP available region contains grub. Start at grub_phys_end.
>
> This prevents a problem where grub was being overwritten since
> grub_phys_start does not start at a zero offset within the memory
> map.
>
> Signed-off-by: Eric Snowberg <address@hidden>
> ---
>  grub-core/loader/sparc64/ieee1275/linux.c |   16 ++++++++--------
>  1 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/grub-core/loader/sparc64/ieee1275/linux.c b/grub-core/loader/sparc64/ieee1275/linux.c
> index d44d7a1..67ef048 100644
> --- a/grub-core/loader/sparc64/ieee1275/linux.c
> +++ b/grub-core/loader/sparc64/ieee1275/linux.c
> @@ -203,20 +203,20 @@ alloc_phys_choose (grub_uint64_t addr, grub_uint64_t len,
>    if (addr + ctx->size >= end)
>      return 0;
>
> -  if (addr >= grub_phys_start && addr < grub_phys_end)
> -    {
> -      addr = ALIGN_UP (grub_phys_end, FOUR_MB);
> -      if (addr + ctx->size >= end)
> -     return 0;
> -    }
> -  if ((addr + ctx->size) >= grub_phys_start
> -      && (addr + ctx->size) < grub_phys_end)
> +  /* OBP available region contains grub. Start at grub_phys_end. */
> +  /* grub_phys_start does not start at the beginning of the memory region */
> +  if ((grub_phys_start >= addr && grub_phys_end < end) ||
> +      (addr > grub_phys_start && addr < grub_phys_end))

What about

a) overlapping regions?

addr < grub_phys_start < end < grub_phys_end

Good catch. Condition should have been
grub_phys_start >= addr && grub_phys_start < end) || (addr > grub_phys_start && addr < grub_phys_end))
My pattern matching algorithm failed and I thought it was standard check for segment intersection but it wasn't. I'll fix this



b) is is possible for requested region to fit before grub?
There is only 16KiB of memory before GRUB but thinking about it again, it's 16 KiB of virtual memory, not physical. What about attached patch?


addr < end < grub_phys_start

>      {
>        addr = ALIGN_UP (grub_phys_end, FOUR_MB);
>        if (addr + ctx->size >= end)
>       return 0;
>      }
>
> +  grub_dprintf("loader",
> +    "addr = 0x%lx grub_phys_start = 0x%lx grub_phys_end = 0x%lx\n",
> +    addr, grub_phys_start, grub_phys_end);
> +
>    if (loaded)
>      {
>        grub_addr_t linux_end = ALIGN_UP (linux_paddr + linux_size, FOUR_MB);
>


_______________________________________________
Grub-devel mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/grub-devel

Attachment: filetree.diff (1)
Description: Binary data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]