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

@ -28,10 +28,8 @@
#define GRUB_XNU_PAGESIZE 4096
typedef grub_uint32_t grub_xnu_ptr_t;
struct grub_xnu_boot_params
struct grub_xnu_boot_params_common
{
grub_uint16_t verminor;
grub_uint16_t vermajor;
/* Command line passed to xnu. */
grub_uint8_t cmdline[1024];
@ -59,17 +57,50 @@ struct grub_xnu_boot_params
grub_xnu_ptr_t heap_start;
/* Last used address by kernel or boot structures minus previous value. */
grub_uint32_t heap_size;
/* First memory page containing runtime code or data. */
grub_uint32_t efi_runtime_first_page;
/* First memory page containing runtime code or data minus previous value. */
grub_uint32_t efi_runtime_npages;
} __attribute__ ((packed));
struct grub_xnu_boot_params_v1
{
grub_uint16_t verminor;
grub_uint16_t vermajor;
struct grub_xnu_boot_params_common common;
grub_uint32_t efi_system_table;
/* Size of grub_efi_uintn_t in bits. */
grub_uint8_t efi_uintnbits;
} __attribute__ ((packed));
#define GRUB_XNU_BOOTARGS_VERMINOR 5
#define GRUB_XNU_BOOTARGS_VERMAJOR 1
#define GRUB_XNU_BOOTARGSV1_VERMINOR 5
#define GRUB_XNU_BOOTARGSV1_VERMAJOR 1
struct grub_xnu_boot_params_v2
{
grub_uint16_t verminor;
grub_uint16_t vermajor;
/* Size of grub_efi_uintn_t in bits. */
grub_uint8_t efi_uintnbits;
grub_uint8_t unused[3];
struct grub_xnu_boot_params_common common;
grub_uint64_t efi_runtime_first_page_virtual;
grub_uint32_t efi_system_table;
grub_uint32_t unused2[11];
grub_uint64_t fsbfreq;
grub_uint32_t unused3[734];
} __attribute__ ((packed));
#define GRUB_XNU_BOOTARGSV2_VERMINOR 0
#define GRUB_XNU_BOOTARGSV2_VERMAJOR 2
union grub_xnu_boot_params_any
{
struct grub_xnu_boot_params_v1 v1;
struct grub_xnu_boot_params_v2 v2;
};
struct grub_xnu_devprop_header
{
@ -114,5 +145,4 @@ extern grub_uint32_t grub_xnu_stack;
extern grub_uint32_t grub_xnu_arg1;
extern char grub_xnu_cmdline[1024];
grub_err_t grub_xnu_boot (void);
grub_err_t grub_cpu_xnu_fill_devicetree (void);
#endif

View file

@ -58,9 +58,9 @@ grub_uint64_t grub_macho_get_entry_point64 (grub_macho_t macho);
/* Ignore BSS segments when loading. */
#define GRUB_MACHO_NOBSS 0x1
grub_err_t grub_macho_load32 (grub_macho_t macho, const char *filename,
char *offset, int flags);
char *offset, int flags, int *darwin_version);
grub_err_t grub_macho_load64 (grub_macho_t macho, const char *filename,
char *offset, int flags);
char *offset, int flags, int *darwin_version);
/* Like filesize and file_read but take only 32-bit part
for current architecture. */

View file

@ -115,4 +115,5 @@ typedef enum {GRUB_XNU_BITMAP_CENTER, GRUB_XNU_BITMAP_STRETCH}
extern grub_xnu_bitmap_mode_t grub_xnu_bitmap_mode;
extern int grub_xnu_is_64bit;
extern grub_addr_t grub_xnu_heap_target_start;
extern int grub_xnu_darwin_version;
#endif