]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
snow32 support.
authorphcoder <phcoder@debian.easynote.phnet.easynote.phnet>
Sun, 30 Aug 2009 12:26:41 +0000 (14:26 +0200)
committerphcoder <phcoder@debian.easynote.phnet.easynote.phnet>
Sun, 30 Aug 2009 12:26:41 +0000 (14:26 +0200)
include/grub/i386/xnu.h
include/grub/xnu.h
loader/xnu.c

index 68674e6053830225a43fc3c9591d8ea62ff40966..57ba0f0b6fbc5cdcab144f58ff0587012c5bfc0f 100644 (file)
@@ -64,7 +64,7 @@ struct grub_xnu_boot_params
   /* Size of grub_efi_uintn_t in bits. */
   grub_uint8_t efi_uintnbits;
 } __attribute__ ((packed));
-#define GRUB_XNU_BOOTARGS_VERMINOR 4
+#define GRUB_XNU_BOOTARGS_VERMINOR 5
 #define GRUB_XNU_BOOTARGS_VERMAJOR 1
 
 extern grub_uint32_t grub_xnu_entry_point;
index c3902e670d02cf08f163820e2297edd7423529f1..67d78d92c7e5c0de22fdca061a17d3872ed08d76 100644 (file)
@@ -76,6 +76,8 @@ struct grub_xnu_extheader
   grub_uint32_t infoplistsize;
   grub_uint32_t binaryaddr;
   grub_uint32_t binarysize;
+  grub_uint32_t nameaddr;
+  grub_uint32_t namesize;
 } __attribute__ ((packed));
 
 struct grub_xnu_devtree_key *grub_xnu_create_key (struct grub_xnu_devtree_key **parent,
index aac4ae372607c384a5288b1f5d4c9f71627ef998..1f29b69a13339f643b77adc3595819be531ad4f3 100644 (file)
@@ -494,6 +494,34 @@ grub_xnu_register_memory (char *prefix, int *suffix,
   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. */
 static grub_err_t
 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);
   char *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");
@@ -581,9 +621,16 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile)
        }
       grub_file_close (infoplist);
       buf[infoplistsize] = 0;
+      buf += infoplistsize + 1;
     }
   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 */
   return grub_xnu_register_memory ("Driver-", &driversnum, exthead,
                                   neededspace);