[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: |
Andrei Borzenkov |
Subject: |
Re: [PATCH] sparc64: OBP available region contains grub. Start at grub_phys_end |
Date: |
Sat, 13 Feb 2016 08:30:09 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 |
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
b) is is possible for requested region to fit before grub?
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);
>