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
>
This commit is contained in:
Toomas Soome 2019-11-15 20:43:39 +00:00
parent 6b51bdf38c
commit 2e2844645f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=354746

View File

@ -647,7 +647,7 @@ ptable_open(void *dev, uint64_t sectors, uint16_t sectorsize,
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;
@ -709,28 +709,23 @@ ptable_open(void *dev, uint64_t sectors, uint16_t sectorsize,
}
/* 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) {