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>