summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorallanjude <allanjude@FreeBSD.org>2015-07-21 15:50:14 +0000
committerallanjude <allanjude@FreeBSD.org>2015-07-21 15:50:14 +0000
commit10c80a84dab9d6dfc505ebcda9ca49b6caa78f90 (patch)
treeba7df2a7ba7cc37b7196cbb6fcf34790abd3f223
parent90d01ac9ea8ba1f791ff7cfc4d142996a3b5caa9 (diff)
downloadFreeBSD-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.88
-rw-r--r--sys/geom/part/g_part_gpt.c16
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)
OpenPOWER on IntegriCloud