GPT boot protocol There is no official MBR-to-partition handover protocol defined for booting from disks partitioned using GPT partition tables with BIOS-style firmware. This is because the GPT partition format comes from the EFI spec, which thinks the universe is all going to be EFI. Sigh. There are thus two alternatives: hybrid booting, and defining a new protocol. *** Hybrid booting *** Hybrid booting uses a standard MBR, and has bootable ("active") partitions present, as partitions, in the GPT PMBR sector. This means the PMBR, instead of containing only one "protective" partition (type EE), may contain up to three partitions: a protective partition (EE) *before* the active partition, the active partition, and a protective partition (EE) *after* the active partition. The active partition is limited to the first 2^32 sectors (2 TB) of the disk. All partitions, including the active partition, should have GPT partition entries. Thus, changing which partition is active does NOT change the GPT partition table. This is the only known way to boot Microsoft operating systems from a GPT disk with BIOS firmware. *** New protocol *** This defines an alternative (experimental) booting protocol for GPT partitions with BIOS firmware. It maintains backwards compatibility to the extent possible. It is implemented by the file mbr/gptmbr.bin. -> The PMBR The PMBR (the first 512-byte sector of the disk) is divided up as follows: Offset Size Contents --------------------------------------------------------- 0 424 PMBR boot code 424 16 GUID of the boot partition 440 4 MBR-compatible disk ID 444 2 Magic number: 1D 9A 446 16 PMBR protective entry 462 48 PMBR null entries 510 2 Boot signature: 55 AA To change the bootable partition, verify that the magic number is present (to avoid corrupting software not compatible with this specification) and enter the GUID of the boot partition at offset 424. It might be wise to verify that the data already there is a valid partition GUID already, or at least warn the user if that is not the case. -> The handover protocol The PMBR boot code loads the first sector of the bootable partition, and passes in DL=, ES:DI=, sets EAX to 0x54504721 ("!GPT") and points DS:SI to a structure of the following form: Offset Size Contents --------------------------------------------------------- 0 1 0x80 (this is a bootable partition) 1 3 CHS of partition (using INT 13h geometry) 4 1 0xEE (partition type: EFI data partition) 5 3 CHS of partition end 8 4 Partition start LBA 12 4 Partition end LBA 16 varies GPT partition entry The CHS information is optional; gptmbr.bin currently does *NOT* calculate them, and just leaves them as zero. Bytes 0-15 matches the standard MBR handover (DS:SI points to the partition entry), except that the information is provided synthetically. The MBR-compatible fields are directly usable if they are < 2 TB, otherwise these fields should contain 0xFFFFFFFF and the OS will need to understand the GPT partition entry which follows the MBR one. The "!GPT" magic number in EAX and the 0xEE partition type also informs the OS that the GPT partition information is present. Currently, this is compatible with Syslinux as long as the Syslinux partition is < 2 TB; this probably will be improved in a future version.