All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: State of GRUB on PowerPC
@ 2009-01-27  7:19 Michel Dänzer
  2009-01-27 16:54 ` Vesa Jääskeläinen
                   ` (2 more replies)
  0 siblings, 3 replies; 20+ messages in thread
From: Michel Dänzer @ 2009-01-27  7:19 UTC (permalink / raw)
  To: Grub-devel

[-- Attachment #1: Type: text/plain, Size: 1468 bytes --]


I was able to reproduce Jordi's findings on my PowerBook G4. (Well,
except device.map seems to get generated correctly and the search
command seems to work for me, maybe this is due to differences between
our OF device trees or something like that)

After some printf-style debugging over the weekend, the failure to load
some modules indeed turns out to be an hfs.mod bug: the problem is that
strncasecmp() doesn't match the HFS B-tree sort order, which in
particular breaks lookup of files with an underscore in their name. The
first attached patch fixes this using a lookup table from Linux
fs/hfs/string.c.

The failure to auto-load some modules like search was also caused by
this, the auto-loading process aborts after failing to load a module. It
might be better to continue auto-loading other modules anyway.


BTW, I also need the second attached patch to be able to boot my
self-built 32 bit kernels configured to support 2GB lowmem.
elf->ehdr.ehdr32.e_entry ends up as 0x70000000.


P.S. Please reconsider automatically rejecting posts from
non-subscribers. I co-moderate half a dozen mailing lists, only costs me
a couple of minutes a day thanks to a nice tool called 'listadmin'.

I probably won't be subscribed to this list for long, please keep me
CC'd on followups.

-- 
Earthling Michel Dänzer           |                http://www.vmware.com
Libre software enthusiast         |          Debian, X and DRI developer

[-- Attachment #2: grub2-hfs.diff --]
[-- Type: text/x-patch, Size: 2716 bytes --]

--- grub2-1.96+20081201.orig/fs/hfs.c	2008-01-23 21:21:18.000000000 +0100
+++ grub2-1.96+20081201/fs/hfs.c	2009-01-26 15:23:08.000000000 +0100
@@ -391,6 +391,34 @@ grub_hfs_mount (grub_disk_t disk)
 }
 
 
+/*
+ * unsigned char caseorder[]
+ *
+ * Defines the lexical ordering of characters on the Macintosh
+ *
+ * Composition of the 'casefold' and 'order' tables from ARDI's code
+ * with the entry for 0x20 changed to match that for 0xCA to remove
+ * special case for those two characters.
+ */
+static unsigned char caseorder[256] = {
+	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
+	0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
+	0x20,0x22,0x23,0x28,0x29,0x2A,0x2B,0x2C,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,
+	0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,
+	0x47,0x48,0x57,0x59,0x5D,0x5F,0x66,0x68,0x6A,0x6C,0x72,0x74,0x76,0x78,0x7A,0x7E,
+	0x8C,0x8E,0x90,0x92,0x95,0x97,0x9E,0xA0,0xA2,0xA4,0xA7,0xA9,0xAA,0xAB,0xAC,0xAD,
+	0x4E,0x48,0x57,0x59,0x5D,0x5F,0x66,0x68,0x6A,0x6C,0x72,0x74,0x76,0x78,0x7A,0x7E,
+	0x8C,0x8E,0x90,0x92,0x95,0x97,0x9E,0xA0,0xA2,0xA4,0xA7,0xAF,0xB0,0xB1,0xB2,0xB3,
+	0x4A,0x4C,0x5A,0x60,0x7B,0x7F,0x98,0x4F,0x49,0x51,0x4A,0x4B,0x4C,0x5A,0x60,0x63,
+	0x64,0x65,0x6E,0x6F,0x70,0x71,0x7B,0x84,0x85,0x86,0x7F,0x80,0x9A,0x9B,0x9C,0x98,
+	0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0x94,0xBB,0xBC,0xBD,0xBE,0xBF,0xC0,0x4D,0x81,
+	0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0x55,0x8A,0xCC,0x4D,0x81,
+	0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0x26,0x27,0xD4,0x20,0x49,0x4B,0x80,0x82,0x82,
+	0xD5,0xD6,0x24,0x25,0x2D,0x2E,0xD7,0xD8,0xA6,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
+	0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
+	0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
+};
+
 /* Compare the K1 and K2 catalog file keys.  */
 static int
 grub_hfs_cmp_catkeys (struct grub_hfs_catalog_key *k1,
@@ -398,17 +426,19 @@ grub_hfs_cmp_catkeys (struct grub_hfs_ca
 {
   int cmp = (grub_be_to_cpu32 (k1->parent_dir)
 	     - grub_be_to_cpu32 (k2->parent_dir));
+  int i;
   
   if (cmp != 0)
     return cmp;
-  
-  cmp = grub_strncasecmp ((char *) (k1->str), (char *) (k2->str), k1->strlen);
-  
-  /* This is required because the compared strings are not of equal
-     length.  */
-  if (cmp == 0 && k1->strlen < k2->strlen)
-    return -1;
-  return cmp;
+
+  for (i = 0; i < k1->strlen && i < k2->strlen; i++) {
+    cmp = caseorder[k1->str[i]] - caseorder[k2->str[i]];
+
+    if (cmp != 0)
+      return cmp;
+  }
+
+  return k1->strlen - k2->strlen;
 }
 
 

[-- Attachment #3: grub2-ELF32_LOADMASK.diff --]
[-- Type: text/x-patch, Size: 568 bytes --]

diff -up -ru grub2-1.96+20081201.orig/loader/powerpc/ieee1275/linux.c grub2-1.96+20081201/loader/powerpc/ieee1275/linux.c
--- grub2-1.96+20081201.orig/loader/powerpc/ieee1275/linux.c	2007-07-22 01:32:33.000000000 +0200
+++ grub2-1.96+20081201/loader/powerpc/ieee1275/linux.c	2009-01-24 16:14:32.000000000 +0100
@@ -27,7 +27,7 @@
 #include <grub/ieee1275/ieee1275.h>
 #include <grub/machine/loader.h>
 
-#define ELF32_LOADMASK (0xc0000000UL)
+#define ELF32_LOADMASK (0xf0000000UL)
 #define ELF64_LOADMASK (0xc000000000000000ULL)
 
 static grub_dl_t my_mod;

^ permalink raw reply	[flat|nested] 20+ messages in thread
* State of GRUB on PowerPC
@ 2008-12-19  0:00 Jordi Mallach
  2008-12-19 11:47 ` Manoel Rebelo Abranches
  2008-12-21 18:37 ` Jordi Mallach
  0 siblings, 2 replies; 20+ messages in thread
From: Jordi Mallach @ 2008-12-19  0:00 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 3065 bytes --]

Hello list,

Many months after my last try, I've given GRUB2 a go on my G4-based Apple
laptop.

For this, I used Debian's 1st of December snapshot packaged to experimental.

Thanks to daChaac, the IRC hero once again ;) the executive summary changed
from "frustrating failure" to "works with quite a few quirks".

 - grub-install generated an incorrect device.map. I've discussed this here
   before: my OpenFirmware calls my hard disk "hd", not "hd0", but
   grub-mkdevicemap will insist in adding the number. I corrected that
   manually.
 - GRUB2 will load correctly and will display a menu, but will fail to load
   Linux, giving a fun error "initrd: command not found". Some modules
   needed by my grub.cfg are missing: _linux, linux, elf and search.

Loading linux.mod was challenging. `insmod linux` would result in a "file
not found" error. I have two partitions that matter when booting:
hd,2 is the Apple_bootstrap hfs partition, and holds all my grub stuff.
hd,3 is my Debian partition, and holds /usr/lib/grub.

daChaac helped me finding the deps for linux.mod, and loading them
sequentially made the module load:

grub> insmod elf
grub> insmod (hd,3)/usr/lib/grub/powerpc-ieee1275/_linux.mod
grub> insmod (hd,3)/usr/lib/grub/powerpc-ieee1275/linux.mod

This gets linux loaded, and things start to be smoother.

However, going back to the menu and trying to boot fails with "you need
to load your kernel first". Damn.

Right, my menu entry includes a search command, which isn't loaded

grub> insmod search

But this still fails miseraby.

On the command-line, I copied the "search --fs-uuid --set" line from my
grub.cfg, and
1) it printed "no such device" and errored out ($?=12,
GRUB_ERR_UNKNOWN_DEVICE)
2) set my root variable to (second-boot).

Our guess is that this second-boot device has the same uuid as hd or hd,3
and that makes search fail or whatever.

if I do "ls", I get hd + its partitions, ide0, ide1, first-boot and
second-boot. `ls (first-boot)` gives:
Device first-boot: partition table
and `ls (first-boot)/` gives the "unknown filesystem" error.

Finally, if I get rid of the search command and change my root device to simply
/dev/hda3, linux is able to boot and I remain happy.

So, in short, a few problems:

- grub-mkdevicemap insists on calling my drive by another name (hd0 vs hd)
- what's going on with linux.mod loading? I won't rule out a hfs fs bug,
  and I'll format to find out, but it could be a hfs.mod bug too. Some
  modules load, some others don't.
- why wasn't search.mod loaded?
- what to do about second-boot confusing search?

Ah, also, my menu appears as white on red colours, but this is so minor at
this point I was not even going to mention it. :)

Hopefully some OF expert can have a look at some of this.

Thanks,
Jordi
-- 
Jordi Mallach Pérez  --  Debian developer     http://www.debian.org/
jordi@sindominio.net     jordi@debian.org     http://www.sindominio.net/
GnuPG public key information available at http://oskuro.net/

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2009-02-21 13:01 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-27  7:19 State of GRUB on PowerPC Michel Dänzer
2009-01-27 16:54 ` Vesa Jääskeläinen
2009-01-27 17:15   ` Michel Dänzer
2009-01-29  2:57 ` Pavel Roskin
2009-01-29 16:18   ` Michel Dänzer
2009-02-07 19:48 ` hfs patch (Re: State of GRUB on PowerPC) Robert Millan
2009-02-08  4:38   ` Pavel Roskin
2009-02-09 14:19     ` Robert Millan
2009-02-10  9:55       ` Michel Dänzer
2009-02-10  9:54     ` Michel Dänzer
2009-02-10 10:50       ` Jordi Mallach
2009-02-10 12:06         ` Jordi Mallach
2009-02-10 12:12           ` Michel Dänzer
2009-02-21 12:46         ` Robert Millan
2009-02-10 14:47       ` Robert Millan
2009-02-11  9:24         ` Michel Dänzer
2009-02-21 13:01           ` Robert Millan
  -- strict thread matches above, loose matches on Subject: below --
2008-12-19  0:00 State of GRUB on PowerPC Jordi Mallach
2008-12-19 11:47 ` Manoel Rebelo Abranches
2008-12-21 18:37 ` Jordi Mallach

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.