Add a new option to gpart(8) to fix Lenovo BIOS boot issue

PR:		184910
Reviewed by:	ae, wblock
Approved by:	marcel
MFC after:	3 days
Relnotes:	yes
Sponsored by:	ScaleEngine Inc.
Differential Revision:	https://reviews.freebsd.org/D3065
This commit is contained in:
allanjude 2015-07-15 02:23:55 +00:00
parent ca799427e1
commit 44bd001082
2 changed files with 23 additions and 1 deletions

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd May 5, 2015
.Dd July 14, 2015
.Dt GPART 8
.Os
.Sh NAME
@ -933,6 +933,12 @@ start-up script.
See
.Xr gptboot 8
for more details.
.It Cm lenovofix
Setting this attribute overwrites the Protective MBR with a new one where
the 0xee partition is the second, rather than the first record.
This resolves a BIOS compatibility issue with some Lenovo models including the
X220, T420, and T520, allowing them to boot from GPT partitioned disks
without using EFI.
.El
.Pp
The scheme-specific attributes for MBR:

View File

@ -1007,6 +1007,7 @@ g_part_gpt_setunset(struct g_part_table *basetable,
{
struct g_part_gpt_entry *entry;
struct g_part_gpt_table *table;
struct g_provider *pp;
uint8_t *p;
uint64_t attr;
int i;
@ -1036,6 +1037,21 @@ g_part_gpt_setunset(struct g_part_table *basetable,
}
}
return (0);
} else if (strcasecmp(attrib, "lenovofix") == 0) {
/*
* Write the 0xee GPT entry to slot #1 (2nd slot) in the pMBR.
* This workaround allows Lenovo X220, T420, T520, etc to boot
* from GPT Partitions in BIOS mode.
*/
if (entry != NULL)
return (ENXIO);
pp = LIST_FIRST(&basetable->gpt_gp->consumer)->provider;
bzero(table->mbr + DOSPARTOFF, DOSPARTSIZE * NDOSPART);
gpt_write_mbr_entry(table->mbr, ((set) ? 1 : 0), 0xee, 1,
MIN(pp->mediasize / pp->sectorsize - 1, UINT32_MAX));
return (0);
}
if (entry == NULL)