[U-Boot] [PATCH 2/3] gpt: add optional parameter guid in gpt command

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


code under flag CONFIG_PARTITION_TYPE_GUID
add parameter guid to select partition type guid

example of use with gpt command :

  partitions = uuid_disk=${uuid_gpt_disk};name=boot,start=0x4400,
  size=0x6bc00,uuid=${uuid_gpt_boot};name=root,start=0x70000,
  size=0x7538ba00,uuid=${uuid_gpt_root},
  guid=0fc63daf-8483-4772-8e79-3d69d8477de4;

  gpt write mmc 0 $partitions

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

 common/cmd_gpt.c | 17 +++++++++++++++++
 disk/part.c      |  9 +++++++++
 disk/part_efi.c  | 25 +++++++++++++++++++++++++
 include/part.h   |  3 +++
 4 files changed, 54 insertions(+)

diff --git a/common/cmd_gpt.c b/common/cmd_gpt.c
index c56fe15..1e8f927 100644
--- a/common/cmd_gpt.c
+++ b/common/cmd_gpt.c
@@ -218,6 +218,23 @@ static int set_gpt_info(block_dev_desc_t *dev_desc,
             strcpy((char *)parts[i].uuid, p);
             free(val);
         }
+#ifdef CONFIG_PARTITION_TYPE_GUID
+        /* guid */
+        val = extract_val(tok, "guid");
+        if (val) {
+            /* 'guid' is optional */
+            if (extract_env(val, &p))
+                p = val;
+            if (strlen(p) >= sizeof(parts[i].guid)) {
+                printf("Wrong guid format for partition %d\n",
+                       i);
+                errno = -4;
+                goto err;
+            }
+            strcpy((char *)parts[i].guid, p);
+            free(val);
+        }
+#endif
         /* name */
         val = extract_val(tok, "name");
         if (!val) { /* name is mandatory */
diff --git a/disk/part.c b/disk/part.c
index 43485c9..316454d 100644
--- a/disk/part.c
+++ b/disk/part.c
@@ -391,6 +391,9 @@ int get_partition_info(block_dev_desc_t *dev_desc, int
part,
     /* The common case is no UUID support */
     info->uuid[0] = 0;
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUIDS
+    info->guid[0] = 0;
+#endif

     switch (dev_desc->part_type) {
 #ifdef CONFIG_MAC_PARTITION
@@ -526,6 +529,9 @@ int get_device_and_partition(const char *ifname, const
char *dev_part_str,
 #ifdef CONFIG_PARTITION_UUIDS
         info->uuid[0] = 0;
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUIDS
+        info->guid[0] = 0;
+#endif

         return 0;
     }
@@ -610,6 +616,9 @@ int get_device_and_partition(const char *ifname, const
char *dev_part_str,
 #ifdef CONFIG_PARTITION_UUIDS
         info->uuid[0] = 0;
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUIDS
+        info->guid[0] = 0;
+#endif

         ret = 0;
         goto cleanup;
diff --git a/disk/part_efi.c b/disk/part_efi.c
index 15627f2..25bf8f9 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -283,6 +283,10 @@ int get_partition_info_efi(block_dev_desc_t *
dev_desc, int part,
     uuid_bin_to_str(gpt_pte[part - 1].unique_partition_guid.b, info->uuid,
             UUID_STR_FORMAT_GUID);
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+    uuid_bin_to_str(gpt_pte[part - 1].partition_type_guid.b, info->guid,
+            UUID_STR_FORMAT_GUID);
+#endif

     debug("%s: start 0x" LBAF ", size 0x" LBAF ", name %s\n", __func__,
           info->start, info->size, info->name);
@@ -419,6 +423,10 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
     char *str_uuid;
     unsigned char *bin_uuid;
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+    char *str_guid;
+    unsigned char *bin_guid;
+#endif

     for (i = 0; i < parts; i++) {
         /* partition starting lba */
@@ -445,9 +453,26 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
         else
             gpt_e[i].ending_lba = cpu_to_le64(offset - 1);

+#ifdef CONFIG_PARTITION_TYPE_GUID
+        str_guid = partitions[i].guid;
+        bin_guid = gpt_e[i].partition_type_guid.b;
+        if (strlen(str_guid)) {
+            if (uuid_str_to_bin(str_guid, bin_guid,
+                        UUID_STR_FORMAT_GUID)) {
+                printf("Partition no. %d: invalid type guid: %s\n",
+                       i, str_guid);
+                return -1;
+            }
+        } else {
+            /* default partition type GUID */
+            memcpy(bin_guid,
+                   &PARTITION_BASIC_DATA_GUID, 16);
+        }
+#else
         /* partition type GUID */
         memcpy(gpt_e[i].partition_type_guid.b,
             &PARTITION_BASIC_DATA_GUID, 16);
+#endif

 #ifdef CONFIG_PARTITION_UUIDS
         str_uuid = partitions[i].uuid;
diff --git a/include/part.h b/include/part.h
index 8ea9b30..d57d284 100644
--- a/include/part.h
+++ b/include/part.h
@@ -93,6 +93,9 @@ typedef struct disk_partition {
 #ifdef CONFIG_PARTITION_UUIDS
     char    uuid[37];    /* filesystem UUID as string, if exists    */
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+    char    guid[37];    /* type GUID as string, if exists    */
+#endif
 } disk_partition_t;

 /* Misc _get_dev functions */
-- 
1.9.1


More information about the U-Boot mailing list