merge mtrunk into xnu
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 18 Dec 2009 02:57:32 +0000 (03:57 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 18 Dec 2009 02:57:32 +0000 (03:57 +0100)
16 files changed:
1  2 
conf/common.rmk
conf/i386-efi.rmk
conf/i386-pc.rmk
conf/x86_64-efi.rmk
fs/i386/pc/pxe.c
fs/ntfs.c
gendistlist.sh
include/grub/autoefi.h
include/grub/efi/efi.h
include/grub/i386/xnu.h
include/grub/misc.h
include/grub/xnu.h
kern/misc.c
loader/i386/xnu.c
loader/xnu.c
util/grub.d/30_os-prober.in

diff --cc conf/common.rmk
Simple merge
@@@ -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)
@@@ -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)
@@@ -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)
Simple merge
diff --cc fs/ntfs.c
Simple merge
diff --cc gendistlist.sh
index 36685a0,102c0c1..102c0c1
mode 100755,100644..100755
Simple merge
@@@ -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);
  #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;
@@@ -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
Simple merge
@@@ -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 kern/misc.c
Simple merge
  #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
@@@ -48,29 -46,6 +50,14 @@@ struct tbl_alias table_aliases[] 
      {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)
  {
@@@ -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)
    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);
 +}
diff --cc loader/xnu.c
  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");
    /* 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);
@@@ -37,56 -37,6 +37,56 @@@ if [ -z "${OSPROBED}" ] ; the
    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 '^' ' '`"