xref: /openbsd/sbin/fdisk/part.c (revision b5ff5246)
1*b5ff5246Skrw /*	$OpenBSD: part.c,v 1.156 2023/04/11 16:34:51 krw Exp $	*/
2a1705421Sweingart 
3a1705421Sweingart /*
4a1705421Sweingart  * Copyright (c) 1997 Tobias Weingartner
5a1705421Sweingart  *
610a68084Skrw  * Permission to use, copy, modify, and distribute this software for any
710a68084Skrw  * purpose with or without fee is hereby granted, provided that the above
810a68084Skrw  * copyright notice and this permission notice appear in all copies.
9a1705421Sweingart  *
1010a68084Skrw  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1110a68084Skrw  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1210a68084Skrw  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1310a68084Skrw  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1410a68084Skrw  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1510a68084Skrw  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1610a68084Skrw  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17a1705421Sweingart  */
18a1705421Sweingart 
19a7568474Sderaadt #include <sys/types.h>
20a7568474Sderaadt #include <sys/disklabel.h>
21729290c0Skrw 
22e8252b55Skrw #include <err.h>
2398952941Skrw #include <stdint.h>
24a1705421Sweingart #include <stdio.h>
25fba7235cSkrw #include <stdlib.h>
26184a329bSmillert #include <string.h>
27fba7235cSkrw #include <uuid.h>
28abc6f793Skrw 
29199eafeaSkrw #include "part.h"
30a5472107Skrw #include "disk.h"
31a1705421Sweingart #include "misc.h"
3265deb39bSkrw #include "gpt.h"
33a1705421Sweingart 
345308a554Skrw struct mbr_type {
355308a554Skrw 	int	 mt_type;
367d916471Skrw 	char	*mt_desc;
375308a554Skrw };
385308a554Skrw 
39290491cbSkrw /*
40290491cbSkrw * MBR type sources:
41290491cbSkrw *	OpenBSD Historical usage
42290491cbSkrw * 	https://en.wikipedia.org/wiki/Partition_type#List_of_partition_IDs
43290491cbSkrw *	https://www.win.tue.nl/~aeb/partitions/partition_types-1.html
44290491cbSkrw */
455308a554Skrw const struct mbr_type		mbr_types[] = {
467d916471Skrw 	{ 0x00, NULL	},   /* unused */
477d916471Skrw 	{ 0x01, NULL	},   /* Primary DOS with 12 bit FAT */
487d916471Skrw 	{ 0x02, NULL	},   /* XENIX / filesystem */
497d916471Skrw 	{ 0x03, NULL	},   /* XENIX /usr filesystem */
507d916471Skrw 	{ 0x04, NULL	},   /* Primary DOS with 16 bit FAT */
517d916471Skrw 	{ 0x05, NULL	},   /* Extended DOS */
527d916471Skrw 	{ 0x06, NULL	},   /* Primary 'big' DOS (> 32MB) */
537d916471Skrw 	{ 0x07, NULL	},   /* NTFS */
547d916471Skrw 	{ 0x08, NULL	},   /* AIX filesystem */
557d916471Skrw 	{ 0x09, NULL	},   /* AIX boot partition or Coherent */
567d916471Skrw 	{ 0x0A, NULL	},   /* OS/2 Boot Manager or OPUS */
577d916471Skrw 	{ 0x0B, NULL	},   /* Primary Win95 w/ 32-bit FAT */
587d916471Skrw 	{ 0x0C, NULL	},   /* Primary Win95 w/ 32-bit FAT LBA-mapped */
597d916471Skrw 	{ 0x0E, NULL	},   /* Primary DOS w/ 16-bit FAT, CHS-mapped */
607d916471Skrw 	{ 0x0F, NULL	},   /* Extended DOS LBA-mapped */
617d916471Skrw 	{ 0x10, NULL	},   /* OPUS */
627d916471Skrw 	{ 0x11, NULL	},   /* OS/2 BM: hidden DOS 12-bit FAT */
637d916471Skrw 	{ 0x12, NULL	},   /* Compaq Diagnostics */
647d916471Skrw 	{ 0x14, NULL	},   /* OS/2 BM: hidden DOS 16-bit FAT <32M or Novell DOS 7.0 bug */
657d916471Skrw 	{ 0x16, NULL	},   /* OS/2 BM: hidden DOS 16-bit FAT >=32M */
667d916471Skrw 	{ 0x17, NULL	},   /* OS/2 BM: hidden IFS */
677d916471Skrw 	{ 0x18, NULL	},   /* AST Windows swapfile */
687d916471Skrw 	{ 0x19, NULL	},   /* Willowtech Photon coS */
697d916471Skrw 	{ 0x1C, NULL	},   /* IBM ThinkPad recovery partition */
707d916471Skrw 	{ 0x20, NULL	},   /* Willowsoft OFS1 */
717d916471Skrw 	{ 0x24, NULL	},   /* NEC DOS */
727d916471Skrw 	{ 0x27, NULL	},   /* Windows hidden Recovery Partition */
737d916471Skrw 	{ 0x38, NULL	},   /* Theos */
747d916471Skrw 	{ 0x39, NULL	},   /* Plan 9 */
757d916471Skrw 	{ 0x40, NULL	},   /* VENIX 286 or LynxOS */
767d916471Skrw 	{ 0x41, NULL 	},   /* Linux/MINIX (sharing disk with DRDOS) or Personal RISC boot */
777d916471Skrw 	{ 0x42, NULL 	},   /* SFS or Linux swap (sharing disk with DRDOS) */
787d916471Skrw 	{ 0x43, NULL 	},   /* Linux native (sharing disk with DRDOS) */
797d916471Skrw 	{ 0x4D, NULL	},   /* QNX 4.2 Primary */
807d916471Skrw 	{ 0x4E, NULL	},   /* QNX 4.2 Secondary */
817d916471Skrw 	{ 0x4F, NULL	},   /* QNX 4.2 Tertiary */
827d916471Skrw 	{ 0x50, NULL	},   /* DM (disk manager) */
837d916471Skrw 	{ 0x51, NULL	},   /* DM6 Aux1 (or Novell) */
847d916471Skrw 	{ 0x52, NULL	},   /* CP/M or Microport SysV/AT */
857d916471Skrw 	{ 0x53, NULL	},   /* DM6 Aux3 */
867d916471Skrw 	{ 0x54, NULL	},   /* Ontrack */
877d916471Skrw 	{ 0x55, NULL	},   /* EZ-Drive (disk manager) */
887d916471Skrw 	{ 0x56, NULL	},   /* Golden Bow (disk manager) */
897d916471Skrw 	{ 0x5C, NULL	},   /* Priam Edisk (disk manager) */
907d916471Skrw 	{ 0x61, NULL	},   /* SpeedStor */
917d916471Skrw 	{ 0x63, NULL	},   /* ISC, System V/386, GNU HURD or Mach */
927d916471Skrw 	{ 0x64, NULL	},   /* Novell NetWare 2.xx */
937d916471Skrw 	{ 0x65, NULL	},   /* Novell NetWare 3.xx */
947d916471Skrw 	{ 0x66, NULL	},   /* Novell 386 NetWare */
957d916471Skrw 	{ 0x67, NULL	},   /* Novell */
967d916471Skrw 	{ 0x68, NULL	},   /* Novell */
977d916471Skrw 	{ 0x69, NULL	},   /* Novell */
987d916471Skrw 	{ 0x70, NULL	},   /* DiskSecure Multi-Boot */
997d916471Skrw 	{ 0x75, NULL	},   /* PCIX */
1007d916471Skrw 	{ 0x80, NULL	},   /* Minix 1.1 ... 1.4a */
1017d916471Skrw 	{ 0x81, NULL	},   /* Minix 1.4b ... 1.5.10 */
1027d916471Skrw 	{ 0x82, NULL	},   /* Linux swap */
1037d916471Skrw 	{ 0x83, NULL	},   /* Linux filesystem */
1047d916471Skrw 	{ 0x84, NULL	},   /* OS/2 hidden C: drive */
1057d916471Skrw 	{ 0x85, NULL	},   /* Linux extended */
1067d916471Skrw 	{ 0x86, NULL	},   /* NT FAT volume set */
1077d916471Skrw 	{ 0x87, NULL	},   /* NTFS volume set or HPFS mirrored */
1087d916471Skrw 	{ 0x8E, NULL	},   /* Linux LVM */
1097d916471Skrw 	{ 0x93, NULL	},   /* Amoeba filesystem */
1107d916471Skrw 	{ 0x94, NULL	},   /* Amoeba bad block table */
1117d916471Skrw 	{ 0x99, NULL	},   /* Mylex EISA SCSI */
1127d916471Skrw 	{ 0x9F, NULL	},   /* BSDI BSD/OS */
1137d916471Skrw 	{ 0xA0, NULL	},   /* Phoenix NoteBIOS save-to-disk */
1147d916471Skrw 	{ 0xA5, NULL	},   /* FreeBSD */
1157d916471Skrw 	{ 0xA6, NULL	},   /* OpenBSD */
1167d916471Skrw 	{ 0xA7, NULL	},   /* NEXTSTEP */
1177d916471Skrw 	{ 0xA8, NULL	},   /* MacOS X main partition */
1187d916471Skrw 	{ 0xA9, NULL	},   /* NetBSD */
1197d916471Skrw 	{ 0xAB, NULL	},   /* MacOS X boot partition */
1207d916471Skrw 	{ 0xAF, NULL	},   /* MacOS X HFS+ partition */
1217d916471Skrw 	{ 0xB7, NULL	},   /* BSDI BSD/386 filesystem */
1227d916471Skrw 	{ 0xB8, NULL	},   /* BSDI BSD/386 swap */
1237d916471Skrw 	{ 0xBF, NULL	},   /* Solaris */
1247d916471Skrw 	{ 0xC0, NULL	},   /* CTOS */
1257d916471Skrw 	{ 0xC1, NULL	},   /* DRDOS/sec (FAT-12) */
1267d916471Skrw 	{ 0xC4, NULL	},   /* DRDOS/sec (FAT-16, < 32M) */
1277d916471Skrw 	{ 0xC6, NULL	},   /* DRDOS/sec (FAT-16, >= 32M) */
1287d916471Skrw 	{ 0xC7, NULL	},   /* Syrinx (Cyrnix?) or HPFS disabled */
1297d916471Skrw 	{ 0xDB, NULL	},   /* Concurrent CPM or C.DOS or CTOS */
1307d916471Skrw 	{ 0xDE, NULL	},   /* Dell maintenance partition */
1317d916471Skrw 	{ 0xE1, NULL	},   /* DOS access or SpeedStor 12-bit FAT extended partition */
1327d916471Skrw 	{ 0xE3, NULL	},   /* DOS R/O or SpeedStor or Storage Dimensions */
1337d916471Skrw 	{ 0xE4, NULL	},   /* SpeedStor 16-bit FAT extended partition < 1024 cyl. */
1347d916471Skrw 	{ 0xEB, NULL	},   /* BeOS for Intel */
1357d916471Skrw 	{ 0xEE, NULL	},   /* EFI Protective Partition */
1367d916471Skrw 	{ 0xEF, NULL	},   /* EFI System Partition */
1377d916471Skrw 	{ 0xF1, NULL	},   /* SpeedStor or Storage Dimensions */
1387d916471Skrw 	{ 0xF2, NULL	},   /* DOS 3.3+ Secondary */
1397d916471Skrw 	{ 0xF4, NULL	},   /* SpeedStor >1024 cyl. or LANstep or IBM PS/2 IML */
1407d916471Skrw 	{ 0xFF, NULL	},   /* Xenix Bad Block Table */
141a1705421Sweingart };
142a1705421Sweingart 
1435308a554Skrw struct gpt_type {
144f458660aSkrw 	int	 gt_attr;
145f458660aSkrw #define	GTATTR_PROTECT		(1 << 0)
146f458660aSkrw #define	GTATTR_PROTECT_EFISYS	(1 << 1)
1478ced0038Skrw 	char	*gt_desc;	/* NULL == try menu name (a.k.a. mi_name) */
1486ba1b8a5Skrw 	char	*gt_guid;
1495308a554Skrw };
1505308a554Skrw 
151290491cbSkrw /*
152290491cbSkrw  * GPT GUID sources:
153290491cbSkrw  *
154290491cbSkrw  * UEFI: UEFI Specification 2.9, March 2021, Section 5.3.3, Table 5.7
155290491cbSkrw  * Wikipedia: https://en.wikipedia.org/wiki/GUID_Partition_Table
156290491cbSkrw  * NetBSD: /usr/src/sys/sys/disklabel_gpt.h
157290491cbSkrw  * FreeBSD: /usr/src/sys/sys/disk/gpt.h.
158290491cbSkrw  * DragonFlyBSD: /usr/src/sys/sys/disk/gpt.h.
159290491cbSkrw  * Systemd:https://uapi-group.org/specifications/specs/discoverable_partitions_specification/
160290491cbSkrw  *         https://www.freedesktop.org/software/systemd/man/systemd-gpt-auto-generator.html
161290491cbSkrw  */
162d6ffd808Skrw 
163e89879fdSmiod #define UNUSED_GUID		"00000000-0000-0000-0000-000000000000"
164e89879fdSmiod #define LEGACY_MBR_GUID		"024dee41-33e7-11d3-9d69-0008c781f39f"
165e89879fdSmiod #define LINUX_SWAP_GUID		"0657fd6d-a4ab-43c4-84e5-0933c84b4f4f"
166e89879fdSmiod #define LINUX_FILES_GUID	"0fc63daf-8483-4772-8e79-3d69d8477de4"
167e89879fdSmiod #define BIOS_BOOT_GUID		"21686148-6449-6e6f-744e-656564454649"
168e89879fdSmiod #define HIFIVE_BBL_GUID		"2e54b353-1271-4842-806f-e436d6af6985"
169e89879fdSmiod #define BEOS_I386_GUID		"42465331-3ba3-10f1-802a-4861696b7521"
170e89879fdSmiod #define MACOS_X_BOOT_GUID	"426f6f74-0000-11aa-aa11-00306543ecac"
171e89879fdSmiod #define MACOS_X_HFS_GUID	"48465300-0000-11aa-aa11-00306543ecac"
172e89879fdSmiod #define NETBSD_GUID		"49f48d5a-b10e-11dc-b99b-0019d1879648"
173e89879fdSmiod #define FREEBSD_GUID		"516e7cb4-6ecf-11d6-8ff8-00022d09712b"
174e89879fdSmiod #define APFS_RECOVERY_GUID	"52637672-7900-11aa-aa11-00306543ecac"
175e89879fdSmiod #define MACOS_X_GUID		"55465300-0000-11aa-aa11-00306543ecac"
176e89879fdSmiod #define HIFIVE_FSBL_GUID	"5b193300-fc78-40cd-8002-e86c45580b47"
177e89879fdSmiod #define APFS_ISC_GUID		"69646961-6700-11aa-aa11-00306543ecac"
178e89879fdSmiod #define SOLARIS_GUID		"6a85cf4d-1dd2-11b2-99a6-080020736631"
179e89879fdSmiod #define APFS_GUID		"7c3457ef-0000-11aa-aa11-00306543ecac"
180e89879fdSmiod #define OPENBSD_GUID		"824cc7a0-36a8-11e3-890a-952519ad3f61"
181e89879fdSmiod #define LINUXSWAP_DR_GUID	"af9b60a0-1431-4f62-bc68-3311714a69ad"
182e89879fdSmiod #define EFI_SYSTEM_PARTITION_GUID "c12a7328-f81f-11d2-ba4b-00a0c93ec93b"
183e89879fdSmiod #define WIN_RECOVERY_GUID	"de94bba4-06d1-4d40-a16a-bfd50179d6ac"
184e89879fdSmiod #define LINUX_LVM_GUID		"e6d6d379-f507-44c2-a23c-238f2a3df928"
185e89879fdSmiod #define MICROSOFT_BASIC_DATA_GUID "ebd0a0a2-b9e5-4433-87c0-68b6b72699c7"
186e89879fdSmiod #define CHROME_KERNEL_GUID	"fe3a2a5d-4f32-41a7-b725-accc3285a309"
1873e1eb766Skrw #if 0
1883e1eb766Skrw #define	CEPH_MULTIPATH_BLOCK_LOG_GUID	"01b41e1b-002a-453c-9f17-88793989ff8f"
1893e1eb766Skrw #define	MIDNIGHTBSD_UFS_GUID		"0394ef8b-237e-11e1-b4b3-e89a8f7fc3a7"
1903e1eb766Skrw #define	FUCHSIA_L_DATA_GUID		"08185f0c-892d-428a-a789-dbeec8f55e6a"
1913e1eb766Skrw #define	CHROMEOS_MINIOS_GUID		"09845860-705f-4bb5-b16c-8a8a099caf52"
1923e1eb766Skrw #define	FUCHSIA_RO_FACTORY_BOOT_GUID	"10b8dbaa-d2bf-42a9-98c6-a7c5db3701e7"
1933e1eb766Skrw #define	ANDROID_IA_BOOT2_GUID		"114eaffe-1552-4022-b26e-9b053604cf84"
1943e1eb766Skrw #define	CEPH_DMCRYPT_LUKS_BLOCK_DB_GUID	"166418da-c469-4022-adf4-b30afd37f176"
1953e1eb766Skrw #define	ANDROID_6_0_ARM_EXT_GUID	"193d1ea4-b3ca-11e4-b075-10604b889dcf"
1963e1eb766Skrw #define	ANDROID_6_0_ARM_META_GUID	"19a710a2-b3ca-11e4-b026-10604b889dcf"
1973e1eb766Skrw #define	FUCHSIA_L_MISC_GUID		"1d75395d-f2c6-476b-a8b7-45cc1c97b476"
1983e1eb766Skrw #define	ANDROID_IA_METADATA_GUID	"20ac26be-20b7-11e3-84c5-6cfdb94711e9"
1993e1eb766Skrw #define	FUCHSIA_L_ZIRCON_BOOTB_GUID	"23cc04df-c278-4ce7-8471-897d1a4bcdf7"
2003e1eb766Skrw #define	ANDROID_IA_BOOT_GUID		"2568845d-2332-4675-bc39-8fa5a4748d15"
2013e1eb766Skrw #define	FUCHSIA_L_BLOB_GUID		"2967380e-134c-4cbb-b6da-17e7ce1ca45d"
2023e1eb766Skrw #define	LINUX_X86_64_ROOT_VERITY_GUID	"2c7357ed-ebd2-46d9-aec1-23d437ec2bf5"
2033e1eb766Skrw #define	NETBSD_CONCATENATED_GUID	"2db519c4-b10f-11dc-b99b-0019d1879648"
2043e1eb766Skrw #define	NETBSD_ENCRYPTED_GUID		"2db519ec-b10f-11dc-b99b-0019d1879648"
2053e1eb766Skrw #define	CHROMEOS_FUTURE_USE_GUID	"2e0a753d-9e48-43b0-8337-b15192cb1b5e"
2063e1eb766Skrw #define	SOFTRAID_SCRATCH_GUID		"2e313465-19b9-463f-8126-8a7993773801"
2073e1eb766Skrw #define	CEPH_DMCRYPT_BLOCK_LOG_GUID	"306e8683-4fe2-4330-b7c0-00a917c16966"
2083e1eb766Skrw #define	CEPH_BLOCK_DB_GUID		"30cd0809-c2b2-499c-8879-2d6b78529876"
2093e1eb766Skrw #define	WINDOWS_IBM_GPFS_GUID		"37affc90-ef7d-4e96-91c3-2d7ae055b174"
2103e1eb766Skrw #define	COREOS_RESIZABLE_ROOT_GUID	"3884dd41-8582-4404-b9a8-e9b84f2df50e"
2113e1eb766Skrw #define	ANDROID_IA_SYSTEM_GUID		"38f428e6-d326-425d-9140-6e0ea133647c"
2123e1eb766Skrw #define	LINUX_SRV_GUID			"3b8f8425-20e0-4f3b-907f-1a25a76f98e8"
2133e1eb766Skrw #define	CHROMEOS_ROOTFS_GUID		"3cb8e202-3b7e-47dd-8a3c-7ff2a13cfcec"
2143e1eb766Skrw #define	U_BOOT_ENVIRONMENT_GUID		"3de21764-95bd-54bd-a5c3-4abe786f38a8"
2153e1eb766Skrw #define	CHROMEOS_HIBERNATE_GUID		"3f0f8318-f146-4e6b-8222-c28c8f02e0d5"
2163e1eb766Skrw #define	ANDROID_IA_RECOVERY_GUID	"4177c722-9e92-4aab-8644-43502bfd5506"
2173e1eb766Skrw #define	FUCHSIA_L_FVM_GUID		"41d0e340-57e3-954e-8c1e-17ecac44cff5"
2183e1eb766Skrw #define	FUCHSIA_VERIFIED_BOOT_META_GUID	"421a8bfc-85d9-4d85-acda-b64eec0133e9"
2193e1eb766Skrw #define	LINUX_IA_64_USR_GUID		"4301d2a6-4e3b-4b2a-bb94-9e0b2c4225ea"
2203e1eb766Skrw #define	LINUX_X86_ROOT_GUID		"44479540-f297-41b2-9af7-d131d5f0458a"
2213e1eb766Skrw #define	CEPH_MULTIPATH_JOURNAL_GUID	"45b0969e-8ae0-4982-bf9d-5a8d867af560"
2223e1eb766Skrw #define	CEPH_DMCRYPT_LUKS_JOURNAL_GUID	"45b0969e-9b03-4f30-b4c6-35865ceff106"
2233e1eb766Skrw #define	CEPH_DMCRYPT_JOURNAL_GUID	"45b0969e-9b03-4f30-b4c6-5ec00ceff106"
2243e1eb766Skrw #define	CEPH_JOURNAL_GUID		"45b0969e-9b03-4f30-b4c6-b4b80ceff106"
2253e1eb766Skrw #define	BAREBOX_BAREBOX_STATE_GUID	"4778ed65-bf42-45fa-9c5b-287a1dc4aab1"
2263e1eb766Skrw #define	FUCHSIA_L_INSTALL_GUID		"48435546-4953-2041-494e-5354414c4c52"
2273e1eb766Skrw #define	ANDROID_IA_BOOT3_GUID		"49a4d17f-93a3-45c1-a0de-f50b2ebe2599"
2283e1eb766Skrw #define	NETBSD_SWAP_GUID		"49f48d32-b10e-11dc-b99b-0019d1879648"
2293e1eb766Skrw #define	NETBSD_LFS_GUID			"49f48d82-b10e-11dc-b99b-0019d1879648"
2303e1eb766Skrw #define	NETBSD_RAID_GUID		"49f48daa-b10e-11dc-b99b-0019d1879648"
2313e1eb766Skrw #define	FUCHSIA_VOLUME_MANAGER_GUID	"49fd7cb8-df15-4e73-b9d9-992070127f0f"
2323e1eb766Skrw #define	MACOS_LABEL_GUID		"4c616265-6c00-11aa-aa11-00306543ecac"
2333e1eb766Skrw #define	LINUX_VAR_GUID			"4d21b016-b534-45c2-a9fb-5c16e091fd2d"
2343e1eb766Skrw #define	FUCHSIA_L_SYS_CFG_GUID		"4e5e989e-4c86-11e8-a15b-480fcf35f8e6"
2353e1eb766Skrw #define	LINUX_X86_64_ROOT_GUID		"4f68bce3-e8cd-4db1-96e7-fbcaf984b709"
2363e1eb766Skrw #define	CEPH_MULTIPATH_OSD_GUID		"4fbd7e29-8ae0-4982-bf9d-5a8d867af560"
2373e1eb766Skrw #define	CEPH_OSD_GUID			"4fbd7e29-9d25-41b8-afd0-062c0ceff05d"
2383e1eb766Skrw #define	CEPH_DMCRYPT_LUKS_OSD_GUID	"4fbd7e29-9d25-41b8-afd0-35865ceff05d"
2393e1eb766Skrw #define	CEPH_DMCRYPT_OSD_GUID		"4fbd7e29-9d25-41b8-afd0-5ec00ceff05d"
2403e1eb766Skrw #define	FREEBSD_SWAP_GUID		"516e7cb5-6ecf-11d6-8ff8-00022d09712b"
2413e1eb766Skrw #define	FREEBSD_UFS_GUID		"516e7cb6-6ecf-11d6-8ff8-00022d09712b"
2423e1eb766Skrw #define	FREEBSD_VINUM_VOL_MGR_GUID	"516e7cb8-6ecf-11d6-8ff8-00022d09712b"
2433e1eb766Skrw #define	FREEBSD_ZFS_GUID		"516e7cba-6ecf-11d6-8ff8-00022d09712b"
2443e1eb766Skrw #define	MACOS_RAID_GUID			"52414944-0000-11aa-aa11-00306543ecac"
2453e1eb766Skrw #define	MACOS_RAID_OFFLINE_GUID		"52414944-5f4f-11aa-aa11-00306543ecac"
2463e1eb766Skrw #define	MACOS_TV_RECOVERY_GUID		"5265636f-7665-11aa-aa11-00306543ecac"
2473e1eb766Skrw #define	MACOS_CORE_STORAGE_GUID		"53746f72-6167-11aa-aa11-00306543ecac"
2483e1eb766Skrw #define	WINDOWS_STORAGE_REPLICA_GUID	"558d43c5-a1ac-43c0-aac8-d1472b2923d1"
2493e1eb766Skrw #define	WINDOWS_LDM_METADATA_GUID	"5808c8aa-7e8f-42e0-85d2-e1e90434cfb3"
2503e1eb766Skrw #define	FUCHSIA_L_FACTORY_CFG_GUID	"5a3a90be-4c86-11e8-a15b-480fcf35f8e6"
2513e1eb766Skrw #define	CEPH_BLOCK_LOG_GUID		"5ce17fce-4087-4169-b7ff-056cc58473f9"
2523e1eb766Skrw #define	COREOS_USR_GUID			"5dfbf5f4-2848-4bac-aa5e-0d9a20b745a6"
2533e1eb766Skrw #define	FUCHSIA_L_BOOT_GUID		"5ece94fe-4c86-11e8-a15b-480fcf35f8e6"
2543e1eb766Skrw #define	FUCHSIA_L_SYSTEM_GUID		"606b000b-b7c7-4653-a7d5-b737332c899d"
2553e1eb766Skrw #define	LINUX_ARM32_ROOT_GUID		"69dad710-2ce4-4e3c-b16c-21a1d49abed3"
2563e1eb766Skrw #define	FUCHSIA_L_VERIFIED_BOOTM_R_GUID	"6a2460c3-cd11-4e8b-80a8-12cce268ed0a"
2573e1eb766Skrw #define	LINUX_IA_64_USR_VERITY_GUID	"6a491e03-3be7-4545-8e38-83320e0ea880"
2583e1eb766Skrw #define	SOLARIS_BOOT_GUID		"6a82cb45-1dd2-11b2-99a6-080020736631"
2593e1eb766Skrw #define	SOLARIS_SWAP_GUID		"6a87c46f-1dd2-11b2-99a6-080020736631"
2603e1eb766Skrw #define	SOLARIS_USR_MACOS_ZFS_GUID	"6a898cc3-1dd2-11b2-99a6-080020736631"
2613e1eb766Skrw #define	SOLARIS_BACKUP_GUID		"6a8b642b-1dd2-11b2-99a6-080020736631"
2623e1eb766Skrw #define	SOLARIS_RESERVED5_GUID		"6a8d2ac7-1dd2-11b2-99a6-080020736631"
2633e1eb766Skrw #define	SOLARIS_VAR_GUID		"6a8ef2e9-1dd2-11b2-99a6-080020736631"
2643e1eb766Skrw #define	SOLARIS_HOME_GUID		"6a90ba39-1dd2-11b2-99a6-080020736631"
2653e1eb766Skrw #define	SOLARIS_ALT_SECTOR_GUID		"6a9283a5-1dd2-11b2-99a6-080020736631"
2663e1eb766Skrw #define	SOLARIS_RESERVED1_GUID		"6a945a3b-1dd2-11b2-99a6-080020736631"
2673e1eb766Skrw #define	SOLARIS_RESERVED4_GUID		"6a96237f-1dd2-11b2-99a6-080020736631"
2683e1eb766Skrw #define	SOLARIS_RESERVED2_GUID		"6a9630d1-1dd2-11b2-99a6-080020736631"
2693e1eb766Skrw #define	SOLARIS_RESERVED3_GUID		"6a980767-1dd2-11b2-99a6-080020736631"
2703e1eb766Skrw #define	LINUX_ARM64_USR_VERITY_GUID	"6e11a4e7-fbca-4ded-b9e9-e1a512bb664e"
2713e1eb766Skrw #define	ATARI_TOS_BASIC_DATA_GUID	"734e5afe-f61a-11e6-bc64-92361f002671"
2723e1eb766Skrw #define	LINUX_ARM32_ROOT_VERITY_GUID	"7386cdf2-203c-47a9-a498-f2ecce45a2d6"
2733e1eb766Skrw #define	ONIE_BOOT_GUID			"7412f7d5-a156-4b13-81dc-867174929325"
2743e1eb766Skrw #define	FREEBSD_NANDFS_GUID		"74ba7dd9-a689-11e1-bd04-00e081286acf"
2753e1eb766Skrw #define	LINUX_X86_USR_GUID		"75250d76-8cc6-458e-bd66-bd47cc81a812"
2763e1eb766Skrw #define	HP_UX_DATA_GUID			"75894c1e-3aeb-11d3-b7c1-7b03a0000000"
2773e1eb766Skrw #define	ANDROID_IA_FASTBOOT_GUID	"767941d0-2085-11e3-ad3b-6cfdb94711e9"
2783e1eb766Skrw #define	LINUX_USER_HOME_GUID		"773f91ef-66d4-49b5-bd83-d683bf40ad16"
2793e1eb766Skrw #define	LINUX_X86_64_USR_VERITY_GUID	"77ff5f63-e7b6-4633-acf4-1565b864c0e6"
2803e1eb766Skrw #define	SPDK_BLOCK_DEVICE_GUID		"7c5222bd-8f5d-4087-9c00-bf9843c7b58c"
2813e1eb766Skrw #define	LINUX_ARM32_USR_GUID		"7d0359a3-02b3-4f0a-865c-654403e70625"
2823e1eb766Skrw #define	LINUX_VAR_TMP_GUID		"7ec6f557-3bc5-4aca-b293-16ef5df639d1"
2833e1eb766Skrw #define	CEPH_MULTIPATH_BLOCK_B_GUID	"7f4a666a-16f3-47a2-8445-152ef4d03f6c"
2843e1eb766Skrw #define	LINUX_PLAIN_DMCRYPT_GUID	"7ffec5c9-2d00-49b7-8941-3ea10a5586b7"
2853e1eb766Skrw #define	FREEBSD_BOOT_GUID		"83bd6b9d-7f41-11dc-be0b-001560b84f0f"
2863e1eb766Skrw #define	LINUX_X86_64_USR_GUID		"8484680c-9521-48c6-9c11-b0720656f69e"
2873e1eb766Skrw #define	MIDNIGHTBSD_DATA_GUID		"85d5e45a-237c-11e1-b4b3-e89a8f7fc3a7"
2883e1eb766Skrw #define	MIDNIGHTBSD_SWAP_GUID		"85d5e45b-237c-11e1-b4b3-e89a8f7fc3a7"
2893e1eb766Skrw #define	MIDNIGHTBSD_VINUM_VOL_MGR_GUID	"85d5e45c-237c-11e1-b4b3-e89a8f7fc3a7"
2903e1eb766Skrw #define	MIDNIGHTBSD_ZFS_GUID		"85d5e45d-237c-11e1-b4b3-e89a8f7fc3a7"
2913e1eb766Skrw #define	MIDNIGHTBSD_BOOT_GUID		"85d5e45e-237c-11e1-b4b3-e89a8f7fc3a7"
2923e1eb766Skrw #define	CEPH_DMCRYPT_LUKS_LOG_GUID	"86a32090-3647-40b9-bbbd-38d8c573aa86"
2933e1eb766Skrw #define	LINUX_IA_64_ROOT_VERITY_GUID	"86ed10d5-b607-45bb-8957-d350f23d0571"
2943e1eb766Skrw #define	CEPH_DMCRYPT_CREATNG_DISK_GUID	"89c57f98-2fe5-4dc0-89c1-5ec00ceff2be"
2953e1eb766Skrw #define	CEPH_DISK_IN_CREATION_GUID	"89c57f98-2fe5-4dc0-89c1-f3ad0ceff2be"
2963e1eb766Skrw #define	FUCHSIA_L_TEST_GUID		"8b94d043-30be-4871-9dfa-d69556e8c1f3"
2973e1eb766Skrw #define	VERACRYPT_ENCRYPTED_DATA_GUID	"8c8f8eff-ac95-4770-814a-21994f2dbc8f"
2983e1eb766Skrw #define	LINUX_RESERVED_GUID		"8da63339-0007-60c0-c436-083ac8230908"
2993e1eb766Skrw #define	LINUX_X86_USR_VERITY_GUID	"8f461b0d-14ee-4e81-9aa9-049b6fb97abd"
3003e1eb766Skrw #define	ANDROID_IA_FACTORY_GUID		"8f68cc74-c5e5-48da-be91-a0c8c15e9c80"
3013e1eb766Skrw #define	FUCHSIA_L_EMMC_BOOT1_GUID	"900b0fc5-90cd-4d4f-84f9-9f8ed579db88"
3023e1eb766Skrw #define	ARCAOS_TYPE_1_GUID		"90b6ff38-b98f-4358-a21f-48f35b4a8ad3"
3033e1eb766Skrw #define	VMWARE_RESERVED_GUID		"9198effc-31c0-11db-8f78-000c2911d1b8"
3043e1eb766Skrw #define	LINUX_HOME_GUID			"933ac7e1-2eb4-4f13-b844-0e14e2aef915"
3053e1eb766Skrw #define	CEPH_DMCRYPT_BLOCK_DB_GUID	"93b0052d-02d9-4d8a-a43b-33a3ee4dfbc3"
3063e1eb766Skrw #define	LINUX_IA_64_ROOT_GUID		"993d8d3d-f80e-4225-855a-9daf8ed7ea97"
3073e1eb766Skrw #define	FUCHSIA_ZIRCON_BOOT_ABR_GUID	"9b37fff6-2e58-466a-983a-f7926d0b04e0"
3083e1eb766Skrw #define	VMWARE_VMKCORE_GUID		"9d275380-40ad-11db-bf97-000c2911d1b8"
3093e1eb766Skrw #define	PPC_PREP_BOOT_GUID		"9e1a2d38-c612-4316-aa26-8b49521e5a8b"
3103e1eb766Skrw #define	ANDROID_IA_FACTORY_ALT_GUID	"9fdaa6ef-4b3f-40d2-ba8d-bff16bfb887b"
3113e1eb766Skrw #define	FUCHSIA_L_ZIRCON_BOOTR_GUID	"a0e5cf57-2def-46be-a80c-a2067c37cd49"
3123e1eb766Skrw #define	FUCHSIA_L_VERIFIED_BOOTM_A_GUID	"a13b4d9a-ec5f-11e8-97d8-6c3be52705bf"
3133e1eb766Skrw #define	LINUX_RAID_GUID			"a19d880f-05fc-4d3b-a006-743f0f84911e"
3143e1eb766Skrw #define	FUCHSIA_L_VERIFIED_BOOTM_B_GUID	"a288abf2-ec5f-11e8-97d8-6c3be52705bf"
3153e1eb766Skrw #define	FUCSHIA_BOOT_METADATA_GUID	"a409e16b-78aa-4acc-995c-302352621a41"
3163e1eb766Skrw #define	ANDROID_IA_CACHE_GUID		"a893ef21-e428-470a-9e55-0668fd91a2d9"
3173e1eb766Skrw #define	VMWARE_VMFS_FILESYSTEM_GUID	"aa31e02a-400f-11db-9590-000c2911d1b8"
3183e1eb766Skrw #define	ANDROID_IA_OEM_GUID		"ac6d7924-eb71-4df8-b48d-e267b27148ff"
3193e1eb766Skrw #define	LINUX_ARM64_USR_GUID		"b0e01050-ee5f-4390-949a-9101b17104e9"
3203e1eb766Skrw #define	FUCHSIA_L_EMMC_BOOT2_GUID	"b2b2e8d1-7c10-4ebc-a2d0-4614568260ad"
3213e1eb766Skrw #define	SOFTRAID_STATUS_GUID		"b6fa30da-92d2-4a9a-96f1-871ec6486200"
3223e1eb766Skrw #define	LINUX_ARM64_ROOT_GUID		"b921b045-1df0-41c3-af44-4c6f280d3fae"
3233e1eb766Skrw #define	SOFTRAID_CACHE_GUID		"bbba6df5-f46f-4a89-8f59-8765b2727503"
3243e1eb766Skrw #define	LINUX_BOOT_GUID			"bc13c2ff-59e6-4262-a352-b275fd6f7172"
3253e1eb766Skrw #define	ANDROID_IA_CFG_GUID		"bd59408b-4514-490d-bf12-9878d963f378"
3263e1eb766Skrw #define	COREOS_ROOT_RAID_GUID		"be9067b9-ea49-4f15-b4f6-f36f8c9e1818"
3273e1eb766Skrw #define	LENOVO_BOOT_GUID		"bfbfafe7-a34f-448a-9a5b-6213eb736c22"
3283e1eb766Skrw #define	LINUX_ARM32_USR_VERITY_GUID	"c215d751-7bcd-4649-be90-6627490a4c05"
3293e1eb766Skrw #define	ANDROID_IA_VENDOR_GUID		"c5a0aeec-13ea-11e5-a1b1-001e67ca0c3c"
3303e1eb766Skrw #define	PLAN9_GUID			"c91818f9-8025-47af-89d2-f030d7000c2c"
3313e1eb766Skrw #define	COREOS_OEM_GUID			"c95dc21a-df0e-4340-8d7b-26cbfa9a03e0"
3323e1eb766Skrw #define	LINUX_LUKS_GUID			"ca7d7ccb-63ed-4c53-861c-1742536059cc"
3333e1eb766Skrw #define	CHROMEOS_FIRMWARE_GUID		"cab6e88e-abf3-4102-a07a-d4bb9be3c1d3"
3343e1eb766Skrw #define	CEPH_MULTIPATH_BLOCK_A_GUID	"cafecafe-8ae0-4982-bf9d-5a8d867af560"
3353e1eb766Skrw #define	CEPH_DMCRYPT_LUKS_BLOCK_GUID	"cafecafe-9b03-4f30-b4c6-35865ceff106"
3363e1eb766Skrw #define	CEPH_DMCRYPT_BLOCK_GUID		"cafecafe-9b03-4f30-b4c6-5ec00ceff106"
3373e1eb766Skrw #define	CEPH_BLOCK_GUID			"cafecafe-9b03-4f30-b4c6-b4b80ceff106"
3383e1eb766Skrw #define	QNX_POWER_SAFE_FS_GUID		"cef5a9ad-73bc-4601-89f3-cdeeeee321a1"
3393e1eb766Skrw #define	LINUX_X86_ROOT_VERITY_GUID	"d13c5d3b-b5d1-422a-b29f-9454fdc89d76"
3403e1eb766Skrw #define	INTEL_FAST_FLASH_GUID		"d3bfe2de-3daf-11df-ba40-e3a556d89593"
3413e1eb766Skrw #define	ONIE_CFG_GUID			"d4e6e2cd-4469-46f3-b5cb-1bff57afc149"
3423e1eb766Skrw #define	FUCHSIA_ENCRYPTED_SYS_GUID	"d9fd4535-106c-4cec-8d37-dfc020ca87cb"
3433e1eb766Skrw #define	ANDROID_IA_DATA_GUID		"dc76dda9-5ac1-491c-af42-a82591580c0d"
3443e1eb766Skrw #define	FUCHSIA_L_ZIRCON_BOOTA_GUID	"de30cc86-1f4a-4a31-93c4-66f147d33e05"
3453e1eb766Skrw #define	LINUX_ARM64_ROOT_VERITY_GUID	"df3300ce-d69f-4c92-978c-9bfb0f38d820"
3463e1eb766Skrw #define	HP_UX_SERVICE_GUID		"e2a1e728-32e3-11d6-a682-7b03a0000000"
3473e1eb766Skrw #define	WINDOWS_RESERVED_GUID		"e3c9e316-0b5c-4db8-817d-f92df00215ae"
3483e1eb766Skrw #define	WINDOWS_STORAGE_SPACES_GUID	"e75caf8f-f680-4cee-afa3-b001e56efc2d"
3493e1eb766Skrw #define	ANDROID_IA_PERSISTENT_GUID	"ebc597d0-2053-4b15-8b64-e0aac75f4db1"
3503e1eb766Skrw #define	CEPH_MULTIPATH_BLOCK_DB_GUID	"ec6d6385-e346-45dc-be91-da2a7c8b3261"
3513e1eb766Skrw #define	ANDROID_IA_MISC_GUID		"ef32a33b-a409-486c-9141-9ffb711f6266"
3523e1eb766Skrw #define	SONY_BOOT_GUID			"f4019732-066e-4e12-8273-346c5641494f"
3533e1eb766Skrw #define	FUCHSIA_RO_FACTORY_SYS_GUID	"f95d940e-caba-4578-9b93-bb6c90f29d3e"
3543e1eb766Skrw #define	SOFTRAID_VOLUME_GUID		"fa709c7e-65b1-4593-bfd5-e71d61de9b02"
3553e1eb766Skrw #define	CEPH_DMCRYPT_KEYS_LOCKBOX_GUID	"fb3aabf9-d25f-47cc-bf5e-721d1816496b"
3563e1eb766Skrw #define	FUCHSIA_BOOT_GUID		"fe8a2634-5e2e-46ba-99e3-3a192091a350"
3573e1eb766Skrw #endif
358d6ffd808Skrw 
3595308a554Skrw const struct gpt_type		gpt_types[] = {
3607d916471Skrw 	{ GTATTR_PROTECT,
3618ced0038Skrw 	     NULL,	/* BIOS Boot */		BIOS_BOOT_GUID },
3627d916471Skrw 	{ GTATTR_PROTECT,
3638ced0038Skrw 	     NULL,	/* HiFive BBL */	HIFIVE_BBL_GUID },
3647d916471Skrw 	{ GTATTR_PROTECT,
3658ced0038Skrw 	     NULL,	/* HiFive FSBL */	HIFIVE_FSBL_GUID },
3667d916471Skrw 	{ GTATTR_PROTECT | GTATTR_PROTECT_EFISYS,
3678ced0038Skrw 	     NULL,	/* APFS Recovery */	APFS_RECOVERY_GUID },
3687d916471Skrw 	{ GTATTR_PROTECT | GTATTR_PROTECT_EFISYS,
3698ced0038Skrw 	     NULL,	/* APFS ISC */		APFS_ISC_GUID },
3708ced0038Skrw 	{ GTATTR_PROTECT | GTATTR_PROTECT_EFISYS,
3718ced0038Skrw 	     NULL,	/* APFS */		APFS_GUID },
3728ced0038Skrw 
3738ced0038Skrw 	{ 0, NULL,	/* Unused */		UNUSED_GUID },
3748ced0038Skrw 	{ 0, NULL,	/* Legacy MBR */	LEGACY_MBR_GUID },
3758ced0038Skrw 	{ 0, NULL,	/* Linux swap */	LINUX_SWAP_GUID },
3768ced0038Skrw 	{ 0, NULL,	/* Linux files* */	LINUX_FILES_GUID },
3778ced0038Skrw 	{ 0, NULL,	/* MacOS X */		MACOS_X_GUID },
3788ced0038Skrw 	{ 0, NULL,	/* Solaris */		SOLARIS_GUID },
3798ced0038Skrw 	{ 0, NULL,	/* BeOS/i386 */		BEOS_I386_GUID },
3808ced0038Skrw 	{ 0, NULL,	/* MacOS X boot */	MACOS_X_BOOT_GUID },
3818ced0038Skrw 	{ 0, NULL,	/* MacOS X HFS+ */	MACOS_X_HFS_GUID },
3828ced0038Skrw 	{ 0, NULL,	/* NetBSD */		NETBSD_GUID },
3838ced0038Skrw 	{ 0, NULL,	/* FreeBSD */		FREEBSD_GUID },
3848ced0038Skrw 	{ 0, NULL,	/* OpenBSD */		OPENBSD_GUID },
3858ced0038Skrw 	{ 0, NULL,	/* LinuxSwap DR */	LINUXSWAP_DR_GUID },
3868ced0038Skrw 	{ 0, NULL,	/* EFI Sys */		EFI_SYSTEM_PARTITION_GUID },
3878ced0038Skrw 	{ 0, NULL,	/* Win Recovery*/	WIN_RECOVERY_GUID },
3888ced0038Skrw 	{ 0, NULL,	/* Linux VM */		LINUX_LVM_GUID },
3898ced0038Skrw 	{ 0, NULL,	/* MS basic data */	MICROSOFT_BASIC_DATA_GUID },
3908ced0038Skrw 	{ 0, NULL,	/* ChromeKernel */	CHROME_KERNEL_GUID },
3913e1eb766Skrw #if 0
3923e1eb766Skrw 	/* Sorted as in https://en.wikipedia.org/wiki/GUID_Partition_Table */
3933e1eb766Skrw 	{ 0, "Intel Fast Flash (iFFS)",		INTEL_FAST_FLASH_GUID },
3943e1eb766Skrw 	{ 0, "Sony boot",			SONY_BOOT_GUID },
3953e1eb766Skrw 	{ 0, "Lenovo boot",			LENOVO_BOOT_GUID },
3963e1eb766Skrw 
3973e1eb766Skrw 	/* Microsoft Windows */
3983e1eb766Skrw 	{ 0, "Windows Reserved (MSR)",		WINDOWS_RESERVED_GUID },
3993e1eb766Skrw 	{ 0, "Windows LDM metadata",		WINDOWS_LDM_METADATA_GUID },
4003e1eb766Skrw 	{ 0, "Windows IBM General Parallel FS",	WINDOWS_IBM_GPFS_GUID },
4013e1eb766Skrw 	{ 0, "Windows Storage Spaces",		WINDOWS_STORAGE_SPACES_GUID },
4023e1eb766Skrw 	{ 0, "Windows Storage Replica",		WINDOWS_STORAGE_REPLICA_GUID },
4033e1eb766Skrw 
4043e1eb766Skrw 	/* HP-UX */
4053e1eb766Skrw 	{ 0, "HP-UX Data",			HP_UX_DATA_GUID },
4063e1eb766Skrw 	{ 0, "HP-UX Service",			HP_UX_SERVICE_GUID },
4073e1eb766Skrw 
4083e1eb766Skrw 	/* Linux */
4093e1eb766Skrw 	{ 0, "Linux RAID",			LINUX_RAID_GUID },
4103e1eb766Skrw 	{ 0, "Linux x86 Root",			LINUX_X86_ROOT_GUID },
4113e1eb766Skrw 	{ 0, "Linux x86-64 Root",		LINUX_X86_64_ROOT_GUID },
4123e1eb766Skrw 	{ 0, "Linux Arm32 Root",		LINUX_ARM32_ROOT_GUID },
4133e1eb766Skrw 	{ 0, "Linux Arm64 root",		LINUX_ARM64_ROOT_GUID },
4143e1eb766Skrw 	{ 0, "Linux /boot",			LINUX_BOOT_GUID },
4153e1eb766Skrw 	{ 0, "Linux /home",			LINUX_HOME_GUID },
4163e1eb766Skrw 	{ 0, "Linux /srv (server data)",	LINUX_SRV_GUID },
4173e1eb766Skrw 	{ 0, "Linux Plain dm-crypt",		LINUX_PLAIN_DMCRYPT_GUID },
4183e1eb766Skrw 	{ 0, "Linux LUKS",			LINUX_LUKS_GUID },
4193e1eb766Skrw 	{ 0, "Linux Reserved",			LINUX_RESERVED_GUID },
4203e1eb766Skrw 
4213e1eb766Skrw 	/* FreeBSD */
4223e1eb766Skrw 	{ 0, "FreeBSD Boot",			FREEBSD_BOOT_GUID },
4233e1eb766Skrw 	{ 0, "FreeBSD Swap",			FREEBSD_SWAP_GUID },
4243e1eb766Skrw 	{ 0, "FreeBSD UFS",			FREEBSD_UFS_GUID },
4253e1eb766Skrw 	{ 0, "FreeBSD Vinum volume manager",	FREEBSD_VINUM_VOL_MGR_GUID },
4263e1eb766Skrw 	{ 0, "FreeBSD ZFS",			FREEBSD_ZFS_GUID },
4273e1eb766Skrw 	{ 0, "FreeBSD nandfs",			FREEBSD_NANDFS_GUID },
4283e1eb766Skrw 
4293e1eb766Skrw 	/* MacOS/Darwin */
4303e1eb766Skrw 	{ 0, "MacOS RAID",			MACOS_RAID_GUID },
4313e1eb766Skrw 	{ 0, "MacOS RAID (offline)",		MACOS_RAID_OFFLINE_GUID },
4323e1eb766Skrw 	{ 0, "MacOS Label",			MACOS_LABEL_GUID },
4333e1eb766Skrw 	{ 0, "MacOS TV Recovery",		MACOS_TV_RECOVERY_GUID },
4343e1eb766Skrw 	{ 0, "MacOS Core Storage container",	MACOS_CORE_STORAGE_GUID },
4353e1eb766Skrw 
4363e1eb766Skrw 	/* Solaris/illumos */
4373e1eb766Skrw 	{ 0, "Solaris/illumos boot",		SOLARIS_BOOT_GUID },
4383e1eb766Skrw 	{ 0, "Solaris/illumos Swap",		SOLARIS_SWAP_GUID },
4393e1eb766Skrw 	{ 0, "Solaris/illumos Backup",		SOLARIS_BACKUP_GUID },
4403e1eb766Skrw 	{ 0, "Solaris/illumos /usr|MacOS ZFS",	SOLARIS_USR_MACOS_ZFS_GUID },
4413e1eb766Skrw 	{ 0, "Solaris/illumos /var",		SOLARIS_VAR_GUID },
4423e1eb766Skrw 	{ 0, "Solaris/illumos /home",		SOLARIS_HOME_GUID },
4433e1eb766Skrw 	{ 0, "Solaris/illumos Alt sector",	SOLARIS_ALT_SECTOR_GUID },
4443e1eb766Skrw 	{ 0, "Solaris/illumos Reserved",	SOLARIS_RESERVED1_GUID },
4453e1eb766Skrw 	{ 0, "Solaris/illumos Reserved",	SOLARIS_RESERVED2_GUID },
4463e1eb766Skrw 	{ 0, "Solaris/illumos Reserved",	SOLARIS_RESERVED3_GUID },
4473e1eb766Skrw 	{ 0, "Solaris/illumos Reserved",	SOLARIS_RESERVED4_GUID },
4483e1eb766Skrw 	{ 0, "Solaris/illumos Reserved",	SOLARIS_RESERVED5_GUID },
4493e1eb766Skrw 
4503e1eb766Skrw 	/* NetBSD */
4513e1eb766Skrw 	{ 0, "NetBSD Swap",			NETBSD_SWAP_GUID },
4523e1eb766Skrw 	{ 0, "NetBSD LFS",			NETBSD_LFS_GUID },
4533e1eb766Skrw 	{ 0, "NetBSD RAID",			NETBSD_RAID_GUID },
4543e1eb766Skrw 	{ 0, "NetBSD Concatenated",		NETBSD_CONCATENATED_GUID },
4553e1eb766Skrw 	{ 0, "NetBSD Encrypted",		NETBSD_ENCRYPTED_GUID },
4563e1eb766Skrw 
4573e1eb766Skrw 	/* ChromeOS */
4583e1eb766Skrw 	{ 0, "ChromeOS rootfs",			CHROMEOS_ROOTFS_GUID },
4593e1eb766Skrw 	{ 0, "ChromeOS firmware",		CHROMEOS_FIRMWARE_GUID },
4603e1eb766Skrw 	{ 0, "ChromeOS future use",		CHROMEOS_FUTURE_USE_GUID },
4613e1eb766Skrw 	{ 0, "ChromeOS miniOS",			CHROMEOS_MINIOS_GUID },
4623e1eb766Skrw 	{ 0, "ChromeOS hibernate",		CHROMEOS_HIBERNATE_GUID },
4633e1eb766Skrw 
4643e1eb766Skrw 	/* Container Linux by CoreOS */
4653e1eb766Skrw 	{ 0, "CoreOS /usr",			COREOS_USR_GUID },
4663e1eb766Skrw 	{ 0, "CoreOS Resizable root",		COREOS_RESIZABLE_ROOT_GUID },
4673e1eb766Skrw 	{ 0, "CoreOS OEM",			COREOS_OEM_GUID },
4683e1eb766Skrw 	{ 0, "CoreOS root RAID",		COREOS_ROOT_RAID_GUID },
4693e1eb766Skrw 
4703e1eb766Skrw 	/* MidnightBSD */
4713e1eb766Skrw 	{ 0, "MidnightBSD Boot",		MIDNIGHTBSD_BOOT_GUID },
4723e1eb766Skrw 	{ 0, "MidnightBSD Data",		MIDNIGHTBSD_DATA_GUID },
4733e1eb766Skrw 	{ 0, "MidnightBSD Swap",		MIDNIGHTBSD_SWAP_GUID },
4743e1eb766Skrw 	{ 0, "MidnightBSD UFS",			MIDNIGHTBSD_UFS_GUID },
4753e1eb766Skrw 	{ 0, "MidnightBSD Vinum vol mgr",	MIDNIGHTBSD_VINUM_VOL_MGR_GUID },
4763e1eb766Skrw 	{ 0, "MidnightBSD ZFS",			MIDNIGHTBSD_ZFS_GUID },
4773e1eb766Skrw 
4783e1eb766Skrw 	/* Ceph */
4793e1eb766Skrw 	{ 0, "Ceph Journal",			CEPH_JOURNAL_GUID },
4803e1eb766Skrw 	{ 0, "Ceph dm-crypt journal",		CEPH_DMCRYPT_JOURNAL_GUID },
4813e1eb766Skrw 	{ 0, "Ceph OSD",			CEPH_OSD_GUID },
4823e1eb766Skrw 	{ 0, "Ceph dm-crypt OSD",		CEPH_DMCRYPT_OSD_GUID },
4833e1eb766Skrw 	{ 0, "Ceph Disk in creation",		CEPH_DISK_IN_CREATION_GUID },
4843e1eb766Skrw 	{ 0, "Ceph dm-crypt disk in creation",	CEPH_DMCRYPT_CREATNG_DISK_GUID },
4853e1eb766Skrw 	{ 0, "Ceph Block",			CEPH_BLOCK_GUID },
4863e1eb766Skrw 	{ 0, "Ceph Block DB",			CEPH_BLOCK_DB_GUID },
4873e1eb766Skrw 	{ 0, "Ceph Block write-ahead log",	CEPH_BLOCK_LOG_GUID },
4883e1eb766Skrw 	{ 0, "Ceph Lockbox for dm-crypt keys",	CEPH_DMCRYPT_KEYS_LOCKBOX_GUID },
4893e1eb766Skrw 	{ 0, "Ceph Multipath OSD",		CEPH_MULTIPATH_OSD_GUID },
4903e1eb766Skrw 	{ 0, "Ceph Multipath journal",		CEPH_MULTIPATH_JOURNAL_GUID },
4913e1eb766Skrw 	{ 0, "Ceph Multipath block A",		CEPH_MULTIPATH_BLOCK_A_GUID },
4923e1eb766Skrw 	{ 0, "Ceph Multipath block B",		CEPH_MULTIPATH_BLOCK_B_GUID },
4933e1eb766Skrw 	{ 0, "Ceph Multipath block DB",		CEPH_MULTIPATH_BLOCK_DB_GUID },
4943e1eb766Skrw 	{ 0, "Ceph Multipath block log",	CEPH_MULTIPATH_BLOCK_LOG_GUID },
4953e1eb766Skrw 	{ 0, "Ceph dm-crypt block",		CEPH_DMCRYPT_BLOCK_GUID },
4963e1eb766Skrw 	{ 0, "Ceph dm-crypt block DB",		CEPH_DMCRYPT_BLOCK_DB_GUID },
4973e1eb766Skrw 	{ 0, "Ceph dm-crypt block log",		CEPH_DMCRYPT_BLOCK_LOG_GUID },
4983e1eb766Skrw 	{ 0, "Ceph dm-crypt LUKS journal",	CEPH_DMCRYPT_LUKS_JOURNAL_GUID },
4993e1eb766Skrw 	{ 0, "Ceph dm-crypt LUKS block",	CEPH_DMCRYPT_LUKS_BLOCK_GUID },
5003e1eb766Skrw 	{ 0, "Ceph dm-crypt LUKS block DB",	CEPH_DMCRYPT_LUKS_BLOCK_DB_GUID },
5013e1eb766Skrw 	{ 0, "Ceph dm-crypt LUKS log",		CEPH_DMCRYPT_LUKS_LOG_GUID },
5023e1eb766Skrw 	{ 0, "Ceph dm-crypt LUKS OSD",		CEPH_DMCRYPT_LUKS_OSD_GUID },
5033e1eb766Skrw 
5043e1eb766Skrw 	/* QNX */
5053e1eb766Skrw 	{ 0, "QNX (6) Power-safe file system",	QNX_POWER_SAFE_FS_GUID },
5063e1eb766Skrw 
5073e1eb766Skrw 	/* Plan 9 */
5083e1eb766Skrw 	{ 0, "Plan9",				PLAN9_GUID },
5093e1eb766Skrw 
5103e1eb766Skrw 	/* VMWare ESX */
5113e1eb766Skrw 	{ 0, "VMWare vmkcore (coredump)",	VMWARE_VMKCORE_GUID },
5123e1eb766Skrw 	{ 0, "VMWare VMFS filesystem",		VMWARE_VMFS_FILESYSTEM_GUID },
5133e1eb766Skrw 	{ 0, "VMWare Reserved",			VMWARE_RESERVED_GUID },
5143e1eb766Skrw 
5153e1eb766Skrw 	/* Android-IA */
5163e1eb766Skrw 	{ 0, "Android-IA Bootloader",		ANDROID_IA_BOOT_GUID },
5173e1eb766Skrw 	{ 0, "Android-IA Bootloader2",		ANDROID_IA_BOOT2_GUID },
5183e1eb766Skrw 	{ 0, "Android-IA Boot",			ANDROID_IA_BOOT3_GUID },
5193e1eb766Skrw 	{ 0, "Android-IA Recovery",		ANDROID_IA_RECOVERY_GUID },
5203e1eb766Skrw 	{ 0, "Android-IA Misc",			ANDROID_IA_MISC_GUID },
5213e1eb766Skrw 	{ 0, "Android-IA Metadata",		ANDROID_IA_METADATA_GUID },
5223e1eb766Skrw 	{ 0, "Android-IA System",		ANDROID_IA_SYSTEM_GUID },
5233e1eb766Skrw 	{ 0, "Android-IA Cache",		ANDROID_IA_CACHE_GUID },
5243e1eb766Skrw 	{ 0, "Android-IA Data",			ANDROID_IA_DATA_GUID },
5253e1eb766Skrw 	{ 0, "Android-IA Persistent",		ANDROID_IA_PERSISTENT_GUID },
5263e1eb766Skrw 	{ 0, "Android-IA Vendor",		ANDROID_IA_VENDOR_GUID },
5273e1eb766Skrw 	{ 0, "Android-IA Config",		ANDROID_IA_CFG_GUID },
5283e1eb766Skrw 	{ 0, "Android-IA Factory",		ANDROID_IA_FACTORY_GUID },
5293e1eb766Skrw 	{ 0, "Android-IA Factory (alt)",	ANDROID_IA_FACTORY_ALT_GUID },
5303e1eb766Skrw 	{ 0, "Android-IA Fastboot/Tertiary",	ANDROID_IA_FASTBOOT_GUID },
5313e1eb766Skrw 	{ 0, "Android-IA OEM",			ANDROID_IA_OEM_GUID },
5323e1eb766Skrw 
5333e1eb766Skrw 	/* Android 6.0+ ARM */
5343e1eb766Skrw 	{ 0, "Android 6.0+ ARM EXT",		ANDROID_6_0_ARM_EXT_GUID },
5353e1eb766Skrw 	{ 0, "Android 6.0+ ARM Meta",		ANDROID_6_0_ARM_META_GUID },
5363e1eb766Skrw 
5373e1eb766Skrw 	/* ONIE */
5383e1eb766Skrw 	{ 0, "ONIE Boot",			ONIE_BOOT_GUID },
5393e1eb766Skrw 	{ 0, "ONIE Config",			ONIE_CFG_GUID },
5403e1eb766Skrw 
5413e1eb766Skrw 	/* PowerPC */
5423e1eb766Skrw 	{ 0, "PPC PReP boot",			PPC_PREP_BOOT_GUID },
5433e1eb766Skrw 
5443e1eb766Skrw 	/* Atari TOS */
5453e1eb766Skrw 	{ 0, "Atari TOS Basic data",		ATARI_TOS_BASIC_DATA_GUID },
5463e1eb766Skrw 
5473e1eb766Skrw 	/* VeraCrypt */
5483e1eb766Skrw 	{ 0, "Veracrypt Encrypted data",	VERACRYPT_ENCRYPTED_DATA_GUID },
5493e1eb766Skrw 
5503e1eb766Skrw 	/* ArcaOS (a.k.a. OS/2) */
5513e1eb766Skrw 	{ 0, "ArcaOS Type 1 (OS/2)",		ARCAOS_TYPE_1_GUID },
5523e1eb766Skrw 
5533e1eb766Skrw 	/* Storage Performance Development Kit (SPDK) */
5543e1eb766Skrw 	{ 0, "SPDK block device",		SPDK_BLOCK_DEVICE_GUID },
5553e1eb766Skrw 
5563e1eb766Skrw 	/* barebox bootloader */
5573e1eb766Skrw 	{ 0, "Barebox barebox-state",		BAREBOX_BAREBOX_STATE_GUID },
5583e1eb766Skrw 
5593e1eb766Skrw 	/* U-Boot bootloader */
5603e1eb766Skrw 	{ 0, "U-Boot environment",		U_BOOT_ENVIRONMENT_GUID },
5613e1eb766Skrw 
5623e1eb766Skrw 	/* SoftRAID (?) */
5633e1eb766Skrw 	{ 0, "Softraid Status",			SOFTRAID_STATUS_GUID },
5643e1eb766Skrw 	{ 0, "Softraid Scratch",		SOFTRAID_SCRATCH_GUID },
5653e1eb766Skrw 	{ 0, "Softraid Volume",			SOFTRAID_VOLUME_GUID },
5663e1eb766Skrw 	{ 0, "Softraid Cache",			SOFTRAID_CACHE_GUID },
5673e1eb766Skrw 
5683e1eb766Skrw 	/* Fuchsia standard partitions */
5693e1eb766Skrw 	{ 0, "Fuchsia bootloader (ABR)",	FUCHSIA_BOOT_GUID },
5703e1eb766Skrw 	{ 0, "Fuchsia encrypted system data",	FUCHSIA_ENCRYPTED_SYS_GUID },
5713e1eb766Skrw 	{ 0, "Fucshia boot metadata (ABR)",	FUCSHIA_BOOT_METADATA_GUID },
5723e1eb766Skrw 	{ 0, "Fuchsia RO Factory system data",	FUCHSIA_RO_FACTORY_SYS_GUID },
5733e1eb766Skrw 	{ 0, "Fuchsia RO Factory boot data",	FUCHSIA_RO_FACTORY_BOOT_GUID },
5743e1eb766Skrw 	{ 0, "Fuchsia Volume Manager",		FUCHSIA_VOLUME_MANAGER_GUID },
5753e1eb766Skrw 	{ 0, "Fuchsia Verified boot meta (ABR)",FUCHSIA_VERIFIED_BOOT_META_GUID },
5763e1eb766Skrw 	{ 0, "Fuchsia Zircon boot (ABR)",	FUCHSIA_ZIRCON_BOOT_ABR_GUID },
5773e1eb766Skrw 
5783e1eb766Skrw 	/* Fuchsia legacy partitions */
5793e1eb766Skrw 	{ 0, "Fuchsia Legacy system",		FUCHSIA_L_SYSTEM_GUID },
5803e1eb766Skrw 	{ 0, "Fuchsia Legacy data",		FUCHSIA_L_DATA_GUID },
5813e1eb766Skrw 	{ 0, "Fuchsia Legacy install",		FUCHSIA_L_INSTALL_GUID },
5823e1eb766Skrw 	{ 0, "Fuchsia Legacy blob",		FUCHSIA_L_BLOB_GUID },
5833e1eb766Skrw 	{ 0, "Fuchsia Legacy fvm",		FUCHSIA_L_FVM_GUID },
5843e1eb766Skrw 	{ 0, "Fuchsia Legacy Zircon boot (A)",	FUCHSIA_L_ZIRCON_BOOTA_GUID },
5853e1eb766Skrw 	{ 0, "Fuchsia Legacy Zircon boot (B)",	FUCHSIA_L_ZIRCON_BOOTB_GUID },
5863e1eb766Skrw 	{ 0, "Fuchsia Legacy Zircon boot (R)",	FUCHSIA_L_ZIRCON_BOOTR_GUID },
5873e1eb766Skrw 	{ 0, "Fuchsia Legacy sys-config",	FUCHSIA_L_SYS_CFG_GUID },
5883e1eb766Skrw 	{ 0, "Fuchsia Legacy factory-config",	FUCHSIA_L_FACTORY_CFG_GUID },
5893e1eb766Skrw 	{ 0, "Fuchsia Legacy bootloader",	FUCHSIA_L_BOOT_GUID },
5903e1eb766Skrw 	{ 0, "Fuchsia Legacy guid-test",	FUCHSIA_L_TEST_GUID },
5913e1eb766Skrw 	{ 0, "Fuchsia Legacy Verified boot mA", FUCHSIA_L_VERIFIED_BOOTM_A_GUID },
5923e1eb766Skrw 	{ 0, "Fuchsia Legacy Verified boot mB", FUCHSIA_L_VERIFIED_BOOTM_B_GUID },
5933e1eb766Skrw 	{ 0, "Fuchsia Legacy Verified boot mR", FUCHSIA_L_VERIFIED_BOOTM_R_GUID },
5943e1eb766Skrw 	{ 0, "Fuchsia Legacy misc",		FUCHSIA_L_MISC_GUID },
5953e1eb766Skrw 	{ 0, "Fuchsia Legacy emmc-boot1",	FUCHSIA_L_EMMC_BOOT1_GUID },
5963e1eb766Skrw 	{ 0, "Fuchsia Legacy emmc-boot2",	FUCHSIA_L_EMMC_BOOT2_GUID },
5973e1eb766Skrw 
5983e1eb766Skrw 	/* Systemd Discoverable Partitions */
5993e1eb766Skrw 	{ 0, "Linux x86-64 root verity",	LINUX_X86_64_ROOT_VERITY_GUID },
6003e1eb766Skrw 	{ 0, "Linux IA-64 /usr",		LINUX_IA_64_USR_GUID },
6013e1eb766Skrw 	{ 0, "Linux /var",			LINUX_VAR_GUID },
6023e1eb766Skrw 	{ 0, "Linux Arm64 /usr verity",		LINUX_ARM64_USR_VERITY_GUID },
6033e1eb766Skrw 	{ 0, "Linux Arm32 root verity",		LINUX_ARM32_ROOT_VERITY_GUID },
6043e1eb766Skrw 	{ 0, "Linux user's home",		LINUX_USER_HOME_GUID },
6053e1eb766Skrw 	{ 0, "Linux x86-64 /usr verity",	LINUX_X86_64_USR_VERITY_GUID },
6063e1eb766Skrw 	{ 0, "Linux Arm32 /usr",		LINUX_ARM32_USR_GUID },
6073e1eb766Skrw 	{ 0, "Linux /var/tmp",			LINUX_VAR_TMP_GUID },
6083e1eb766Skrw 	{ 0, "Linux IA-64 /usr verity",		LINUX_IA_64_USR_VERITY_GUID },
6093e1eb766Skrw 	{ 0, "Linux x86 /usr",			LINUX_X86_USR_GUID },
6103e1eb766Skrw 	{ 0, "Linux x86-64 /usr",		LINUX_X86_64_USR_GUID },
6113e1eb766Skrw 	{ 0, "Linux IA-64 root verity",		LINUX_IA_64_ROOT_VERITY_GUID },
6123e1eb766Skrw 	{ 0, "Linux x86 /usr verity",		LINUX_X86_USR_VERITY_GUID },
6133e1eb766Skrw 	{ 0, "Linux IA-64 root",		LINUX_IA_64_ROOT_GUID },
6143e1eb766Skrw 	{ 0, "Linux Arm64 /usr",		LINUX_ARM64_USR_GUID },
6153e1eb766Skrw 	{ 0, "Linux Arm32 /usr verity",		LINUX_ARM32_USR_VERITY_GUID },
6163e1eb766Skrw 	{ 0, "Linux x86 root verity",		LINUX_X86_ROOT_VERITY_GUID },
6173e1eb766Skrw 	{ 0, "Linux Arm64 root verity",		LINUX_ARM64_ROOT_VERITY_GUID },
6183e1eb766Skrw #endif
6197d916471Skrw };
6207d916471Skrw 
6217d916471Skrw struct menu_item {
6227d916471Skrw 	int	 mi_menuid;	/* Unique hex octet */
6237d916471Skrw 	int	 mi_mbrid;	/* -1 == not on MBR menu */
6247d916471Skrw 	char 	*mi_name;	/* Truncated at 14 chars */
6257d916471Skrw 	char	*mi_guid;	/* NULL == not on GPT menu */
6267d916471Skrw };
6277d916471Skrw 
6287d916471Skrw const struct menu_item menu_items[] = {
6297691286fSkrw 	{ 0x00,	0x00,	"Unused",	UNUSED_GUID },
6307d916471Skrw 	{ 0x01,	0x01,	"DOS FAT-12",	MICROSOFT_BASIC_DATA_GUID },
6317d916471Skrw 	{ 0x02,	0x02,	"XENIX /",	NULL },
6327d916471Skrw 	{ 0x03,	0x03,	"XENIX /usr",	NULL },
6337d916471Skrw 	{ 0x04,	0x04,	"DOS FAT-16",	MICROSOFT_BASIC_DATA_GUID },
6347d916471Skrw 	{ 0x05,	0x05,	"Extended DOS",	NULL },
6357d916471Skrw 	{ 0x06,	0x06,	"DOS > 32MB",	MICROSOFT_BASIC_DATA_GUID },
6367d916471Skrw 	{ 0x07,	0x07,	"NTFS",		MICROSOFT_BASIC_DATA_GUID },
6377d916471Skrw 	{ 0x08,	0x08,	"AIX fs",	NULL },
6387d916471Skrw 	{ 0x09,	0x09,	"AIX/Coherent",	NULL },
6397d916471Skrw 	{ 0x0A,	0x0A,	"OS/2 Bootmgr",	NULL },
6407d916471Skrw 	{ 0x0B,	0x0B,	"Win95 FAT-32",	MICROSOFT_BASIC_DATA_GUID },
6417d916471Skrw 	{ 0x0C,	0x0C,	"Win95 FAT32L",	MICROSOFT_BASIC_DATA_GUID },
6427691286fSkrw 	{ 0x0D,   -1,	"BIOS boot",	BIOS_BOOT_GUID },
6437d916471Skrw 	{ 0x0E,	0x0E,	"DOS FAT-16",	MICROSOFT_BASIC_DATA_GUID },
6447d916471Skrw 	{ 0x0F,	0x0F,	"Extended LBA",	NULL },
6457d916471Skrw 	{ 0x10,	0x10,	"OPUS",		NULL },
6467d916471Skrw 	{ 0x11,	0x11,	"OS/2 hidden",	MICROSOFT_BASIC_DATA_GUID },
6477d916471Skrw 	{ 0x12,	0x12,	"Compaq Diag",	NULL },
6487d916471Skrw 	{ 0x14,	0x14,	"OS/2 hidden",	MICROSOFT_BASIC_DATA_GUID },
6497d916471Skrw 	{ 0x16,	0x16,	"OS/2 hidden",	MICROSOFT_BASIC_DATA_GUID },
6507d916471Skrw 	{ 0x17,	0x17,	"OS/2 hidden",	MICROSOFT_BASIC_DATA_GUID },
6517d916471Skrw 	{ 0x18,	0x18,	"AST swap",	NULL },
6527d916471Skrw 	{ 0x19,	0x19,	"Willowtech",	NULL },
6537d916471Skrw 	{ 0x1C,	0x1C,	"ThinkPad Rec",	MICROSOFT_BASIC_DATA_GUID },
6547d916471Skrw 	{ 0x20,	0x20,	"Willowsoft",	NULL },
6557d916471Skrw 	{ 0x24,	0x24,	"NEC DOS",	NULL },
6567691286fSkrw 	{ 0x27,	0x27,	"Win Recovery",	WIN_RECOVERY_GUID },
6577d916471Skrw 	{ 0x38,	0x38,	"Theos",	NULL },
6587d916471Skrw 	{ 0x39,	0x39,	"Plan 9",	NULL },
6597d916471Skrw 	{ 0x40,	0x40,	"VENIX 286",	NULL },
6607d916471Skrw 	{ 0x41,	0x41,	"Lin/Minux DR",	NULL },
6617691286fSkrw 	{ 0x42,	0x42,	"LinuxSwap DR",	LINUXSWAP_DR_GUID },
6627d916471Skrw 	{ 0x43,	0x43,	"Linux DR",	NULL },
6637d916471Skrw 	{ 0x4D,	0x4D,	"QNX 4.2 Pri",	NULL },
6647d916471Skrw 	{ 0x4E,	0x4E,	"QNX 4.2 Sec",	NULL },
6657d916471Skrw 	{ 0x4F,	0x4F,	"QNX 4.2 Ter",	NULL },
6667d916471Skrw 	{ 0x50,	0x50,	"DM",		NULL },
6677d916471Skrw 	{ 0x51,	0x51,	"DM",		NULL },
6687d916471Skrw 	{ 0x52,	0x52,	"CP/M or SysV",	NULL },
6697d916471Skrw 	{ 0x53,	0x53,	"DM",		NULL },
6707d916471Skrw 	{ 0x54,	0x54,	"Ontrack",	NULL },
6717d916471Skrw 	{ 0x55,	0x55,	"EZ-Drive",	NULL },
6727d916471Skrw 	{ 0x56,	0x56,	"Golden Bow",	NULL },
6737d916471Skrw 	{ 0x5C,	0x5C,	"Priam"	,	NULL },
6747d916471Skrw 	{ 0x61,	0x61,	"SpeedStor",	NULL },
6757d916471Skrw 	{ 0x63,	0x63,	"ISC, HURD, *",	NULL },
6767d916471Skrw 	{ 0x64,	0x64,	"NetWare 2.xx",	NULL },
6777d916471Skrw 	{ 0x65,	0x65,	"NetWare 3.xx",	NULL },
6787d916471Skrw 	{ 0x66,	0x66,	"NetWare 386",	NULL },
6797d916471Skrw 	{ 0x67,	0x67,	"Novell",	NULL },
6807d916471Skrw 	{ 0x68,	0x68,	"Novell",	NULL },
6817d916471Skrw 	{ 0x69,	0x69,	"Novell",	NULL },
6827d916471Skrw 	{ 0x70,	0x70,	"DiskSecure",	NULL },
6837d916471Skrw 	{ 0x75,	0x75,	"PCIX",		NULL },
6847691286fSkrw 	{ 0x7F,   -1,	"Chrome Kernel",CHROME_KERNEL_GUID },
6857d916471Skrw 	{ 0x80, 0x80,	"Minix (old)",	NULL },
6867d916471Skrw 	{ 0x81, 0x81,	"Minix (new)",	NULL },
6877691286fSkrw 	{ 0x82,	0x82,	"Linux swap",	LINUX_SWAP_GUID },
6887691286fSkrw 	{ 0x83,	0x83,	"Linux files*",	LINUX_FILES_GUID },
6897d916471Skrw 	{ 0x84,	0x84,	"OS/2 hidden",	NULL },
6907d916471Skrw 	{ 0x85,	0x85,	"Linux ext.",	NULL },
6917d916471Skrw 	{ 0x86, 0x86,	"NT FAT VS",	NULL },
6927d916471Skrw 	{ 0x87, 0x87,	"NTFS VS",	NULL },
6937691286fSkrw 	{ 0x8E,	0x8E,	"Linux LVM",	LINUX_LVM_GUID },
6947d916471Skrw 	{ 0x93,	0x93,	"Amoeba FS",	NULL },
6957d916471Skrw 	{ 0x94,	0x94,	"Amoeba BBT",	NULL },
6967d916471Skrw 	{ 0x99,	0x99,	"Mylex"	,	NULL },
6977d916471Skrw 	{ 0x9F,	0x9F,	"BSDI",		NULL },
6987d916471Skrw 	{ 0xA0,	0xA0,	"NotebookSave",	NULL },
6997691286fSkrw 	{ 0xA5,	0xA5,	"FreeBSD",	FREEBSD_GUID },
7007691286fSkrw 	{ 0xA6,	0xA6,	"OpenBSD",	OPENBSD_GUID },
7017d916471Skrw 	{ 0xA7,	0xA7,	"NeXTSTEP",	NULL },
7027691286fSkrw 	{ 0xA8,	0xA8,	"MacOS X",	MACOS_X_GUID },
7037691286fSkrw 	{ 0xA9,	0xA9,	"NetBSD",	NETBSD_GUID },
7047691286fSkrw 	{ 0xAB,	0xAB,	"MacOS X boot",	MACOS_X_BOOT_GUID },
7057691286fSkrw 	{ 0xAF,	0xAF,	"MacOS X HFS+",	MACOS_X_HFS_GUID },
7067691286fSkrw 	{ 0xB0,	  -1,	"APFS",		APFS_GUID },
7077691286fSkrw 	{ 0xB1,	  -1,	"APFS ISC",	APFS_ISC_GUID },
7087691286fSkrw 	{ 0xB2,	  -1,	"APFS Recovery",APFS_RECOVERY_GUID },
7097691286fSkrw 	{ 0xB3,	  -1,	"HiFive FSBL",	HIFIVE_FSBL_GUID },
7107691286fSkrw 	{ 0xB4,	  -1,	"HiFive BBL",	HIFIVE_BBL_GUID },
7117d916471Skrw 	{ 0xB7,	0xB7,	"BSDI filesy*",	NULL },
7127d916471Skrw 	{ 0xB8,	0xB8,	"BSDI swap",	NULL },
7137691286fSkrw 	{ 0xBF,	0xBF,	"Solaris",	SOLARIS_GUID },
7147d916471Skrw 	{ 0xC0,	0xC0,	"CTOS",		NULL },
7157d916471Skrw 	{ 0xC1,	0xC1,	"DRDOSs FAT12",	NULL },
7167d916471Skrw 	{ 0xC4,	0xC4,	"DRDOSs < 32M",	NULL },
7177d916471Skrw 	{ 0xC6,	0xC6,	"DRDOSs >=32M",	NULL },
7187d916471Skrw 	{ 0xC7,	0xC7,	"HPFS Disbled",	NULL },
7197d916471Skrw 	{ 0xDB,	0xDB,	"CPM/C.DOS/C*",	NULL },
7207d916471Skrw 	{ 0xDE,	0xDE,	"Dell Maint",	NULL },
7217d916471Skrw 	{ 0xE1,	0xE1,	"SpeedStor",	NULL },
7227d916471Skrw 	{ 0xE3,	0xE3,	"SpeedStor",	NULL },
7237d916471Skrw 	{ 0xE4,	0xE4,	"SpeedStor",	NULL },
7247691286fSkrw 	{ 0xEB,	0xEB,	"BeOS/i386",	BEOS_I386_GUID },
7257691286fSkrw 	{ 0xEC,	  -1,	"Legacy MBR",	LEGACY_MBR_GUID },
7267d916471Skrw 	{ 0xEE,	0xEE,	"EFI GPT",	NULL },
7277d916471Skrw 	{ 0xEF,	0xEF,	"EFI Sys",	EFI_SYSTEM_PARTITION_GUID },
7287d916471Skrw 	{ 0xF1,	0xF1,	"SpeedStor",	NULL },
7297d916471Skrw 	{ 0xF2,	0xF2,	"DOS 3.3+ Sec",	NULL },
7307d916471Skrw 	{ 0xF4,	0xF4,	"SpeedStor",	NULL },
7317d916471Skrw 	{ 0xFF,	0xFF,	"Xenix BBT",	NULL },
73295e8765cSkrw };
73395e8765cSkrw 
734f2ec1a13Skrw const struct gpt_type	*find_gpt_type(const struct uuid *);
735*b5ff5246Skrw const char		*find_uuid_desc(const struct uuid *);
736*b5ff5246Skrw int			 gpt_item(const unsigned int);
737*b5ff5246Skrw int			 uuid_attr(const struct uuid *);
738*b5ff5246Skrw 
739867d4347Skrw const struct mbr_type	*find_mbr_type(const int);
74078d83ce9Skrw const char		*find_mbr_desc(const int);
7417d916471Skrw int			 mbr_item(const unsigned int);
742*b5ff5246Skrw 
7437d916471Skrw void			 print_menu(int (*)(const unsigned int),
7447d916471Skrw     const unsigned int);
745*b5ff5246Skrw int			 nth_menu_item(int (*)(const unsigned int),
746*b5ff5246Skrw     const unsigned int, unsigned int);
747c96c378cSkrw 
748c96c378cSkrw const struct gpt_type *
749c96c378cSkrw find_gpt_type(const struct uuid *uuid)
750c96c378cSkrw {
75178d83ce9Skrw 	const struct gpt_type	*gt = NULL;
75278d83ce9Skrw 	char			*guid;
753c96c378cSkrw 	unsigned int		 i;
754c96c378cSkrw 	uint32_t		 status;
755c96c378cSkrw 
75678d83ce9Skrw 	if (uuid != NULL) {
75778d83ce9Skrw 		uuid_to_string(uuid, &guid, &status);
758c96c378cSkrw 		if (status == uuid_s_ok) {
75978d83ce9Skrw 			for (i = 0; i < nitems(gpt_types) && gt == NULL; i++) {
76078d83ce9Skrw 				if (strcasecmp(gpt_types[i].gt_guid, guid) == 0)
76178d83ce9Skrw 					gt = &gpt_types[i];
762c96c378cSkrw 			}
76378d83ce9Skrw 		}
76478d83ce9Skrw 		free(guid);
76578d83ce9Skrw 	}
766c96c378cSkrw 
76778d83ce9Skrw 	return gt;
76878d83ce9Skrw }
76978d83ce9Skrw 
77078d83ce9Skrw const char *
77178d83ce9Skrw find_uuid_desc(const struct uuid *uuid)
77278d83ce9Skrw {
77378d83ce9Skrw 	const struct gpt_type	*gt;
77478d83ce9Skrw 	unsigned int		 i;
77578d83ce9Skrw 
77678d83ce9Skrw 	gt = find_gpt_type(uuid);
77778d83ce9Skrw 	if (gt != NULL) {
77878d83ce9Skrw 		if (gt->gt_desc != NULL)
77978d83ce9Skrw 			return gt->gt_desc;
78078d83ce9Skrw 		for (i = 0; i < nitems(menu_items); i++) {
78178d83ce9Skrw 			if (gpt_item(i) == 0 &&
78278d83ce9Skrw 			    strcasecmp(menu_items[i].mi_guid, gt->gt_guid) == 0)
78378d83ce9Skrw 				return menu_items[i].mi_name;
78478d83ce9Skrw 		}
78578d83ce9Skrw 	}
78678d83ce9Skrw 
787c96c378cSkrw 	return NULL;
788c96c378cSkrw }
789c96c378cSkrw 
790*b5ff5246Skrw int
791*b5ff5246Skrw gpt_item(const unsigned int item)
792*b5ff5246Skrw {
793*b5ff5246Skrw 	return menu_items[item].mi_guid == NULL;
794*b5ff5246Skrw }
795*b5ff5246Skrw 
796*b5ff5246Skrw int
797*b5ff5246Skrw uuid_attr(const struct uuid *uuid)
798*b5ff5246Skrw {
799*b5ff5246Skrw 	const struct gpt_type	*gt;
800*b5ff5246Skrw 
801*b5ff5246Skrw 	gt = find_gpt_type(uuid);
802*b5ff5246Skrw 	if (gt == NULL)
803*b5ff5246Skrw 		return 0;
804*b5ff5246Skrw 	else
805*b5ff5246Skrw 		return gt->gt_attr;
806*b5ff5246Skrw }
807*b5ff5246Skrw 
808867d4347Skrw const struct mbr_type *
809867d4347Skrw find_mbr_type(const int id)
810c96c378cSkrw {
81178d83ce9Skrw 	const struct mbr_type	*mt = NULL;
812867d4347Skrw 	unsigned int		 i;
813c96c378cSkrw 
81478d83ce9Skrw 	if (id >= 0) {
815c96c378cSkrw 		for (i = 0; i < nitems(mbr_types); i++) {
816c96c378cSkrw 			if (mbr_types[i].mt_type == id)
81778d83ce9Skrw 				mt = &mbr_types[i];
81878d83ce9Skrw 		}
81978d83ce9Skrw 	}
82078d83ce9Skrw 
82178d83ce9Skrw 	return mt;
82278d83ce9Skrw }
82378d83ce9Skrw 
82478d83ce9Skrw const char *
82578d83ce9Skrw find_mbr_desc(const int mbrid)
82678d83ce9Skrw {
82778d83ce9Skrw 	const struct mbr_type	*mt;
82878d83ce9Skrw 	unsigned int		 i;
82978d83ce9Skrw 
83078d83ce9Skrw 	mt = find_mbr_type(mbrid);
83178d83ce9Skrw 	if (mt != NULL) {
83278d83ce9Skrw 		if (mt->mt_desc != NULL)
83378d83ce9Skrw 			return mt->mt_desc;
83478d83ce9Skrw 		for (i = 0; i < nitems(menu_items); i++) {
83578d83ce9Skrw 			if (mbr_item(i) == 0 &&
83678d83ce9Skrw 			    menu_items[i].mi_mbrid == mt->mt_type)
83778d83ce9Skrw 				return menu_items[i].mi_name;
83878d83ce9Skrw 		}
839c96c378cSkrw 	}
840c96c378cSkrw 
841867d4347Skrw 	return NULL;
842c96c378cSkrw }
843c96c378cSkrw 
844f458660aSkrw int
845*b5ff5246Skrw mbr_item(const unsigned int item)
846f458660aSkrw {
847*b5ff5246Skrw 	return menu_items[item].mi_mbrid == -1;
848f458660aSkrw }
849f2ec1a13Skrw 
8507d916471Skrw void
8517d916471Skrw print_menu(int (*test)(const unsigned int), const unsigned int columns)
8527d916471Skrw {
8537d916471Skrw 	int			 col, col0;
8547d916471Skrw 	unsigned int		 count, i, j, rows;
8557d916471Skrw 
8567d916471Skrw 	count = 0;
8577d916471Skrw 	for (i = 0; i < nitems(menu_items); i++)
8587d916471Skrw 		if (test(i) == 0)
8597d916471Skrw 			count++;
8607d916471Skrw 	rows = (count + columns - 1) / columns;
8617d916471Skrw 
8627d916471Skrw 	col0 = -1;
8637d916471Skrw 	for (i = 0; i < rows; i++) {
8647d916471Skrw 		col0 = nth_menu_item(test, col0, 1);
8657d916471Skrw 		printf("%02X %-15s", menu_items[col0].mi_menuid,
8667d916471Skrw 		    menu_items[col0].mi_name);
8677d916471Skrw 		for (j = 1; j < columns; j++) {
8687d916471Skrw 			col = nth_menu_item(test, col0, j * rows);
8697d916471Skrw 			if (col == -1)
8707d916471Skrw 				break;
8717d916471Skrw 			printf("%02X %-15s", menu_items[col].mi_menuid,
8727d916471Skrw 			    menu_items[col].mi_name);
8737d916471Skrw 		}
8747d916471Skrw 		printf("\n");
8757d916471Skrw 	}
8767d916471Skrw }
8777d916471Skrw 
8787d916471Skrw int
8797d916471Skrw nth_menu_item(int (*test)(const unsigned int), const unsigned int last,
8807d916471Skrw     unsigned int n)
8817d916471Skrw {
8827d916471Skrw 	unsigned int			i;
8837d916471Skrw 
8847d916471Skrw 	for (i = last + 1; i < nitems(menu_items); i++) {
8857d916471Skrw 		if (test(i) == 0) {
8867d916471Skrw 			n--;
8877d916471Skrw 			if (n == 0)
8887d916471Skrw 				return i;
8897d916471Skrw 		}
8907d916471Skrw 	}
8917d916471Skrw 
8927d916471Skrw 	return -1;
8937d916471Skrw }
8947d916471Skrw 
89595e8765cSkrw int
896490259bdSkrw PRT_protected_uuid(const struct uuid *uuid)
89795e8765cSkrw {
898f458660aSkrw 	const struct gpt_type	*gt;
8998e294713Skrw 	unsigned int		 pn;
9008e294713Skrw 
901f458660aSkrw 	gt = find_gpt_type(uuid);
902f458660aSkrw 	if (gt && gt->gt_attr & GTATTR_PROTECT)
903f458660aSkrw 		return 1;
90495e8765cSkrw 
905e92bde66Skrw 	if (gt && strcasecmp(gt->gt_guid, EFI_SYSTEM_PARTITION_GUID) == 0) {
9062de77560Skrw 		for (pn = 0; pn < gh.gh_part_num; pn++) {
907f458660aSkrw 			if (uuid_attr(&gp[pn].gp_type) & GTATTR_PROTECT_EFISYS)
908f458660aSkrw 				return 1;
90995e8765cSkrw 		}
91065deb39bSkrw 	}
91195e8765cSkrw 
9128e294713Skrw 	return 0;
91395e8765cSkrw }
91495e8765cSkrw 
9154b464610Sderaadt void
916a0193349Skrw PRT_print_mbrmenu(char *lbuf, size_t lbuflen)
9174b464610Sderaadt {
9187d916471Skrw #define	MBR_MENU_COLUMNS	4
9194b464610Sderaadt 
920c2ad5584Sderaadt 	printf("Choose from the following Partition id values:\n");
9217d916471Skrw 	print_menu(mbr_item,  MBR_MENU_COLUMNS);
922a0193349Skrw 
923a0193349Skrw 	memset(lbuf, 0, lbuflen);	/* Just continue. */
9245308a554Skrw }
9255308a554Skrw 
9265308a554Skrw void
927a0193349Skrw PRT_print_gptmenu(char *lbuf, size_t lbuflen)
9285308a554Skrw {
9297d916471Skrw #define	GPT_MENU_COLUMNS	4
9305308a554Skrw 
9315308a554Skrw 	printf("Choose from the following Partition id values:\n");
9327d916471Skrw 	print_menu(gpt_item, GPT_MENU_COLUMNS);
933a0193349Skrw 
934a0193349Skrw 	memset(lbuf, 0, lbuflen);	/* Just continue. */
935d20bdfc6Skrw }
936a1705421Sweingart 
937a1705421Sweingart void
9380cd9e2afSkrw PRT_parse(const struct dos_partition *dp, const uint64_t lba_self,
9390cd9e2afSkrw     const uint64_t lba_firstembr, struct prt *prt)
940a1705421Sweingart {
941ca2e86e1Sprovos 	off_t			off;
942b87d3542Skrw 	uint32_t		t;
943a1705421Sweingart 
944ee38fe33Skrw 	prt->prt_flag = dp->dp_flag;
945ee38fe33Skrw 	prt->prt_id = dp->dp_typ;
946a1705421Sweingart 
947ee38fe33Skrw 	if ((prt->prt_id == DOSPTYP_EXTEND) || (prt->prt_id == DOSPTYP_EXTENDL))
948061e6e0aSkrw 		off = lba_firstembr;
949c3e3230dSderaadt 	else
950061e6e0aSkrw 		off = lba_self;
951ca2e86e1Sprovos 
952ee38fe33Skrw 	memcpy(&t, &dp->dp_start, sizeof(uint32_t));
953ee38fe33Skrw 	prt->prt_bs = letoh32(t) + off;
954ee38fe33Skrw 	memcpy(&t, &dp->dp_size, sizeof(uint32_t));
955ee38fe33Skrw 	prt->prt_ns = letoh32(t);
956ee38fe33Skrw 	if (prt->prt_id == DOSPTYP_EFI && prt->prt_ns == UINT32_MAX)
957ee38fe33Skrw 		prt->prt_ns = DL_GETDSIZE(&dl) - prt->prt_bs;
9584ed7cd7eSrahnds }
95949241bdaSkrw 
960a1705421Sweingart void
96199e0469cSkrw PRT_make(const struct prt *prt, const uint64_t lba_self,
96299e0469cSkrw     const uint64_t lba_firstembr, struct dos_partition *dp)
963a1705421Sweingart {
96477392607Skrw 	struct chs		start, end;
9650cd9e2afSkrw 	uint64_t		off, t;
966c3e3230dSderaadt 
9676aca8866Skrw 	if (prt->prt_ns == 0 || prt->prt_id == DOSPTYP_UNUSED) {
9686aca8866Skrw 		memset(dp, 0, sizeof(*dp));
9696aca8866Skrw 		return;
9706aca8866Skrw 	}
9716aca8866Skrw 
972ee38fe33Skrw 	if ((prt->prt_id == DOSPTYP_EXTEND) || (prt->prt_id == DOSPTYP_EXTENDL))
973ee38fe33Skrw 		off = lba_firstembr;
974c3e3230dSderaadt 	else
975ee38fe33Skrw 		off = lba_self;
976a1705421Sweingart 
97777392607Skrw 	if (PRT_lba_to_chs(prt, &start, &end) == 0) {
97877392607Skrw 		dp->dp_shd = start.chs_head & 0xFF;
97977392607Skrw 		dp->dp_ssect = (start.chs_sect & 0x3F) | ((start.chs_cyl & 0x300) >> 2);
98077392607Skrw 		dp->dp_scyl = start.chs_cyl & 0xFF;
98177392607Skrw 		dp->dp_ehd = end.chs_head & 0xFF;
98277392607Skrw 		dp->dp_esect = (end.chs_sect & 0x3F) | ((end.chs_cyl & 0x300) >> 2);
98377392607Skrw 		dp->dp_ecyl = end.chs_cyl & 0xFF;
9844ed7cd7eSrahnds 	} else {
985ee38fe33Skrw 		memset(dp, 0xFF, sizeof(*dp));
9864ed7cd7eSrahnds 	}
987a1705421Sweingart 
988ee38fe33Skrw 	dp->dp_flag = prt->prt_flag & 0xFF;
989ee38fe33Skrw 	dp->dp_typ = prt->prt_id & 0xFF;
99040b0f5f3Skrw 
991ee38fe33Skrw 	t = htole64(prt->prt_bs - off);
992ee38fe33Skrw 	memcpy(&dp->dp_start, &t, sizeof(uint32_t));
993ee38fe33Skrw 	if (prt->prt_id == DOSPTYP_EFI && (prt->prt_bs + prt->prt_ns) >
99498952941Skrw 	    DL_GETDSIZE(&dl))
99598952941Skrw 		t = htole64(UINT32_MAX);
99698952941Skrw 	else
997ee38fe33Skrw 		t = htole64(prt->prt_ns);
998ee38fe33Skrw 	memcpy(&dp->dp_size, &t, sizeof(uint32_t));
9996d5e103bSkjell }
1000a1705421Sweingart 
1001a1705421Sweingart void
10027b70791fSkrw PRT_print_parthdr(void)
1003a1705421Sweingart {
1004ba49db25Skrw 	printf("            Starting         Ending    "
1005ba49db25Skrw 	    "     LBA Info:\n");
1006ba49db25Skrw 	printf(" #: id      C   H   S -      C   H   S "
1007ba49db25Skrw 	    "[       start:        size ]\n");
1008ba49db25Skrw 	printf("---------------------------------------"
1009ba49db25Skrw 	    "----------------------------------------\n");
10107b70791fSkrw }
10117b70791fSkrw 
10127b70791fSkrw void
10137b70791fSkrw PRT_print_part(const int num, const struct prt *prt, const char *units)
10147b70791fSkrw {
10157b70791fSkrw 	const struct unit_type	*ut;
101678d83ce9Skrw 	const char		*desc;
101777392607Skrw 	struct chs		 start, end;
10187b70791fSkrw 	double			 size;
10197d916471Skrw 	unsigned int		 i;
10207b70791fSkrw 
10213e9b7d6bSkrw 	size = units_size(units, prt->prt_ns, &ut);
102277392607Skrw 	PRT_lba_to_chs(prt, &start, &end);
102378d83ce9Skrw 	desc = find_mbr_desc(prt->prt_id);
102477392607Skrw 
1025d8dd0570Skrw 	printf("%c%1d: %.2X %6llu %3u %3u - %6llu %3u %3u [%12llu:%12.0f%s] "
102678d83ce9Skrw 	    "%-15s\n", (prt->prt_flag == DOSACTIVE) ? '*' : ' ', num,
102778d83ce9Skrw 	    prt->prt_id, start.chs_cyl, start.chs_head, start.chs_sect,
102877392607Skrw 	    end.chs_cyl, end.chs_head, end.chs_sect,
10297d916471Skrw 	    prt->prt_bs, size, ut->ut_abbr, desc ? desc : "<Unknown ID>");
103062718823Skrw 
103162718823Skrw 	if (prt->prt_bs >= DL_GETDSIZE(&dl))
103262718823Skrw 		printf("partition %d starts beyond the end of %s\n", num,
103362718823Skrw 		    disk.dk_name);
103462718823Skrw 	else if (prt->prt_bs + prt->prt_ns > DL_GETDSIZE(&dl))
103562718823Skrw 		printf("partition %d extends beyond the end of %s\n", num,
103662718823Skrw 		    disk.dk_name);
1037a1705421Sweingart }
1038a1705421Sweingart 
103977392607Skrw int
104077392607Skrw PRT_lba_to_chs(const struct prt *prt, struct chs *start, struct chs *end)
1041a1705421Sweingart {
104277392607Skrw 	uint64_t		lba;
1043a1705421Sweingart 
104477392607Skrw 	if (prt->prt_ns == 0 || prt->prt_id == DOSPTYP_UNUSED) {
104577392607Skrw 		memset(start, 0, sizeof(*start));
104677392607Skrw 		memset(end, 0, sizeof(*end));
104777392607Skrw 		return -1;
1048eb4cb19dSkjell 	}
1049eb4cb19dSkjell 
105077392607Skrw 	/*
105177392607Skrw 	 * C = LBA ÷ (HPC × SPT)
105277392607Skrw 	 * H = (LBA ÷ SPT) mod HPC
105377392607Skrw 	 * S = (LBA mod SPT) + 1
105477392607Skrw 	 */
1055a1705421Sweingart 
105677392607Skrw 	lba = prt->prt_bs;
105777392607Skrw 	start->chs_cyl = lba / (disk.dk_sectors * disk.dk_heads);
105877392607Skrw 	start->chs_head = (lba / disk.dk_sectors) % disk.dk_heads;
105977392607Skrw 	start->chs_sect = (lba % disk.dk_sectors) + 1;
1060a1705421Sweingart 
106177392607Skrw 	lba = prt->prt_bs + prt->prt_ns - 1;
106277392607Skrw 	end->chs_cyl = lba / (disk.dk_sectors * disk.dk_heads);
106377392607Skrw 	end->chs_head = (lba / disk.dk_sectors) % disk.dk_heads;
106477392607Skrw 	end->chs_sect = (lba % disk.dk_sectors) + 1;
1065a1705421Sweingart 
106677392607Skrw 	if (start->chs_head > 255 || end->chs_head > 255 ||
106777392607Skrw 	    start->chs_sect > 63  || end->chs_sect > 63 ||
106877392607Skrw 	    start->chs_cyl > 1023 || end->chs_cyl > 1023)
106977392607Skrw 		return -1;
1070a1705421Sweingart 
107177392607Skrw 	return 0;
1072a1705421Sweingart }
1073fba7235cSkrw 
1074f2ec1a13Skrw const char *
107578d83ce9Skrw PRT_uuid_to_desc(const struct uuid *uuid)
1076f2ec1a13Skrw {
107778d83ce9Skrw 	static char		 guid[UUID_STR_LEN + 1];
107878d83ce9Skrw 	const char		*desc;
107978d83ce9Skrw 	char			*str;
1080351f0068Skrw 	uint32_t		 status;
1081f2ec1a13Skrw 
108278d83ce9Skrw 	desc = find_uuid_desc(uuid);
108378d83ce9Skrw 	if (desc != NULL)
108478d83ce9Skrw 		return desc;
10855c01edd6Skrw 
108678d83ce9Skrw 	uuid_to_string(uuid, &str, &status);
1087f2ec1a13Skrw 	if (status == uuid_s_ok)
108878d83ce9Skrw 		strlcpy(guid, str, sizeof(guid));
10895c01edd6Skrw 	else
109078d83ce9Skrw 		strlcpy(guid, "<Bad UUID>", sizeof(guid));
109178d83ce9Skrw 	free(str);
1092f2ec1a13Skrw 
109378d83ce9Skrw 	return guid;
1094fba7235cSkrw }
1095fba7235cSkrw 
1096f3cf20a5Skrw char *
1097f3cf20a5Skrw PRT_uuid_to_menudflt(const struct uuid *uuid)
1098145e5a87Stim {
1099f3cf20a5Skrw 	char			*dflt;
11007d916471Skrw 	unsigned int		 i;
1101f3cf20a5Skrw 	uint32_t		 status;
1102145e5a87Stim 
1103f3cf20a5Skrw 	uuid_to_string(uuid, &dflt, &status);
1104f3cf20a5Skrw 	if (status != uuid_s_ok)
1105f3cf20a5Skrw 		return NULL;
1106fba7235cSkrw 
11077d916471Skrw 	for (i = 0; i < nitems(menu_items); i++) {
1108f3cf20a5Skrw 		if (gpt_item(i) || strcasecmp(menu_items[i].mi_guid, dflt))
1109f3cf20a5Skrw 			continue;
1110f3cf20a5Skrw 		free(dflt);
1111f3cf20a5Skrw 		dflt = NULL;
1112717a7d06Skrw 		if (asprintf(&dflt, "%02X", menu_items[i].mi_menuid) == -1)
1113f3cf20a5Skrw 			return NULL;
1114fba7235cSkrw 	}
1115fba7235cSkrw 
1116f3cf20a5Skrw 	return dflt;
1117f3cf20a5Skrw }
1118f3cf20a5Skrw 
1119f3cf20a5Skrw const char *
1120f3cf20a5Skrw PRT_menuid_to_guid(const int menuid)
1121f3cf20a5Skrw {
1122f3cf20a5Skrw 	unsigned int		i;
1123f3cf20a5Skrw 
1124f3cf20a5Skrw 	for (i = 0; i < nitems(menu_items); i++) {
1125f3cf20a5Skrw 		if (gpt_item(i) == 0 && menu_items[i].mi_menuid == menuid)
1126f3cf20a5Skrw 			return menu_items[i].mi_guid;
1127f3cf20a5Skrw 	}
1128f3cf20a5Skrw 
1129f3cf20a5Skrw 	return NULL;
1130fba7235cSkrw }
1131