Document GPT boot protocol; add !GPT signature origin/3.6x
authorH. Peter Anvin <hpa@zytor.com>
Wed, 14 May 2008 01:30:20 +0000 (18:30 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Wed, 14 May 2008 01:30:20 +0000 (18:30 -0700)
Document the GPT boot protocol; add additional assurance by
requiring that EAX contains "!GPT" for the GPT information
to be valid.

doc/gpt.txt [new file with mode: 0644]
mbr/gptmbr.S

diff --git a/doc/gpt.txt b/doc/gpt.txt
new file mode 100644 (file)
index 0000000..42a4da1
--- /dev/null
@@ -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=<disk number>, ES:DI=<pointer to $PnP>, 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.
+
+
+         
+
index 85b9fcd..77408b7 100644 (file)
@@ -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 */