commit
91391dc52b
86 changed files with 1935 additions and 1034 deletions
|
@ -33,12 +33,6 @@
|
|||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
#define GRUB_EFI_PAGE_SHIFT 12
|
||||
#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT)
|
||||
#define GRUB_EFI_PE_MAGIC 0x5A4D
|
||||
|
||||
static grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
|
||||
|
||||
static grub_dl_t my_mod;
|
||||
static int loaded;
|
||||
|
||||
|
@ -58,6 +52,7 @@ static void *
|
|||
get_firmware_fdt (void)
|
||||
{
|
||||
grub_efi_configuration_table_t *tables;
|
||||
grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
|
||||
void *firmware_fdt = NULL;
|
||||
unsigned int i;
|
||||
|
||||
|
@ -75,8 +70,8 @@ get_firmware_fdt (void)
|
|||
return firmware_fdt;
|
||||
}
|
||||
|
||||
static void
|
||||
get_fdt (void)
|
||||
void *
|
||||
grub_linux_get_fdt (void)
|
||||
{
|
||||
void *raw_fdt;
|
||||
grub_size_t size;
|
||||
|
@ -99,7 +94,7 @@ get_fdt (void)
|
|||
grub_dprintf ("linux", "allocating %ld bytes for fdt\n", size);
|
||||
fdt = grub_efi_allocate_pages (0, BYTES_TO_PAGES (size));
|
||||
if (!fdt)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
if (raw_fdt)
|
||||
{
|
||||
|
@ -110,10 +105,11 @@ get_fdt (void)
|
|||
{
|
||||
grub_fdt_create_empty_tree (fdt, size);
|
||||
}
|
||||
return fdt;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
check_kernel (struct grub_arm64_linux_kernel_header *lh)
|
||||
grub_err_t
|
||||
grub_arm64_uefi_check_image (struct grub_arm64_linux_kernel_header * lh)
|
||||
{
|
||||
if (lh->magic != GRUB_ARM64_LINUX_MAGIC)
|
||||
return grub_error(GRUB_ERR_BAD_OS, "invalid magic number");
|
||||
|
@ -131,14 +127,14 @@ check_kernel (struct grub_arm64_linux_kernel_header *lh)
|
|||
}
|
||||
|
||||
static grub_err_t
|
||||
finalize_params (void)
|
||||
finalize_params_linux (void)
|
||||
{
|
||||
grub_efi_boot_services_t *b;
|
||||
grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
|
||||
grub_efi_status_t status;
|
||||
int node, retval;
|
||||
|
||||
get_fdt ();
|
||||
if (!fdt)
|
||||
if (!grub_linux_get_fdt ())
|
||||
goto failure;
|
||||
|
||||
node = grub_fdt_find_subnode (fdt, 0, "chosen");
|
||||
|
@ -240,21 +236,16 @@ out:
|
|||
return grub_errno;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_linux_boot (void)
|
||||
grub_err_t
|
||||
grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size, char *args)
|
||||
{
|
||||
grub_efi_memory_mapped_device_path_t *mempath;
|
||||
grub_efi_handle_t image_handle;
|
||||
grub_efi_boot_services_t *b;
|
||||
grub_efi_status_t status;
|
||||
grub_err_t retval;
|
||||
grub_efi_loaded_image_t *loaded_image;
|
||||
int len;
|
||||
|
||||
retval = finalize_params();
|
||||
if (retval != GRUB_ERR_NONE)
|
||||
return retval;
|
||||
|
||||
mempath = grub_malloc (2 * sizeof (grub_efi_memory_mapped_device_path_t));
|
||||
if (!mempath)
|
||||
return grub_errno;
|
||||
|
@ -263,8 +254,8 @@ grub_linux_boot (void)
|
|||
mempath[0].header.subtype = GRUB_EFI_MEMORY_MAPPED_DEVICE_PATH_SUBTYPE;
|
||||
mempath[0].header.length = grub_cpu_to_le16_compile_time (sizeof (*mempath));
|
||||
mempath[0].memory_type = GRUB_EFI_LOADER_DATA;
|
||||
mempath[0].start_address = (grub_addr_t) kernel_addr;
|
||||
mempath[0].end_address = (grub_addr_t) kernel_addr + kernel_size;
|
||||
mempath[0].start_address = addr;
|
||||
mempath[0].end_address = addr + size;
|
||||
|
||||
mempath[1].header.type = GRUB_EFI_END_DEVICE_PATH_TYPE;
|
||||
mempath[1].header.subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
||||
|
@ -273,16 +264,16 @@ grub_linux_boot (void)
|
|||
b = grub_efi_system_table->boot_services;
|
||||
status = b->load_image (0, grub_efi_image_handle,
|
||||
(grub_efi_device_path_t *) mempath,
|
||||
kernel_addr, kernel_size, &image_handle);
|
||||
(void *) addr, size, &image_handle);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
return grub_error (GRUB_ERR_BAD_OS, "cannot load image");
|
||||
|
||||
grub_dprintf ("linux", "linux command line: '%s'\n", linux_args);
|
||||
grub_dprintf ("linux", "linux command line: '%s'\n", args);
|
||||
|
||||
/* Convert command line to UCS-2 */
|
||||
loaded_image = grub_efi_get_loaded_image (image_handle);
|
||||
loaded_image->load_options_size = len =
|
||||
(grub_strlen (linux_args) + 1) * sizeof (grub_efi_char16_t);
|
||||
(grub_strlen (args) + 1) * sizeof (grub_efi_char16_t);
|
||||
loaded_image->load_options =
|
||||
grub_efi_allocate_pages (0,
|
||||
BYTES_TO_PAGES (loaded_image->load_options_size));
|
||||
|
@ -291,9 +282,9 @@ grub_linux_boot (void)
|
|||
|
||||
loaded_image->load_options_size =
|
||||
2 * grub_utf8_to_utf16 (loaded_image->load_options, len,
|
||||
(grub_uint8_t *) linux_args, len, NULL);
|
||||
(grub_uint8_t *) args, len, NULL);
|
||||
|
||||
grub_dprintf("linux", "starting image %p\n", image_handle);
|
||||
grub_dprintf ("linux", "starting image %p\n", image_handle);
|
||||
status = b->start_image (image_handle, 0, NULL);
|
||||
|
||||
/* When successful, not reached */
|
||||
|
@ -304,6 +295,16 @@ grub_linux_boot (void)
|
|||
return grub_errno;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_linux_boot (void)
|
||||
{
|
||||
if (finalize_params_linux () != GRUB_ERR_NONE)
|
||||
return grub_errno;
|
||||
|
||||
return (grub_arm64_uefi_boot_image((grub_addr_t)kernel_addr,
|
||||
kernel_size, linux_args));
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_linux_unload (void)
|
||||
{
|
||||
|
@ -400,7 +401,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
|||
if (grub_file_read (file, &lh, sizeof (lh)) < (long) sizeof (lh))
|
||||
return grub_errno;
|
||||
|
||||
if (check_kernel (&lh) != GRUB_ERR_NONE)
|
||||
if (grub_arm64_uefi_check_image (&lh) != GRUB_ERR_NONE)
|
||||
goto fail;
|
||||
|
||||
grub_loader_unset();
|
||||
|
|
|
@ -350,8 +350,6 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
|
|||
}
|
||||
loaded_image->device_handle = dev_handle;
|
||||
|
||||
grub_file_close (file);
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
int i, len;
|
||||
|
@ -381,6 +379,9 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
|
|||
loaded_image->load_options_size = len;
|
||||
}
|
||||
|
||||
grub_file_close (file);
|
||||
grub_device_close (dev);
|
||||
|
||||
grub_loader_set (grub_chainloader_boot, grub_chainloader_unload, 0);
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -84,11 +84,11 @@ SUFFIX (grub_freebsd_load_elfmodule_obj) (struct grub_relocator *relocator,
|
|||
grub_size_t chunk_size = 0;
|
||||
void *chunk_src;
|
||||
|
||||
curload = module = ALIGN_PAGE (*kern_end);
|
||||
|
||||
err = read_headers (file, argv[0], &e, &shdr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
curload = module = ALIGN_PAGE (*kern_end);
|
||||
goto out;
|
||||
|
||||
for (s = (Elf_Shdr *) shdr; s < (Elf_Shdr *) ((char *) shdr
|
||||
+ e.e_shnum * e.e_shentsize);
|
||||
|
@ -109,7 +109,7 @@ SUFFIX (grub_freebsd_load_elfmodule_obj) (struct grub_relocator *relocator,
|
|||
err = grub_relocator_alloc_chunk_addr (relocator, &ch,
|
||||
module, chunk_size);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
chunk_src = get_virtual_current_address (ch);
|
||||
}
|
||||
|
||||
|
@ -135,7 +135,7 @@ SUFFIX (grub_freebsd_load_elfmodule_obj) (struct grub_relocator *relocator,
|
|||
err = load (file, argv[0], (grub_uint8_t *) chunk_src + curload - *kern_end,
|
||||
s->sh_offset, s->sh_size);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
break;
|
||||
case SHT_NOBITS:
|
||||
grub_memset ((grub_uint8_t *) chunk_src + curload - *kern_end, 0,
|
||||
|
@ -159,6 +159,8 @@ SUFFIX (grub_freebsd_load_elfmodule_obj) (struct grub_relocator *relocator,
|
|||
| FREEBSD_MODINFOMD_SHDR,
|
||||
shdr, e.e_shnum * e.e_shentsize);
|
||||
|
||||
out:
|
||||
grub_free (shdr);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -177,11 +179,11 @@ SUFFIX (grub_freebsd_load_elfmodule) (struct grub_relocator *relocator,
|
|||
grub_size_t chunk_size = 0;
|
||||
void *chunk_src;
|
||||
|
||||
curload = module = ALIGN_PAGE (*kern_end);
|
||||
|
||||
err = read_headers (file, argv[0], &e, &shdr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
curload = module = ALIGN_PAGE (*kern_end);
|
||||
goto out;
|
||||
|
||||
for (s = (Elf_Shdr *) shdr; s < (Elf_Shdr *) ((char *) shdr
|
||||
+ e.e_shnum * e.e_shentsize);
|
||||
|
@ -207,7 +209,7 @@ SUFFIX (grub_freebsd_load_elfmodule) (struct grub_relocator *relocator,
|
|||
err = grub_relocator_alloc_chunk_addr (relocator, &ch,
|
||||
module, chunk_size);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
|
||||
chunk_src = get_virtual_current_address (ch);
|
||||
}
|
||||
|
@ -235,7 +237,7 @@ SUFFIX (grub_freebsd_load_elfmodule) (struct grub_relocator *relocator,
|
|||
+ s->sh_addr - *kern_end,
|
||||
s->sh_offset, s->sh_size);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
break;
|
||||
case SHT_NOBITS:
|
||||
grub_memset ((grub_uint8_t *) chunk_src + module
|
||||
|
@ -265,6 +267,10 @@ SUFFIX (grub_freebsd_load_elfmodule) (struct grub_relocator *relocator,
|
|||
grub_freebsd_add_meta_module (argv[0], FREEBSD_MODTYPE_ELF_MODULE,
|
||||
argc - 1, argv + 1, module,
|
||||
curload - module);
|
||||
out:
|
||||
grub_free (shdr);
|
||||
if (err)
|
||||
return err;
|
||||
return SUFFIX (grub_freebsd_load_elf_meta) (relocator, file, argv[0], kern_end);
|
||||
}
|
||||
|
||||
|
@ -292,13 +298,13 @@ SUFFIX (grub_freebsd_load_elf_meta) (struct grub_relocator *relocator,
|
|||
|
||||
err = read_headers (file, filename, &e, &shdr);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
|
||||
err = grub_bsd_add_meta (FREEBSD_MODINFO_METADATA |
|
||||
FREEBSD_MODINFOMD_ELFHDR, &e,
|
||||
sizeof (e));
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
|
||||
for (s = (Elf_Shdr *) shdr; s < (Elf_Shdr *) (shdr
|
||||
+ e.e_shnum * e.e_shentsize);
|
||||
|
@ -307,7 +313,10 @@ SUFFIX (grub_freebsd_load_elf_meta) (struct grub_relocator *relocator,
|
|||
break;
|
||||
if (s >= (Elf_Shdr *) ((char *) shdr
|
||||
+ e.e_shnum * e.e_shentsize))
|
||||
return grub_error (GRUB_ERR_BAD_OS, N_("no symbol table"));
|
||||
{
|
||||
err = grub_error (GRUB_ERR_BAD_OS, N_("no symbol table"));
|
||||
goto out;
|
||||
}
|
||||
symoff = s->sh_offset;
|
||||
symsize = s->sh_size;
|
||||
symentsize = s->sh_entsize;
|
||||
|
@ -325,7 +334,7 @@ SUFFIX (grub_freebsd_load_elf_meta) (struct grub_relocator *relocator,
|
|||
err = grub_relocator_alloc_chunk_addr (relocator, &ch,
|
||||
symtarget, chunk_size);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
sym_chunk = get_virtual_current_address (ch);
|
||||
}
|
||||
|
||||
|
@ -337,28 +346,38 @@ SUFFIX (grub_freebsd_load_elf_meta) (struct grub_relocator *relocator,
|
|||
curload += sizeof (grub_freebsd_addr_t);
|
||||
|
||||
if (grub_file_seek (file, symoff) == (grub_off_t) -1)
|
||||
return grub_errno;
|
||||
{
|
||||
err = grub_errno;
|
||||
goto out;
|
||||
}
|
||||
sym = (Elf_Sym *) curload;
|
||||
if (grub_file_read (file, curload, symsize) != (grub_ssize_t) symsize)
|
||||
{
|
||||
if (! grub_errno)
|
||||
return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
filename);
|
||||
return grub_errno;
|
||||
err = grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
filename);
|
||||
else
|
||||
err = grub_errno;
|
||||
goto out;
|
||||
}
|
||||
curload += symsize;
|
||||
|
||||
*((grub_freebsd_addr_t *) curload) = strsize;
|
||||
curload += sizeof (grub_freebsd_addr_t);
|
||||
if (grub_file_seek (file, stroff) == (grub_off_t) -1)
|
||||
return grub_errno;
|
||||
{
|
||||
err = grub_errno;
|
||||
goto out;
|
||||
}
|
||||
str = (char *) curload;
|
||||
if (grub_file_read (file, curload, strsize) != (grub_ssize_t) strsize)
|
||||
{
|
||||
if (! grub_errno)
|
||||
return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
filename);
|
||||
return grub_errno;
|
||||
err = grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
filename);
|
||||
else
|
||||
err = grub_errno;
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (i = 0;
|
||||
|
@ -378,18 +397,20 @@ SUFFIX (grub_freebsd_load_elf_meta) (struct grub_relocator *relocator,
|
|||
FREEBSD_MODINFOMD_DYNAMIC, &dynamic,
|
||||
sizeof (dynamic));
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = grub_bsd_add_meta (FREEBSD_MODINFO_METADATA |
|
||||
FREEBSD_MODINFOMD_SSYM, &symstart,
|
||||
sizeof (symstart));
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
|
||||
err = grub_bsd_add_meta (FREEBSD_MODINFO_METADATA |
|
||||
FREEBSD_MODINFOMD_ESYM, &symend,
|
||||
sizeof (symend));
|
||||
out:
|
||||
grub_free (shdr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -417,7 +438,10 @@ SUFFIX (grub_netbsd_load_elf_meta) (struct grub_relocator *relocator,
|
|||
|
||||
err = read_headers (file, filename, &e, &shdr);
|
||||
if (err)
|
||||
return err;
|
||||
{
|
||||
grub_free (shdr);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
for (s = (Elf_Shdr *) shdr; s < (Elf_Shdr *) (shdr
|
||||
+ e.e_shnum * e.e_shentsize);
|
||||
|
@ -426,7 +450,10 @@ SUFFIX (grub_netbsd_load_elf_meta) (struct grub_relocator *relocator,
|
|||
break;
|
||||
if (s >= (Elf_Shdr *) ((char *) shdr
|
||||
+ e.e_shnum * e.e_shentsize))
|
||||
return GRUB_ERR_NONE;
|
||||
{
|
||||
grub_free (shdr);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
symsize = s->sh_size;
|
||||
symsh = s;
|
||||
s = (Elf_Shdr *) (shdr + e.e_shentsize * s->sh_link);
|
||||
|
@ -443,7 +470,7 @@ SUFFIX (grub_netbsd_load_elf_meta) (struct grub_relocator *relocator,
|
|||
err = grub_relocator_alloc_chunk_addr (relocator, &ch,
|
||||
symtarget, chunk_size);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
sym_chunk = get_virtual_current_address (ch);
|
||||
}
|
||||
|
||||
|
@ -482,29 +509,41 @@ SUFFIX (grub_netbsd_load_elf_meta) (struct grub_relocator *relocator,
|
|||
}
|
||||
|
||||
if (grub_file_seek (file, symsh->sh_offset) == (grub_off_t) -1)
|
||||
return grub_errno;
|
||||
{
|
||||
err = grub_errno;
|
||||
goto out;
|
||||
}
|
||||
if (grub_file_read (file, curload, symsize) != (grub_ssize_t) symsize)
|
||||
{
|
||||
if (! grub_errno)
|
||||
return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
filename);
|
||||
return grub_errno;
|
||||
err = grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
filename);
|
||||
else
|
||||
err = grub_errno;
|
||||
goto out;
|
||||
}
|
||||
curload += ALIGN_UP (symsize, sizeof (grub_freebsd_addr_t));
|
||||
|
||||
if (grub_file_seek (file, strsh->sh_offset) == (grub_off_t) -1)
|
||||
return grub_errno;
|
||||
{
|
||||
err = grub_errno;
|
||||
goto out;
|
||||
}
|
||||
if (grub_file_read (file, curload, strsize) != (grub_ssize_t) strsize)
|
||||
{
|
||||
if (! grub_errno)
|
||||
return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
filename);
|
||||
return grub_errno;
|
||||
err = grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||
filename);
|
||||
else
|
||||
err = grub_errno;
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = grub_bsd_add_meta (NETBSD_BTINFO_SYMTAB,
|
||||
&symtab,
|
||||
sizeof (symtab));
|
||||
out:
|
||||
grub_free (shdr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -530,7 +569,10 @@ SUFFIX(grub_openbsd_find_ramdisk) (grub_file_t file,
|
|||
|
||||
err = read_headers (file, filename, &e, &shdr);
|
||||
if (err)
|
||||
return err;
|
||||
{
|
||||
grub_free (shdr);
|
||||
return err;
|
||||
}
|
||||
|
||||
for (s = (Elf_Shdr *) shdr; s < (Elf_Shdr *) (shdr
|
||||
+ e.e_shnum * e.e_shentsize);
|
||||
|
@ -583,7 +625,11 @@ SUFFIX(grub_openbsd_find_ramdisk) (grub_file_t file,
|
|||
}
|
||||
|
||||
if (grub_file_seek (file, stroff) == (grub_off_t) -1)
|
||||
return grub_errno;
|
||||
{
|
||||
grub_free (syms);
|
||||
grub_free (strs);
|
||||
return grub_errno;
|
||||
}
|
||||
if (grub_file_read (file, strs, strsize) != (grub_ssize_t) strsize)
|
||||
{
|
||||
grub_free (syms);
|
||||
|
|
|
@ -70,7 +70,6 @@ static grub_addr_t prot_mode_target;
|
|||
static void *initrd_mem;
|
||||
static grub_addr_t initrd_mem_target;
|
||||
static grub_size_t prot_init_space;
|
||||
static grub_uint32_t initrd_pages;
|
||||
static struct grub_relocator *relocator = NULL;
|
||||
static void *efi_mmap_buf;
|
||||
static grub_size_t maximal_cmdline_size;
|
||||
|
@ -1048,7 +1047,7 @@ static grub_err_t
|
|||
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
{
|
||||
grub_size_t size = 0;
|
||||
grub_size_t size = 0, aligned_size = 0;
|
||||
grub_addr_t addr_min, addr_max;
|
||||
grub_addr_t addr;
|
||||
grub_err_t err;
|
||||
|
@ -1070,8 +1069,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
|||
goto fail;
|
||||
|
||||
size = grub_get_initrd_size (&initrd_ctx);
|
||||
|
||||
initrd_pages = (page_align (size) >> 12);
|
||||
aligned_size = ALIGN_UP (size, 4096);
|
||||
|
||||
/* Get the highest address available for the initrd. */
|
||||
if (grub_le_to_cpu16 (linux_params.version) >= 0x0203)
|
||||
|
@ -1099,7 +1097,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
|||
addr_min = (grub_addr_t) prot_mode_target + prot_init_space;
|
||||
|
||||
/* Put the initrd as high as possible, 4KiB aligned. */
|
||||
addr = (addr_max - size) & ~0xFFF;
|
||||
addr = (addr_max - aligned_size) & ~0xFFF;
|
||||
|
||||
if (addr < addr_min)
|
||||
{
|
||||
|
@ -1110,7 +1108,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
|||
{
|
||||
grub_relocator_chunk_t ch;
|
||||
err = grub_relocator_alloc_chunk_align (relocator, &ch,
|
||||
addr_min, addr, size, 0x1000,
|
||||
addr_min, addr, aligned_size,
|
||||
0x1000,
|
||||
GRUB_RELOCATOR_PREFERENCE_HIGH,
|
||||
1);
|
||||
if (err)
|
||||
|
|
|
@ -269,9 +269,9 @@ grub_xnu_devprop_add_property (struct grub_xnu_devprop_device_descriptor *dev,
|
|||
prop->data = grub_malloc (prop->length);
|
||||
if (!prop->data)
|
||||
{
|
||||
grub_free (prop);
|
||||
grub_free (prop->name);
|
||||
grub_free (prop->name16);
|
||||
grub_free (prop);
|
||||
return grub_errno;
|
||||
}
|
||||
grub_memcpy (prop->data, data, prop->length);
|
||||
|
|
|
@ -161,6 +161,9 @@ grub_initrd_init (int argc, char *argv[],
|
|||
for (i = 0; i < argc; i++)
|
||||
{
|
||||
const char *fname = argv[i];
|
||||
|
||||
initrd_ctx->size = ALIGN_UP (initrd_ctx->size, 4);
|
||||
|
||||
if (grub_memcmp (argv[i], "newc:", 5) == 0)
|
||||
{
|
||||
const char *ptr, *eptr;
|
||||
|
@ -205,11 +208,12 @@ grub_initrd_init (int argc, char *argv[],
|
|||
initrd_ctx->nfiles++;
|
||||
initrd_ctx->components[i].size
|
||||
= grub_file_size (initrd_ctx->components[i].file);
|
||||
initrd_ctx->size += ALIGN_UP (initrd_ctx->components[i].size, 4);
|
||||
initrd_ctx->size += initrd_ctx->components[i].size;
|
||||
}
|
||||
|
||||
if (newc)
|
||||
{
|
||||
initrd_ctx->size = ALIGN_UP (initrd_ctx->size, 4);
|
||||
initrd_ctx->size += ALIGN_UP (sizeof (struct newc_head)
|
||||
+ sizeof ("TRAILER!!!") - 1, 4);
|
||||
free_dir (root);
|
||||
|
@ -248,10 +252,12 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
|||
int i;
|
||||
int newc = 0;
|
||||
struct dir *root = 0;
|
||||
grub_ssize_t cursize = 0;
|
||||
|
||||
for (i = 0; i < initrd_ctx->nfiles; i++)
|
||||
{
|
||||
grub_ssize_t cursize;
|
||||
grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4));
|
||||
ptr += ALIGN_UP_OVERHEAD (cursize, 4);
|
||||
|
||||
if (initrd_ctx->components[i].newc_name)
|
||||
{
|
||||
|
@ -283,11 +289,13 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
|||
return grub_errno;
|
||||
}
|
||||
ptr += cursize;
|
||||
grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4));
|
||||
ptr += ALIGN_UP_OVERHEAD (cursize, 4);
|
||||
}
|
||||
if (newc)
|
||||
ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1, 0, 0);
|
||||
{
|
||||
grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4));
|
||||
ptr += ALIGN_UP_OVERHEAD (cursize, 4);
|
||||
ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1, 0, 0);
|
||||
}
|
||||
free_dir (root);
|
||||
root = 0;
|
||||
return GRUB_ERR_NONE;
|
||||
|
|
|
@ -333,6 +333,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
|
|||
return grub_errno;
|
||||
|
||||
#ifndef GRUB_USE_MULTIBOOT2
|
||||
lowest_addr = 0x100000;
|
||||
if (grub_multiboot_quirks & GRUB_MULTIBOOT_QUIRK_MODULES_AFTER_KERNEL)
|
||||
lowest_addr = ALIGN_UP (highest_load + 1048576, 4096);
|
||||
#endif
|
||||
|
|
|
@ -169,7 +169,10 @@ CONCAT(grub_multiboot_load_elf, XX) (grub_file_t file, const char *filename, voi
|
|||
return grub_errno;
|
||||
|
||||
if (grub_file_seek (file, ehdr->e_shoff) == (grub_off_t) -1)
|
||||
return grub_errno;
|
||||
{
|
||||
grub_free (shdr);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
if (grub_file_read (file, shdr, ehdr->e_shnum * ehdr->e_shentsize)
|
||||
!= (grub_ssize_t) ehdr->e_shnum * ehdr->e_shentsize)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue