snow32 support.

This commit is contained in:
phcoder 2009-08-30 14:26:41 +02:00
parent 64bf71d0b1
commit 965632c10f
3 changed files with 50 additions and 1 deletions

View file

@ -64,7 +64,7 @@ struct grub_xnu_boot_params
/* Size of grub_efi_uintn_t in bits. */ /* Size of grub_efi_uintn_t in bits. */
grub_uint8_t efi_uintnbits; grub_uint8_t efi_uintnbits;
} __attribute__ ((packed)); } __attribute__ ((packed));
#define GRUB_XNU_BOOTARGS_VERMINOR 4 #define GRUB_XNU_BOOTARGS_VERMINOR 5
#define GRUB_XNU_BOOTARGS_VERMAJOR 1 #define GRUB_XNU_BOOTARGS_VERMAJOR 1
extern grub_uint32_t grub_xnu_entry_point; extern grub_uint32_t grub_xnu_entry_point;

View file

@ -76,6 +76,8 @@ struct grub_xnu_extheader
grub_uint32_t infoplistsize; grub_uint32_t infoplistsize;
grub_uint32_t binaryaddr; grub_uint32_t binaryaddr;
grub_uint32_t binarysize; grub_uint32_t binarysize;
grub_uint32_t nameaddr;
grub_uint32_t namesize;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct grub_xnu_devtree_key *grub_xnu_create_key (struct grub_xnu_devtree_key **parent, struct grub_xnu_devtree_key *grub_xnu_create_key (struct grub_xnu_devtree_key **parent,

View file

@ -494,6 +494,34 @@ grub_xnu_register_memory (char *prefix, int *suffix,
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
static inline char *
get_name_ptr (char *name)
{
char *p = name, *p2;
/* Skip Info.plist. */
p2 = grub_strrchr (p, '/');
if (!p2)
return name;
if (p2 == name)
return name + 1;
p = p2 - 1;
p2 = grub_strrchr (p, '/');
if (!p2)
return name;
if (p2 == name)
return name + 1;
if (grub_memcmp (p2, "/Contents/", sizeof ("/Contents/") - 1) != 0)
return p2 + 1;
p = p2 - 1;
p2 = grub_strrchr (p, '/');
if (!p2)
return name;
return p2 + 1;
}
/* Load .kext. */ /* Load .kext. */
static grub_err_t static grub_err_t
grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile) grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile)
@ -505,6 +533,18 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile)
int neededspace = sizeof (*exthead); int neededspace = sizeof (*exthead);
char *buf; char *buf;
grub_size_t infoplistsize = 0, machosize = 0; grub_size_t infoplistsize = 0, machosize = 0;
char *name, *nameend;
int namelen;
name = get_name_ptr (infoplistname);
nameend = grub_strchr (name, '/');
if (nameend)
namelen = nameend - name;
else
namelen = grub_strlen (name);
neededspace += namelen + 1;
if (! grub_xnu_heap_size) if (! grub_xnu_heap_size)
return grub_error (GRUB_ERR_BAD_OS, "no xnu kernel loaded"); return grub_error (GRUB_ERR_BAD_OS, "no xnu kernel loaded");
@ -581,9 +621,16 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile)
} }
grub_file_close (infoplist); grub_file_close (infoplist);
buf[infoplistsize] = 0; buf[infoplistsize] = 0;
buf += infoplistsize + 1;
} }
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
exthead->nameaddr = (buf - grub_xnu_heap_start) + grub_xnu_heap_will_be_at;
exthead->namesize = namelen + 1;
grub_memcpy (buf, name, namelen);
buf[namelen] = 0;
buf += namelen + 1;
/* Announce to kernel */ /* Announce to kernel */
return grub_xnu_register_memory ("Driver-", &driversnum, exthead, return grub_xnu_register_memory ("Driver-", &driversnum, exthead,
neededspace); neededspace);