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) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to