aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2002-05-28 09:04:48 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2002-05-28 09:04:48 +0000
commitbcd46c600ae12a4b6d1b1023e796e70b82de0ad2 (patch)
tree598070d70bbdf3c82fb1e92b9e6361755aae3083
parentfcd9ea1b42a8b8c28c495a668419599742b778cc (diff)
downloadsrc-bcd46c600ae12a4b6d1b1023e796e70b82de0ad2.tar.gz
src-bcd46c600ae12a4b6d1b1023e796e70b82de0ad2.zip
Add support to GEOM for GUID Partition Tables (GPTs). The support
is currently conditional on both the GEOM and GEOM_GPT options to avoid getting GPT by default and having the MBR and GPT classes clash. The correct behaviour of the MBR class would be to back-off (reject) a MBR if it's a Protective MBR (a MBR with a single partition of type 0xEE that spans the whole disk (as far as the MBR is concerned). The correct behaviour if the GPT class would be to back-off (reject) a GPT if there's a MBR that's not a Protective MBR. At this stage it's inconvenient to destroy a good MBR when working with GPTs that it's more convenient to have the MBR class back-off when it detects the GPT signature on disk and have the GPT class ignore the MBR. In sys/gpt.h UUIDs (GUIDs) for the following FreeBSD partitions have been defined: GPT_ENT_TYPE_FREEBSD FreeBSD slice with disklabel. This is the equivalent of the well-known FreeBSD MBR partition type. GPT_ENT_TYPE_FREEBSD_{SWAP|UFS|UFS2|VINUM} FreeBSD partitions in the context of disklabel. This is speculating on the idea to use the GPT to hold partitions instead if slices and removing the fixed (and low) limits we have on the number of partitions. This commit lacks a GPT image for the regression suite.
Notes
Notes: svn path=/head/; revision=97392
-rw-r--r--sys/conf/NOTES1
-rw-r--r--sys/conf/files1
-rw-r--r--sys/conf/options2
-rw-r--r--sys/geom/geom_gpt.c314
-rw-r--r--sys/geom/geom_mbr.c17
-rw-r--r--sys/sys/gpt.h78
6 files changed, 413 insertions, 0 deletions
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index 688de2f1cec5..7ed9c9a8a40b 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -102,6 +102,7 @@ options INCLUDE_CONFIG_FILE # Include this file in kernel
options GEOM # Use the GEOMetry system for
# disk-I/O transformations.
+options GEOM_GPT # Include support for GPT disks.
#
# The root device and filesystem type can be compiled in;
diff --git a/sys/conf/files b/sys/conf/files
index 6e3e3650ea93..48d34921e651 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -723,6 +723,7 @@ geom/geom_disk.c optional geom
geom/geom_dump.c optional geom
geom/geom_enc.c optional geom
geom/geom_event.c optional geom
+geom/geom_gpt.c optional geom geom_gpt
geom/geom_io.c optional geom
geom/geom_kern.c optional geom
geom/geom_mbr.c optional geom
diff --git a/sys/conf/options b/sys/conf/options
index 5caf9b57f2f6..29587aa3d4b1 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -57,6 +57,8 @@ ADW_ALLOW_MEMIO opt_adw.h # Allow PCI devices to use memory
# Miscellaneous options.
GEOM opt_geom.h
+GEOM_GPT opt_geom.h # Add support for GUID Partition
+ # Tables (GPTs).
ADAPTIVE_MUTEXES
COMPAT_43 opt_compat.h
COMPAT_SUNOS opt_compat.h
diff --git a/sys/geom/geom_gpt.c b/sys/geom/geom_gpt.c
new file mode 100644
index 000000000000..3f446e34c4b8
--- /dev/null
+++ b/sys/geom/geom_gpt.c
@@ -0,0 +1,314 @@
+/*-
+ * Copyright (c) 2002 Marcel Moolenaar
+ * Copyright (c) 2002 Poul-Henning Kamp
+ * Copyright (c) 2002 Networks Associates Technology, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The names of the authors may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * CRC32 code derived from work by Gary S. Brown.
+ */
+
+#include <sys/param.h>
+#ifndef _KERNEL
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <sys/param.h>
+#include <stdlib.h>
+#include <err.h>
+#else
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/bio.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#endif
+
+#include <sys/endian.h>
+#include <sys/errno.h>
+#include <sys/disklabel.h>
+#include <sys/sbuf.h>
+#include <sys/uuid.h>
+#include <sys/gpt.h>
+#include <geom/geom.h>
+#include <geom/geom_slice.h>
+
+/*
+ * XXX: GEOM is not dynamic enough. We are forced to use a compile-time
+ * limit. The minimum number of partitions (128) as required by EFI is
+ * most of the time just a waste of space.
+ */
+#define GPT_MAX_SLICES 128
+
+struct g_gpt_softc {
+ struct gpt_ent *part[GPT_MAX_SLICES];
+};
+
+static uint32_t crc32_tab[] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+};
+
+static uint32_t
+crc32(const void *buf, size_t size)
+{
+ const uint8_t *p;
+ uint32_t crc;
+
+ p = buf;
+ crc = ~0U;
+
+ while (size--)
+ crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
+
+ return crc ^ ~0U;
+}
+
+static int
+is_gpt_hdr(struct gpt_hdr *hdr)
+{
+ uint32_t crc;
+
+ if (memcmp(hdr->hdr_sig, GPT_HDR_SIG, sizeof(hdr->hdr_sig)))
+ return (0);
+ crc = hdr->hdr_crc_self;
+ hdr->hdr_crc_self = 0;
+ if (crc32(hdr, hdr->hdr_size) != crc)
+ return (0);
+ hdr->hdr_crc_self = crc;
+ /* We're happy... */
+ return (1);
+}
+
+static int
+g_gpt_start(struct bio *bp)
+{
+ struct uuid freebsd = GPT_ENT_TYPE_FREEBSD;
+ struct g_provider *pp = bp->bio_to;
+ struct g_geom *gp = pp->geom;
+ struct g_slicer *gsp = gp->softc;
+ struct g_gpt_softc *gs = gsp->softc;
+ u_int type;
+
+ if (bp->bio_cmd != BIO_GETATTR)
+ return (0);
+
+ /*
+ * XXX: this is bogus. The BSD class has a strong dependency on
+ * the MBR/MBREXT class, because it asks for an attribute that's
+ * specific to the MBR/MBREXT class and the value of the attribute
+ * is just as specific to the MBR class. In an extensible scheme
+ * a geom would ask another geom if it could possible accomodate a
+ * class and the answer should be yes or no. Now we're forced to
+ * emulate a MBR class :-/
+ */
+ type = (memcmp(&gs->part[pp->index]->ent_type, &freebsd,
+ sizeof(freebsd))) ? 0 : 165;
+ return ((g_haveattr_int(bp, "MBR::type", type)) ? 1 : 0);
+}
+
+static void
+g_gpt_dumpconf(struct sbuf *sb, char *indent, struct g_geom *gp,
+ struct g_consumer *cp, struct g_provider *pp)
+{
+ struct g_slicer *gsp = gp->softc;
+ struct g_gpt_softc *gs = gsp->softc;
+ struct uuid *uuid;
+
+ g_slice_dumpconf(sb, indent, gp, cp, pp);
+
+ if (pp != NULL) {
+ uuid = &gs->part[pp->index]->ent_type;
+ sbuf_printf(sb, "%s<type>", indent);
+ sbuf_printf_uuid(sb, uuid);
+ sbuf_printf(sb, "</type>\n");
+ }
+}
+
+static struct g_geom *
+g_gpt_taste(struct g_class *mp, struct g_provider *pp, int insist)
+{
+ struct g_consumer *cp;
+ struct g_geom *gp;
+ struct g_gpt_softc *gs;
+ struct g_slicer *gsp;
+ u_char *buf, *mbr;
+ struct gpt_ent *ent;
+ struct gpt_hdr *hdr;
+ u_int i, npart, secsz, tblsz;
+ int error;
+
+ g_trace(G_T_TOPOLOGY, "g_gpt_taste(%s,%s)", mp->name, pp->name);
+ g_topology_assert();
+
+ /*
+ * XXX: I don't like to hardcode a maximum number of slices, since
+ * it's wasting space most of the time and insufficient any time.
+ * It's easier for now...
+ */
+ gp = g_slice_new(mp, GPT_MAX_SLICES, pp, &cp, &gs, sizeof(*gs),
+ g_gpt_start);
+ if (gp == NULL)
+ return (NULL);
+
+ gsp = gp->softc;
+ g_topology_unlock();
+ gp->dumpconf = g_gpt_dumpconf;
+
+ npart = 0;
+ mbr = NULL;
+
+ if (gp->rank != 2 && insist == 0)
+ goto out;
+
+ error = g_getattr("GEOM::sectorsize", cp, &secsz);
+ if (error)
+ goto out;
+
+ /* XXX: we need to get the media size as well. */
+
+ /* Read both the MBR sector and the GPT sector. */
+ mbr = g_read_data(cp, 0, 2 * secsz, &error);
+ if (mbr == NULL || error != 0)
+ goto out;
+#if 0
+ /*
+ * XXX: we should ignore the GPT if there's a MBR and the MBR is
+ * not a PMBR (Protective MBR). I believe this is what the EFI
+ * spec is going to say eventually (this is hearsay :-)
+ * Currently EFI (version 1.02) accepts and uses the GPT even
+ * though there's a valid MBR. We do this too, because it allows
+ * us to test this code without first nuking the only partitioning
+ * scheme we grok until this is working.
+ */
+ if (!is_pmbr((void*)mbr))
+ goto out;
+#endif
+
+ hdr = (void*)(mbr + secsz);
+
+ /*
+ * XXX: if we don't have a GPT header at LBA 1, we should check if
+ * there's a backup GPT at the end of the medium. If we have a valid
+ * backup GPT, we should restore the primary GPT and claim this lunch.
+ */
+ if (!is_gpt_hdr(hdr))
+ goto out;
+
+ tblsz = (hdr->hdr_entries * hdr->hdr_entsz + secsz - 1) & ~(secsz - 1);
+ buf = g_read_data(cp, hdr->hdr_lba_table * secsz, tblsz, &error);
+
+ gsp->frontstuff = hdr->hdr_lba_start * secsz;
+
+ for (i = 0; i < hdr->hdr_entries; i++) {
+ struct uuid unused = GPT_ENT_TYPE_UNUSED;
+ if (i >= GPT_MAX_SLICES)
+ break;
+ ent = (void*)(buf + i * hdr->hdr_entsz);
+ if (!memcmp(&ent->ent_type, &unused, sizeof(unused)))
+ continue;
+ gs->part[i] = g_malloc(hdr->hdr_entsz, M_WAITOK);
+ if (gs->part[i] == NULL)
+ break;
+ bcopy(ent, gs->part[i], hdr->hdr_entsz);
+ (void)g_slice_addslice(gp, i, ent->ent_lba_start * secsz,
+ (ent->ent_lba_end - ent->ent_lba_start + 1ULL) * secsz,
+ "%ss%d", gp->name, i + 1);
+ npart++;
+ }
+
+ g_free(buf);
+
+ out:
+ if (mbr != NULL)
+ g_free(mbr);
+
+ g_topology_lock();
+ error = g_access_rel(cp, -1, 0, 0);
+
+ if (npart > 0) {
+ LIST_FOREACH(pp, &gp->provider, provider)
+ g_error_provider(pp, 0);
+ return (gp);
+ }
+ g_std_spoiled(cp);
+ return (NULL);
+}
+
+static struct g_class g_gpt_class = {
+ "GPT",
+ g_gpt_taste,
+ NULL,
+ G_CLASS_INITSTUFF
+};
+
+DECLARE_GEOM_CLASS(g_gpt_class, g_gpt);
diff --git a/sys/geom/geom_mbr.c b/sys/geom/geom_mbr.c
index fdb98aa7dc2a..9e8e8cd4f9d4 100644
--- a/sys/geom/geom_mbr.c
+++ b/sys/geom/geom_mbr.c
@@ -58,6 +58,8 @@
#include <geom/geom.h>
#include <geom/geom_slice.h>
+#include "opt_geom.h"
+
#define MBR_CLASS_NAME "MBR"
#define MBREXT_CLASS_NAME "MBREXT"
@@ -197,13 +199,28 @@ g_mbr_taste(struct g_class *mp, struct g_provider *pp, int insist)
if (!error && sectorsize != 512)
break;
gsp->frontstuff = sectorsize * fwsectors;
+#ifdef GEOM_GPT
+ /*
+ * XXX: GPT hack: Read the second sector as well and back-off
+ * if it has the GPT signature. The ultimate behaviour would
+ * be to back-off if we detect a protective MBR (PMBR).
+ */
+ buf = g_read_data(cp, 0, 2 * sectorsize, &error);
+#else
buf = g_read_data(cp, 0, sectorsize, &error);
+#endif
if (buf == NULL || error != 0)
break;
if (buf[0x1fe] != 0x55 && buf[0x1ff] != 0xaa) {
g_free(buf);
break;
}
+#ifdef GEOM_GPT
+ if (!memcmp(buf + 512, "EFI PART", 8)) {
+ g_free(buf);
+ break;
+ }
+#endif
for (i = 0; i < NDOSPART; i++)
g_dec_dos_partition(
buf + DOSPARTOFF + i * sizeof(struct dos_partition),
diff --git a/sys/sys/gpt.h b/sys/sys/gpt.h
new file mode 100644
index 000000000000..813a4f166691
--- /dev/null
+++ b/sys/sys/gpt.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2002 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _SYS_GPT_H_
+#define _SYS_GPT_H_
+
+struct gpt_hdr {
+ char hdr_sig[8];
+#define GPT_HDR_SIG "EFI PART"
+ uint32_t hdr_revision;
+#define GPT_HDR_REVISION 0x00010000
+ uint32_t hdr_size;
+ uint32_t hdr_crc_self;
+ uint32_t __reserved;
+ uint64_t hdr_lba_self;
+ uint64_t hdr_lba_alt;
+ uint64_t hdr_lba_start;
+ uint64_t hdr_lba_end;
+ struct uuid hdr_uuid;
+ uint64_t hdr_lba_table;
+ uint32_t hdr_entries;
+ uint32_t hdr_entsz;
+ uint32_t hdr_crc_table;
+};
+
+struct gpt_ent {
+ struct uuid ent_type;
+ struct uuid ent_uuid;
+ uint64_t ent_lba_start;
+ uint64_t ent_lba_end;
+ uint64_t ent_attr;
+#define GPT_ENT_ATTR_PLATFORM (1ULL << 0)
+ short ent_name[36]; /* UNICODE!!! */
+};
+
+#define GPT_ENT_TYPE_UNUSED \
+ {0x00000000,0x0000,0x0000,0x00,0x00,{0x00,0x00,0x00,0x00,0x00,0x00}}
+#define GPT_ENT_TYPE_EFI \
+ {0xc12a7328,0xf81f,0x11d2,0xba,0x4b,{0x00,0xa0,0xc9,0x3e,0xc9,0x3b}}
+#define GPT_ENT_TYPE_MBR \
+ {0x024dee41,0x33e7,0x11d3,0x9d,0x69,{0x00,0x08,0xc7,0x81,0xf3,0x9f}}
+#define GPT_ENT_TYPE_FREEBSD \
+ {0x516e7cb4,0x6ecf,0x11d6,0x8f,0xf8,{0x00,0x02,0x2d,0x09,0x71,0x2b}}
+#define GPT_ENT_TYPE_FREEBSD_SWAP \
+ {0x516e7cb5,0x6ecf,0x11d6,0x8f,0xf8,{0x00,0x02,0x2d,0x09,0x71,0x2b}}
+#define GPT_ENT_TYPE_FREEBSD_UFS \
+ {0x516e7cb6,0x6ecf,0x11d6,0x8f,0xf8,{0x00,0x02,0x2d,0x09,0x71,0x2b}}
+#define GPT_ENT_TYPE_FREEBSD_UFS2 \
+ {0x516e7cb7,0x6ecf,0x11d6,0x8f,0xf8,{0x00,0x02,0x2d,0x09,0x71,0x2b}}
+#define GPT_ENT_TYPE_FREEBSD_VINUM \
+ {0x516e7cb8,0x6ecf,0x11d6,0x8f,0xf8,{0x00,0x02,0x2d,0x09,0x71,0x2b}}
+
+#endif /* _SYS_GPT_H_ */