From: Vladimir 'phcoder' Serbinenko Date: Fri, 18 Dec 2009 02:57:32 +0000 (+0100) Subject: merge mtrunk into xnu X-Git-Tag: 1.98~307^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7ea73643f5d793fd09011af81ae6149f71423aaf;p=thirdparty%2Fgrub.git merge mtrunk into xnu --- 7ea73643f5d793fd09011af81ae6149f71423aaf diff --cc conf/i386-efi.rmk index 27566b901,629b83999..261fe4092 --- a/conf/i386-efi.rmk +++ b/conf/i386-efi.rmk @@@ -196,10 -143,19 +143,19 @@@ fixvideo_mod_SOURCES = commands/efi/fix 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) diff --cc conf/i386-pc.rmk index 108ffe467,031c24adf..046c71641 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@@ -243,9 -183,8 +183,8 @@@ linux_mod_CFLAGS = $(COMMON_CFLAGS 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) diff --cc conf/x86_64-efi.rmk index c9d0083ba,ee511e1bd..0d1289c6f --- a/conf/x86_64-efi.rmk +++ b/conf/x86_64-efi.rmk @@@ -196,10 -149,19 +149,19 @@@ fixvideo_mod_SOURCES = commands/efi/fix 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) diff --cc gendistlist.sh index 36685a092,102c0c11c..102c0c11c mode 100755,100644..100755 --- a/gendistlist.sh +++ b/gendistlist.sh diff --cc include/grub/efi/efi.h index 97051f297,43f152981..b12205ad3 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h @@@ -54,13 -54,7 +54,11 @@@ char *EXPORT_FUNC(grub_efi_get_filename 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); diff --cc include/grub/i386/xnu.h index a05d67fc3,306dc7b65..3be2c3bcc --- a/include/grub/i386/xnu.h +++ b/include/grub/i386/xnu.h @@@ -20,7 -20,9 +20,10 @@@ #define GRUB_CPU_XNU_H 1 #include +#include + #include + + #define XNU_RELOCATOR(x) (grub_relocator32_ ## x) #define GRUB_XNU_PAGESIZE 4096 typedef grub_uint32_t grub_xnu_ptr_t; @@@ -111,10 -75,7 +114,8 @@@ 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); 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 diff --cc include/grub/xnu.h index b0146728c,cf778cf6b..6ce17c25e --- a/include/grub/xnu.h +++ b/include/grub/xnu.h @@@ -102,10 -101,7 +103,10 @@@ grub_err_t grub_xnu_scan_dir_for_kexts 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 diff --cc loader/i386/xnu.c index 857d6b63c,6a3535950..b1509cdc8 --- a/loader/i386/xnu.c +++ b/loader/i386/xnu.c @@@ -25,15 -25,13 +25,17 @@@ #include #include #include +#include #include #include +#include #include +#include +#include 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 @@@ -48,29 -46,6 +50,14 @@@ struct tbl_alias table_aliases[] {GRUB_EFI_ACPI_TABLE_GUID, "ACPI"}, }; +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; +}; + - /* 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 - static int utf16_strlen (grub_uint16_t *in) { @@@ -853,23 -434,8 +853,24 @@@ grub_xnu_boot (void 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) @@@ -926,24 -456,6 +927,25 @@@ memory_map = grub_xnu_heap_malloc (memory_map_size); if (! memory_map) return grub_errno; + 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 = ((char *) devtree - grub_xnu_heap_start) ++ 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, @@@ -1003,40 -531,38 +1005,32 @@@ 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_autoefi_set_virtual_address_map (memory_map_size, descriptor_size, + descriptor_version,memory_map); + - grub_xnu_launch (); - - /* Never reaches here. */ - return 0; + 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); +} diff --cc loader/xnu.c index 523443a1c,cc6d55ae2..7d33f8ea4 --- a/loader/xnu.c +++ b/loader/xnu.c @@@ -36,8 -35,10 +36,11 @@@ 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 @@@ -634,20 -496,8 +627,20 @@@ grub_xnu_load_driver (char *infoplistna 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"); @@@ -698,14 -545,10 +691,14 @@@ /* 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; @@@ -735,12 -577,6 +728,13 @@@ } 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); diff --cc util/grub.d/30_os-prober.in index 9577926be,5c95e5f88..a8662b63d --- a/util/grub.d/30_os-prober.in +++ b/util/grub.d/30_os-prober.in @@@ -37,56 -37,6 +37,56 @@@ if [ -z "${OSPROBED}" ] ; the exit 0 fi +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 vbe ++ 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 '^' ' '`"