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.<br>
<div><br></div><div><div>Index: packages/mac-parts.c</div><div>===================================================================</div><div>--- packages/mac-parts.c<span style="white-space:pre-wrap"> </span>(revision 1041)</div>
<div>+++ packages/mac-parts.c<span style="white-space:pre-wrap"> </span>(working copy)</div><div>@@ -200,15 +203,26 @@</div><div> </div><div> <span style="white-space:pre-wrap"> </span>} else {</div>
<div> <span style="white-space:pre-wrap"> </span>/* Another partition was explicitly requested */</div><div>-<span style="white-space:pre-wrap"> </span>SEEK( bs * parnum );</div><div>
-<span style="white-space:pre-wrap"> </span>READ( &par, sizeof(par) );</div><div>+<span style="white-space:pre-wrap"> </span></div><div>+<span style="white-space:pre-wrap"> </span>/* We have to find the first valid partition corresponding to the given number.</div>
<div>+<span style="white-space:pre-wrap"> </span> This is because Apple sometimes includes a bunch of extra partitions that</div><div>+<span style="white-space:pre-wrap"> </span> BootX expects to be ignored */</div>
<div>+<span style="white-space:pre-wrap"> </span>while (parnum < par.pmMapBlkCnt) {</div><div>+<span style="white-space:pre-wrap"> </span>SEEK( bs * parnum );</div><div>+<span style="white-space:pre-wrap"> </span>READ( &par, sizeof(par) );</div>
<div> </div><div>-<span style="white-space:pre-wrap"> </span>if( (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsValid) &&</div><div>-<span style="white-space:pre-wrap"> </span> (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsAllocated) &&</div>
<div>-<span style="white-space:pre-wrap"> </span> (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsReadable) ) {</div><div>+<span style="white-space:pre-wrap"> </span>/* Check if valid, also device driver partitions are expected to be ignored */</div>
<div>+<span style="white-space:pre-wrap"> </span>if( (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsValid) &&</div><div>+<span style="white-space:pre-wrap"> </span> (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsAllocated) &&</div>
<div>+<span style="white-space:pre-wrap"> </span> (__be32_to_cpu(par.pmPartStatus) & kPartitionAUXIsReadable) && </div><div>+<span style="white-space:pre-wrap"> </span> !(__be32_to_cpu(par.pmPartStatus) & kPartitionIsRealDeviceDriver)) {</div>
<div> </div><div>-<span style="white-space:pre-wrap"> </span>offs = (long long)__be32_to_cpu(par.pmPyPartStart) * bs;</div><div>-<span style="white-space:pre-wrap"> </span>size = (long long)__be32_to_cpu(par.pmPartBlkCnt) * bs;</div>
<div>+<span style="white-space:pre-wrap"> </span>offs = (long long)__be32_to_cpu(par.pmPyPartStart) * bs;</div><div>+<span style="white-space:pre-wrap"> </span>size = (long long)__be32_to_cpu(par.pmPartBlkCnt) * bs;</div>
<div>+<span style="white-space:pre-wrap"> </span>break;</div><div>+<span style="white-space:pre-wrap"> </span>}</div><div>+</div><div>+<span style="white-space:pre-wrap"> </span>parnum++;</div>
<div> <span style="white-space:pre-wrap"> </span>}</div><div> <span style="white-space:pre-wrap"> </span>}</div></div>