From 456b8c4d2424e52f7861e14d667ba7c26ca1cce3 Mon Sep 17 00:00:00 2001 From: Joel Granados Moreno Date: Fri, 5 Jun 2009 14:14:08 +0200 Subject: [PATCH] Preserve first 446 bytes of the pmbr in gpt. * libparted/label/gpt.c (_write_pmbr) : Make sure we read the first 446 bytes of the device when we are creating the pmbr. --- libparted/labels/gpt.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c index 73bdbb2..f1c4f69 100644 --- a/libparted/labels/gpt.c +++ b/libparted/labels/gpt.c @@ -982,7 +982,18 @@ _write_pmbr (PedDevice * dev) { LegacyMBR_t pmbr; - memset(&pmbr, 0, sizeof(pmbr)); + /* The UEFI spec is not clear about what to do with the following + * elements of the Protective MBR (pmbr): BootCode (0-440B), + * UniqueMBRSignature (440B-444B) and Unknown (444B-446B). + * With this in mind, we try not to modify these elements. + */ + if(ped_device_read(dev, &pmbr, 0, GPT_PMBR_SECTORS) < GPT_PMBR_SECTORS) + memset(&pmbr, 0, sizeof(pmbr)); + + /* Make sure we zero out all the legacy partitions. + * There are 4 PartitionRecords. */ + memset(&(pmbr.PartitionRecord), 0, sizeof(PartitionRecord_t) * 4); + pmbr.Signature = PED_CPU_TO_LE16(MSDOS_MBR_SIGNATURE); pmbr.PartitionRecord[0].OSType = EFI_PMBR_OSTYPE_EFI; pmbr.PartitionRecord[0].StartSector = 1; -- 1.6.0.6