[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: |
Eric Snowberg |
Subject: |
Re: [PATCH] sparc64: OBP available region contains grub. Start at grub_phys_end |
Date: |
Sat, 13 Feb 2016 09:03:45 -0700 |
> On Feb 12, 2016, at 10:30 PM, Andrei Borzenkov <address@hidden> wrote:
>
> 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
>
On SPARC, there is always an 8k offset from the beginning of memory to
grub_phys_start. I had intentionally skipped this memory for the 2 cases above.
>> {
>> 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);