Le Sat, Feb 13, 2016 à 5:03 PM, Eric Snowberg <eric.snowb...@oracle.com> a écrit :
> > > On Feb 12, 2016, at 10:30 PM, Andrei Borzenkov <arvidj...@gmail.com> > 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 <eric.snowb...@oracle.com> > >> --- > >> 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. > > Isn't this an internal implementation detail of OBP? It has to be 8k in virtual memory but why does it have to be in physical memory? > > >> { > >> 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 > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel