Support v2 xnu boot arguments.

* grub-core/loader/i386/xnu.c (grub_cpu_xnu_fill_devicetree):
	New argument fsbfreq_out.
	(grub_xnu_set_video): Receive an argument grub_xnu_boot_params_common.
	(grub_xnu_boot): Support v2 arguments. Disable PIC so that APIC can
	be used.
	* grub-core/loader/machoXX.c (grub_macho_load): New argument
	darwin_version.
	* grub-core/loader/xnu.c (grub_xnu_darwin_version): New variable.
	* include/grub/i386/xnu.h (grub_xnu_boot_params_common): New struct.
	(grub_xnu_boot_params): Rename to ...
	(grub_xnu_boot_params_v1): ...this. Use grub_xnu_boot_params_common.
	(grub_xnu_boot_params_v2): New struct.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-02-28 04:04:19 +01:00
parent dc693fe67c
commit 83ddae2333
7 changed files with 154 additions and 52 deletions

View file

@ -164,7 +164,7 @@ SUFFIX (grub_macho_size) (grub_macho_t macho, grub_macho_addr_t *segments_start,
/* Load every loadable segment into memory specified by `_load_hook'. */
grub_err_t
SUFFIX (grub_macho_load) (grub_macho_t macho, const char *filename,
char *offset, int flags)
char *offset, int flags, int *darwin_version)
{
auto int NESTED_FUNC_ATTR do_load(grub_macho_t _macho,
struct grub_macho_cmd *hdr0,
@ -201,6 +201,23 @@ SUFFIX (grub_macho_load) (grub_macho_t macho, const char *filename,
return 1;
}
if (darwin_version)
{
const char *ptr = offset + hdr->vmaddr;
const char *end = ptr + min (hdr->filesize, hdr->vmsize)
- (sizeof ("Darwin Kernel Version ") - 1);
for (; ptr < end; ptr++)
if (grub_memcmp (ptr, "Darwin Kernel Version ",
sizeof ("Darwin Kernel Version ") - 1) == 0)
{
ptr += sizeof ("Darwin Kernel Version ") - 1;
*darwin_version = 0;
end += (sizeof ("Darwin Kernel Version ") - 1);
while (ptr < end && grub_isdigit (*ptr))
*darwin_version = (*ptr++ - '0') + *darwin_version * 10;
break;
}
}
}
if (hdr->filesize < hdr->vmsize)
@ -209,6 +226,9 @@ SUFFIX (grub_macho_load) (grub_macho_t macho, const char *filename,
return 0;
}
if (darwin_version)
*darwin_version = 0;
grub_macho_cmds_iterate (macho, do_load, 0);
return grub_errno;