[U-Boot] [PATCH 3/3] uuid: add shorcut for known GUID

Patrick Delaunay patrick.delaunay73 at gmail.com
Tue Oct 13 16:25:16 CEST 2015


guid shorcut can be used in gpt command with guid parameter
      partitions = name=boot,size=0x6bc00,guid=data; \
                   name=root,size=0x7538ba00,guid=linux;
      gpt write mmc 0 $partitions

and they are used to display the type of partition in "part list" command

  Partition Map for MMC device 0  --   Partition Type: EFI

  Part    Start LBA    End LBA        Name
    Attributes
    Type GUID
    Partition GUID
    1    0x00000022    0x0000037f    "boot"
    attrs:    0x0000000000000000
    type:    ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
    type:    data
    guid:    d117f98e-6f2c-d04b-a5b2-331a19f91cb2
    2    0x00000380    0x003a9fdc    "root"
    attrs:    0x0000000000000000
    type:    0fc63daf-8483-4772-8e79-3d69d8477de4
    type:    linux
    guid:    25718777-d0ad-7443-9e60-02cb591c9737

Signed-off-by: Patrick Delaunay <patrick.delaunay73 at gmail.com>
---

 disk/part_efi.c |  4 ++++
 include/uuid.h  |  4 ++++
 lib/uuid.c      | 62
+++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/disk/part_efi.c b/disk/part_efi.c
index 25bf8f9..9118be0 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -223,6 +223,10 @@ void print_part_efi(block_dev_desc_t * dev_desc)
         uuid_bin = (unsigned char *)gpt_pte[i].partition_type_guid.b;
         uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
         printf("\ttype:\t%s\n", uuid);
+#ifdef CONFIG_PARTITION_TYPE_GUID
+        if (!uuid_guid_get_str(uuid_bin, uuid))
+            printf("\ttype:\t%s\n", uuid);
+#endif
         uuid_bin = (unsigned char *)gpt_pte[i].unique_partition_guid.b;
         uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
         printf("\tguid:\t%s\n", uuid);
diff --git a/include/uuid.h b/include/uuid.h
index 93027c1..15a14cd 100644
--- a/include/uuid.h
+++ b/include/uuid.h
@@ -36,6 +36,10 @@ enum {
 int uuid_str_valid(const char *uuid);
 int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int
str_format);
 void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int
str_format);
+#ifdef CONFIG_PARTITION_TYPE_GUID
+int uuid_guid_get_bin(char *uuid_str, unsigned char *uuid_bin);
+int uuid_guid_get_str(unsigned char *uuid_bin, char *uuid_str);
+#endif
 void gen_rand_uuid(unsigned char *uuid_bin);
 void gen_rand_uuid_str(char *uuid_str, int str_format);
 #endif
diff --git a/lib/uuid.c b/lib/uuid.c
index f6b4423..9805aa0 100644
--- a/lib/uuid.c
+++ b/lib/uuid.c
@@ -80,10 +80,63 @@ int uuid_str_valid(const char *uuid)
     return 1;
 }

+#ifdef CONFIG_PARTITION_TYPE_GUID
+const struct {
+    char *string;
+    efi_guid_t guid;
+} shorcut_guid[8] = {
+    {"system", PARTITION_SYSTEM_GUID},
+    {"mbr", LEGACY_MBR_PARTITION_GUID},
+    {"msft", PARTITION_MSFT_RESERVED_GUID},
+    {"data", PARTITION_BASIC_DATA_GUID},
+    {"linux", PARTITION_LINUX_FILE_SYSTEM_DATA_GUID},
+    {"raid", PARTITION_LINUX_RAID_GUID},
+    {"swap", PARTITION_LINUX_SWAP_GUID},
+    {"lvm", PARTITION_LINUX_LVM_GUID}
+};
+
+/*
+ * uuid_guid_get_bin() - this function get GUID bin for GUID shorcut string
+ *
+ * @param uuid_str - pointer to allocated array [7B]
+ * @param uuid_bin - pointer to allocated array for big endian output [16B]
+ */
+int uuid_guid_get_bin(char *uuid_str, unsigned char *uuid_bin)
+{
+    int i;
+    for (i = 0; i < 8; i++) {
+        if (!strcmp(shorcut_guid[i].string, uuid_str)) {
+            memcpy(uuid_bin, &shorcut_guid[i].guid, 16);
+            return 0;
+        }
+    }
+    return -ENODEV;
+}
+
+/*
+ * uuid_guid_get_str() - this function get GUID shortcut string for GUID.
+ *
+ * @param uuid_bin - pointer to allocated array for big endian output [16B]
+ * @param uuid_str - pointer to allocated array [7B]
+ */
+int uuid_guid_get_str(unsigned char *uuid_bin, char *uuid_str)
+{
+    int i;
+    *uuid_str = 0;
+    for (i = 0; i < 8; i++) {
+        if (!memcmp(shorcut_guid[i].guid.b, uuid_bin, 16)) {
+            strcpy(uuid_str, shorcut_guid[i].string);
+            return 0;
+        }
+    }
+    return -ENODEV;
+}
+#endif
+
 /*
  * uuid_str_to_bin() - convert string UUID or GUID to big endian binary
data.
  *
- * @param uuid_str - pointer to UUID or GUID string [37B]
+ * @param uuid_str - pointer to UUID or GUID string [37B] or GUID shorcut
  * @param uuid_bin - pointer to allocated array for big endian output [16B]
  * @str_format     - UUID string format: 0 - UUID; 1 - GUID
  */
@@ -93,8 +146,13 @@ int uuid_str_to_bin(char *uuid_str, unsigned char
*uuid_bin, int str_format)
     uint32_t tmp32;
     uint64_t tmp64;

-    if (!uuid_str_valid(uuid_str))
+    if (!uuid_str_valid(uuid_str)) {
+#ifdef CONFIG_PARTITION_TYPE_GUID
+        if (!uuid_guid_get_bin(uuid_str, uuid_bin))
+            return 0;
+#endif
         return -EINVAL;
+    }

     if (str_format == UUID_STR_FORMAT_STD) {
         tmp32 = cpu_to_be32(simple_strtoul(uuid_str, NULL, 16));
-- 
1.9.1


More information about the U-Boot mailing list