Add LZSS Mach-O support (needed for new xnu kernelcache).
* grub-core/Makefile.core.def (xnu): Add file lzss.c * grub-core/loader/lzss.c: New file. * grub-core/loader/xnu.c (grub_xnu_load_driver): Close binaryfile on Mach-O open failure. * grub-core/loader/macho.c (grub_macho_close): Free uncompressedXX. Don't free cmdsXX in uncompressedXX is set. (grub_macho_file): Init new fields. New argument is_64bit. All users updated. Handle compressed. Error out if no suitable architecture is found. Don't close file. (grub_macho_open): New argument is_64bit. All users updated. * grub-core/loader/macho32.c: Add defines for new fields. * grub-core/loader/macho64.c: Likewise. * grub-core/loader/machoXX.c (grub_macho_contains_macho): Make static. (grub_macho_parse): Handle compressed. Defer actual processing if compressed. (grub_macho_cmds_iterate): Decompress if compressed. New argument "filename". All users updated. (grub_macho_size): New argument "filename". All users updated. (grub_macho_get_entry_point): Likewise. (grub_macho_load): Handle compressed. * include/grub/macho.h (grub_macho_lzss_header): New struct. (GRUB_MACHO_LZSS_OFFSET): New define. (grub_decompress_lzss): New proto. * include/grub/machoload.h (grub_macho_file): New fields to handle compressed. (grub_macho_contains_macho64): Remove proto. (grub_macho_contains_macho32): Likewise. * util/grub.d/30_os-prober.in: Use kernel cache if available.
This commit is contained in:
parent
ebd17d6f51
commit
99ce1597a4
11 changed files with 339 additions and 80 deletions
|
@ -351,17 +351,12 @@ grub_cmd_xnu_kernel (grub_command_t cmd __attribute__ ((unused)),
|
|||
|
||||
grub_xnu_unload ();
|
||||
|
||||
macho = grub_macho_open (args[0]);
|
||||
macho = grub_macho_open (args[0], 0);
|
||||
if (! macho)
|
||||
return grub_errno;
|
||||
if (! grub_macho_contains_macho32 (macho))
|
||||
{
|
||||
grub_macho_close (macho);
|
||||
return grub_error (GRUB_ERR_BAD_OS,
|
||||
"kernel doesn't contain suitable 32-bit architecture");
|
||||
}
|
||||
|
||||
err = grub_macho_size32 (macho, &startcode, &endcode, GRUB_MACHO_NOBSS);
|
||||
err = grub_macho_size32 (macho, &startcode, &endcode, GRUB_MACHO_NOBSS,
|
||||
args[0]);
|
||||
if (err)
|
||||
{
|
||||
grub_macho_close (macho);
|
||||
|
@ -396,7 +391,7 @@ grub_cmd_xnu_kernel (grub_command_t cmd __attribute__ ((unused)),
|
|||
return err;
|
||||
}
|
||||
|
||||
grub_xnu_entry_point = grub_macho_get_entry_point32 (macho);
|
||||
grub_xnu_entry_point = grub_macho_get_entry_point32 (macho, args[0]);
|
||||
if (! grub_xnu_entry_point)
|
||||
{
|
||||
grub_macho_close (macho);
|
||||
|
@ -461,17 +456,12 @@ grub_cmd_xnu_kernel64 (grub_command_t cmd __attribute__ ((unused)),
|
|||
|
||||
grub_xnu_unload ();
|
||||
|
||||
macho = grub_macho_open (args[0]);
|
||||
macho = grub_macho_open (args[0], 1);
|
||||
if (! macho)
|
||||
return grub_errno;
|
||||
if (! grub_macho_contains_macho64 (macho))
|
||||
{
|
||||
grub_macho_close (macho);
|
||||
return grub_error (GRUB_ERR_BAD_OS,
|
||||
"kernel doesn't contain suitable 64-bit architecture");
|
||||
}
|
||||
|
||||
err = grub_macho_size64 (macho, &startcode, &endcode, GRUB_MACHO_NOBSS);
|
||||
err = grub_macho_size64 (macho, &startcode, &endcode, GRUB_MACHO_NOBSS,
|
||||
args[0]);
|
||||
if (err)
|
||||
{
|
||||
grub_macho_close (macho);
|
||||
|
@ -509,7 +499,8 @@ grub_cmd_xnu_kernel64 (grub_command_t cmd __attribute__ ((unused)),
|
|||
return err;
|
||||
}
|
||||
|
||||
grub_xnu_entry_point = grub_macho_get_entry_point64 (macho) & 0x0fffffff;
|
||||
grub_xnu_entry_point = grub_macho_get_entry_point64 (macho, args[0])
|
||||
& 0x0fffffff;
|
||||
if (! grub_xnu_entry_point)
|
||||
{
|
||||
grub_macho_close (macho);
|
||||
|
@ -667,18 +658,16 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
|
|||
/* Compute the needed space. */
|
||||
if (binaryfile)
|
||||
{
|
||||
macho = grub_macho_file (binaryfile, filename);
|
||||
if (! macho || ! grub_macho_contains_macho32 (macho))
|
||||
{
|
||||
if (macho)
|
||||
grub_macho_close (macho);
|
||||
return grub_error (GRUB_ERR_BAD_OS,
|
||||
"extension doesn't contain suitable architecture");
|
||||
}
|
||||
if (grub_xnu_is_64bit)
|
||||
machosize = grub_macho_filesize64 (macho);
|
||||
macho = grub_macho_file (binaryfile, filename, grub_xnu_is_64bit);
|
||||
if (!macho)
|
||||
grub_file_close (binaryfile);
|
||||
else
|
||||
machosize = grub_macho_filesize32 (macho);
|
||||
{
|
||||
if (grub_xnu_is_64bit)
|
||||
machosize = grub_macho_filesize64 (macho);
|
||||
else
|
||||
machosize = grub_macho_filesize32 (macho);
|
||||
}
|
||||
neededspace += machosize;
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue