2009-06-21 Vladimir Serbinenko <phcoder@gmail.com>
Load BSD ELF modules * conf/i386-pc.rmk (bsd_mod_SOURCES): Add loader/i386/bsd32.c and loader/i386/bsd64.c * include/grub/i386/bsd.h (FREEBSD_MODTYPE_MODULE): Remove (FREEBSD_MODTYPE_ELF_MODULE): New definition (FREEBSD_MODTYPE_ELF_MODULE_OBJ): Likewise (grub_freebsd_load_elfmodule32): New declaration (grub_freebsd_load_elfmoduleobj64): Likewise (grub_freebsd_load_elf_meta32): Likewise (grub_freebsd_load_elf_meta64): Likewise (grub_freebsd_add_meta): Likewise (grub_freebsd_add_meta_module): Likewise * loader/i386/bsd.c (grub_freebsd_add_meta): Make global (grub_freebsd_add_meta_module): Likewise and move module-specific parts to grub_cmd_freebsd and grub_cmd_freebsd_module (grub_cmd_freebsd): Add elf-kernel specific parts based on grub_freebsd_add_meta_module (grub_cmd_freebsd_module): Add type parsing moved from grub_freebsd_add_meta_module (grub_cmd_freebsd_module_elf): New function (cmd_freebsd_module_elf): New variable (GRUB_MOD_INIT): Register freebsd_module_elf * loader/i386/bsd32.c: New file * loader/i386/bsd64.c: Likewise * loader/i386/bsdXX.c: Likewise * kern/elf.c (grub_elf32_load): Let hook decide which pheaders to load (grub_elf64_load): Likewise * include/grub/elfload.h (grub_elf32_load_hook_t): New parameter do_load All users updated (grub_elf64_load_hook_t): Likewise
This commit is contained in:
parent
0db15301d1
commit
3f3ec72b38
14 changed files with 613 additions and 68 deletions
18
kern/elf.c
18
kern/elf.c
|
@ -228,14 +228,15 @@ grub_elf32_load (grub_elf_t _elf, grub_elf32_load_hook_t _load_hook,
|
|||
{
|
||||
grub_elf32_load_hook_t load_hook = (grub_elf32_load_hook_t) hook;
|
||||
grub_addr_t load_addr;
|
||||
|
||||
if (phdr->p_type != PT_LOAD)
|
||||
return 0;
|
||||
int do_load = 1;
|
||||
|
||||
load_addr = phdr->p_paddr;
|
||||
if (load_hook && load_hook (phdr, &load_addr))
|
||||
if (load_hook && load_hook (phdr, &load_addr, &do_load))
|
||||
return 1;
|
||||
|
||||
if (! do_load)
|
||||
return 0;
|
||||
|
||||
if (load_addr < load_base)
|
||||
load_base = load_addr;
|
||||
|
||||
|
@ -407,14 +408,15 @@ grub_elf64_load (grub_elf_t _elf, grub_elf64_load_hook_t _load_hook,
|
|||
{
|
||||
grub_elf64_load_hook_t load_hook = (grub_elf64_load_hook_t) hook;
|
||||
grub_addr_t load_addr;
|
||||
|
||||
if (phdr->p_type != PT_LOAD)
|
||||
return 0;
|
||||
int do_load = 1;
|
||||
|
||||
load_addr = phdr->p_paddr;
|
||||
if (load_hook && load_hook (phdr, &load_addr))
|
||||
if (load_hook && load_hook (phdr, &load_addr, &do_load))
|
||||
return 1;
|
||||
|
||||
if (! do_load)
|
||||
return 0;
|
||||
|
||||
if (load_addr < load_base)
|
||||
load_base = load_addr;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue