diff options
author | allanjude <allanjude@FreeBSD.org> | 2015-07-21 15:50:14 +0000 |
---|---|---|
committer | allanjude <allanjude@FreeBSD.org> | 2015-07-21 15:50:14 +0000 |
commit | 10c80a84dab9d6dfc505ebcda9ca49b6caa78f90 (patch) | |
tree | ba7df2a7ba7cc37b7196cbb6fcf34790abd3f223 | |
parent | 90d01ac9ea8ba1f791ff7cfc4d142996a3b5caa9 (diff) | |
download | FreeBSD-src-10c80a84dab9d6dfc505ebcda9ca49b6caa78f90.zip FreeBSD-src-10c80a84dab9d6dfc505ebcda9ca49b6caa78f90.tar.gz |
MFC: r285594
New partition flag for gpart, writes the 0xee partition in the pmbr in the second slot, rather than the first.
Works around Lenovo legacy GPT boot issue
PR: 184910
Approved by: re (gjb), marcel
Relnotes: yes
Sponsored by: ScaleEngine Inc.
Differential Revision: https://reviews.freebsd.org/D3140
-rw-r--r-- | sbin/geom/class/part/gpart.8 | 8 | ||||
-rw-r--r-- | sys/geom/part/g_part_gpt.c | 16 |
2 files changed, 23 insertions, 1 deletions
diff --git a/sbin/geom/class/part/gpart.8 b/sbin/geom/class/part/gpart.8 index 11ad201..3421ba0 100644 --- a/sbin/geom/class/part/gpart.8 +++ b/sbin/geom/class/part/gpart.8 @@ -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: diff --git a/sys/geom/part/g_part_gpt.c b/sys/geom/part/g_part_gpt.c index b331f84..d7650e9 100644 --- a/sys/geom/part/g_part_gpt.c +++ b/sys/geom/part/g_part_gpt.c @@ -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) |