svn commit: r354818 - stable/12/stand/common
Toomas Soome
tsoome at FreeBSD.org
Mon Nov 18 16:40:04 UTC 2019
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) {
More information about the svn-src-stable-12
mailing list