Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Nov 2019 16:40:03 +0000 (UTC)
From:      Toomas Soome <tsoome@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r354818 - stable/12/stand/common
Message-ID:  <201911181640.xAIGe3hF075557@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: tsoome
Date: Mon Nov 18 16:40:03 2019
New Revision: 354818
URL: https://svnweb.freebsd.org/changeset/base/354818

Log:
  MFC r354746:
  loader: add support for hybrid PMBR for GPT partition table
  
  Note hybrid table is nor really UEFI specification compliant.
  
  Sample hybrid partition table:
  > ::mbr
  Format: unknown
  Signature: 0xaa55 (valid)
  UniqueMBRDiskSignature: 0
  
  PART TYPE                  ACTIVE  STARTCHS    ENDCHS      SECTOR     NUMSECT
  0    EFI_PMBR:0xee         0       1023/254/63 1023/254/63 1          409639
  1    0xff                  0       1023/254/63 1023/254/63 409640     978508408
  2    FDISK_EXT_WIN:0xc     0       1023/254/63 1023/254/63 978918048  31250000
  3    0xff                  0       1023/254/63 1023/254/63 1010168048 32
  >

Modified:
  stable/12/stand/common/part.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/stand/common/part.c
==============================================================================
--- stable/12/stand/common/part.c	Mon Nov 18 16:37:21 2019	(r354817)
+++ stable/12/stand/common/part.c	Mon Nov 18 16:40:03 2019	(r354818)
@@ -651,7 +651,7 @@ ptable_open(void *dev, uint64_t sectors, uint16_t sect
 	struct dos_partition *dp;
 	struct ptable *table;
 	uint8_t *buf;
-	int i, count;
+	int i;
 #ifdef LOADER_MBR_SUPPORT
 	struct pentry *entry;
 	uint32_t start, end;
@@ -713,28 +713,23 @@ ptable_open(void *dev, uint64_t sectors, uint16_t sect
 	}
 	/* Check that we have PMBR. Also do some validation. */
 	dp = (struct dos_partition *)(buf + DOSPARTOFF);
-	for (i = 0, count = 0; i < NDOSPART; i++) {
+	/*
+	 * In mac we can have PMBR partition in hybrid MBR;
+	 * that is, MBR partition which has DOSPTYP_PMBR entry defined as
+	 * start sector 1. After DOSPTYP_PMBR, there may be other partitions.
+	 * UEFI compliant PMBR has no other partitions.
+	 */
+	for (i = 0; i < NDOSPART; i++) {
 		if (dp[i].dp_flag != 0 && dp[i].dp_flag != 0x80) {
 			DPRINTF("invalid partition flag %x", dp[i].dp_flag);
 			goto out;
 		}
 #ifdef LOADER_GPT_SUPPORT
-		if (dp[i].dp_typ == DOSPTYP_PMBR) {
+		if (dp[i].dp_typ == DOSPTYP_PMBR && dp[i].dp_start == 1) {
 			table->type = PTABLE_GPT;
 			DPRINTF("PMBR detected");
 		}
 #endif
-		if (dp[i].dp_typ != 0)
-			count++;
-	}
-	/* Do we have some invalid values? */
-	if (table->type == PTABLE_GPT && count > 1) {
-		if (dp[1].dp_typ != DOSPTYP_HFS) {
-			table->type = PTABLE_NONE;
-			DPRINTF("Incorrect PMBR, ignore it");
-		} else {
-			DPRINTF("Bootcamp detected");
-		}
 	}
 #ifdef LOADER_GPT_SUPPORT
 	if (table->type == PTABLE_GPT) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201911181640.xAIGe3hF075557>