diff --git a/ChangeLog b/ChangeLog index 752bde8..1502765 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-07-28 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' + 2009-07-25 Felix Zielcke * kern/file.c (grub_file_open): Revert to previous check with diff --git a/partmap/apple.c b/partmap/apple.c index fce2f2c..c317908 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 @@ -106,7 +107,7 @@ apple_partition_map_iterate (grub_disk_t disk, struct grub_apple_part apart; struct grub_disk raw; int partno = 0; - unsigned pos = GRUB_DISK_SECTOR_SIZE; + unsigned pos; /* Enforce raw disk access. */ raw = *disk; @@ -126,6 +127,8 @@ apple_partition_map_iterate (grub_disk_t disk, goto fail; } + pos = grub_be_to_cpu16 (aheader.blocksize); + for (;;) { if (grub_disk_read (&raw, pos / GRUB_DISK_SECTOR_SIZE, @@ -142,8 +145,12 @@ 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); + 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; @@ -160,7 +167,7 @@ apple_partition_map_iterate (grub_disk_t disk, == GRUB_DISK_SECTOR_SIZE * 2) return 0; - pos += sizeof (struct grub_apple_part); + pos += grub_be_to_cpu16 (aheader.blocksize); partno++; }