Blame SOURCES/0067-libparted-Fix-MacOS-boot-support.patch

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