BootX will only check the first few partitions from mac-parts to find the Mac OS partition. So it must expect drivers and void partitions to be ignored. This patch makes it so that if you specify the partition cd:1 and partition 1 is a driver it will keep checking partitions until reaching the first non-driver and non-void partition.
Index: packages/mac-parts.c =================================================================== --- packages/mac-parts.c (revision 1041) +++ packages/mac-parts.c (working copy) @@ -200,15 +203,26 @@
} else { /* Another partition was explicitly requested */ - SEEK( bs * parnum ); - READ( &par, sizeof(par) ); + + /* We have to find the first valid partition corresponding to the given number. + This is because Apple sometimes includes a bunch of extra partitions that + BootX expects to be ignored */ + while (parnum < par.pmMapBlkCnt) { + SEEK( bs * parnum ); + READ( &par, sizeof(par) );
- if( (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsValid) && - (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsAllocated) && - (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsReadable) ) { + /* Check if valid, also device driver partitions are expected to be ignored */ + if( (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsValid) && + (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsAllocated) && + (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsReadable) && + !(__be32_to_cpu(par.pmPartStatus) & kPartitionIsRealDeviceDriver)) {
- offs = (long long)__be32_to_cpu(par.pmPyPartStart) * bs; - size = (long long)__be32_to_cpu(par.pmPartBlkCnt) * bs; + offs = (long long)__be32_to_cpu(par.pmPyPartStart) * bs; + size = (long long)__be32_to_cpu(par.pmPartBlkCnt) * bs; + break; + } + + parnum++; } }