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: 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);




reply via email to

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