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
				
			
		|  | @ -37,9 +37,9 @@ struct grub_elf_file | |||
| typedef struct grub_elf_file *grub_elf_t; | ||||
| 
 | ||||
| typedef grub_err_t (*grub_elf32_load_hook_t) | ||||
|   (Elf32_Phdr *phdr, grub_addr_t *addr); | ||||
|   (Elf32_Phdr *phdr, grub_addr_t *addr, int *load); | ||||
| typedef grub_err_t (*grub_elf64_load_hook_t) | ||||
|   (Elf64_Phdr *phdr, grub_addr_t *addr); | ||||
|   (Elf64_Phdr *phdr, grub_addr_t *addr, int *load); | ||||
| 
 | ||||
| grub_elf_t grub_elf_open (const char *); | ||||
| grub_elf_t grub_elf_file (grub_file_t); | ||||
|  |  | |||
|  | @ -86,7 +86,8 @@ | |||
| 
 | ||||
| #define FREEBSD_MODTYPE_KERNEL		"elf kernel" | ||||
| #define FREEBSD_MODTYPE_KERNEL64	"elf64 kernel" | ||||
| #define FREEBSD_MODTYPE_MODULE		"elf module" | ||||
| #define FREEBSD_MODTYPE_ELF_MODULE	"elf module" | ||||
| #define FREEBSD_MODTYPE_ELF_MODULE_OBJ	"elf obj module" | ||||
| #define FREEBSD_MODTYPE_RAW		"raw" | ||||
| 
 | ||||
| struct grub_freebsd_bootinfo | ||||
|  | @ -229,6 +230,21 @@ struct grub_netbsd_btinfo_bootdisk | |||
| 
 | ||||
| void grub_unix_real_boot (grub_addr_t entry, ...) | ||||
|      __attribute__ ((cdecl,noreturn)); | ||||
| grub_err_t grub_freebsd_load_elfmodule32 (grub_file_t file, int argc, | ||||
| 					  char *argv[], grub_addr_t *kern_end); | ||||
| grub_err_t grub_freebsd_load_elfmodule_obj64 (grub_file_t file, int argc, | ||||
| 					      char *argv[], | ||||
| 					      grub_addr_t *kern_end); | ||||
| grub_err_t grub_freebsd_load_elf_meta32 (grub_file_t file, | ||||
| 					 grub_addr_t *kern_end); | ||||
| grub_err_t grub_freebsd_load_elf_meta64 (grub_file_t file, | ||||
| 					 grub_addr_t *kern_end); | ||||
| 
 | ||||
| grub_err_t grub_freebsd_add_meta (grub_uint32_t type, void *data, | ||||
| 				  grub_uint32_t len); | ||||
| grub_err_t grub_freebsd_add_meta_module (char *filename, char *type, | ||||
| 					 int argc, char **argv, | ||||
| 					 grub_addr_t addr, grub_uint32_t size); | ||||
| 
 | ||||
| extern grub_uint8_t grub_bsd64_trampoline_start, grub_bsd64_trampoline_end; | ||||
| extern grub_uint32_t grub_bsd64_trampoline_selfjump; | ||||
|  |  | |||
|  | @ -45,10 +45,10 @@ void | |||
| grub_mb2_arch_unload (struct multiboot_tag_header *tags); | ||||
| 
 | ||||
| grub_err_t | ||||
| grub_mb2_arch_elf32_hook (Elf32_Phdr *phdr, grub_addr_t *addr); | ||||
| grub_mb2_arch_elf32_hook (Elf32_Phdr *phdr, grub_addr_t *addr, int *do_load); | ||||
| 
 | ||||
| grub_err_t | ||||
| grub_mb2_arch_elf64_hook (Elf64_Phdr *phdr, grub_addr_t *addr); | ||||
| grub_mb2_arch_elf64_hook (Elf64_Phdr *phdr, grub_addr_t *addr, int *do_load); | ||||
| 
 | ||||
| grub_err_t | ||||
| grub_mb2_arch_module_alloc (grub_size_t size, grub_addr_t *addr); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue