summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2018-10-14 11:16:25 +0300
committerDan McDonald <danmcd@joyent.com>2018-10-29 21:09:21 -0400
commitd06952d085d59072d42d77e29ac5669bbdc25d6e (patch)
tree9c1b37f715b6633c9523d40eba7afeaa7957148c
parent0ff1227b75bfc6aac8def680dc602c3b9fc2bfd4 (diff)
downloadillumos-gate-d06952d085d59072d42d77e29ac5669bbdc25d6e.tar.gz
9893 add some partition types
Reviewed by: Igor Kozhukhov <igor@dilos.org> Reviewed by: Yuri Pankov <yuripv@yuripv.net> Reviewed by: Garrett D'Amore <garrett@damore.org> Approved by: Dan McDonald <danmcd@joyent.com>
-rw-r--r--usr/src/cmd/format/menu_command.c5
-rw-r--r--usr/src/lib/libefi/common/rdwr_efi.c75
-rw-r--r--usr/src/uts/common/sys/efi_partition.h8
-rw-r--r--usr/src/uts/common/sys/vtoc.h19
4 files changed, 73 insertions, 34 deletions
diff --git a/usr/src/cmd/format/menu_command.c b/usr/src/cmd/format/menu_command.c
index bc441b0e86..f64757cff9 100644
--- a/usr/src/cmd/format/menu_command.c
+++ b/usr/src/cmd/format/menu_command.c
@@ -85,6 +85,11 @@ slist_t ptag_choices[] = {
{ "reserved", "", V_RESERVED },
{ "system", "", V_SYSTEM },
{ "BIOS_boot", "", V_BIOS_BOOT },
+ { "FreeBSD boot", "", V_FREEBSD_BOOT },
+ { "FreeBSD swap", "", V_FREEBSD_SWAP },
+ { "FreeBSD UFS", "", V_FREEBSD_UFS },
+ { "FreeBSD ZFS", "", V_FREEBSD_ZFS },
+
{ NULL }
};
diff --git a/usr/src/lib/libefi/common/rdwr_efi.c b/usr/src/lib/libefi/common/rdwr_efi.c
index a878cb50d2..18ad38f0c5 100644
--- a/usr/src/lib/libefi/common/rdwr_efi.c
+++ b/usr/src/lib/libefi/common/rdwr_efi.c
@@ -44,39 +44,48 @@
#include <sys/byteorder.h>
#include <sys/ddi.h>
+/*
+ * The original conversion array used simple array index, but since
+ * we do need to take account of VTOC tag numbers from other systems,
+ * we need to provide tag values too, or the array will grow too large.
+ *
+ * Still we will fabricate the missing p_tag values.
+ */
static struct uuid_to_ptag {
struct uuid uuid;
+ ushort_t p_tag;
} conversion_array[] = {
- { EFI_UNUSED },
- { EFI_BOOT },
- { EFI_ROOT },
- { EFI_SWAP },
- { EFI_USR },
- { EFI_BACKUP },
- { 0 }, /* STAND is never used */
- { EFI_VAR },
- { EFI_HOME },
- { EFI_ALTSCTR },
- { 0 }, /* CACHE is never used */
- { EFI_RESERVED },
- { EFI_SYSTEM },
- { EFI_LEGACY_MBR },
- { EFI_SYMC_PUB },
- { EFI_SYMC_CDS },
- { EFI_MSFT_RESV },
- { EFI_DELL_BASIC },
- { EFI_DELL_RAID },
- { EFI_DELL_SWAP },
- { EFI_DELL_LVM },
- { EFI_DELL_RESV },
- { EFI_AAPL_HFS },
- { EFI_AAPL_UFS },
- { EFI_BIOS_BOOT },
- { EFI_FREEBSD_BOOT },
- { EFI_FREEBSD_SWAP },
- { EFI_FREEBSD_UFS },
- { EFI_FREEBSD_VINUM },
- { EFI_FREEBSD_ZFS }
+ { EFI_UNUSED, V_UNASSIGNED },
+ { EFI_BOOT, V_BOOT },
+ { EFI_ROOT, V_ROOT },
+ { EFI_SWAP, V_SWAP },
+ { EFI_USR, V_USR },
+ { EFI_BACKUP, V_BACKUP },
+ { EFI_VAR, V_VAR },
+ { EFI_HOME, V_HOME },
+ { EFI_ALTSCTR, V_ALTSCTR },
+ { EFI_RESERVED, V_RESERVED },
+ { EFI_SYSTEM, V_SYSTEM }, /* V_SYSTEM is 0xc */
+ { EFI_LEGACY_MBR, 0x10 },
+ { EFI_SYMC_PUB, 0x11 },
+ { EFI_SYMC_CDS, 0x12 },
+ { EFI_MSFT_RESV, 0x13 },
+ { EFI_DELL_BASIC, 0x14 },
+ { EFI_DELL_RAID, 0x15 },
+ { EFI_DELL_SWAP, 0x16 },
+ { EFI_DELL_LVM, 0x17 },
+ { EFI_DELL_RESV, 0x19 },
+ { EFI_AAPL_HFS, 0x1a },
+ { EFI_AAPL_UFS, 0x1b },
+ { EFI_AAPL_ZFS, 0x1c },
+ { EFI_AAPL_APFS, 0x1d },
+ { EFI_BIOS_BOOT, V_BIOS_BOOT }, /* V_BIOS_BOOT is 0x18 */
+ { EFI_FREEBSD_BOOT, V_FREEBSD_BOOT },
+ { EFI_FREEBSD_SWAP, V_FREEBSD_SWAP },
+ { EFI_FREEBSD_UFS, V_FREEBSD_UFS },
+ { EFI_FREEBSD_VINUM, V_FREEBSD_VINUM },
+ { EFI_FREEBSD_ZFS, V_FREEBSD_ZFS },
+ { EFI_FREEBSD_NANDFS, V_FREEBSD_NANDFS }
};
/*
@@ -563,7 +572,8 @@ efi_read(int fd, struct dk_gpt *vtoc)
if (bcmp(&vtoc->efi_parts[i].p_guid,
&conversion_array[j].uuid,
sizeof (struct uuid)) == 0) {
- vtoc->efi_parts[i].p_tag = j;
+ vtoc->efi_parts[i].p_tag =
+ conversion_array[j].p_tag;
break;
}
}
@@ -1037,7 +1047,8 @@ efi_write(int fd, struct dk_gpt *vtoc)
j < sizeof (conversion_array) /
sizeof (struct uuid_to_ptag); j++) {
- if (vtoc->efi_parts[i].p_tag == j) {
+ if (vtoc->efi_parts[i].p_tag ==
+ conversion_array[j].p_tag) {
UUID_LE_CONVERT(
efi_parts[i].efi_gpe_PartitionTypeGUID,
conversion_array[j].uuid);
diff --git a/usr/src/uts/common/sys/efi_partition.h b/usr/src/uts/common/sys/efi_partition.h
index 32d3d92b52..5fa101cbb7 100644
--- a/usr/src/uts/common/sys/efi_partition.h
+++ b/usr/src/uts/common/sys/efi_partition.h
@@ -131,12 +131,20 @@ typedef struct efi_gpe_Attrs {
{ 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28 } }
#define EFI_DELL_RESV { 0x8da63339, 0x0007, 0x60c0, 0xc4, 0x36, \
{ 0x08, 0x3a, 0xc8, 0x23, 0x09, 0x08 } }
+#define EFI_AAPL_BOOT { 0x426F6F74, 0x0000, 0x11aa, 0xaa, 0x11, \
+ { 0x00, 0x30, 0x65, 0x43, 0xec, 0xac } }
#define EFI_AAPL_HFS { 0x48465300, 0x0000, 0x11aa, 0xaa, 0x11, \
{ 0x00, 0x30, 0x65, 0x43, 0xec, 0xac } }
#define EFI_AAPL_UFS { 0x55465300, 0x0000, 0x11aa, 0xaa, 0x11, \
{ 0x00, 0x30, 0x65, 0x43, 0xec, 0xac } }
+#define EFI_AAPL_ZFS { 0x6a898cc3, 0x1dd2, 0x11b2, 0x99, 0xa6, \
+ { 0x08, 0x00, 0x20, 0x73, 0x66, 0x31 } }
+#define EFI_AAPL_APFS { 0x7c3457ef, 0x0000, 0x11aa, 0xaa, 0x11, \
+ { 0x00, 0x30, 0x65, 0x43, 0xec, 0xac } }
#define EFI_FREEBSD_BOOT { 0x83bd6b9d, 0x7f41, 0x11dc, 0xbe, 0x0b, \
{ 0x00, 0x15, 0x60, 0xb8, 0x4f, 0x0f } }
+#define EFI_FREEBSD_NANDFS { 0x74ba7dd9, 0xa689, 0x11e1, 0xbd, 0x04, \
+ { 0x00, 0xe0, 0x81, 0x28, 0x6a, 0xcf } }
#define EFI_FREEBSD_SWAP { 0x516e7cb5, 0x6ecf, 0x11d6, 0x8f, 0xf8, \
{ 0x00, 0x02, 0x2d, 0x09, 0x71, 0x2b } }
#define EFI_FREEBSD_UFS { 0x516e7cb6, 0x6ecf, 0x11d6, 0x8f, 0xf8, \
diff --git a/usr/src/uts/common/sys/vtoc.h b/usr/src/uts/common/sys/vtoc.h
index e9168d1e41..cce9938da6 100644
--- a/usr/src/uts/common/sys/vtoc.h
+++ b/usr/src/uts/common/sys/vtoc.h
@@ -86,9 +86,24 @@ extern "C" {
/* Tags for EFI/GPT labels */
#define V_RESERVED 0x0b /* SMI reserved data */
#define V_SYSTEM 0x0c /* EFI/GPT system partition */
-#define V_BIOS_BOOT 0x18 /* BIOS Boot partition */
-#define V_UNKNOWN 0xff /* Unknown partition */
+#define V_VXVM_PUB 0x0e /* VxVM public region */
+#define V_VXVM_PRIV 0x0f /* VxVM private region */
+
+#define V_BIOS_BOOT 0x18 /* Grub2 BIOS Boot partition */
+
+/* NetBSD/mips defines this */
+#define V_NETBSD_FFS 0xff
+
+/* FreeBSD tags: the high byte equals ELFOSABI_FREEBSD */
+#define V_FREEBSD_BOOT 0x0900
+#define V_FREEBSD_SWAP 0x0901
+#define V_FREEBSD_UFS 0x0902
+#define V_FREEBSD_VINUM 0x0903
+#define V_FREEBSD_ZFS 0x0904
+#define V_FREEBSD_NANDFS 0x0905
+
+#define V_UNKNOWN 0xffff /* Unknown partition */
/*
* Partition permission flags