fixvideo_mod_CFLAGS = $(COMMON_CFLAGS)
fixvideo_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ pkglib_MODULES += efi_uga.mod
+ efi_uga_mod_SOURCES = video/efi_uga.c
+ efi_uga_mod_CFLAGS = $(COMMON_CFLAGS)
+ efi_uga_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+ pkglib_MODULES += efi_gop.mod
+ efi_gop_mod_SOURCES = video/efi_gop.c
+ efi_gop_mod_CFLAGS = $(COMMON_CFLAGS)
+ efi_gop_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
pkglib_MODULES += xnu.mod
-xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c loader/i386/efi/xnu.c\
- loader/macho.c loader/xnu.c
+xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c loader/i386/efi/xnu.c \
- loader/macho32.c loader/macho64.c loader/macho.c loader/xnu.c \
- loader/i386/xnu_helper.S
++ loader/macho32.c loader/macho64.c loader/macho.c loader/xnu.c
xnu_mod_CFLAGS = $(COMMON_CFLAGS)
xnu_mod_LDFLAGS = $(COMMON_LDFLAGS)
xnu_mod_ASFLAGS = $(COMMON_ASFLAGS)
linux_mod_LDFLAGS = $(COMMON_LDFLAGS)
pkglib_MODULES += xnu.mod
-xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c loader/i386/pc/xnu.c\
- loader/macho.c loader/xnu.c
+xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c loader/i386/pc/xnu.c \
- loader/macho32.c loader/macho64.c loader/macho.c loader/xnu.c \
- loader/i386/xnu_helper.S
++ loader/macho32.c loader/macho64.c loader/macho.c loader/xnu.c
xnu_mod_CFLAGS = $(COMMON_CFLAGS)
xnu_mod_LDFLAGS = $(COMMON_LDFLAGS)
xnu_mod_ASFLAGS = $(COMMON_ASFLAGS)
fixvideo_mod_CFLAGS = $(COMMON_CFLAGS)
fixvideo_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ pkglib_MODULES += efi_uga.mod
+ efi_uga_mod_SOURCES = video/efi_uga.c
+ efi_uga_mod_CFLAGS = $(COMMON_CFLAGS)
+ efi_uga_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+ pkglib_MODULES += efi_gop.mod
+ efi_gop_mod_SOURCES = video/efi_gop.c
+ efi_gop_mod_CFLAGS = $(COMMON_CFLAGS)
+ efi_gop_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
pkglib_MODULES += xnu.mod
-xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c loader/i386/efi/xnu.c\
- loader/macho.c loader/xnu.c
+xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c loader/i386/efi/xnu.c \
- loader/macho32.c loader/macho64.c loader/macho.c loader/xnu.c \
- loader/i386/xnu_helper.S
++ loader/macho32.c loader/macho64.c loader/macho.c loader/xnu.c
xnu_mod_CFLAGS = $(COMMON_CFLAGS)
xnu_mod_LDFLAGS = $(COMMON_LDFLAGS)
xnu_mod_ASFLAGS = $(COMMON_ASFLAGS)
grub_efi_device_path_t *
EXPORT_FUNC(grub_efi_get_device_path) (grub_efi_handle_t handle);
int EXPORT_FUNC(grub_efi_exit_boot_services) (grub_efi_uintn_t map_key);
- void EXPORT_FUNC (grub_reboot) (void);
- void EXPORT_FUNC (grub_halt) (void);
int EXPORT_FUNC (grub_efi_finish_boot_services) (void);
+grub_err_t EXPORT_FUNC (grub_efi_set_virtual_address_map) (grub_efi_uintn_t memory_map_size,
+ grub_efi_uintn_t descriptor_size,
+ grub_efi_uint32_t descriptor_version,
+ grub_efi_memory_descriptor_t *virtual_map);
void grub_efi_mm_init (void);
void grub_efi_mm_fini (void);
#define GRUB_CPU_XNU_H 1
#include <grub/err.h>
+#include <grub/efi/api.h>
+ #include <grub/cpu/relocator.h>
+
+ #define XNU_RELOCATOR(x) (grub_relocator32_ ## x)
#define GRUB_XNU_PAGESIZE 4096
typedef grub_uint32_t grub_xnu_ptr_t;
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);
grub_err_t grub_xnu_set_video (struct grub_xnu_boot_params *bootparams_relloc);
+grub_err_t
+grub_cpu_xnu_fill_devicetree (void);
extern grub_uint32_t grub_xnu_heap_will_be_at;
- extern grub_uint8_t grub_xnu_launcher_start[];
- extern grub_uint8_t grub_xnu_launcher_end[];
#endif
grub_err_t grub_xnu_load_kext_from_dir (char *dirname, char *osbundlerequired,
int maxrecursion);
void *grub_xnu_heap_malloc (int size);
+grub_err_t grub_xnu_fill_devicetree (void);
+extern grub_uint32_t grub_xnu_heap_real_start;
extern grub_size_t grub_xnu_heap_size;
- extern char *grub_xnu_heap_start;
+ extern void *grub_xnu_heap_start;
extern struct grub_video_bitmap *grub_xnu_bitmap;
+extern int grub_xnu_is_64bit;
#endif
#include <grub/loader.h>
#include <grub/autoefi.h>
#include <grub/i386/tsc.h>
+#include <grub/efi/api.h>
#include <grub/i386/pit.h>
#include <grub/misc.h>
+#include <grub/charset.h>
#include <grub/term.h>
+#include <grub/command.h>
+#include <grub/gzio.h>
char grub_xnu_cmdline[1024];
+ grub_uint32_t grub_xnu_heap_will_be_at;
+ grub_uint32_t grub_xnu_entry_point, grub_xnu_arg1, grub_xnu_stack;
/* Aliases set for some tables. */
struct tbl_alias
{GRUB_EFI_ACPI_TABLE_GUID, "ACPI"},
};
- /* The following function is used to be able to debug xnu loader
- with grub-emu. */
- #ifdef GRUB_UTIL
- static grub_err_t
- grub_xnu_launch (void)
- {
- grub_printf ("Fake launch %x:%p:%p", grub_xnu_entry_point, grub_xnu_arg1,
- grub_xnu_stack);
- grub_getkey ();
- return 0;
- }
- #else
- static void (*grub_xnu_launch) (void) = 0;
- #endif
-
+struct grub_xnu_devprop_device_descriptor
+{
+ struct grub_xnu_devprop_device_descriptor *next;
+ struct property_descriptor *properties;
+ struct grub_efi_device_path *path;
+ int pathlen;
+};
+
static int
utf16_strlen (grub_uint16_t *in)
{
void *devtree;
grub_size_t devtreelen;
int i;
+ struct grub_relocator32_state state;
+ err = grub_autoefi_prepare ();
+ if (err)
+ return err;
+
+ err = grub_cpu_xnu_fill_devprop ();
+ if (err)
+ return err;
+
+ err = grub_cpu_xnu_fill_devicetree ();
+ if (err)
+ return err;
+
+ err = grub_xnu_fill_devicetree ();
+ if (err)
+ return err;
+
/* Page-align to avoid following parts to be inadvertently freed. */
err = grub_xnu_align_heap (GRUB_XNU_PAGESIZE);
if (err)
memory_map = grub_xnu_heap_malloc (memory_map_size);
if (! memory_map)
return grub_errno;
- bootparams_relloc->devtree = ((char *) devtree - grub_xnu_heap_start)
+ mmap_relloc_off = (grub_uint8_t *) memory_map
+ - (grub_uint8_t *) grub_xnu_heap_start;
+
+ err = grub_xnu_writetree_toheap (&devtree, &devtreelen);
+ if (err)
+ return err;
+ bootparams_relloc = (struct grub_xnu_boot_params *)
+ (bootparams_relloc_off + (grub_uint8_t *) grub_xnu_heap_start);
+
+ grub_memcpy (bootparams_relloc->cmdline, grub_xnu_cmdline,
+ sizeof (bootparams_relloc->cmdline));
+
++ bootparams_relloc->devtree
++ = ((grub_uint8_t *) devtree - (grub_uint8_t *) grub_xnu_heap_start)
+ + grub_xnu_heap_will_be_at;
+ bootparams_relloc->devtreelen = devtreelen;
+
+ memory_map = (grub_efi_memory_descriptor_t *)
+ ((grub_uint8_t *) grub_xnu_heap_start + mmap_relloc_off);
if (grub_autoefi_get_memory_map (&memory_map_size, memory_map,
&map_key, &descriptor_size,
grub_xnu_stack = bootparams_relloc->heap_start
+ bootparams_relloc->heap_size + GRUB_XNU_PAGESIZE;
grub_xnu_arg1 = bootparams_relloc_off + grub_xnu_heap_will_be_at;
- #ifndef GRUB_UTIL
- grub_xnu_launch = (void (*) (void))
- (grub_xnu_heap_start + grub_xnu_heap_size);
- #endif
- grub_dprintf ("xnu", "eip=%x\n", grub_xnu_entry_point);
--
- grub_memcpy (grub_xnu_heap_start + grub_xnu_heap_size,
- grub_xnu_launcher_start,
- grub_xnu_launcher_end - grub_xnu_launcher_start);
- const char *debug = grub_env_get ("debug");
--
- if (debug && (grub_strword (debug, "all") || grub_strword (debug, "xnu")))
- {
- grub_printf ("Press any key to launch xnu\n");
- grub_getkey ();
- }
- /* Set video. */
- err = grub_xnu_set_video (bootparams_relloc);
- if (err != GRUB_ERR_NONE)
- {
- grub_print_error ();
- grub_errno = GRUB_ERR_NONE;
- grub_printf ("Booting in blind mode\n");
-
- bootparams_relloc->lfb_mode = 0;
- bootparams_relloc->lfb_width = 0;
- bootparams_relloc->lfb_height = 0;
- bootparams_relloc->lfb_depth = 0;
- bootparams_relloc->lfb_line_len = 0;
- bootparams_relloc->lfb_base = 0;
- }
-
- if (! grub_autoefi_finish_boot_services ())
+ if (! grub_autoefi_exit_boot_services (map_key))
return grub_error (GRUB_ERR_IO, "can't exit boot services");
- grub_xnu_launch ();
-
- /* Never reaches here. */
- return 0;
+ grub_autoefi_set_virtual_address_map (memory_map_size, descriptor_size,
+ descriptor_version,memory_map);
+
+ state.eip = grub_xnu_entry_point;
+ state.eax = grub_xnu_arg1;
+ state.esp = grub_xnu_stack;
+ return grub_relocator32_boot (grub_xnu_heap_start, grub_xnu_heap_will_be_at,
+ state);
}
+
+static grub_command_t cmd_devprop_load;
+
+void
+grub_cpu_xnu_init (void)
+{
+ cmd_devprop_load = grub_register_command ("xnu_devprop_load",
+ grub_cmd_devprop_load,
+ 0, "Load device-properties dump.");
+}
+
+void
+grub_cpu_xnu_fini (void)
+{
+ grub_unregister_command (cmd_devprop_load);
+}
struct grub_xnu_devtree_key *grub_xnu_devtree_root = 0;
static int driverspackagenum = 0;
static int driversnum = 0;
+int grub_xnu_is_64bit = 0;
+ void *grub_xnu_heap_start = 0;
+ grub_size_t grub_xnu_heap_size = 0;
+
/* Allocate heap by 32MB-blocks. */
#define GRUB_XNU_HEAP_ALLOC_BLOCK 0x2000000
grub_file_t infoplist;
struct grub_xnu_extheader *exthead;
int neededspace = sizeof (*exthead);
- char *buf;
+ grub_uint8_t *buf;
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)
return grub_error (GRUB_ERR_BAD_OS, "no xnu kernel loaded");
/* Load the binary. */
if (macho)
{
- exthead->binaryaddr = (buf - grub_xnu_heap_start)
+ exthead->binaryaddr = (buf - (grub_uint8_t *) grub_xnu_heap_start)
+ grub_xnu_heap_will_be_at;
exthead->binarysize = machosize;
- if ((err = grub_macho32_readfile (macho, buf)))
+ if (grub_xnu_is_64bit)
+ err = grub_macho_readfile64 (macho, buf);
+ else
+ err = grub_macho_readfile32 (macho, buf);
+ if (err)
{
grub_macho_close (macho);
return err;
}
grub_errno = GRUB_ERR_NONE;
- exthead->nameaddr = (buf - grub_xnu_heap_start) + grub_xnu_heap_will_be_at;
++ exthead->nameaddr = (buf - (grub_uint8_t *) 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 */
return grub_xnu_register_memory ("Driver-", &driversnum, exthead,
neededspace);
exit 0
fi
- insmod vbe
+function osx_entry {
+ cat << EOF
+menuentry "${LONGNAME} (${2}-bit) (on ${DEVICE})" {
+EOF
+ prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
+ cat << EOF
++ insmod ${GRUB_VIDEO_BACKEND}
+ do_resume=0
+ if [ /var/vm/sleepimage -nt10 / ]; then
+ if xnu_resume /var/vm/sleepimage; then
+ do_resume=1
+ fi
+ fi
+ if [ \$do_resume == 0 ]; then
+ xnu_uuid ${OSXUUID} uuid
+ if [ -f /Extra/DSDT.aml ]; then
+ acpi -e /Extra/DSDT.aml
+ fi
+ $1 /mach_kernel boot-uuid=\${uuid} rd=*uuid
+ if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
+ xnu_mkext /System/Library/Extensions.mkext
+ else
+ xnu_kextdir /System/Library/Extensions
+ fi
+ if [ -f /Extra/Extensions.mkext ]; then
+ xnu_mkext /Extra/Extensions.mkext
+ fi
+ if [ -d /Extra/Extensions ]; then
+ xnu_kextdir /Extra/Extensions
+ fi
+ if [ -f /Extra/devprop.bin ]; then
+ xnu_devprop_load /Extra/devprop.bin
+ fi
+ if [ -f /Extra/splash.jpg ]; then
+ insmod jpeg
+ xnu_splash /Extra/splash.jpg
+ fi
+ if [ -f /Extra/splash.png ]; then
+ insmod png
+ xnu_splash /Extra/splash.png
+ fi
+ if [ -f /Extra/splash.tga ]; then
+ insmod tga
+ xnu_splash /Extra/splash.tga
+ fi
+ fi
+}
+EOF
+}
+
for OS in ${OSPROBED} ; do
DEVICE="`echo ${OS} | cut -d ':' -f 1`"
LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"