The basic idea for both pre- and post-PCI Power Macintosh computers is that the boot partition has kPartitionIsStartup set in its pmStatus field. At startup time, the driver searches for this partition and adds its drive queue element to the drive queue before the other partitions. When the system subsequently searches for a disk to boot from, it will find this drive queue element and boot from it.
The change with the PCI-based Power Macintosh computers is that the Startup Disk control panel allows the user to choose a startup partition. When the control panel opens, it sends a kdgBoot Driver Gestalt request to the driver of each volume. The result from this request uniquely identifies the partition containing that volume. When the user chooses a startup volume, the control panel sends a kcsSetStartupDrive (csCode 44) control request to the driver. The driver responds to this by modifying the partition map to set the kPartitionIsStartup bit on the partition containing the volume and clear the bit on all other partitions.
The startup drive mechanism is slightly different for Apple computers, such as the iMac computer, that support the NewWorld architecture. The final details were still being ironed out when this document was written. When the information is available, it will be incorporated into the appropriate sections in the documentation that discuss disk drivers and boot issues.
The kcsSetStartupDrive control call ( csCode = 44) results when a user selects a drive from the Startup Device control panel in the current version of Mac OS. It indicates to the driver that a volume controlled by that driver (that is, one with its drive number in the ioVRefNum field) is the chosen startup drive. This lets a specific partition selected by the user on a multiply partitioned disk be the startup volume by allowing the driver to control which partition is inserted into the drive queue first. Mass storage drivers (those that control elements in the drive queue) that set the driverGestaltEnable bit must implement this control request or return controlErr.