2009-08-01 Vladimir Serbinenko <phcoder@gmail.com>

Support Apple partition map with sector size different from 512 bytes.

	* partmap/apple.c (grub_apple_header): New field 'blocksize'.
	(apple_partition_map_iterate): Respect 'aheader.blocksize'
	and 'apart.partmap_size'.
This commit is contained in:
phcoder 2009-08-01 14:40:30 +00:00
parent 6ad6258a28
commit 8aab5e25a1
2 changed files with 26 additions and 11 deletions

View file

@ -1,3 +1,11 @@
2009-08-01 Vladimir Serbinenko <phcoder@gmail.com>
Support Apple partition map with sector size different from 512 bytes.
* partmap/apple.c (grub_apple_header): New field 'blocksize'.
(apple_partition_map_iterate): Respect 'aheader.blocksize'
and 'apart.partmap_size'.
2009-08-01 Vladimir Serbinenko <phcoder@gmail.com> 2009-08-01 Vladimir Serbinenko <phcoder@gmail.com>
2009-08-01 Robert Millan <rmh.grub@aybabtu.com> 2009-08-01 Robert Millan <rmh.grub@aybabtu.com>

View file

@ -30,6 +30,7 @@ struct grub_apple_header
/* The magic number to identify the partition map, it should have /* The magic number to identify the partition map, it should have
the value `0x4552'. */ the value `0x4552'. */
grub_uint16_t magic; grub_uint16_t magic;
grub_uint16_t blocksize;
}; };
struct grub_apple_part struct grub_apple_part
@ -105,8 +106,8 @@ apple_partition_map_iterate (grub_disk_t disk,
struct grub_apple_header aheader; struct grub_apple_header aheader;
struct grub_apple_part apart; struct grub_apple_part apart;
struct grub_disk raw; struct grub_disk raw;
int partno = 0; int partno = 0, partnum = 0;
unsigned pos = GRUB_DISK_SECTOR_SIZE; unsigned pos;
/* Enforce raw disk access. */ /* Enforce raw disk access. */
raw = *disk; raw = *disk;
@ -126,7 +127,9 @@ apple_partition_map_iterate (grub_disk_t disk,
goto fail; goto fail;
} }
for (;;) pos = grub_be_to_cpu16 (aheader.blocksize);
do
{ {
if (grub_disk_read (&raw, pos / GRUB_DISK_SECTOR_SIZE, if (grub_disk_read (&raw, pos / GRUB_DISK_SECTOR_SIZE,
pos % GRUB_DISK_SECTOR_SIZE, pos % GRUB_DISK_SECTOR_SIZE,
@ -142,8 +145,15 @@ apple_partition_map_iterate (grub_disk_t disk,
break; break;
} }
part.start = grub_be_to_cpu32 (apart.first_phys_block); if (partnum == 0)
part.len = grub_be_to_cpu32 (apart.blockcnt); partnum = grub_be_to_cpu32 (apart.partmap_size);
part.start = ((grub_disk_addr_t) grub_be_to_cpu32 (apart.first_phys_block)
* grub_be_to_cpu16 (aheader.blocksize))
/ GRUB_DISK_SECTOR_SIZE;
part.len = ((grub_disk_addr_t) grub_be_to_cpu32 (apart.blockcnt)
* grub_be_to_cpu16 (aheader.blocksize))
/ GRUB_DISK_SECTOR_SIZE;
part.offset = pos; part.offset = pos;
part.index = partno; part.index = partno;
@ -156,15 +166,12 @@ apple_partition_map_iterate (grub_disk_t disk,
if (hook (disk, &part)) if (hook (disk, &part))
return grub_errno; return grub_errno;
if (grub_be_to_cpu32 (apart.first_phys_block) pos += grub_be_to_cpu16 (aheader.blocksize);
== GRUB_DISK_SECTOR_SIZE * 2)
return 0;
pos += sizeof (struct grub_apple_part);
partno++; partno++;
} }
while (partno < partnum);
if (pos != GRUB_DISK_SECTOR_SIZE) if (partno != 0)
return 0; return 0;
fail: fail: