[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: grub-probe fails to find PC partition due to Apple disklabel

From: Chris Knadle
Subject: Re: grub-probe fails to find PC partition due to Apple disklabel
Date: Tue, 22 Jul 2008 22:53:49 -0400
User-agent: KMail/1.9.9

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:

   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?

   -- Chris


Chris Knadle

reply via email to

[Prev in Thread] Current Thread [Next in Thread]