* grub-core/kern/elfXX.c (grub_elfXX_load): Handle

GRUB_ELF_LOAD_FLAGS_30BITS and GRUB_ELF_LOAD_FLAGS_62BITS.
	* grub-core/loader/powerpc/ieee1275/linux.c (grub_linux_load32),
	(grub_linux_load64): Mask out 2 high bits.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2013-04-19 15:05:11 +02:00
parent 4eafa17565
commit aeace7f71c
4 changed files with 27 additions and 4 deletions

View file

@ -101,8 +101,20 @@ grub_elfXX_load (grub_elf_t elf, const char *filename,
continue;
load_addr = (grub_addr_t) phdr->p_paddr;
if (load_flags & GRUB_ELF_LOAD_FLAGS_28BITS)
load_addr &= 0xFFFFFFF;
switch (load_flags & GRUB_ELF_LOAD_FLAGS_BITS)
{
case GRUB_ELF_LOAD_FLAGS_ALL_BITS:
break;
case GRUB_ELF_LOAD_FLAGS_28BITS:
load_addr &= 0xFFFFFFF;
break;
case GRUB_ELF_LOAD_FLAGS_30BITS:
load_addr &= 0x3FFFFFFF;
break;
case GRUB_ELF_LOAD_FLAGS_62BITS:
load_addr &= 0x3FFFFFFFFFFFFFFFULL;
break;
}
load_addr += (grub_addr_t) load_offset;
if (load_addr < load_base)

View file

@ -204,7 +204,7 @@ grub_linux_load32 (grub_elf_t elf, const char *filename)
linux_addr = seg_addr;
/* Now load the segments into the area we claimed. */
return grub_elf32_load (elf, filename, (void *) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_NONE, 0, 0);
return grub_elf32_load (elf, filename, (void *) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_30BITS, 0, 0);
}
static grub_err_t
@ -238,7 +238,7 @@ grub_linux_load64 (grub_elf_t elf, const char *filename)
linux_addr = seg_addr;
/* Now load the segments into the area we claimed. */
return grub_elf64_load (elf, filename, (void *) (grub_addr_t) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_NONE, 0, 0);
return grub_elf64_load (elf, filename, (void *) (grub_addr_t) (seg_addr - base_addr), GRUB_ELF_LOAD_FLAGS_62BITS, 0, 0);
}
static grub_err_t