From 1bd7c31844a7b946c5d2d85a21e913fa81460930 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Tue, 13 May 2008 18:30:20 -0700 Subject: [PATCH] Document GPT boot protocol; add !GPT signature Document the GPT boot protocol; add additional assurance by requiring that EAX contains "!GPT" for the GPT information to be valid. --- doc/gpt.txt | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mbr/gptmbr.S | 1 + 2 files changed, 93 insertions(+) create mode 100644 doc/gpt.txt diff --git a/doc/gpt.txt b/doc/gpt.txt new file mode 100644 index 0000000..42a4da1 --- /dev/null +++ b/doc/gpt.txt @@ -0,0 +1,92 @@ + 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. + + + + diff --git a/mbr/gptmbr.S b/mbr/gptmbr.S index 85b9fcd..77408b7 100644 --- a/mbr/gptmbr.S +++ b/mbr/gptmbr.S @@ -204,6 +204,7 @@ boot: popw %dx /* dl -> drive number */ popw %di /* es:di -> $PnP vector */ popw %es + movl $0x54504721,%eax /* !GPT magic number */ cli jmpw *%sp /* %sp == bootsec */ -- 2.7.4