| From 526f3ee2afbe7cd90d282915b7b580d4f356c4eb Mon Sep 17 00:00:00 2001 |
| From: Laurent Vivier <laurent@vivier.eu> |
| Date: Fri, 9 Dec 2016 15:10:53 +0100 |
| Subject: [PATCH 67/75] libparted: Fix MacOS boot support |
| |
| boot_region_length (or BootSize in the MacOS dialect) is the length |
| of the driver code in the driver partition. This length is used |
| to compute the checksum of the driver. |
| |
| libparted updates this value by setting the whole size of the partition |
| without computing the checksum of the driver using this size. |
| |
| As the checksum is wrong, the driver is broken and cannot be loaded |
| by the MacOS ROM, and thus the disk is not bootable anymore. |
| |
| Moreover, parted try to update the driver list and makes it disappear. |
| |
| As parted is not able to insert a driver in a partition, |
| the driver is generally inserted by the Apple HD Tool, |
| this patch removes the line updating the driver size. |
| |
| We also simplify the driver list scan and fix endianess use. |
| |
| This has been tested... and it works, now. |
| |
| I have updated a bootable disk with parted on x86_64 and |
| then been able to boot it (again) on a Mac LC III. |
| |
| Signed-off-by: Laurent Vivier <laurent@vivier.eu> |
| Signed-off-by: Brian C. Lane <bcl@redhat.com> |
| |
| libparted/labels/mac.c | 41 ++++++++++++++++++++--------------------- |
| 1 file changed, 20 insertions(+), 21 deletions(-) |
| |
| diff --git a/libparted/labels/mac.c b/libparted/labels/mac.c |
| index d8da941..fa4e43f 100644 |
| |
| |
| @@ -411,14 +411,14 @@ _rawpart_has_driver (const MacRawPartition* raw_part, MacDiskData* mac_disk_data |
| { |
| MacDeviceDriver *driverlist; |
| uint16_t i; |
| - uint32_t driver_bs, driver_be, part_be; |
| + uint32_t start_block, block_count; |
| |
| + start_block = PED_BE32_TO_CPU(raw_part->start_block); |
| + block_count = PED_BE32_TO_CPU(raw_part->block_count); |
| driverlist = &mac_disk_data->driverlist[0]; |
| for (i = 0; i < mac_disk_data->driver_count; i++) { |
| - driver_bs = driverlist->block; |
| - driver_be = driver_bs + driverlist->size; |
| - part_be = raw_part->start_block + raw_part->block_count; |
| - if (driver_bs >= raw_part->start_block && driver_be <= part_be) |
| + if (start_block == PED_BE32_TO_CPU(driverlist->block) && |
| + block_count == PED_BE16_TO_CPU(driverlist->size)) |
| return 1; |
| driverlist++; |
| } |
| @@ -751,11 +751,12 @@ mac_read (PedDisk* disk) |
| if (!ped_disk_delete_all (disk)) |
| goto error; |
| |
| - if (raw_disk->driver_count && raw_disk->driver_count < 62) { |
| + if (PED_BE16_TO_CPU(raw_disk->driver_count) && |
| + PED_BE16_TO_CPU(raw_disk->driver_count) < 62) { |
| memcpy(&mac_disk_data->driverlist[0], &raw_disk->driverlist[0], |
| sizeof(mac_disk_data->driverlist)); |
| - mac_disk_data->driver_count = raw_disk->driver_count; |
| - mac_disk_data->block_size = raw_disk->block_size; |
| + mac_disk_data->driver_count = PED_BE16_TO_CPU(raw_disk->driver_count); |
| + mac_disk_data->block_size = PED_BE16_TO_CPU(raw_disk->block_size); |
| } |
| |
| /* If _disk_analyse_block_size has increased the sector_size, |
| @@ -877,17 +878,16 @@ static void |
| _update_driver_count (MacRawPartition* part_map_entry, |
| MacDiskData *mac_driverdata, const MacDiskData* mac_disk_data) |
| { |
| - uint16_t i, count_orig, count_cur; |
| - uint32_t driver_bs, driver_be, part_be; |
| - |
| - count_cur = mac_driverdata->driver_count; |
| - count_orig = mac_disk_data->driver_count; |
| - for (i = 0; i < count_orig; i++) { |
| - driver_bs = mac_disk_data->driverlist[i].block; |
| - driver_be = driver_bs + mac_disk_data->driverlist[i].size; |
| - part_be = part_map_entry->start_block + part_map_entry->block_count; |
| - if (driver_bs >= part_map_entry->start_block |
| - && driver_be <= part_be) { |
| + uint16_t i; |
| + uint32_t start_block, block_count; |
| + |
| + start_block = PED_BE32_TO_CPU(part_map_entry->start_block); |
| + block_count = PED_BE32_TO_CPU(part_map_entry->block_count); |
| + |
| + for (i = 0; i < mac_disk_data->driver_count; i++) { |
| + if (start_block == PED_BE32_TO_CPU(mac_disk_data->driverlist[i].block) && |
| + block_count == PED_BE16_TO_CPU(mac_disk_data->driverlist[i].size)) { |
| + uint16_t count_cur = mac_driverdata->driver_count; |
| mac_driverdata->driverlist[count_cur].block |
| = mac_disk_data->driverlist[i].block; |
| mac_driverdata->driverlist[count_cur].size |
| @@ -934,7 +934,6 @@ _generate_raw_part (PedDisk* disk, PedPartition* part, |
| strncpy (part_map_entry->type, mac_part_data->system_name, 32); |
| |
| if (mac_part_data->is_driver) { |
| - mac_part_data->boot_region_length = part->geom.length; |
| if (mac_part_data->has_driver) |
| _update_driver_count(part_map_entry, mac_driverdata, |
| mac_disk_data); |
| @@ -1042,7 +1041,7 @@ write_block_zero (PedDisk* disk, MacDiskData* mac_driverdata) |
| raw_disk->block_size = PED_CPU_TO_BE16 (dev->sector_size); |
| raw_disk->block_count = PED_CPU_TO_BE32 (dev->length); |
| |
| - raw_disk->driver_count = mac_driverdata->driver_count; |
| + raw_disk->driver_count = PED_CPU_TO_BE16(mac_driverdata->driver_count); |
| memcpy(&raw_disk->driverlist[0], &mac_driverdata->driverlist[0], |
| sizeof(raw_disk->driverlist)); |
| |
| -- |
| 2.9.3 |
| |