poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fwd: GPT pickles for review


From: Mohammad-Reza Nabipoor
Subject: Re: Fwd: GPT pickles for review
Date: Thu, 24 Aug 2023 01:31:52 +0200

Hello Denis,

> Attached please find the set of pickles to analyse GPT partition maps.
> I needed a tool to analyze GPT layout on modern HDDs, poke looked like a
> way to go, so I spent some time creating a gpt pickles set.
> I would like to contribute it to the poke project.


Nice work :)
Thank you for the patch and tests!
Please find the comments below.


> Github project seems to be frozen, otherwise I would just go with pull
> request there.


Yes, we don't use GitHub for poke development.
Email is the best :)


General comments:
  - We try to follow the GNU Coding Standards as much as possible.
    Things like
      - putting space before parenthesis, putting braces on the next line, e.g.
          if (some_condition)
            {
              do_something (some_value);
              do_some_other_thing;
            }
        or, if the body is a single statement, then please omit the braces.
      - Please keep the length of source lines to 79 characters or less.
        (Yeah, this is not fashionable nowadays :) But it's a very good rule!)
      - Please use two spaces instead of four spaces for indentation.


I'll mention formatting problems in a few places, but please fix them 
everywhere!



diff --git a/pickles/gpt-partition-attrs.pk b/pickles/gpt-partition-attrs.pk
new file mode 100644
index 00000000..a3409a41
--- /dev/null
+++ b/pickles/gpt-partition-attrs.pk
@@ -0,0 +1,64 @@
+/* gpt-partition-attrs.pk - Common GUID partition attributes implementation 
for GNU poke */
+
+/* Copyright (C) 2023 Denis Maryin */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* Implemented as per https://en.wikipedia.org/wiki/GUID_Partition_Table */
+
+var show_chromeos_attrs = 0;


Please use a prefix for this variable, like `gptattr_show_chromoss_attrs = 0'.
In general, it's not a good idea to inject global variables without proper
prefix.


+
+var GPT_ATTR_VITAL                           = 0x0000_0000_0000_0001UL,
+    GPT_ATTR_EFIFW_IGNORE                    = 0x0000_0000_0000_0002UL,
+    GPT_ATTR_LEGACY_BOOTABLE                 = 0x0000_0000_0000_0004UL,
+    GPT_ATTR_RESERVED                        = 0x0000_ffff_ffff_fff8UL,
+    GPT_ATTR_MS_BASIC_DATA_READONLY          = 0x1000_0000_0000_0000UL,
+    GPT_ATTR_MS_BASIC_DATA_SHADOWCOPY        = 0x2000_0000_0000_0000UL,
+    GPT_ATTR_MS_BASIC_DATA_HIDDEN            = 0x4000_0000_0000_0000UL,
+    GPT_ATTR_MS_BASIC_DATA_NODRIVELETTER     = 0x8000_0000_0000_0000UL,
+    GPT_ATTR_CHROMEOS_KERNEL_BOOT_SUCCESS    = 0x0100_0000_0000_0000UL,
+    GPT_ATTR_CHROMEOS_KERNEL_TRIES_REMAINING = 0x00F0_0000_0000_0000UL,
+    GPT_ATTR_CHROMEOS_KERNEL_PRIORITY        = 0x000F_0000_0000_0000UL;
                                                     ^
                                         Here  ______+

I'd suggest in order to keep things consistent, use lower-case letters
for hexadecimal values.


+
+var GPT_OFFS_CHROMEOS_KERNEL_TRIES_REMAINING = 52,
+    GPT_OFFS_CHROMEOS_KERNEL_PRIORITY        = 48;
+
+type GPT_Partition_Attributes = struct
+{


We write this like:

type GPT_Partition_Attributes =
  struct
  {
    /* ...  */
  };


+    little uint<64> attribute_flags @ 0#B;


You don't need to specify the offset of fields, Poke compiler will take of that!
The purpose of Poke is to take care of boring things, let it do its job :)
So `little uint<64> attribute_flags;' is enough.


+    method _print = void:
+    {
+        print("#<");
+        var s = "";
+        if (attribute_flags & GPT_ATTR_VITAL)                           { s = 
s + "VITAL,";            };
+        if (attribute_flags & GPT_ATTR_EFIFW_IGNORE)                    { s = 
s + "EFIFW_IGNORE,";     };
+        if (attribute_flags & GPT_ATTR_LEGACY_BOOTABLE)                 { s = 
s + "LEGACY_BOOTABLE,";  };
+        if (attribute_flags & GPT_ATTR_RESERVED)                        { s = 
s + "RESERVED,";         };
+        if (attribute_flags & GPT_ATTR_MS_BASIC_DATA_READONLY)          { s = 
s + "MS_READONLY,";      };
+        if (attribute_flags & GPT_ATTR_MS_BASIC_DATA_SHADOWCOPY)        { s = 
s + "MS_SHADOWCOPY,";    };
+        if (attribute_flags & GPT_ATTR_MS_BASIC_DATA_HIDDEN)            { s = 
s + "MS_HIDDEN,";        };
+        if (attribute_flags & GPT_ATTR_MS_BASIC_DATA_NODRIVELETTER)     { s = 
s + "MS_NODRIVELETTER,"; };


GNU style please!

  method _print = void:
  {
    print ("#<");
    if (attribute_flags && GPT_ATTR_VITAL)
      s += "VITAL,";
    if (...)
      ...;
    ...


+        print(rtrim(s, ","));
+        if ( show_chromeos_attrs )
+        {
+            s = "FAILED";
+            if (attribute_flags & GPT_ATTR_CHROMEOS_KERNEL_BOOT_SUCCESS) { s = 
"Ok"; };
+            var remaining = (attribute_flags & 
GPT_ATTR_CHROMEOS_KERNEL_TRIES_REMAINING) .>> 
GPT_OFFS_CHROMEOS_KERNEL_TRIES_REMAINING;
+            var priority  = (attribute_flags & 
GPT_ATTR_CHROMEOS_KERNEL_PRIORITY)        .>> GPT_OFFS_CHROMEOS_KERNEL_PRIORITY;
+            printf(" CHROMEOS[Boot status=%s, Tries remaining=%u8d, 
Prio=%u8d]", s, remaining, priority);
+        }
+        print(">");
+    }
+};
diff --git a/pickles/gpt-partition-types.pk b/pickles/gpt-partition-types.pk
new file mode 100644
index 00000000..8cc964ed
--- /dev/null
+++ b/pickles/gpt-partition-types.pk
@@ -0,0 +1,459 @@
+/* gpt-partition-types.pk - Common GUID partition types implementation for GNU 
poke */
+
+/* Copyright (C) 2023 Denis Maryin */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* Implemented as per https://en.wikipedia.org/wiki/GUID_Partition_Table */
+/* Order preserved as is, empty lines represent first column horisontal 
separators */
+
+load "guid.pk";
+
+var GPT_PT_COMMON_UNUSED                                  = GUID { data1 = 
0x00000000U, data2 = 0x0000UH, data3 = 0x0000UH, data4 = [ 0x00UB, 0x00UB, 
0x00UB, 0x00UB, 0x00UB, 0x00UB, 0x00UB, 0x00UB ] },
+    GPT_PT_COMMON_MBR_SCHEME                              = GUID { data1 = 
0x024DEE41U, data2 = 0x33E7UH, data3 = 0x11D3UH, data4 = [ 0x9DUB, 0x69UB, 
0x00UB, 0x08UB, 0xC7UB, 0x81UB, 0xF3UB, 0x9FUB ] },
+    GPT_PT_COMMON_EFI_SYSTEM                              = GUID { data1 = 
0xC12A7328U, data2 = 0xF81FUH, data3 = 0x11D2UH, data4 = [ 0xBAUB, 0x4BUB, 
0x00UB, 0xA0UB, 0xC9UB, 0x3EUB, 0xC9UB, 0x3BUB ] },
+    GPT_PT_COMMON_BIOS_BOOT                               = GUID { data1 = 
0x21686148U, data2 = 0x6449UH, data3 = 0x6E6FUH, data4 = [ 0x74UB, 0x4EUB, 
0x65UB, 0x65UB, 0x64UB, 0x45UB, 0x46UB, 0x49UB ] },
+    GPT_PT_COMMON_IFFS                                    = GUID { data1 = 
0xD3BFE2DEU, data2 = 0x3DAFUH, data3 = 0x11DFUH, data4 = [ 0xBAUB, 0x40UB, 
0xE3UB, 0xA5UB, 0x56UB, 0xD8UB, 0x95UB, 0x93UB ] },
+    GPT_PT_COMMON_SONY_BOOT                               = GUID { data1 = 
0xF4019732U, data2 = 0x066EUH, data3 = 0x4E12UH, data4 = [ 0x82UB, 0x73UB, 
0x34UB, 0x6CUB, 0x56UB, 0x41UB, 0x49UB, 0x4FUB ] },
+    GPT_PT_COMMON_LENOVO_BOOT                             = GUID { data1 = 
0xBFBFAFE7U, data2 = 0xA34FUH, data3 = 0x448AUH, data4 = [ 0x9AUB, 0x5BUB, 
0x62UB, 0x13UB, 0xEBUB, 0x73UB, 0x6CUB, 0x22UB ] },
+
+    GPT_PT_MS_RESERVED                                    = GUID { data1 = 
0xE3C9E316U, data2 = 0x0B5CUH, data3 = 0x4DB8UH, data4 = [ 0x81UB, 0x7DUB, 
0xF9UB, 0x2DUB, 0xF0UB, 0x02UB, 0x15UB, 0xAEUB ] },
+    GPT_PT_MS_BASIC_DATA                                  = GUID { data1 = 
0xEBD0A0A2U, data2 = 0xB9E5UH, data3 = 0x4433UH, data4 = [ 0x87UB, 0xC0UB, 
0x68UB, 0xB6UB, 0xB7UB, 0x26UB, 0x99UB, 0xC7UB ] },
+    GPT_PT_MS_LDM_METADATA                                = GUID { data1 = 
0x5808C8AAU, data2 = 0x7E8FUH, data3 = 0x42E0UH, data4 = [ 0x85UB, 0xD2UB, 
0xE1UB, 0xE9UB, 0x04UB, 0x34UB, 0xCFUB, 0xB3UB ] },
+    GPT_PT_MS_LDM_DATA                                    = GUID { data1 = 
0xAF9B60A0U, data2 = 0x1431UH, data3 = 0x4F62UH, data4 = [ 0xBCUB, 0x68UB, 
0x33UB, 0x11UB, 0x71UB, 0x4AUB, 0x69UB, 0xADUB ] },
+    GPT_PT_MS_RECOVERY                                    = GUID { data1 = 
0xDE94BBA4U, data2 = 0x06D1UH, data3 = 0x4D40UH, data4 = [ 0xA1UB, 0x6AUB, 
0xBFUB, 0xD5UB, 0x01UB, 0x79UB, 0xD6UB, 0xACUB ] },
+    GPT_PT_IBM_GPFS                                       = GUID { data1 = 
0x37AFFC90U, data2 = 0xEF7DUH, data3 = 0x4E96UH, data4 = [ 0x91UB, 0xC3UB, 
0x2DUB, 0x7AUB, 0xE0UB, 0x55UB, 0xB1UB, 0x74UB ] },
+    GPT_PT_MS_STORAGE                                     = GUID { data1 = 
0xE75CAF8FU, data2 = 0xF680UH, data3 = 0x4CEEUH, data4 = [ 0xAFUB, 0xA3UB, 
0xB0UB, 0x01UB, 0xE5UB, 0x6EUB, 0xFCUB, 0x2DUB ] },
+    GPT_PT_MS_STORAGE_REPLICA                             = GUID { data1 = 
0x558D43C5U, data2 = 0xA1ACUH, data3 = 0x43C0UH, data4 = [ 0xAAUB, 0xC8UB, 
0xD1UB, 0x47UB, 0x2BUB, 0x29UB, 0x23UB, 0xD1UB ] },
+
+    GPT_PT_HP_DATA                                        = GUID { data1 = 
0x75894C1EU, data2 = 0x3AEBUH, data3 = 0x11D3UH, data4 = [ 0xB7UB, 0xC1UB, 
0x7BUB, 0x03UB, 0xA0UB, 0x00UB, 0x00UB, 0x00UB ] },
+    GPT_PT_HP_SERVICE                                     = GUID { data1 = 
0xE2A1E728U, data2 = 0x32E3UH, data3 = 0x11D6UH, data4 = [ 0xA6UB, 0x82UB, 
0x7BUB, 0x03UB, 0xA0UB, 0x00UB, 0x00UB, 0x00UB ] },
+
+    GPT_PT_LINUX_FS_DATA                                  = GUID { data1 = 
0x0FC63DAFU, data2 = 0x8483UH, data3 = 0x4772UH, data4 = [ 0x8EUB, 0x79UB, 
0x3DUB, 0x69UB, 0xD8UB, 0x47UB, 0x7DUB, 0xE4UB ] },
+    GPT_PT_LINUX_RAID                                     = GUID { data1 = 
0xA19D880FU, data2 = 0x05FCUH, data3 = 0x4D3BUH, data4 = [ 0xA0UB, 0x06UB, 
0x74UB, 0x3FUB, 0x0FUB, 0x84UB, 0x91UB, 0x1EUB ] },
+    GPT_PT_LINUX_ROOT_X86                                 = GUID { data1 = 
0x44479540U, data2 = 0xF297UH, data3 = 0x41B2UH, data4 = [ 0x9AUB, 0xF7UB, 
0xD1UB, 0x31UB, 0xD5UB, 0xF0UB, 0x45UB, 0x8AUB ] },
+    GPT_PT_LINUX_ROOT_X86_64                              = GUID { data1 = 
0x4F68BCE3U, data2 = 0xE8CDUH, data3 = 0x4DB1UH, data4 = [ 0x96UB, 0xE7UB, 
0xFBUB, 0xCAUB, 0xF9UB, 0x84UB, 0xB7UB, 0x09UB ] },
+    GPT_PT_LINUX_ROOT_ARM32                               = GUID { data1 = 
0x69DAD710U, data2 = 0x2CE4UH, data3 = 0x4E3CUH, data4 = [ 0xB1UB, 0x6CUB, 
0x21UB, 0xA1UB, 0xD4UB, 0x9AUB, 0xBEUB, 0xD3UB ] },
+    GPT_PT_LINUX_ROOT_ARM64                               = GUID { data1 = 
0xB921B045U, data2 = 0x1DF0UH, data3 = 0x41C3UH, data4 = [ 0xAFUB, 0x44UB, 
0x4CUB, 0x6FUB, 0x28UB, 0x0DUB, 0x3FUB, 0xAEUB ] },
+    GPT_PT_LINUX_BOOT                                     = GUID { data1 = 
0xBC13C2FFU, data2 = 0x59E6UH, data3 = 0x4262UH, data4 = [ 0xA3UB, 0x52UB, 
0xB2UB, 0x75UB, 0xFDUB, 0x6FUB, 0x71UB, 0x72UB ] },
+    GPT_PT_LINUX_SWAP                                     = GUID { data1 = 
0x0657FD6DU, data2 = 0xA4ABUH, data3 = 0x43C4UH, data4 = [ 0x84UB, 0xE5UB, 
0x09UB, 0x33UB, 0xC8UB, 0x4BUB, 0x4FUB, 0x4FUB ] },
+    GPT_PT_LINUX_LVM                                      = GUID { data1 = 
0xE6D6D379U, data2 = 0xF507UH, data3 = 0x44C2UH, data4 = [ 0xA2UB, 0x3CUB, 
0x23UB, 0x8FUB, 0x2AUB, 0x3DUB, 0xF9UB, 0x28UB ] },
+    GPT_PT_LINUX_HOME                                     = GUID { data1 = 
0x933AC7E1U, data2 = 0x2EB4UH, data3 = 0x4F13UH, data4 = [ 0xB8UB, 0x44UB, 
0x0EUB, 0x14UB, 0xE2UB, 0xAEUB, 0xF9UB, 0x15UB ] },
+    GPT_PT_LINUX_SERVER_DATA                              = GUID { data1 = 
0x3B8F8425U, data2 = 0x20E0UH, data3 = 0x4F3BUH, data4 = [ 0x90UB, 0x7FUB, 
0x1AUB, 0x25UB, 0xA7UB, 0x6FUB, 0x98UB, 0xE8UB ] },
+    GPT_PT_LINUX_DM_CRYPT                                 = GUID { data1 = 
0x7FFEC5C9U, data2 = 0x2D00UH, data3 = 0x49B7UH, data4 = [ 0x89UB, 0x41UB, 
0x3EUB, 0xA1UB, 0x0AUB, 0x55UB, 0x86UB, 0xB7UB ] },
+    GPT_PT_LINUX_LUKS                                     = GUID { data1 = 
0xCA7D7CCBU, data2 = 0x63EDUH, data3 = 0x4C53UH, data4 = [ 0x86UB, 0x1CUB, 
0x17UB, 0x42UB, 0x53UB, 0x60UB, 0x59UB, 0xCCUB ] },
+    GPT_PT_LINUX_RESERVED                                 = GUID { data1 = 
0x8DA63339U, data2 = 0x0007UH, data3 = 0x60C0UH, data4 = [ 0xC4UB, 0x36UB, 
0x08UB, 0x3AUB, 0xC8UB, 0x23UB, 0x09UB, 0x08UB ] },
+
+    // note duplicate with LINUX_FS_DATA
+    GPT_PT_HURD_LINUX_FS_DATA                             = GUID { data1 = 
0x0FC63DAFU, data2 = 0x8483UH, data3 = 0x4772UH, data4 = [ 0x8EUB, 0x79UB, 
0x3DUB, 0x69UB, 0xD8UB, 0x47UB, 0x7DUB, 0xE4UB ] },
+    // note duplicate with LINUX_SWAP
+    GPT_PT_HURD_LINUX_SWAP                                = GUID { data1 = 
0x0657FD6DU, data2 = 0xA4ABUH, data3 = 0x43C4UH, data4 = [ 0x84UB, 0xE5UB, 
0x09UB, 0x33UB, 0xC8UB, 0x4BUB, 0x4FUB, 0x4FUB ] },
+
+    GPT_PT_FREEBSD_BOOT                                   = GUID { data1 = 
0x83BD6B9DU, data2 = 0x7F41UH, data3 = 0x11DCUH, data4 = [ 0xBEUB, 0x0BUB, 
0x00UB, 0x15UB, 0x60UB, 0xB8UB, 0x4FUB, 0x0FUB ] },
+    GPT_PT_FREEBSD_DISKLABEL                              = GUID { data1 = 
0x516E7CB4U, data2 = 0x6ECFUH, data3 = 0x11D6UH, data4 = [ 0x8FUB, 0xF8UB, 
0x00UB, 0x02UB, 0x2DUB, 0x09UB, 0x71UB, 0x2BUB ] },
+    GPT_PT_FREEBSD_SWAP                                   = GUID { data1 = 
0x516E7CB5U, data2 = 0x6ECFUH, data3 = 0x11D6UH, data4 = [ 0x8FUB, 0xF8UB, 
0x00UB, 0x02UB, 0x2DUB, 0x09UB, 0x71UB, 0x2BUB ] },
+    GPT_PT_FREEBSD_UFS                                    = GUID { data1 = 
0x516E7CB6U, data2 = 0x6ECFUH, data3 = 0x11D6UH, data4 = [ 0x8FUB, 0xF8UB, 
0x00UB, 0x02UB, 0x2DUB, 0x09UB, 0x71UB, 0x2BUB ] },
+    GPT_PT_FREEBSD_VINUM                                  = GUID { data1 = 
0x516E7CB8U, data2 = 0x6ECFUH, data3 = 0x11D6UH, data4 = [ 0x8FUB, 0xF8UB, 
0x00UB, 0x02UB, 0x2DUB, 0x09UB, 0x71UB, 0x2BUB ] },
+    GPT_PT_FREEBSD_ZFS                                    = GUID { data1 = 
0x516E7CBAU, data2 = 0x6ECFUH, data3 = 0x11D6UH, data4 = [ 0x8FUB, 0xF8UB, 
0x00UB, 0x02UB, 0x2DUB, 0x09UB, 0x71UB, 0x2BUB ] },
+    GPT_PT_FREEBSD_NANDFS                                 = GUID { data1 = 
0x74BA7DD9U, data2 = 0xA689UH, data3 = 0x11E1UH, data4 = [ 0xBDUB, 0x04UB, 
0x00UB, 0xE0UB, 0x81UB, 0x28UB, 0x6AUB, 0xCFUB ] },
+
+    GPT_PT_HFS_PLUS                                       = GUID { data1 = 
0x48465300U, data2 = 0x0000UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_APFS_CONTAINER                                 = GUID { data1 = 
0x7C3457EFU, data2 = 0x0000UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_APPLE_UFS_CONTAINER                            = GUID { data1 = 
0x55465300U, data2 = 0x0000UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_ZFS                                            = GUID { data1 = 
0x6A898CC3U, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_APPLE_RAID                                     = GUID { data1 = 
0x52414944U, data2 = 0x0000UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_APPLE_RAID_OFFLINE                             = GUID { data1 = 
0x52414944U, data2 = 0x5F4FUH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_APPLE_BOOT                                     = GUID { data1 = 
0x426F6F74U, data2 = 0x0000UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_APPLE_LABEL                                    = GUID { data1 = 
0x4C616265U, data2 = 0x6C00UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_APPLE_TV_RECOVERY                              = GUID { data1 = 
0x5265636FU, data2 = 0x7665UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_APPLE_CORE_STORAGE_CONTAINER                   = GUID { data1 = 
0x53746F72U, data2 = 0x6167UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_APFS_PREBOOT                                   = GUID { data1 = 
0x69646961U, data2 = 0x6700UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+    GPT_PT_APFS_RECOVERY                                  = GUID { data1 = 
0x52637672U, data2 = 0x7900UH, data3 = 0x11AAUH, data4 = [ 0xAAUB, 0x11UB, 
0x00UB, 0x30UB, 0x65UB, 0x43UB, 0xECUB, 0xACUB ] },
+
+    GPT_PT_SOLARIS_BOOT                                   = GUID { data1 = 
0x6A82CB45U, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_ROOT                                   = GUID { data1 = 
0x6A85CF4DU, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_SWAP                                   = GUID { data1 = 
0x6A87C46FU, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_BACKUP                                 = GUID { data1 = 
0x6A8B642BU, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    // note SOLARIS_USR vs ZFS
+    GPT_PT_SOLARIS_USR                                    = GUID { data1 = 
0x6A898CC3U, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_VAR                                    = GUID { data1 = 
0x6A8EF2E9U, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_HOME                                   = GUID { data1 = 
0x6A90BA39U, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_ALT_SECTOR                             = GUID { data1 = 
0x6A9283A5U, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_RESERVED_1                             = GUID { data1 = 
0x6A945A3BU, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_RESERVED_2                             = GUID { data1 = 
0x6A9630D1U, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_RESERVED_3                             = GUID { data1 = 
0x6A980767U, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_RESERVED_4                             = GUID { data1 = 
0x6A96237FU, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+    GPT_PT_SOLARIS_RESERVED_5                             = GUID { data1 = 
0x6A8D2AC7U, data2 = 0x1DD2UH, data3 = 0x11B2UH, data4 = [ 0x99UB, 0xA6UB, 
0x08UB, 0x00UB, 0x20UB, 0x73UB, 0x66UB, 0x31UB ] },
+
+    GPT_PT_NETBSD_SWAP                                    = GUID { data1 = 
0x49F48D32U, data2 = 0xB10EUH, data3 = 0x11DCUH, data4 = [ 0xB9UB, 0x9BUB, 
0x00UB, 0x19UB, 0xD1UB, 0x87UB, 0x96UB, 0x48UB ] },
+    GPT_PT_NETBSD_FFS                                     = GUID { data1 = 
0x49F48D5AU, data2 = 0xB10EUH, data3 = 0x11DCUH, data4 = [ 0xB9UB, 0x9BUB, 
0x00UB, 0x19UB, 0xD1UB, 0x87UB, 0x96UB, 0x48UB ] },
+    GPT_PT_NETBSD_LFS                                     = GUID { data1 = 
0x49F48D82U, data2 = 0xB10EUH, data3 = 0x11DCUH, data4 = [ 0xB9UB, 0x9BUB, 
0x00UB, 0x19UB, 0xD1UB, 0x87UB, 0x96UB, 0x48UB ] },
+    GPT_PT_NETBSD_RAID                                    = GUID { data1 = 
0x49F48DAAU, data2 = 0xB10EUH, data3 = 0x11DCUH, data4 = [ 0xB9UB, 0x9BUB, 
0x00UB, 0x19UB, 0xD1UB, 0x87UB, 0x96UB, 0x48UB ] },
+    GPT_PT_NETBSD_CONCAT                                  = GUID { data1 = 
0x2DB519C4U, data2 = 0xB10FUH, data3 = 0x11DCUH, data4 = [ 0xB9UB, 0x9BUB, 
0x00UB, 0x19UB, 0xD1UB, 0x87UB, 0x96UB, 0x48UB ] },
+    GPT_PT_NETBSD_ENC                                     = GUID { data1 = 
0x2DB519ECU, data2 = 0xB10FUH, data3 = 0x11DCUH, data4 = [ 0xB9UB, 0x9BUB, 
0x00UB, 0x19UB, 0xD1UB, 0x87UB, 0x96UB, 0x48UB ] },
+
+    GPT_PT_CHROME_KERNEL                                  = GUID { data1 = 
0xFE3A2A5DU, data2 = 0x4F32UH, data3 = 0x41A7UH, data4 = [ 0xB7UB, 0x25UB, 
0xACUB, 0xCCUB, 0x32UB, 0x85UB, 0xA3UB, 0x09UB ] },
+    GPT_PT_CHROME_ROOTFS                                  = GUID { data1 = 
0x3CB8E202U, data2 = 0x3B7EUH, data3 = 0x47DDUH, data4 = [ 0x8AUB, 0x3CUB, 
0x7FUB, 0xF2UB, 0xA1UB, 0x3CUB, 0xFCUB, 0xECUB ] },
+    GPT_PT_CHROME_FIRMWARE                                = GUID { data1 = 
0xCAB6E88EU, data2 = 0xABF3UH, data3 = 0x4102UH, data4 = [ 0xA0UB, 0x7AUB, 
0xD4UB, 0xBBUB, 0x9BUB, 0xE3UB, 0xC1UB, 0xD3UB ] },
+    GPT_PT_CHROME_FUTURE                                  = GUID { data1 = 
0x2E0A753DU, data2 = 0x9E48UH, data3 = 0x43B0UH, data4 = [ 0x83UB, 0x37UB, 
0xB1UB, 0x51UB, 0x92UB, 0xCBUB, 0x1BUB, 0x5EUB ] },
+    GPT_PT_CHROME_MINI_OS                                 = GUID { data1 = 
0x09845860U, data2 = 0x705FUH, data3 = 0x4BB5UH, data4 = [ 0xB1UB, 0x6CUB, 
0x8AUB, 0x8AUB, 0x09UB, 0x9CUB, 0xAFUB, 0x52UB ] },
+    GPT_PT_CHROME_HIBERNATE                               = GUID { data1 = 
0x3F0F8318U, data2 = 0xF146UH, data3 = 0x4E6BUH, data4 = [ 0x82UB, 0x22UB, 
0xC2UB, 0x8CUB, 0x8FUB, 0x02UB, 0xE0UB, 0xD5UB ] },
+
+    GPT_PT_COREOS_USR                                     = GUID { data1 = 
0x5DFBF5F4U, data2 = 0x2848UH, data3 = 0x4BACUH, data4 = [ 0xAAUB, 0x5EUB, 
0x0DUB, 0x9AUB, 0x20UB, 0xB7UB, 0x45UB, 0xA6UB ] },
+    GPT_PT_COREOS_RESIZE                                  = GUID { data1 = 
0x3884DD41U, data2 = 0x8582UH, data3 = 0x4404UH, data4 = [ 0xB9UB, 0xA8UB, 
0xE9UB, 0xB8UB, 0x4FUB, 0x2DUB, 0xF5UB, 0x0EUB ] },
+    GPT_PT_COREOS_RESERVED                                = GUID { data1 = 
0xC95DC21AU, data2 = 0xDF0EUH, data3 = 0x4340UH, data4 = [ 0x8DUB, 0x7BUB, 
0x26UB, 0xCBUB, 0xFAUB, 0x9AUB, 0x03UB, 0xE0UB ] },
+    GPT_PT_COREOS_ROOT_RAID                               = GUID { data1 = 
0xBE9067B9U, data2 = 0xEA49UH, data3 = 0x4F15UH, data4 = [ 0xB4UB, 0xF6UB, 
0xF3UB, 0x6FUB, 0x8CUB, 0x9EUB, 0x18UB, 0x18UB ] },
+
+    GPT_PT_HAIKU_BFS                                      = GUID { data1 = 
0x42465331U, data2 = 0x3BA3UH, data3 = 0x10F1UH, data4 = [ 0x80UB, 0x2AUB, 
0x48UB, 0x61UB, 0x69UB, 0x6BUB, 0x75UB, 0x21UB ] },
+
+    GPT_PT_MIDNIGHT_BOOT                                  = GUID { data1 = 
0x85D5E45EU, data2 = 0x237CUH, data3 = 0x11E1UH, data4 = [ 0xB4UB, 0xB3UB, 
0xE8UB, 0x9AUB, 0x8FUB, 0x7FUB, 0xC3UB, 0xA7UB ] },
+    GPT_PT_MIDNIGHT_DATA                                  = GUID { data1 = 
0x85D5E45AU, data2 = 0x237CUH, data3 = 0x11E1UH, data4 = [ 0xB4UB, 0xB3UB, 
0xE8UB, 0x9AUB, 0x8FUB, 0x7FUB, 0xC3UB, 0xA7UB ] },
+    GPT_PT_MIDNIGHT_SWAP                                  = GUID { data1 = 
0x85D5E45BU, data2 = 0x237CUH, data3 = 0x11E1UH, data4 = [ 0xB4UB, 0xB3UB, 
0xE8UB, 0x9AUB, 0x8FUB, 0x7FUB, 0xC3UB, 0xA7UB ] },
+    GPT_PT_MIDNIGHT_UFS                                   = GUID { data1 = 
0x0394EF8BU, data2 = 0x237EUH, data3 = 0x11E1UH, data4 = [ 0xB4UB, 0xB3UB, 
0xE8UB, 0x9AUB, 0x8FUB, 0x7FUB, 0xC3UB, 0xA7UB ] },
+    GPT_PT_MIDNIGHT_VINUM                                 = GUID { data1 = 
0x85D5E45CU, data2 = 0x237CUH, data3 = 0x11E1UH, data4 = [ 0xB4UB, 0xB3UB, 
0xE8UB, 0x9AUB, 0x8FUB, 0x7FUB, 0xC3UB, 0xA7UB ] },
+    GPT_PT_MIDNIGHT_ZFS                                   = GUID { data1 = 
0x85D5E45DU, data2 = 0x237CUH, data3 = 0x11E1UH, data4 = [ 0xB4UB, 0xB3UB, 
0xE8UB, 0x9AUB, 0x8FUB, 0x7FUB, 0xC3UB, 0xA7UB ] },
+
+    GPT_PT_CEPH_JOURNAL                                   = GUID { data1 = 
0x45B0969EU, data2 = 0x9B03UH, data3 = 0x4F30UH, data4 = [ 0xB4UB, 0xC6UB, 
0xB4UB, 0xB8UB, 0x0CUB, 0xEFUB, 0xF1UB, 0x06UB ] },
+    GPT_PT_CEPH_CRYPT_JOURNAL                             = GUID { data1 = 
0x45B0969EU, data2 = 0x9B03UH, data3 = 0x4F30UH, data4 = [ 0xB4UB, 0xC6UB, 
0x5EUB, 0xC0UB, 0x0CUB, 0xEFUB, 0xF1UB, 0x06UB ] },
+    GPT_PT_CEPH_OSD                                       = GUID { data1 = 
0x4FBD7E29U, data2 = 0x9D25UH, data3 = 0x41B8UH, data4 = [ 0xAFUB, 0xD0UB, 
0x06UB, 0x2CUB, 0x0CUB, 0xEFUB, 0xF0UB, 0x5DUB ] },
+    GPT_PT_CEPH_CRYPT_OSD                                 = GUID { data1 = 
0x4FBD7E29U, data2 = 0x9D25UH, data3 = 0x41B8UH, data4 = [ 0xAFUB, 0xD0UB, 
0x5EUB, 0xC0UB, 0x0CUB, 0xEFUB, 0xF0UB, 0x5DUB ] },
+    GPT_PT_CEPH_DISK_CREATION                             = GUID { data1 = 
0x89C57F98U, data2 = 0x2FE5UH, data3 = 0x4DC0UH, data4 = [ 0x89UB, 0xC1UB, 
0xF3UB, 0xADUB, 0x0CUB, 0xEFUB, 0xF2UB, 0xBEUB ] },
+    GPT_PT_CEPH_CRYPT_DISK_CREATION                       = GUID { data1 = 
0x89C57F98U, data2 = 0x2FE5UH, data3 = 0x4DC0UH, data4 = [ 0x89UB, 0xC1UB, 
0x5EUB, 0xC0UB, 0x0CUB, 0xEFUB, 0xF2UB, 0xBEUB ] },
+    GPT_PT_CEPH_BLOCK                                     = GUID { data1 = 
0xCAFECAFEU, data2 = 0x9B03UH, data3 = 0x4F30UH, data4 = [ 0xB4UB, 0xC6UB, 
0xB4UB, 0xB8UB, 0x0CUB, 0xEFUB, 0xF1UB, 0x06UB ] },
+    GPT_PT_CEPH_BLOCK_DB                                  = GUID { data1 = 
0x30CD0809U, data2 = 0xC2B2UH, data3 = 0x499CUH, data4 = [ 0x88UB, 0x79UB, 
0x2DUB, 0x6BUB, 0x78UB, 0x52UB, 0x98UB, 0x76UB ] },
+    GPT_PT_CEPH_BLOCK_WAL                                 = GUID { data1 = 
0x5CE17FCEU, data2 = 0x4087UH, data3 = 0x4169UH, data4 = [ 0xB7UB, 0xFFUB, 
0x05UB, 0x6CUB, 0xC5UB, 0x84UB, 0x73UB, 0xF9UB ] },
+    GPT_PT_CEPH_LOCKBOX                                   = GUID { data1 = 
0xFB3AABF9U, data2 = 0xD25FUH, data3 = 0x47CCUH, data4 = [ 0xBFUB, 0x5EUB, 
0x72UB, 0x1DUB, 0x18UB, 0x16UB, 0x49UB, 0x6BUB ] },
+    GPT_PT_CEPH_MULTIPATH_OSD                             = GUID { data1 = 
0x4FBD7E29U, data2 = 0x8AE0UH, data3 = 0x4982UH, data4 = [ 0xBFUB, 0x9DUB, 
0x5AUB, 0x8DUB, 0x86UB, 0x7AUB, 0xF5UB, 0x60UB ] },
+    GPT_PT_CEPH_MULTIPATH_JOURNAL                         = GUID { data1 = 
0x45B0969EU, data2 = 0x8AE0UH, data3 = 0x4982UH, data4 = [ 0xBFUB, 0x9DUB, 
0x5AUB, 0x8DUB, 0x86UB, 0x7AUB, 0xF5UB, 0x60UB ] },
+    GPT_PT_CEPH_MULTIPATH_BLOCK                           = GUID { data1 = 
0xCAFECAFEU, data2 = 0x8AE0UH, data3 = 0x4982UH, data4 = [ 0xBFUB, 0x9DUB, 
0x5AUB, 0x8DUB, 0x86UB, 0x7AUB, 0xF5UB, 0x60UB ] },
+    GPT_PT_CEPH_MULTIPATH_BLOCK                           = GUID { data1 = 
0x7F4A666AU, data2 = 0x16F3UH, data3 = 0x47A2UH, data4 = [ 0x84UB, 0x45UB, 
0x15UB, 0x2EUB, 0xF4UB, 0xD0UB, 0x3FUB, 0x6CUB ] },
+    GPT_PT_CEPH_MULTIPATH_BLOCK_DB                        = GUID { data1 = 
0xEC6D6385U, data2 = 0xE346UH, data3 = 0x45DCUH, data4 = [ 0xBEUB, 0x91UB, 
0xDAUB, 0x2AUB, 0x7CUB, 0x8BUB, 0x32UB, 0x61UB ] },
+    GPT_PT_CEPH_MULTIPATH_BLOCK_WAL                       = GUID { data1 = 
0x01B41E1BU, data2 = 0x002AUH, data3 = 0x453CUH, data4 = [ 0x9FUB, 0x17UB, 
0x88UB, 0x79UB, 0x39UB, 0x89UB, 0xFFUB, 0x8FUB ] },
+    GPT_PT_CEPH_DM_CRYPT_BLOCK                            = GUID { data1 = 
0xCAFECAFEU, data2 = 0x9B03UH, data3 = 0x4F30UH, data4 = [ 0xB4UB, 0xC6UB, 
0x5EUB, 0xC0UB, 0x0CUB, 0xEFUB, 0xF1UB, 0x06UB ] },
+    GPT_PT_CEPH_DM_CRYPT_BLOCK_DB                         = GUID { data1 = 
0x93B0052DU, data2 = 0x02D9UH, data3 = 0x4D8AUH, data4 = [ 0xA4UB, 0x3BUB, 
0x33UB, 0xA3UB, 0xEEUB, 0x4DUB, 0xFBUB, 0xC3UB ] },
+    GPT_PT_CEPH_DM_CRYPT_BLOCK_WAL                        = GUID { data1 = 
0x306E8683U, data2 = 0x4FE2UH, data3 = 0x4330UH, data4 = [ 0xB7UB, 0xC0UB, 
0x00UB, 0xA9UB, 0x17UB, 0xC1UB, 0x69UB, 0x66UB ] },
+    GPT_PT_CEPH_DM_CRYPT_LUKS_JOURNAL                     = GUID { data1 = 
0x45B0969EU, data2 = 0x9B03UH, data3 = 0x4F30UH, data4 = [ 0xB4UB, 0xC6UB, 
0x35UB, 0x86UB, 0x5CUB, 0xEFUB, 0xF1UB, 0x06UB ] },
+    GPT_PT_CEPH_DM_CRYPT_LUKS_BLOCK                       = GUID { data1 = 
0xCAFECAFEU, data2 = 0x9B03UH, data3 = 0x4F30UH, data4 = [ 0xB4UB, 0xC6UB, 
0x35UB, 0x86UB, 0x5CUB, 0xEFUB, 0xF1UB, 0x06UB ] },
+    GPT_PT_CEPH_DM_CRYPT_LUKS_BLOCK_DB                    = GUID { data1 = 
0x166418DAU, data2 = 0xC469UH, data3 = 0x4022UH, data4 = [ 0xADUB, 0xF4UB, 
0xB3UB, 0x0AUB, 0xFDUB, 0x37UB, 0xF1UB, 0x76UB ] },
+    GPT_PT_CEPH_DM_CRYPT_LUKS_BLOCK_WAL                   = GUID { data1 = 
0x86A32090U, data2 = 0x3647UH, data3 = 0x40B9UH, data4 = [ 0xBBUB, 0xBDUB, 
0x38UB, 0xD8UB, 0xC5UB, 0x73UB, 0xAAUB, 0x86UB ] },
+    GPT_PT_CEPH_DM_CRYPT_LUKS_OSD                         = GUID { data1 = 
0x4FBD7E29U, data2 = 0x9D25UH, data3 = 0x41B8UH, data4 = [ 0xAFUB, 0xD0UB, 
0x35UB, 0x86UB, 0x5CUB, 0xEFUB, 0xF0UB, 0x5DUB ] },
+
+    GPT_PT_OPENBSD_DATA                                   = GUID { data1 = 
0x824CC7A0U, data2 = 0x36A8UH, data3 = 0x11E3UH, data4 = [ 0x89UB, 0x0AUB, 
0x95UB, 0x25UB, 0x19UB, 0xADUB, 0x3FUB, 0x61UB ] },
+
+    GPT_PT_QNX6                                           = GUID { data1 = 
0xCEF5A9ADU, data2 = 0x73BCUH, data3 = 0x4601UH, data4 = [ 0x89UB, 0xF3UB, 
0xCDUB, 0xEEUB, 0xEEUB, 0xE3UB, 0x21UB, 0xA1UB ] },
+
+    GPT_PT_PLAN9                                          = GUID { data1 = 
0xC91818F9U, data2 = 0x8025UH, data3 = 0x47AFUH, data4 = [ 0x89UB, 0xD2UB, 
0xF0UB, 0x30UB, 0xD7UB, 0x00UB, 0x0CUB, 0x2CUB ] },
+
+    GPT_PT_VMWARE_VMFS                                    = GUID { data1 = 
0xAA31E02AU, data2 = 0x400FUH, data3 = 0x11DBUH, data4 = [ 0x95UB, 0x90UB, 
0x00UB, 0x0CUB, 0x29UB, 0x11UB, 0xD1UB, 0xB8UB ] },
+    GPT_PT_VMWARE_RESERVED                                = GUID { data1 = 
0x9198EFFCU, data2 = 0x31C0UH, data3 = 0x11DBUH, data4 = [ 0x8FUB, 0x78UB, 
0x00UB, 0x0CUB, 0x29UB, 0x11UB, 0xD1UB, 0xB8UB ] },
+    GPT_PT_VMWARE_KCORE                                   = GUID { data1 = 
0x9D275380U, data2 = 0x40ADUH, data3 = 0x11DBUH, data4 = [ 0xBFUB, 0x97UB, 
0x00UB, 0x0CUB, 0x29UB, 0x11UB, 0xD1UB, 0xB8UB ] },
+
+    GPT_PT_ANDROID_X86_BOOTLOADER                         = GUID { data1 = 
0x2568845DU, data2 = 0x2332UH, data3 = 0x4675UH, data4 = [ 0xBCUB, 0x39UB, 
0x8FUB, 0xA5UB, 0xA4UB, 0x74UB, 0x8DUB, 0x15UB ] },
+    GPT_PT_ANDROID_X86_BOOTLOADER2                        = GUID { data1 = 
0x114EAFFEU, data2 = 0x1552UH, data3 = 0x4022UH, data4 = [ 0xB2UB, 0x6EUB, 
0x9BUB, 0x05UB, 0x36UB, 0x04UB, 0xCFUB, 0x84UB ] },
+    GPT_PT_ANDROID_X86_BOOT                               = GUID { data1 = 
0x49A4D17FU, data2 = 0x93A3UH, data3 = 0x45C1UH, data4 = [ 0xA0UB, 0xDEUB, 
0xF5UB, 0x0BUB, 0x2EUB, 0xBEUB, 0x25UB, 0x99UB ] },
+    GPT_PT_ANDROID_X86_RECOVERY                           = GUID { data1 = 
0x4177C722U, data2 = 0x9E92UH, data3 = 0x4AABUH, data4 = [ 0x86UB, 0x44UB, 
0x43UB, 0x50UB, 0x2BUB, 0xFDUB, 0x55UB, 0x06UB ] },
+    GPT_PT_ANDROID_X86_MISC                               = GUID { data1 = 
0xEF32A33BU, data2 = 0xA409UH, data3 = 0x486CUH, data4 = [ 0x91UB, 0x41UB, 
0x9FUB, 0xFBUB, 0x71UB, 0x1FUB, 0x62UB, 0x66UB ] },
+    GPT_PT_ANDROID_X86_METADATA                           = GUID { data1 = 
0x20AC26BEU, data2 = 0x20B7UH, data3 = 0x11E3UH, data4 = [ 0x84UB, 0xC5UB, 
0x6CUB, 0xFDUB, 0xB9UB, 0x47UB, 0x11UB, 0xE9UB ] },
+    GPT_PT_ANDROID_X86_SYSTEM                             = GUID { data1 = 
0x38F428E6U, data2 = 0xD326UH, data3 = 0x425DUH, data4 = [ 0x91UB, 0x40UB, 
0x6EUB, 0x0EUB, 0xA1UB, 0x33UB, 0x64UB, 0x7CUB ] },
+    GPT_PT_ANDROID_X86_CACHE                              = GUID { data1 = 
0xA893EF21U, data2 = 0xE428UH, data3 = 0x470AUH, data4 = [ 0x9EUB, 0x55UB, 
0x06UB, 0x68UB, 0xFDUB, 0x91UB, 0xA2UB, 0xD9UB ] },
+    GPT_PT_ANDROID_X86_DATA                               = GUID { data1 = 
0xDC76DDA9U, data2 = 0x5AC1UH, data3 = 0x491CUH, data4 = [ 0xAFUB, 0x42UB, 
0xA8UB, 0x25UB, 0x91UB, 0x58UB, 0x0CUB, 0x0DUB ] },
+    GPT_PT_ANDROID_X86_PERSISTENT                         = GUID { data1 = 
0xEBC597D0U, data2 = 0x2053UH, data3 = 0x4B15UH, data4 = [ 0x8BUB, 0x64UB, 
0xE0UB, 0xAAUB, 0xC7UB, 0x5FUB, 0x4DUB, 0xB1UB ] },
+    GPT_PT_ANDROID_X86_VENDOR                             = GUID { data1 = 
0xC5A0AEECU, data2 = 0x13EAUH, data3 = 0x11E5UH, data4 = [ 0xA1UB, 0xB1UB, 
0x00UB, 0x1EUB, 0x67UB, 0xCAUB, 0x0CUB, 0x3CUB ] },
+    GPT_PT_ANDROID_X86_CONFIG                             = GUID { data1 = 
0xBD59408BU, data2 = 0x4514UH, data3 = 0x490DUH, data4 = [ 0xBFUB, 0x12UB, 
0x98UB, 0x78UB, 0xD9UB, 0x63UB, 0xF3UB, 0x78UB ] },
+    GPT_PT_ANDROID_X86_FACTORY                            = GUID { data1 = 
0x8F68CC74U, data2 = 0xC5E5UH, data3 = 0x48DAUH, data4 = [ 0xBEUB, 0x91UB, 
0xA0UB, 0xC8UB, 0xC1UB, 0x5EUB, 0x9CUB, 0x80UB ] },
+    GPT_PT_ANDROID_X86_FACTORY_ALT                        = GUID { data1 = 
0x9FDAA6EFU, data2 = 0x4B3FUH, data3 = 0x40D2UH, data4 = [ 0xBAUB, 0x8DUB, 
0xBFUB, 0xF1UB, 0x6BUB, 0xFBUB, 0x88UB, 0x7BUB ] },
+    GPT_PT_ANDROID_X86_FASTBOOT                           = GUID { data1 = 
0x767941D0U, data2 = 0x2085UH, data3 = 0x11E3UH, data4 = [ 0xADUB, 0x3BUB, 
0x6CUB, 0xFDUB, 0xB9UB, 0x47UB, 0x11UB, 0xE9UB ] },
+    GPT_PT_ANDROID_X86_OEM                                = GUID { data1 = 
0xAC6D7924U, data2 = 0xEB71UH, data3 = 0x4DF8UH, data4 = [ 0xB4UB, 0x8DUB, 
0xE2UB, 0x67UB, 0xB2UB, 0x71UB, 0x48UB, 0xFFUB ] },
+
+    GPT_PT_ANDROID_ARM_META                               = GUID { data1 = 
0x19A710A2U, data2 = 0xB3CAUH, data3 = 0x11E4UH, data4 = [ 0xB0UB, 0x26UB, 
0x10UB, 0x60UB, 0x4BUB, 0x88UB, 0x9DUB, 0xCFUB ] },
+    GPT_PT_ANDROID_ARM_EXT                                = GUID { data1 = 
0x193D1EA4U, data2 = 0xB3CAUH, data3 = 0x11E4UH, data4 = [ 0xB0UB, 0x75UB, 
0x10UB, 0x60UB, 0x4BUB, 0x88UB, 0x9DUB, 0xCFUB ] },
+
+    GPT_PT_ONIE_BOOT                                      = GUID { data1 = 
0x7412F7D5U, data2 = 0xA156UH, data3 = 0x4B13UH, data4 = [ 0x81UB, 0xDCUB, 
0x86UB, 0x71UB, 0x74UB, 0x92UB, 0x93UB, 0x25UB ] },
+    GPT_PT_ONIE_CONFIG                                    = GUID { data1 = 
0xD4E6E2CDU, data2 = 0x4469UH, data3 = 0x46F3UH, data4 = [ 0xB5UB, 0xCBUB, 
0x1BUB, 0xFFUB, 0x57UB, 0xAFUB, 0xC1UB, 0x49UB ] },
+
+    GPT_PT_POWERPC_PREP_BOOT                              = GUID { data1 = 
0x9E1A2D38U, data2 = 0xC612UH, data3 = 0x4316UH, data4 = [ 0xAAUB, 0x26UB, 
0x8BUB, 0x49UB, 0x52UB, 0x1EUB, 0x5AUB, 0x8BUB ] },
+
+    // note FREEDESKTOP equals to LINUX_BOOT
+    GPT_PT_FREEDESKTOP                                    = GUID { data1 = 
0xBC13C2FFU, data2 = 0x59E6UH, data3 = 0x4262UH, data4 = [ 0xA3UB, 0x52UB, 
0xB2UB, 0x75UB, 0xFDUB, 0x6FUB, 0x71UB, 0x72UB ] },
+
+    GPT_PT_ATARI_TOS_BASIC                                = GUID { data1 = 
0x734E5AFEU, data2 = 0xF61AUH, data3 = 0x11E6UH, data4 = [ 0xBCUB, 0x64UB, 
0x92UB, 0x36UB, 0x1FUB, 0x00UB, 0x26UB, 0x71UB ] },
+
+    GPT_PT_VERACRYPT_ENCRYPTED                            = GUID { data1 = 
0x8C8F8EFFU, data2 = 0xAC95UH, data3 = 0x4770UH, data4 = [ 0x81UB, 0x4AUB, 
0x21UB, 0x99UB, 0x4FUB, 0x2DUB, 0xBCUB, 0x8FUB ] },
+
+    GPT_PT_OS2_ARCAOS_TYPE1                               = GUID { data1 = 
0x90B6FF38U, data2 = 0xB98FUH, data3 = 0x4358UH, data4 = [ 0xA2UB, 0x1FUB, 
0x48UB, 0xF3UB, 0x5BUB, 0x4AUB, 0x8AUB, 0xD3UB ] },
+
+    GPT_PT_SPDK_BLOCK_DEVICE                              = GUID { data1 = 
0x7C5222BDU, data2 = 0x8F5DUH, data3 = 0x4087UH, data4 = [ 0x9CUB, 0x00UB, 
0xBFUB, 0x98UB, 0x43UB, 0xC7UB, 0xB5UB, 0x8CUB ] },
+
+    GPT_PT_BAREBOX_STATE                                  = GUID { data1 = 
0x4778ED65U, data2 = 0xBF42UH, data3 = 0x45FAUH, data4 = [ 0x9CUB, 0x5BUB, 
0x28UB, 0x7AUB, 0x1DUB, 0xC4UB, 0xAAUB, 0xB1UB ] },
+
+    GPT_PT_UBOOT_ENVIRONMENT                              = GUID { data1 = 
0x3DE21764U, data2 = 0x95BDUH, data3 = 0x54BDUH, data4 = [ 0xA5UB, 0xC3UB, 
0x4AUB, 0xBEUB, 0x78UB, 0x6FUB, 0x38UB, 0xA8UB ] },
+
+    GPT_PT_SOFTRAID_STATUS                                = GUID { data1 = 
0xB6FA30DAU, data2 = 0x92D2UH, data3 = 0x4A9AUH, data4 = [ 0x96UB, 0xF1UB, 
0x87UB, 0x1EUB, 0xC6UB, 0x48UB, 0x62UB, 0x00UB ] },
+    GPT_PT_SOFTRAID_SCRATCH                               = GUID { data1 = 
0x2E313465U, data2 = 0x19B9UH, data3 = 0x463FUH, data4 = [ 0x81UB, 0x26UB, 
0x8AUB, 0x79UB, 0x93UB, 0x77UB, 0x38UB, 0x01UB ] },
+    GPT_PT_SOFTRAID_VOLUME                                = GUID { data1 = 
0xFA709C7EU, data2 = 0x65B1UH, data3 = 0x4593UH, data4 = [ 0xBFUB, 0xD5UB, 
0xE7UB, 0x1DUB, 0x61UB, 0xDEUB, 0x9BUB, 0x02UB ] },
+    GPT_PT_SOFTRAID_CACHE                                 = GUID { data1 = 
0xBBBA6DF5U, data2 = 0xF46FUH, data3 = 0x4A89UH, data4 = [ 0x8FUB, 0x59UB, 
0x87UB, 0x65UB, 0xB2UB, 0x72UB, 0x75UB, 0x03UB ] },
+
+    GPT_PT_FUCHSIA_BOOTLOADER                             = GUID { data1 = 
0xFE8A2634U, data2 = 0x5E2EUH, data3 = 0x46BAUH, data4 = [ 0x99UB, 0xE3UB, 
0x3AUB, 0x19UB, 0x20UB, 0x91UB, 0xA3UB, 0x50UB ] },
+    GPT_PT_FUCHSIA_DURABLE_MUTABLE_SYSTEM_DATA            = GUID { data1 = 
0xD9FD4535U, data2 = 0x106CUH, data3 = 0x4CECUH, data4 = [ 0x8DUB, 0x37UB, 
0xDFUB, 0xC0UB, 0x20UB, 0xCAUB, 0x87UB, 0xCBUB ] },
+    GPT_PT_FUCHSIA_DURABLE_MUTABLE_BOOTLOADER_DATA        = GUID { data1 = 
0xA409E16BU, data2 = 0x78AAUH, data3 = 0x4ACCUH, data4 = [ 0x99UB, 0x5CUB, 
0x30UB, 0x23UB, 0x52UB, 0x62UB, 0x1AUB, 0x41UB ] },
+    GPT_PT_FUCHSIA_FACTORY_PROVISIONED_RO_SYSTEM_DATA     = GUID { data1 = 
0xF95D940EU, data2 = 0xCABAUH, data3 = 0x4578UH, data4 = [ 0x9BUB, 0x93UB, 
0xBBUB, 0x6CUB, 0x90UB, 0xF2UB, 0x9DUB, 0x3EUB ] },
+    GPT_PT_FUCHSIA_FACTORY_PROVISIONED_RO_BOOTLOADER_DATA = GUID { data1 = 
0x10B8DBAAU, data2 = 0xD2BFUH, data3 = 0x42A9UH, data4 = [ 0x98UB, 0xC6UB, 
0xA7UB, 0xC5UB, 0xDBUB, 0x37UB, 0x01UB, 0xE7UB ] },
+    GPT_PT_FUCHSIA_VOLUME_MANAGER                         = GUID { data1 = 
0x49FD7CB8U, data2 = 0xDF15UH, data3 = 0x4E73UH, data4 = [ 0xB9UB, 0xD9UB, 
0x99UB, 0x20UB, 0x70UB, 0x12UB, 0x7FUB, 0x0FUB ] },
+    GPT_PT_FUCHSIA_VERIFIED_BOOT_METADATA                 = GUID { data1 = 
0x421A8BFCU, data2 = 0x85D9UH, data3 = 0x4D85UH, data4 = [ 0xACUB, 0xDAUB, 
0xB6UB, 0x4EUB, 0xECUB, 0x01UB, 0x33UB, 0xE9UB ] },
+    GPT_PT_FUCHSIA_ZIRCON_BOOT_IMAGE                      = GUID { data1 = 
0x9B37FFF6U, data2 = 0x2E58UH, data3 = 0x466AUH, data4 = [ 0x98UB, 0x3AUB, 
0xF7UB, 0x92UB, 0x6DUB, 0x0BUB, 0x04UB, 0xE0UB ] },
+
+    // note FUCHSIA_L_ESP equals to COMMON_EFI_SYSTEM
+    GPT_PT_FUCHSIA_L_ESP                                  = GUID { data1 = 
0xC12A7328U, data2 = 0xF81FUH, data3 = 0x11D2UH, data4 = [ 0xBAUB, 0x4BUB, 
0x00UB, 0xA0UB, 0xC9UB, 0x3EUB, 0xC9UB, 0x3BUB ] },
+    GPT_PT_FUCHSIA_L_SYSTEM                               = GUID { data1 = 
0x606B000BU, data2 = 0xB7C7UH, data3 = 0x4653UH, data4 = [ 0xA7UB, 0xD5UB, 
0xB7UB, 0x37UB, 0x33UB, 0x2CUB, 0x89UB, 0x9DUB ] },
+    GPT_PT_FUCHSIA_L_DATA                                 = GUID { data1 = 
0x08185F0CU, data2 = 0x892DUH, data3 = 0x428AUH, data4 = [ 0xA7UB, 0x89UB, 
0xDBUB, 0xEEUB, 0xC8UB, 0xF5UB, 0x5EUB, 0x6AUB ] },
+    GPT_PT_FUCHSIA_L_INSTALL                              = GUID { data1 = 
0x48435546U, data2 = 0x4953UH, data3 = 0x2041UH, data4 = [ 0x49UB, 0x4EUB, 
0x53UB, 0x54UB, 0x41UB, 0x4CUB, 0x4CUB, 0x52UB ] },
+    GPT_PT_FUCHSIA_L_BLOB                                 = GUID { data1 = 
0x2967380EU, data2 = 0x134CUH, data3 = 0x4CBBUH, data4 = [ 0xB6UB, 0xDAUB, 
0x17UB, 0xE7UB, 0xCEUB, 0x1CUB, 0xA4UB, 0x5DUB ] },
+    GPT_PT_FUCHSIA_L_FVM                                  = GUID { data1 = 
0x41D0E340U, data2 = 0x57E3UH, data3 = 0x954EUH, data4 = [ 0x8CUB, 0x1EUB, 
0x17UB, 0xECUB, 0xACUB, 0x44UB, 0xCFUB, 0xF5UB ] },
+    GPT_PT_FUCHSIA_L_ZIRCON_BOOT_A                        = GUID { data1 = 
0xDE30CC86U, data2 = 0x1F4AUH, data3 = 0x4A31UH, data4 = [ 0x93UB, 0xC4UB, 
0x66UB, 0xF1UB, 0x47UB, 0xD3UB, 0x3EUB, 0x05UB ] },
+    GPT_PT_FUCHSIA_L_ZIRCON_BOOT_B                        = GUID { data1 = 
0x23CC04DFU, data2 = 0xC278UH, data3 = 0x4CE7UH, data4 = [ 0x84UB, 0x71UB, 
0x89UB, 0x7DUB, 0x1AUB, 0x4BUB, 0xCDUB, 0xF7UB ] },
+    GPT_PT_FUCHSIA_L_ZIRCON_BOOT_R                        = GUID { data1 = 
0xA0E5CF57U, data2 = 0x2DEFUH, data3 = 0x46BEUH, data4 = [ 0xA8UB, 0x0CUB, 
0xA2UB, 0x06UB, 0x7CUB, 0x37UB, 0xCDUB, 0x49UB ] },
+    GPT_PT_FUCHSIA_L_SYS_CONFIG                           = GUID { data1 = 
0x4E5E989EU, data2 = 0x4C86UH, data3 = 0x11E8UH, data4 = [ 0xA1UB, 0x5BUB, 
0x48UB, 0x0FUB, 0xCFUB, 0x35UB, 0xF8UB, 0xE6UB ] },
+    GPT_PT_FUCHSIA_L_FACTORY_CONFIG                       = GUID { data1 = 
0x5A3A90BEU, data2 = 0x4C86UH, data3 = 0x11E8UH, data4 = [ 0xA1UB, 0x5BUB, 
0x48UB, 0x0FUB, 0xCFUB, 0x35UB, 0xF8UB, 0xE6UB ] },
+    GPT_PT_FUCHSIA_L_BOOTLOADER                           = GUID { data1 = 
0x5ECE94FEU, data2 = 0x4C86UH, data3 = 0x11E8UH, data4 = [ 0xA1UB, 0x5BUB, 
0x48UB, 0x0FUB, 0xCFUB, 0x35UB, 0xF8UB, 0xE6UB ] },
+    GPT_PT_FUCHSIA_L_GUID_TEST                            = GUID { data1 = 
0x8B94D043U, data2 = 0x30BEUH, data3 = 0x4871UH, data4 = [ 0x9DUB, 0xFAUB, 
0xD6UB, 0x95UB, 0x56UB, 0xE8UB, 0xC1UB, 0xF3UB ] },
+    GPT_PT_FUCHSIA_L_VERIFIED_BOOT_A                      = GUID { data1 = 
0xA13B4D9AU, data2 = 0xEC5FUH, data3 = 0x11E8UH, data4 = [ 0x97UB, 0xD8UB, 
0x6CUB, 0x3BUB, 0xE5UB, 0x27UB, 0x05UB, 0xBFUB ] },
+    GPT_PT_FUCHSIA_L_VERIFIED_BOOT_B                      = GUID { data1 = 
0xA288ABF2U, data2 = 0xEC5FUH, data3 = 0x11E8UH, data4 = [ 0x97UB, 0xD8UB, 
0x6CUB, 0x3BUB, 0xE5UB, 0x27UB, 0x05UB, 0xBFUB ] },
+    GPT_PT_FUCHSIA_L_VERIFIED_BOOT_R                      = GUID { data1 = 
0x6A2460C3U, data2 = 0xCD11UH, data3 = 0x4E8BUH, data4 = [ 0x80UB, 0xA8UB, 
0x12UB, 0xCCUB, 0xE2UB, 0x68UB, 0xEDUB, 0x0AUB ] },
+    GPT_PT_FUCHSIA_L_MISC                                 = GUID { data1 = 
0x1D75395DU, data2 = 0xF2C6UH, data3 = 0x476BUH, data4 = [ 0xA8UB, 0xB7UB, 
0x45UB, 0xCCUB, 0x1CUB, 0x97UB, 0xB4UB, 0x76UB ] },
+    GPT_PT_FUCHSIA_L_EMMC_BOOT1                           = GUID { data1 = 
0x900B0FC5U, data2 = 0x90CDUH, data3 = 0x4D4FUH, data4 = [ 0x84UB, 0xF9UB, 
0x9FUB, 0x8EUB, 0xD5UB, 0x79UB, 0xDBUB, 0x88UB ] },
+    GPT_PT_FUCHSIA_L_EMMC_BOOT2                           = GUID { data1 = 
0xB2B2E8D1U, data2 = 0x7C10UH, data3 = 0x4EBCUH, data4 = [ 0xA2UB, 0xD0UB, 
0x46UB, 0x14UB, 0x56UB, 0x82UB, 0x60UB, 0xADUB ] };
+


Please reformat to conform the max line limitation.


+type GPT_PartitionType_GUID = struct
+{
+    GUID guid;
+    method _print = void:
+    {
+        var s = "UNRECOGNIZED";
+        if (guid == GPT_PT_COMMON_UNUSED)                                  { s 
= "Unused Entry"; };
+        if (guid == GPT_PT_COMMON_MBR_SCHEME)                              { s 
= "MBR Partition Scheme"; };


Please use `else if' to prevent unnecessary checks, like:

  if (guid == GPT_PT_COMMON_UNUSED)
    s = "Unused Entry";
  else if (...)
    ...
  else if (...)
    ...

Or, you can use ternary operator:

  s = guid == GPT_PT_COMMON_UNUSED ? "Unused Entry"
    : guid == GPT_PT_COMMON_MBR_SCHEME) ? s = "MBR Partition Scheme"
    : ...
    : "UNRECOGNIZED"
    ;

I prefer the ternary operator approach here.


+        if (guid == GPT_PT_COMMON_EFI_SYSTEM)                              { s 
= "EFI System Partition"; };
+        if (guid == GPT_PT_COMMON_BIOS_BOOT)                               { s 
= "BIOS Boot Partition"; };
+        if (guid == GPT_PT_COMMON_IFFS)                                    { s 
= "Intel Fast Flash (iFFS) Partition"; };
+        if (guid == GPT_PT_COMMON_SONY_BOOT)                               { s 
= "Sony Boot Partition"; };
+        if (guid == GPT_PT_COMMON_LENOVO_BOOT)                             { s 
= "Lenovo Boot Partition"; };
+
+        if (guid == GPT_PT_MS_RESERVED)                                    { s 
= "MS Reserved Partition (MSR)"; };
+        if (guid == GPT_PT_MS_BASIC_DATA)                                  { s 
= "MS Basic Data Partition"; };
+        if (guid == GPT_PT_MS_LDM_METADATA)                                { s 
= "MS Logical Disk Manager (LDM) Metadata Partition"; };
+        if (guid == GPT_PT_MS_LDM_DATA)                                    { s 
= "MS Logical Disk Manager Data Partition"; };
+        if (guid == GPT_PT_MS_RECOVERY)                                    { s 
= "MS Windows Recovery Environment"; };
+        if (guid == GPT_PT_IBM_GPFS)                                       { s 
= "IBM General Parallel File System (GPFS) Partition"; };
+        if (guid == GPT_PT_MS_STORAGE)                                     { s 
= "MS Storage Spaces Partition"; };
+        if (guid == GPT_PT_MS_STORAGE_REPLICA)                             { s 
= "MS Storage Replica Partition"; };
+
+        if (guid == GPT_PT_HP_DATA)                                        { s 
= "HP-UX Data Partition"; };
+        if (guid == GPT_PT_HP_SERVICE)                                     { s 
= "HP-UX Service Partition"; };
+
+        if (guid == GPT_PT_LINUX_FS_DATA)                                  { s 
= "Linux Filesystem Data"; };
+        if (guid == GPT_PT_LINUX_RAID)                                     { s 
= "Linux RAID Partition"; };
+        if (guid == GPT_PT_LINUX_ROOT_X86)                                 { s 
= "Linux Root Partition (x86)"; };
+        if (guid == GPT_PT_LINUX_ROOT_X86_64)                              { s 
= "Linux Root Partition (x86-64)"; };
+        if (guid == GPT_PT_LINUX_ROOT_ARM32)                               { s 
= "Linux Root Partition (32-bit ARM)"; };
+        if (guid == GPT_PT_LINUX_ROOT_ARM64)                               { s 
= "Linux Root Partition (64-bit ARM/AArch64)"; };
+        if (guid == GPT_PT_LINUX_BOOT)                                     { s 
= "Linux /boot Partition"; };
+        if (guid == GPT_PT_LINUX_SWAP)                                     { s 
= "Linux Swap Partition"; };
+        if (guid == GPT_PT_LINUX_LVM)                                      { s 
= "Linux Logical Volume Manager (LVM) Partition"; };
+        if (guid == GPT_PT_LINUX_HOME)                                     { s 
= "Linux /home Partition"; };
+        if (guid == GPT_PT_LINUX_SERVER_DATA)                              { s 
= "Linux /srv (Server Data) Partition"; };
+        if (guid == GPT_PT_LINUX_DM_CRYPT)                                 { s 
= "Linux Plain dm-crypt Partition"; };
+        if (guid == GPT_PT_LINUX_LUKS)                                     { s 
= "Linux LUKS Partition"; };
+        if (guid == GPT_PT_LINUX_RESERVED)                                 { s 
= "Linux Reserved Partition"; };
+
+        // HURD_LINUX_FS_DATA equals to LINUX_FS_DATA
+        // if (guid == GPT_PT_HURD_LINUX_FS_DATA)                             
{ s = "GNU/Hurd Linux Filesystem Data"; };
+        // HURD_LINUX_SWAP equals to LINUX_SWAP
+        // if (guid == GPT_PT_HURD_LINUX_SWAP)                                
{ s = "GNU/Hurd Linux Swap Partition"; };
+
+        if (guid == GPT_PT_FREEBSD_BOOT)                                   { s 
= "FreeBSD Boot Partition"; };
+        if (guid == GPT_PT_FREEBSD_DISKLABEL)                              { s 
= "FreeBSD Disklabel Partition"; };
+        if (guid == GPT_PT_FREEBSD_SWAP)                                   { s 
= "FreeBSD Swap Partition"; };
+        if (guid == GPT_PT_FREEBSD_UFS)                                    { s 
= "FreeBSD Unix File System Partition"; };
+        if (guid == GPT_PT_FREEBSD_VINUM)                                  { s 
= "FreeBSD Vinum Volume Manager Partition"; };
+        if (guid == GPT_PT_FREEBSD_ZFS)                                    { s 
= "FreeBSD ZFS Partition"; };
+        if (guid == GPT_PT_FREEBSD_NANDFS)                                 { s 
= "FreeBSD NANDFS Partition"; };
+
+        if (guid == GPT_PT_HFS_PLUS)                                       { s 
= "Hierarchical File System Plus (HFS+) Partition"; };
+        if (guid == GPT_PT_APFS_CONTAINER)                                 { s 
= "Apple APFS Container / APFS FileVault Volume Container"; };
+        if (guid == GPT_PT_APPLE_UFS_CONTAINER)                            { s 
= "Apple UFS Container"; };
+        if (guid == GPT_PT_ZFS)                                            { s 
= "ZFS"; };
+        if (guid == GPT_PT_APPLE_RAID)                                     { s 
= "Apple RAID Partition"; };
+        if (guid == GPT_PT_APPLE_RAID_OFFLINE)                             { s 
= "Apple RAID Partition (Offline)"; };
+        if (guid == GPT_PT_APPLE_BOOT)                                     { s 
= "Apple Boot Partition (Recovery HD)"; };
+        if (guid == GPT_PT_APPLE_LABEL)                                    { s 
= "Apple Label"; };
+        if (guid == GPT_PT_APPLE_TV_RECOVERY)                              { s 
= "Apple TV Recovery Partition"; };
+        if (guid == GPT_PT_APPLE_CORE_STORAGE_CONTAINER)                   { s 
= "Apple Core Storage Container"; };
+        if (guid == GPT_PT_APFS_PREBOOT)                                   { s 
= "Apple APFS Preboot Partition"; };
+        if (guid == GPT_PT_APFS_RECOVERY)                                  { s 
= "Apple APFS Recovery Partition"; };
+
+        if (guid == GPT_PT_SOLARIS_BOOT)                                   { s 
= "Solaris Boot partition"; };
+        if (guid == GPT_PT_SOLARIS_ROOT)                                   { s 
= "Solaris Root partition"; };
+        if (guid == GPT_PT_SOLARIS_SWAP)                                   { s 
= "Solaris Swap partition"; };
+        if (guid == GPT_PT_SOLARIS_BACKUP)                                 { s 
= "Solaris Backup partition"; };
+        // SOLARIS_USR equals to ZFS
+        // if (guid == GPT_PT_SOLARIS_USR)                                    
{ s = "Solaris /usr partition"; };
+        if (guid == GPT_PT_SOLARIS_VAR)                                    { s 
= "Solaris /var partition"; };
+        if (guid == GPT_PT_SOLARIS_HOME)                                   { s 
= "Solaris /home partition"; };
+        if (guid == GPT_PT_SOLARIS_ALT_SECTOR)                             { s 
= "Solaris Alternate sector"; };
+        if (guid == GPT_PT_SOLARIS_RESERVED_1)                             { s 
= "Solaris Reserved partition 1"; };
+        if (guid == GPT_PT_SOLARIS_RESERVED_2)                             { s 
= "Solaris Reserved partition 2"; };
+        if (guid == GPT_PT_SOLARIS_RESERVED_3)                             { s 
= "Solaris Reserved partition 3"; };
+        if (guid == GPT_PT_SOLARIS_RESERVED_4)                             { s 
= "Solaris Reserved partition 4"; };
+        if (guid == GPT_PT_SOLARIS_RESERVED_5)                             { s 
= "Solaris Reserved partition 5"; };
+
+        if (guid == GPT_PT_NETBSD_SWAP)                                    { s 
= "NetBSD Swap Partition"; };
+        if (guid == GPT_PT_NETBSD_FFS)                                     { s 
= "NetBSD FFS Partition"; };
+        if (guid == GPT_PT_NETBSD_LFS)                                     { s 
= "NetBSD LFS Partition"; };
+        if (guid == GPT_PT_NETBSD_RAID)                                    { s 
= "NetBSD RAID Partition"; };
+        if (guid == GPT_PT_NETBSD_CONCAT)                                  { s 
= "NetBSD Concatenated Partition"; };
+        if (guid == GPT_PT_NETBSD_ENC)                                     { s 
= "NetBSD Encrypted Partition"; };
+
+        if (guid == GPT_PT_CHROME_KERNEL)                                  { s 
= "Chrome OS Kernel Partition"; };
+        if (guid == GPT_PT_CHROME_ROOTFS)                                  { s 
= "Chrome OS RootFS Partition"; };
+        if (guid == GPT_PT_CHROME_FIRMWARE)                                { s 
= "Chrome OS Firmware Partition"; };
+        if (guid == GPT_PT_CHROME_FUTURE)                                  { s 
= "Chrome OS Future Use Partition"; };
+        if (guid == GPT_PT_CHROME_MINI_OS)                                 { s 
= "Chrome OS MiniOS Partition"; };
+        if (guid == GPT_PT_CHROME_HIBERNATE)                               { s 
= "Chrome OS Hibernate Partition"; };
+
+        if (guid == GPT_PT_COREOS_USR)                                     { s 
= "/usr Partition (coreos-usr)"; };
+        if (guid == GPT_PT_COREOS_RESIZE)                                  { s 
= "Resizable Rootfs (coreos-resize)"; };
+        if (guid == GPT_PT_COREOS_RESERVED)                                { s 
= "OEM Customizations (coreos-reserved)"; };
+        if (guid == GPT_PT_COREOS_ROOT_RAID)                               { s 
= "Root Filesystem on RAID (coreos-root-raid)"; };
+
+        if (guid == GPT_PT_HAIKU_BFS)                                      { s 
= "Haiku BFS Partition"; };
+
+        if (guid == GPT_PT_MIDNIGHT_BOOT)                                  { s 
= "MidnightBSD Boot Partition"; };
+        if (guid == GPT_PT_MIDNIGHT_DATA)                                  { s 
= "MidnightBSD Data Partition"; };
+        if (guid == GPT_PT_MIDNIGHT_SWAP)                                  { s 
= "MidnightBSD Swap Partition"; };
+        if (guid == GPT_PT_MIDNIGHT_UFS)                                   { s 
= "MidnightBSD Unix File System Partition"; };
+        if (guid == GPT_PT_MIDNIGHT_VINUM)                                 { s 
= "MidnightBSD Vinum Volume Manager Partition"; };
+        if (guid == GPT_PT_MIDNIGHT_ZFS)                                   { s 
= "MidnightBSD ZFS Partition"; };
+
+        if (guid == GPT_PT_CEPH_JOURNAL)                                   { s 
= "Ceph Journal Partition"; };
+        if (guid == GPT_PT_CEPH_CRYPT_JOURNAL)                             { s 
= "Ceph Crypt Journal Partition"; };
+        if (guid == GPT_PT_CEPH_OSD)                                       { s 
= "Ceph OSD Partition"; };
+        if (guid == GPT_PT_CEPH_CRYPT_OSD)                                 { s 
= "Ceph Crypt OSD Partition"; };
+        if (guid == GPT_PT_CEPH_DISK_CREATION)                             { s 
= "Ceph Disk in Creation"; };
+        if (guid == GPT_PT_CEPH_CRYPT_DISK_CREATION)                       { s 
= "Ceph Crypt Disk in Creation"; };
+        if (guid == GPT_PT_CEPH_BLOCK)                                     { s 
= "Ceph Block Partition"; };
+        if (guid == GPT_PT_CEPH_BLOCK_DB)                                  { s 
= "Ceph Block DB Partition"; };
+        if (guid == GPT_PT_CEPH_BLOCK_WAL)                                 { s 
= "Ceph Block Write-Ahead Log Partition"; };
+        if (guid == GPT_PT_CEPH_LOCKBOX)                                   { s 
= "Ceph Lockbox for dm-crypt keys"; };
+        if (guid == GPT_PT_CEPH_MULTIPATH_OSD)                             { s 
= "Ceph Multipath OSD Partition"; };
+        if (guid == GPT_PT_CEPH_MULTIPATH_JOURNAL)                         { s 
= "Ceph Multipath Journal Partition"; };
+        if (guid == GPT_PT_CEPH_MULTIPATH_BLOCK)                           { s 
= "Ceph Multipath Block Partition"; };
+        if (guid == GPT_PT_CEPH_MULTIPATH_BLOCK)                           { s 
= "Ceph Multipath Block Partition"; };
+        if (guid == GPT_PT_CEPH_MULTIPATH_BLOCK_DB)                        { s 
= "Ceph Multipath Block DB Partition"; };
+        if (guid == GPT_PT_CEPH_MULTIPATH_BLOCK_WAL)                       { s 
= "Ceph Multipath Block Write-Ahead Log Partition"; };
+        if (guid == GPT_PT_CEPH_DM_CRYPT_BLOCK)                            { s 
= "Ceph dm-crypt Ceph Block Partition"; };
+        if (guid == GPT_PT_CEPH_DM_CRYPT_BLOCK_DB)                         { s 
= "Ceph dm-crypt Ceph Block DB Partition"; };
+        if (guid == GPT_PT_CEPH_DM_CRYPT_BLOCK_WAL)                        { s 
= "Ceph dm-crypt Ceph Block Write-Ahead Log Partition"; };
+        if (guid == GPT_PT_CEPH_DM_CRYPT_LUKS_JOURNAL)                     { s 
= "Ceph dm-crypt LUKS Journal Partition"; };
+        if (guid == GPT_PT_CEPH_DM_CRYPT_LUKS_BLOCK)                       { s 
= "Ceph dm-crypt LUKS Block Partition"; };
+        if (guid == GPT_PT_CEPH_DM_CRYPT_LUKS_BLOCK_DB)                    { s 
= "Ceph dm-crypt LUKS Block DB Partition"; };
+        if (guid == GPT_PT_CEPH_DM_CRYPT_LUKS_BLOCK_WAL)                   { s 
= "Ceph dm-crypt LUKS Block Write-Ahead Log Partition"; };
+        if (guid == GPT_PT_CEPH_DM_CRYPT_LUKS_OSD)                         { s 
= "Ceph dm-crypt LUKS OSD Partition"; };
+
+        if (guid == GPT_PT_OPENBSD_DATA)                                   { s 
= "OpenBSD Data Partition"; };
+
+        if (guid == GPT_PT_QNX6)                                           { s 
= "QNX6 File System Partition"; };
+
+        if (guid == GPT_PT_PLAN9)                                          { s 
= "Plan 9 Partition"; };
+
+        if (guid == GPT_PT_VMWARE_VMFS)                                    { s 
= "VMware VMFS Partition"; };
+        if (guid == GPT_PT_VMWARE_RESERVED)                                { s 
= "VMware Reserved Partition"; };
+        if (guid == GPT_PT_VMWARE_KCORE)                                   { s 
= "VMware KCore Crash Partition"; };
+
+        if (guid == GPT_PT_ANDROID_X86_BOOTLOADER)                         { s 
= "Android x86 Bootloader Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_BOOTLOADER2)                        { s 
= "Android x86 Bootloader2 Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_BOOT)                               { s 
= "Android x86 Boot Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_RECOVERY)                           { s 
= "Android x86 Recovery Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_MISC)                               { s 
= "Android x86 Misc Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_METADATA)                           { s 
= "Android x86 Metadata Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_SYSTEM)                             { s 
= "Android x86 System Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_CACHE)                              { s 
= "Android x86 Cache Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_DATA)                               { s 
= "Android x86 Data Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_PERSISTENT)                         { s 
= "Android x86 Persistent Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_VENDOR)                             { s 
= "Android x86 Vendor Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_CONFIG)                             { s 
= "Android x86 Config Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_FACTORY)                            { s 
= "Android x86 Factory Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_FACTORY_ALT)                        { s 
= "Android x86 Factory (Alternate) Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_FASTBOOT)                           { s 
= "Android x86 Fastboot / Tertiary Partition"; };
+        if (guid == GPT_PT_ANDROID_X86_OEM)                                { s 
= "Android x86 OEM Partition"; };
+
+        if (guid == GPT_PT_ANDROID_ARM_META)                               { s 
= "Android ARM Meta Partition"; };
+        if (guid == GPT_PT_ANDROID_ARM_EXT)                                { s 
= "Android ARM EXT Partition"; };
+
+        if (guid == GPT_PT_ONIE_BOOT)                                      { s 
= "ONIE Boot Partition"; };
+        if (guid == GPT_PT_ONIE_CONFIG)                                    { s 
= "ONIE Config Partition"; };
+
+        if (guid == GPT_PT_POWERPC_PREP_BOOT)                              { s 
= "PowerPC PReP Boot"; };
+
+        // FREEDESKTOP equals to LINUX_BOOT
+        // if (guid == GPT_PT_FREEDESKTOP)                                    
{ s = "freedesktop.org Shared Boot Loader Configuration"; };
+
+        if (guid == GPT_PT_ATARI_TOS_BASIC)                                { s 
= "Atari TOS Basic Data Partition (GEM, BGM, F32)"; };
+
+        if (guid == GPT_PT_VERACRYPT_ENCRYPTED)                            { s 
= "VeraCrypt Encrypted Data Partition"; };
+
+        if (guid == GPT_PT_OS2_ARCAOS_TYPE1)                               { s 
= "OS/2 ArcaOS Type 1"; };
+
+        if (guid == GPT_PT_SPDK_BLOCK_DEVICE)                              { s 
= "Storage Performance Development Kit (SPDK) Block Device"; };
+
+        if (guid == GPT_PT_BAREBOX_STATE)                                  { s 
= "barebox Bootloader State"; };
+
+        if (guid == GPT_PT_UBOOT_ENVIRONMENT)                              { s 
= "U-Boot Bootloader Environment"; };
+
+        if (guid == GPT_PT_SOFTRAID_STATUS)                                { s 
= "SoftRAID Status"; };
+        if (guid == GPT_PT_SOFTRAID_SCRATCH)                               { s 
= "SoftRAID Scratch"; };
+        if (guid == GPT_PT_SOFTRAID_VOLUME)                                { s 
= "SoftRAID Volume"; };
+        if (guid == GPT_PT_SOFTRAID_CACHE)                                 { s 
= "SoftRAID Cache"; };
+
+        if (guid == GPT_PT_FUCHSIA_BOOTLOADER)                             { s 
= "Fuchsia Bootloader (slot A/B/R)"; };
+        if (guid == GPT_PT_FUCHSIA_DURABLE_MUTABLE_SYSTEM_DATA)            { s 
= "Fuchsia Durable Mutable Encrypted System Data"; };
+        if (guid == GPT_PT_FUCHSIA_DURABLE_MUTABLE_BOOTLOADER_DATA)        { s 
= "Fuchsia Durable Mutable Bootloader Data (including A/B/R metadata)"; };
+        if (guid == GPT_PT_FUCHSIA_FACTORY_PROVISIONED_RO_SYSTEM_DATA)     { s 
= "Fuchsia Factory-Provisioned Read-Only System Data"; };
+        if (guid == GPT_PT_FUCHSIA_FACTORY_PROVISIONED_RO_BOOTLOADER_DATA) { s 
= "Fuchsia Factory-Provisioned Read-Only Bootloader Data"; };
+        if (guid == GPT_PT_FUCHSIA_VOLUME_MANAGER)                         { s 
= "Fuchsia Volume Manager"; };
+        if (guid == GPT_PT_FUCHSIA_VERIFIED_BOOT_METADATA)                 { s 
= "Fuchsia Verified Boot Metadata (slot A/B/R)"; };
+        if (guid == GPT_PT_FUCHSIA_ZIRCON_BOOT_IMAGE)                      { s 
= "Zircon Boot Image (slot A/B/R)"; };
+
+        // FUCHSIA_L_ESP equals to COMMON_EFI_SYSTEM
+        // if (guid == GPT_PT_FUCHSIA_L_ESP)                                  
{ s = "Fuchsia Legacy ESP"; };
+        if (guid == GPT_PT_FUCHSIA_L_SYSTEM)                               { s 
= "Fuchsia Legacy System"; };
+        if (guid == GPT_PT_FUCHSIA_L_DATA)                                 { s 
= "Fuchsia Legacy Data"; };
+        if (guid == GPT_PT_FUCHSIA_L_INSTALL)                              { s 
= "Fuchsia Legacy Install"; };
+        if (guid == GPT_PT_FUCHSIA_L_BLOB)                                 { s 
= "Fuchsia Legacy Blob"; };
+        if (guid == GPT_PT_FUCHSIA_L_FVM)                                  { s 
= "Fuchsia Legacy FVM"; };
+        if (guid == GPT_PT_FUCHSIA_L_ZIRCON_BOOT_A)                        { s 
= "Zircon Legacy Boot Image (slot A)"; };
+        if (guid == GPT_PT_FUCHSIA_L_ZIRCON_BOOT_B)                        { s 
= "Zircon Legacy Boot Image (slot B)"; };
+        if (guid == GPT_PT_FUCHSIA_L_ZIRCON_BOOT_R)                        { s 
= "Zircon Legacy Boot Image (slot R)"; };
+        if (guid == GPT_PT_FUCHSIA_L_SYS_CONFIG)                           { s 
= "Fuchsia Legacy System Config"; };
+        if (guid == GPT_PT_FUCHSIA_L_FACTORY_CONFIG)                       { s 
= "Fuchsia Legacy Factory Config"; };
+        if (guid == GPT_PT_FUCHSIA_L_BOOTLOADER)                           { s 
= "Fuchsia Legacy Bootloader"; };
+        if (guid == GPT_PT_FUCHSIA_L_GUID_TEST)                            { s 
= "Fuchsia Legacy GUID Test"; };
+        if (guid == GPT_PT_FUCHSIA_L_VERIFIED_BOOT_A)                      { s 
= "Fuchsia Legacy Verified Boot Metadata (slot A)"; };
+        if (guid == GPT_PT_FUCHSIA_L_VERIFIED_BOOT_B)                      { s 
= "Fuchsia Legacy Verified Boot Metadata (slot B)"; };
+        if (guid == GPT_PT_FUCHSIA_L_VERIFIED_BOOT_R)                      { s 
= "Fuchsia Legacy Verified Boot Metadata (slot R)"; };
+        if (guid == GPT_PT_FUCHSIA_L_MISC)                                 { s 
= "Fuchsia Legacy Miscellaneous"; };
+        if (guid == GPT_PT_FUCHSIA_L_EMMC_BOOT1)                           { s 
= "Fuchsia Legacy eMMC Boot1"; };
+        if (guid == GPT_PT_FUCHSIA_L_EMMC_BOOT2)                           { s 
= "Fuchsia Legacy eMMC Boot2"; };
+        print "#<" + s + ">";
+    }
+};
diff --git a/pickles/gpt.pk b/pickles/gpt.pk
new file mode 100644
index 00000000..7e49d550
--- /dev/null
+++ b/pickles/gpt.pk
@@ -0,0 +1,88 @@
+/* gpt.pk - GUID partition table implementation for GNU poke */
+
+/* Copyright (C) 2023 Denis Maryin */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* Implemented as per https://en.wikipedia.org/wiki/GUID_Partition_Table */
+
+
+load "mbr.pk";
+load "guid.pk";
+load "gpt-partition-types.pk";
+load "gpt-partition-attrs.pk";
+
+var sector_size = 512;


This is a global constant, so please make it upper case and also add a prefix,
something like `GPT_SECTOR_SIZE = 512#B';
And becase it's a size, I used an offset value, instead of an integer.


+
+type GPT_Header = struct
+{
+    little uint<8>[8] signature == ['E', 'F', 'I', ' ', 'P', 'A', 'R', 'T'] @ 
0#B;


As already mentioned this, please remvoe the `@ ...' from this field and the
following fields. It's not necessary.

And `little' doesn't make sense for `uint<8>', so please remove that from here
and from other `uint<8>' fields.


+    little uint<8>[4] revision_magic                                        @ 
8#B;
+    little uint<32> header_size == 92                                       @ 
12#B;


It's a size, please use an offset:
  `little offset<uint<32>,B> header_size == 92#B;'


+    little uint<32> header_CRC                                              @ 
16#B;


Is there any reason to use upper-case `CRC' here? `header_crc' or `crc_header'
seems to be fine.  And please fix other lower_case_UPPER_CASE fields too :)


+    little uint<32> reserved_zero1 == 0                                     @ 
20#B;
+    little uint<64> current_LBA                                             @ 
24#B;
+    little uint<64> backup_LBA                                              @ 
32#B;
+    little uint<64> first_usable_LBA                                        @ 
40#B;
+    little uint<64> last_usable_LBA                                         @ 
48#B;
+    GUID disk_GUID                                                          @ 
56#B;
+    little uint<64> partition_entries_start_LBA                             @ 
72#B;
+    little uint<32> partition_entries_count                                 @ 
80#B;
+    little uint<32> partition_entry_size                                    @ 
84#B;
+    little uint<32> partition_entries_CRC                                   @ 
88#B;
+    little uint<8>[sector_size - 92] padding                                @ 
92#B;


You can use this form:

  uint<8>[GPT_SECTOR_SIZE - 92#B] padding : OFFSET == 92#B;

To make sure that the `OFFSET' at this point in the struct matches your
expectation.

(Side note: if you use `OFFSET' in the array boundary like this:
  `uint<8>[GPT_SECTOR_SIZE - OFFSET] padding;`
then this type is no longer a "complete type".
Complete types are the ones that have a known size at compile-time.)


+};
+
+// TODO: assert (sizeof(GPT_Header) == sector_size);


Proper way to do this:

  assert ((GPT_Header {})'size == GPT_SECTOR_SIZE);
or
  assert (#GPT_Header == GPT_SECTOR_SIZE); // Works for "complete types"


+
+type GPT_Partition_Name = struct
+{
+    little uint<16>[36] partition_name       @ 0#B;
+    method _print = void:
+    {
+        var s = "";
+        for (utf16le_letter in partition_name)
+        {
+            if (utf16le_letter < 256)
+            {
+                s = s + utf16le_letter as uint<8> as string;
+            }
+            else
+            {
+                s = s + "?";
+            }
+        }
+        print("#<Name=\"" + s + "\">");
+    }
+
+};
+
+type GPT_Partition_Entry = struct
+{
+    GPT_PartitionType_GUID pt_GUID           @ 0#B;
+    GUID this_partition_GUID                 @ 16#B;
+    little uint<64> first_LBA                @ 32#B;
+    little uint<64> last_LBA                 @ 40#B;
+    GPT_Partition_Attributes attribute_flags @ 48#B;
+    GPT_Partition_Name partition_name        @ 56#B;
+};
+
+type GPT = struct
+{
+    MBR protective_mbr                                             @ 0#B;
+    GPT_Header header                                              @ 
sector_size#B;
+    GPT_Partition_Entry[header.partition_entries_count] partitions @ 
(sector_size * header.partition_entries_start_LBA)#B;
+};
+
diff --git a/pickles/guid.pk b/pickles/guid.pk
new file mode 100644
index 00000000..56903073
--- /dev/null
+++ b/pickles/guid.pk
@@ -0,0 +1,36 @@
+/* guid.pk - GUID (Microsoft LE style) implementation for GNU poke */
+
+/* Copyright (C) 2023 Denis Maryin */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* Implemented as specified in 
https://en.wikipedia.org/wiki/Universally_unique_identifier */
+
+type GUID = struct
+{
+    little uint<32>   data1;
+    little uint<16>   data2;
+    little uint<16>   data3;
+    little uint<8>[8] data4;
+    method _print = void:
+    {
+        printf
+        (
+            "#<{%u32x-%u16x-%u16x-%u8x%u8x-%u8x%u8x%u8x%u8x%u8x%u8x}>",
+            data1, data2, data3, data4[0], data4[1],
+            data4[2], data4[3], data4[4], data4[5], data4[6], data4[7]
+        );
+    }
+};


What's the reason for this pickle? `uuid.pk' is already implemented this.
If you need some refinement, please extend the `uuid.pk'.


diff --git a/pickles/mbr.pk b/pickles/mbr.pk
index 7692a5c2..3caa755c 100644
--- a/pickles/mbr.pk
+++ b/pickles/mbr.pk
@@ -46,6 +46,86 @@ type MBR_CHS =
       }
   };
 
+var MBR_PT_Empty           = 0x00,
+    MBR_PT_FAT12           = 0x01,
+    MBR_PT_FAT16_32MB      = 0x04,
+    MBR_PT_Extended        = 0x05,
+    MBR_PT_FAT16           = 0x06,
+    MBR_PT_NTFS            = 0x07,
+    MBR_PT_FAT32           = 0x0B,
+    MBR_PT_FAT32_LBA       = 0x0C,
+    MBR_PT_Extended_LBA    = 0x0F,
+    MBR_PT_LinuxSwap       = 0x82,
+    MBR_PT_LinuxNative     = 0x83,
+    MBR_PT_LinuxExtended   = 0x85,
+    MBR_PT_LinuxLVM        = 0x8E,
+    MBR_PT_FreeBSD         = 0xA5,
+    MBR_PT_OpenBSD         = 0xA6,
+    MBR_PT_NetBSD          = 0xA9,
+    MBR_PT_HFS_HFSPlus     = 0xAF,
+    MBR_PT_Solaris         = 0xBE,
+    MBR_PT_SolarisBoot     = 0xBF,
+    MBR_PT_ChromeOSKernel  = 0xC1,
+    MBR_PT_ChromeOSRootFS  = 0xC2,
+    MBR_PT_ChromeOSFuture  = 0xC3,
+    MBR_PT_CP_M            = 0xDB,
+    MBR_PT_CTOS            = 0xE1,
+    MBR_PT_LinuxPlaintext  = 0xE2,
+    MBR_PT_LinuxLVM2       = 0xE3,
+    MBR_PT_DRDOS           = 0xE4,
+    MBR_PT_SpeedStor       = 0xE5,
+    MBR_PT_BeOS            = 0xEB,
+    MBR_PT_GPT_PROTECTIVE  = 0xEE,
+    MBR_PT_EFISystem       = 0xEF,
+    MBR_PT_SkyOS           = 0xF1,
+    MBR_PT_IBM_OS2         = 0xFB;
+
+type MBR_PartitionType =
+  struct
+  {
+    uint<8> p_type;
+
+    method _print = void:
+    {
+      var s = "UNRECOGNIZED";
+      if (p_type == MBR_PT_Empty)           { s = "Empty"; };
+      if (p_type == MBR_PT_FAT12)           { s = "FAT12"; };
+      if (p_type == MBR_PT_FAT16_32MB)      { s = "FAT16 (32MB or smaller)"; };
+      if (p_type == MBR_PT_Extended)        { s = "Extended"; };
+      if (p_type == MBR_PT_FAT16)           { s = "FAT16"; };
+      if (p_type == MBR_PT_NTFS)            { s = "NTFS"; };
+      if (p_type == MBR_PT_FAT32)           { s = "FAT32"; };
+      if (p_type == MBR_PT_FAT32_LBA)       { s = "FAT32 (LBA)"; };
+      if (p_type == MBR_PT_Extended_LBA)    { s = "Extended (LBA)"; };
+      if (p_type == MBR_PT_LinuxSwap)       { s = "Linux Swap"; };
+      if (p_type == MBR_PT_LinuxNative)     { s = "Linux Native"; };
+      if (p_type == MBR_PT_LinuxExtended)   { s = "Linux Extended"; };
+      if (p_type == MBR_PT_LinuxLVM)        { s = "Linux LVM"; };
+      if (p_type == MBR_PT_FreeBSD)         { s = "FreeBSD"; };
+      if (p_type == MBR_PT_OpenBSD)         { s = "OpenBSD"; };
+      if (p_type == MBR_PT_NetBSD)          { s = "NetBSD"; };
+      if (p_type == MBR_PT_HFS_HFSPlus)     { s = "HFS / HFS+"; };
+      if (p_type == MBR_PT_Solaris)         { s = "Solaris"; };
+      if (p_type == MBR_PT_SolarisBoot)     { s = "Solaris Boot"; };
+      if (p_type == MBR_PT_ChromeOSKernel)  { s = "ChromeOS Kernel"; };
+      if (p_type == MBR_PT_ChromeOSRootFS)  { s = "ChromeOS Root FS"; };
+      if (p_type == MBR_PT_ChromeOSFuture)  { s = "ChromeOS Future"; };
+      if (p_type == MBR_PT_CP_M)            { s = "CP/M"; };
+      if (p_type == MBR_PT_CTOS)            { s = "CTOS"; };
+      if (p_type == MBR_PT_LinuxPlaintext)  { s = "Linux Plaintext"; };
+      if (p_type == MBR_PT_LinuxLVM2)       { s = "Linux LVM2"; };
+      if (p_type == MBR_PT_DRDOS)           { s = "DR-DOS"; };
+      if (p_type == MBR_PT_SpeedStor)       { s = "SpeedStor"; };
+      if (p_type == MBR_PT_BeOS)            { s = "BeOS"; };
+      if (p_type == MBR_PT_GPT_PROTECTIVE)  { s = "GPT Protective Partition"; 
};
+      if (p_type == MBR_PT_EFISystem)       { s = "EFI System"; };
+      if (p_type == MBR_PT_SkyOS)           { s = "SkyOS"; };
+      if (p_type == MBR_PT_IBM_OS2)         { s = "IBM OS/2"; };



Please use ternary operator.


+      print "#<" + s + ">";
+    }
+  };
+
+
 /* MBR Partition Table Entry (PTE)
  *
  *  Offset  Size (bytes)  Description
@@ -73,7 +153,7 @@ type MBR_PTE =
         }
     } attr;
     MBR_CHS start_chs;
-    uint<8> part_type;  /* partition type*/
+    MBR_PartitionType part_type;
     MBR_CHS end_chs;
     uint<32> lba;
     uint<32> sector_count;
diff --git a/testsuite/poke.pickles/gpt-test.pk 
b/testsuite/poke.pickles/gpt-test.pk
new file mode 100644
index 00000000..76dc03c7
--- /dev/null
+++ b/testsuite/poke.pickles/gpt-test.pk
@@ -0,0 +1,71 @@
+/* gpt-test.pk - Tests for the gpt pickle.  */
+
+/* Copyright (C) 2023 Denis Maryin */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+load pktest;
+load gpt;
+
+set_endian(ENDIAN_LITTLE);
+
+var data = open ("*data*");


Instead of using a global IOS, which is error-prone, you can
use `with_temp_ios' function.  For an example please see
`testsuite/poke.pickles/uuid-test.pk'.
It opens a temporary IOS, and make it the current IOS, and change the
endianness to what you specified; the good thing it'll revert all the settings
to default on exit (either successful or with exceptions).


+
+var tests = [
+  PkTest {
+    name = "various magic numbers",
+    func = lambda (string name) void:
+      {
+        uint<8>[5120] @ data : 0#B = uint<8>[5120] ();
+        try
+          {
+            var g = GPT @ data : 0#B;
+            assert(0, "MBR shall fail constraint checking!");
+          }
+        catch if E_constraint
+          {
+            assert(1, "expected exception");
+          }
+        /* Fix the MBR magic number */
+        uint<8>[2] @ data : 510#B = [0x55UB, 0xaaUB];
+        try
+          {
+            var g = GPT @ data : 0#B;
+            assert(0, "GPT header shall fail constraint checking!");
+          }
+        catch if E_constraint
+          {
+            assert(1, "expected exception");
+          }
+        /* fix GPT header magic */
+        uint<8>[8] @ data : 512#B = ['E', 'F', 'I', ' ', 'P', 'A', 'R', 'T'];
+        /* fix GPT header size */
+        uint<32> @ data : (512 + 12)#B = 92U;
+        /* fix GPT header rezerved-must-be-zero */


s/rezerved/reserved/


+        uint<32> @ data : (512 + 20)#B = 0U;
+
+        /* must not fail now */
+        var g = GPT @ data : 0#B;
+
+        /* check for random field zero */
+        assert(g.header.partition_entry_size == 0, "Must be zero for 
uninitialized GPT");
+      },
+  },
+];
+
+var ec = pktest_run (tests) ? 0 : 1;
+
+close(data);
+exit (ec);
diff --git a/testsuite/poke.pickles/guid-test.pk 
b/testsuite/poke.pickles/guid-test.pk
new file mode 100644
index 00000000..48f8e8b1
--- /dev/null
+++ b/testsuite/poke.pickles/guid-test.pk
@@ -0,0 +1,52 @@
+/* guid-test.pk - Tests for the guid pickle.  */
+
+/* Copyright (C) 2023 Denis Maryin */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+load pktest;
+load guid;
+
+var data = open ("*data*");
+
+var tests = [
+  PkTest {
+    name = "invariant little",
+    func = lambda (string name) void:
+      {
+        set_endian(ENDIAN_LITTLE);
+        uint<8>[16] @ data : 0#B = [0x00UB, 0x11UB, 0x22UB, 0x33UB, 0x44UB, 
0x55UB, 0x66UB, 0x77UB, 0x88UB, 0x99UB, 0xAAUB, 0xBBUB, 0xCCUB, 0xDDUB, 0xEEUB, 
0xFFUB];
+        var expected = GUID { data1=0x33221100U, data2=0x5544UH, 
data3=0x7766UH, data4=[0x88UB, 0x99UB, 0xaaUB, 0xbbUB, 0xccUB, 0xddUB, 0xeeUB, 
0xffUB] };
+        var present = GUID @ data: 0#B;
+        assert(expected == present);


For example using `with_temp_ios', this will become this:


  with_temp_ios
    :endian ENDIAN_LITTLE
    :do lambda void:
      {
        uint<8>[16] @ data : 0#B = [
          0x00UB, 0x11UB, 0x22UB, 0x33UB, 0x44UB, 0x55UB, 0x66UB, 0x77UB,
          0x88UB, 0x99UB, 0xAAUB, 0xBBUB, 0xCCUB, 0xDDUB, 0xEEUB, 0xFFUB];

        var expected = GUID {
          data1=0x33221100U, data2=0x5544UH, data3=0x7766UH,
          data4=[0x88UB, 0x99UB, 0xaaUB, 0xbbUB, 0xccUB, 0xddUB, 0xeeUB, 
0xffUB],
        };
        var present = GUID @ data: 0#B;

        assert(expected == present);
      };


+      },
+  },
+  PkTest {
+    name = "invariant big",
+    func = lambda (string name) void:
+      {
+        set_endian(ENDIAN_BIG);
+        uint<8>[16] @ data : 0#B = [0x00UB, 0x11UB, 0x22UB, 0x33UB, 0x44UB, 
0x55UB, 0x66UB, 0x77UB, 0x88UB, 0x99UB, 0xAAUB, 0xBBUB, 0xCCUB, 0xDDUB, 0xEEUB, 
0xFFUB];
+        var expected = GUID { data1=0x33221100U, data2=0x5544UH, 
data3=0x7766UH, data4=[0x88UB, 0x99UB, 0xaaUB, 0xbbUB, 0xccUB, 0xddUB, 0xeeUB, 
0xffUB] };
+        var present = GUID @ data: 0#B;
+        assert(expected == present);
+      },
+  },
+];
+
+var ec = pktest_run (tests) ? 0 : 1;
+
+close(data);
+exit (ec);


Regards,
Mohammad-Reza



reply via email to

[Prev in Thread] Current Thread [Next in Thread]