Felix Zielcke asked me about the Apple/PC hybrid disk problem, so I'm trying to figure out how to fix it. Sorry for letting this fall through the cracks; this is from three months ago.
On Monday 14 April 2008, Pavel Roskin wrote: > On Mon, 2008-04-14 at 10:21 -0400, Chris Knadle wrote: > > Instead of probing for partmaps in a particular order, it seems that > > solving for this might best be done by probing for all of the possible > > partmaps for the architecture and trying to figure out which one best > > fits. grub2's grub-probe is clearly already doing this; _however_, > > somehow the PC partmap probe is subtly different depending on whether > > partmap/apple.c is included in the search. > > Apple and PC partition maps can coexist. The place occupied by the > PC partition and the PC magic is not used by the Apple partition. Yeah, I see -- this includes the Apple magic of 0xAA55 that's placed in Sector 0, so searching for that won't help. > The way to differentiate them would be to check at the first sector. If > it starts with 0x45 0x52, then it's an Apple partition. A PC partition > would have an executable entry there. The Apple magic would decode to: > > inc %bp > push %dx > > It's highly unlikely to be used in the first two instructions of the PC > boot code. > > partmap/apple.c starts reading with the second sector (unsigned pos = > GRUB_DISK_SECTOR_SIZE). Perhaps it should read the first sector to > check the magic. I see where you got 0x4552 from; it's the HFS+ magic descriptor. For the moment I'm using the following #define for that: #define GRUB_APPLE_FIRST_SECTOR_MAGIC 0x4552 I'm trying to figure out how to get grub to check the first sector. Mainly I'm asking for hints. I think it involves running a new instance of grub_disk_read for the first sector (sector 0 of the partition) within the apple_partition_map_iterate function -- something like: grub_disk_read(&raw, 0, 0, sizeof (struct grub_apple_part), (char *)&apart)) But then I want to check the first block against 0x4552, and apart.first_phys_block is 32-bits. Since I want the first (high) 16 bits, I think I need to make the comparison in a way such as: if ((apart.first_phys_block & 0xFFFF0000) == (0x4552 << 16)) Is this vaguely on the right track? Thanks. -- Chris -- Chris Knadle [EMAIL PROTECTED] _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel