From 8aab5e25a1ee3fa11b7d19f1e015b68fa654206e Mon Sep 17 00:00:00 2001 From: phcoder Date: Sat, 1 Aug 2009 14:40:30 +0000 Subject: [PATCH] 2009-08-01 Vladimir Serbinenko 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'. --- ChangeLog | 8 ++++++++ partmap/apple.c | 29 ++++++++++++++++++----------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 23c68d25c..76e8c680c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-08-01 Vladimir Serbinenko + + 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 2009-08-01 Robert Millan diff --git a/partmap/apple.c b/partmap/apple.c index fce2f2c5f..04ccff146 100644 --- a/partmap/apple.c +++ b/partmap/apple.c @@ -30,6 +30,7 @@ struct grub_apple_header /* The magic number to identify the partition map, it should have the value `0x4552'. */ grub_uint16_t magic; + grub_uint16_t blocksize; }; struct grub_apple_part @@ -105,8 +106,8 @@ apple_partition_map_iterate (grub_disk_t disk, struct grub_apple_header aheader; struct grub_apple_part apart; struct grub_disk raw; - int partno = 0; - unsigned pos = GRUB_DISK_SECTOR_SIZE; + int partno = 0, partnum = 0; + unsigned pos; /* Enforce raw disk access. */ raw = *disk; @@ -126,7 +127,9 @@ apple_partition_map_iterate (grub_disk_t disk, goto fail; } - for (;;) + pos = grub_be_to_cpu16 (aheader.blocksize); + + do { if (grub_disk_read (&raw, pos / GRUB_DISK_SECTOR_SIZE, pos % GRUB_DISK_SECTOR_SIZE, @@ -142,8 +145,15 @@ apple_partition_map_iterate (grub_disk_t disk, break; } - part.start = grub_be_to_cpu32 (apart.first_phys_block); - part.len = grub_be_to_cpu32 (apart.blockcnt); + if (partnum == 0) + 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.index = partno; @@ -156,15 +166,12 @@ apple_partition_map_iterate (grub_disk_t disk, if (hook (disk, &part)) return grub_errno; - if (grub_be_to_cpu32 (apart.first_phys_block) - == GRUB_DISK_SECTOR_SIZE * 2) - return 0; - - pos += sizeof (struct grub_apple_part); + pos += grub_be_to_cpu16 (aheader.blocksize); partno++; } + while (partno < partnum); - if (pos != GRUB_DISK_SECTOR_SIZE) + if (partno != 0) return 0; fail: