From 1fdc3000f1ab6f9c1bb792cb8baff16a7517c03a Mon Sep 17 00:00:00 2001
From: Mohamed Omar Asaker <mohamed.omarasaker@arm.com>
Date: Thu, 22 Dec 2022 14:27:41 +0000
Subject: [PATCH 7/10] Platform:corstone1000: Introduce GPT parser

Adding GPT parser
Side changes required:
Includes the implementation of the `plat_get_image_source` function
in the platform.c file.

The GPT parser requires the function. Given the image id, it should
return handle to the IO device contains the image and image
specification that allows IO storage access to the image.

Signed-off-by: Mohamed Omar Asaker <mohamed.omarasaker@arm.com>
Upstream-Status: Pending [Not submitted to upstream yet]
---
 .../target/arm/corstone1000/partition/efi.h   |  36 ++
 .../target/arm/corstone1000/partition/gpt.c   |  58 ++++
 .../target/arm/corstone1000/partition/gpt.h   |  51 +++
 .../target/arm/corstone1000/partition/mbr.h   |  29 ++
 .../arm/corstone1000/partition/partition.c    | 310 ++++++++++++++++++
 .../arm/corstone1000/partition/partition.h    |  47 +++
 .../target/arm/corstone1000/partition/uuid.h  |  76 +++++
 .../ext/target/arm/corstone1000/platform.c    |  20 ++
 .../ext/target/arm/corstone1000/platform.h    |  14 +
 9 files changed, 641 insertions(+)
 create mode 100644 platform/ext/target/arm/corstone1000/partition/efi.h
 create mode 100644 platform/ext/target/arm/corstone1000/partition/gpt.c
 create mode 100644 platform/ext/target/arm/corstone1000/partition/gpt.h
 create mode 100644 platform/ext/target/arm/corstone1000/partition/mbr.h
 create mode 100644 platform/ext/target/arm/corstone1000/partition/partition.c
 create mode 100644 platform/ext/target/arm/corstone1000/partition/partition.h
 create mode 100644 platform/ext/target/arm/corstone1000/partition/uuid.h
 create mode 100644 platform/ext/target/arm/corstone1000/platform.c
 create mode 100644 platform/ext/target/arm/corstone1000/platform.h

diff --git a/platform/ext/target/arm/corstone1000/partition/efi.h b/platform/ext/target/arm/corstone1000/partition/efi.h
new file mode 100644
index 0000000000..f66daffb32
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/partition/efi.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2021, Linaro Limited
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#ifndef DRIVERS_PARTITION_EFI_H
+#define DRIVERS_PARTITION_EFI_H
+
+#include <string.h>
+
+#include "uuid.h"
+
+#define EFI_NAMELEN 36
+
+static inline int guidcmp(const void *g1, const void *g2) {
+    return memcmp(g1, g2, sizeof(struct efi_guid));
+}
+
+static inline void *guidcpy(void *dst, const void *src) {
+    return memcpy(dst, src, sizeof(struct efi_guid));
+}
+
+#define EFI_GUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)  \
+    {                                                      \
+        (a) & 0xffffffff, (b)&0xffff, (c)&0xffff, {        \
+            (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) \
+        }                                                  \
+    }
+
+#define NULL_GUID                                                            \
+    EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+             0x00, 0x00)
+
+#endif /* DRIVERS_PARTITION_EFI_H */
diff --git a/platform/ext/target/arm/corstone1000/partition/gpt.c b/platform/ext/target/arm/corstone1000/partition/gpt.c
new file mode 100644
index 0000000000..8549785e3b
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/partition/gpt.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "gpt.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+
+#include "efi.h"
+
+static int unicode_to_ascii(unsigned short *str_in, unsigned char *str_out) {
+    uint8_t *name;
+    int i;
+
+    assert((str_in != NULL) && (str_out != NULL));
+
+    name = (uint8_t *)str_in;
+
+    assert(name[0] != '\0');
+
+    /* check whether the unicode string is valid */
+    for (i = 1; i < (EFI_NAMELEN << 1); i += 2) {
+        if (name[i] != '\0') return -EINVAL;
+    }
+    /* convert the unicode string to ascii string */
+    for (i = 0; i < (EFI_NAMELEN << 1); i += 2) {
+        str_out[i >> 1] = name[i];
+        if (name[i] == '\0') break;
+    }
+    return 0;
+}
+
+int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry) {
+    int result;
+
+    assert((gpt_entry != NULL) && (entry != NULL));
+
+    if ((gpt_entry->first_lba == 0) && (gpt_entry->last_lba == 0)) {
+        return -EINVAL;
+    }
+
+    memset(entry, 0, sizeof(partition_entry_t));
+    result = unicode_to_ascii(gpt_entry->name, (uint8_t *)entry->name);
+    if (result != 0) {
+        return result;
+    }
+    entry->start = (uint64_t)gpt_entry->first_lba * PLAT_PARTITION_BLOCK_SIZE;
+    entry->length = (uint64_t)(gpt_entry->last_lba - gpt_entry->first_lba + 1) *
+                    PLAT_PARTITION_BLOCK_SIZE;
+    guidcpy(&entry->part_guid, &gpt_entry->unique_uuid);
+    guidcpy(&entry->type_guid, &gpt_entry->type_uuid);
+
+    return 0;
+}
diff --git a/platform/ext/target/arm/corstone1000/partition/gpt.h b/platform/ext/target/arm/corstone1000/partition/gpt.h
new file mode 100644
index 0000000000..b528fc05c0
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/partition/gpt.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef GPT_H
+#define GPT_H
+
+#include "efi.h"
+#include "partition.h"
+#include "uuid.h"
+
+#define PARTITION_TYPE_GPT 0xee
+#define GPT_HEADER_OFFSET PLAT_PARTITION_BLOCK_SIZE
+#define GPT_ENTRY_OFFSET (GPT_HEADER_OFFSET + PLAT_PARTITION_BLOCK_SIZE)
+
+#define GPT_SIGNATURE "EFI PART"
+
+typedef struct gpt_entry {
+    struct efi_guid type_uuid;
+    struct efi_guid unique_uuid;
+    unsigned long long first_lba;
+    unsigned long long last_lba;
+    unsigned long long attr;
+    unsigned short name[EFI_NAMELEN];
+} gpt_entry_t;
+
+typedef struct gpt_header {
+    unsigned char signature[8];
+    unsigned int revision;
+    unsigned int size;
+    unsigned int header_crc;
+    unsigned int reserved;
+    unsigned long long current_lba;
+    unsigned long long backup_lba;
+    unsigned long long first_lba;
+    unsigned long long last_lba;
+    struct efi_guid disk_uuid;
+    /* starting LBA of array of partition entries */
+    unsigned long long part_lba;
+    /* number of partition entries in array */
+    unsigned int list_num;
+    /* size of a single partition entry (usually 128) */
+    unsigned int part_size;
+    unsigned int part_crc;
+} gpt_header_t;
+
+int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry);
+
+#endif /* GPT_H */
diff --git a/platform/ext/target/arm/corstone1000/partition/mbr.h b/platform/ext/target/arm/corstone1000/partition/mbr.h
new file mode 100644
index 0000000000..e77f367016
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/partition/mbr.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef MBR_H
+#define MBR_H
+
+#define MBR_OFFSET 0
+
+#define MBR_PRIMARY_ENTRY_OFFSET 0x1be
+#define MBR_PRIMARY_ENTRY_SIZE 0x10
+#define MBR_PRIMARY_ENTRY_NUMBER 4
+#define MBR_CHS_ADDRESS_LEN 3
+
+#define MBR_SIGNATURE_FIRST 0x55
+#define MBR_SIGNATURE_SECOND 0xAA
+
+typedef struct mbr_entry {
+    unsigned char status;
+    unsigned char first_sector[MBR_CHS_ADDRESS_LEN];
+    unsigned char type;
+    unsigned char last_sector[MBR_CHS_ADDRESS_LEN];
+    unsigned int first_lba;
+    unsigned int sector_nums;
+} mbr_entry_t;
+
+#endif /* MBR_H */
diff --git a/platform/ext/target/arm/corstone1000/partition/partition.c b/platform/ext/target/arm/corstone1000/partition/partition.c
new file mode 100644
index 0000000000..afc6aa1c5c
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/partition/partition.c
@@ -0,0 +1,310 @@
+/*
+ * Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "partition.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "efi.h"
+#include "gpt.h"
+#include "mbr.h"
+
+#include "io_storage.h"
+#include "platform.h"
+#include "soft_crc.h"
+
+#define PLAT_LOG_MODULE_NAME "partition"
+#include "platform_log.h"
+
+static uint8_t mbr_sector[PLAT_PARTITION_BLOCK_SIZE];
+static partition_entry_list_t list;
+
+#if LOG_LEVEL >= LOG_LEVEL_DEBUG
+static void dump_entries(int num) {
+    char name[EFI_NAMELEN];
+    int i, j, len;
+
+    VERBOSE("Partition table with %d entries:", num);
+    for (i = 0; i < num; i++) {
+        len = snprintf(name, EFI_NAMELEN, "%s", list.list[i].name);
+        for (j = 0; j < EFI_NAMELEN - len - 1; j++) {
+            name[len + j] = ' ';
+        }
+        name[EFI_NAMELEN - 1] = '\0';
+        VERBOSE("%d: %s %x%x %d", i + 1, name,
+                (uint32_t)(list.list[i].start >> 32),
+                (uint32_t)list.list[i].start,
+                (uint32_t)(list.list[i].start + list.list[i].length - 4));
+    }
+}
+#else
+#define dump_entries(num) ((void)num)
+#endif
+
+/*
+ * Load the first sector that carries MBR header.
+ * The MBR boot signature should be always valid whether it's MBR or GPT.
+ */
+static int load_mbr_header(uintptr_t image_handle, mbr_entry_t *mbr_entry) {
+    size_t bytes_read;
+    uintptr_t offset;
+    int result;
+
+    assert(mbr_entry != NULL);
+    /* MBR partition table is in LBA0. */
+    result = io_seek(image_handle, IO_SEEK_SET, MBR_OFFSET);
+    if (result != 0) {
+        WARN("Failed to seek (%i)\n", result);
+        return result;
+    }
+    result = io_read(image_handle, (uintptr_t)&mbr_sector,
+                     PLAT_PARTITION_BLOCK_SIZE, &bytes_read);
+    if (result != 0) {
+        WARN("Failed to read data (%i)\n", result);
+        return result;
+    }
+
+    /* Check MBR boot signature. */
+    if ((mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 2] != MBR_SIGNATURE_FIRST) ||
+        (mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 1] != MBR_SIGNATURE_SECOND)) {
+        ERROR("MBR signature isn't correct");
+        return -ENOENT;
+    }
+    offset = (uintptr_t)&mbr_sector + MBR_PRIMARY_ENTRY_OFFSET;
+    memcpy(mbr_entry, (void *)offset, sizeof(mbr_entry_t));
+    return 0;
+}
+
+/*
+ * Load GPT header and check the GPT signature and header CRC.
+ * If partition numbers could be found, check & update it.
+ */
+static int load_gpt_header(uintptr_t image_handle) {
+    gpt_header_t header;
+    size_t bytes_read;
+    int result;
+    uint32_t header_crc, calc_crc;
+
+    result = io_seek(image_handle, IO_SEEK_SET, GPT_HEADER_OFFSET);
+    if (result != 0) {
+        return result;
+    }
+    result = io_read(image_handle, (uintptr_t)&header, sizeof(gpt_header_t),
+                     &bytes_read);
+    if ((result != 0) || (sizeof(gpt_header_t) != bytes_read)) {
+        return result;
+    }
+    if (memcmp(header.signature, GPT_SIGNATURE, sizeof(header.signature)) !=
+        0) {
+        return -EINVAL;
+    }
+
+    /*
+     * UEFI Spec 2.8 March 2019 Page 119: HeaderCRC32 value is
+     * computed by setting this field to 0, and computing the
+     * 32-bit CRC for HeaderSize bytes.
+     */
+    header_crc = header.header_crc;
+    header.header_crc = 0U;
+
+    calc_crc = crc32((uint8_t *)&header, DEFAULT_GPT_HEADER_SIZE);
+    if (header_crc != calc_crc) {
+        ERROR("Invalid GPT Header CRC: Expected 0x%x but got 0x%x.\n",
+              header_crc, calc_crc);
+        return -EINVAL;
+    }
+
+    header.header_crc = header_crc;
+
+    /* partition numbers can't exceed PLAT_PARTITION_MAX_ENTRIES */
+    list.entry_count = header.list_num;
+    if (list.entry_count > PLAT_PARTITION_MAX_ENTRIES) {
+        list.entry_count = PLAT_PARTITION_MAX_ENTRIES;
+    }
+    return 0;
+}
+
+static int load_mbr_entry(uintptr_t image_handle, mbr_entry_t *mbr_entry,
+                          int part_number) {
+    size_t bytes_read;
+    uintptr_t offset;
+    int result;
+
+    assert(mbr_entry != NULL);
+    /* MBR partition table is in LBA0. */
+    result = io_seek(image_handle, IO_SEEK_SET, MBR_OFFSET);
+    if (result != 0) {
+        WARN("Failed to seek (%i)\n", result);
+        return result;
+    }
+    result = io_read(image_handle, (uintptr_t)&mbr_sector,
+                     PLAT_PARTITION_BLOCK_SIZE, &bytes_read);
+    if (result != 0) {
+        WARN("Failed to read data (%i)\n", result);
+        return result;
+    }
+
+    /* Check MBR boot signature. */
+    if ((mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 2] != MBR_SIGNATURE_FIRST) ||
+        (mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 1] != MBR_SIGNATURE_SECOND)) {
+        return -ENOENT;
+    }
+    offset = (uintptr_t)&mbr_sector + MBR_PRIMARY_ENTRY_OFFSET +
+             MBR_PRIMARY_ENTRY_SIZE * part_number;
+    memcpy(mbr_entry, (void *)offset, sizeof(mbr_entry_t));
+
+    return 0;
+}
+
+static int load_mbr_entries(uintptr_t image_handle) {
+    mbr_entry_t mbr_entry;
+    int i;
+
+    list.entry_count = MBR_PRIMARY_ENTRY_NUMBER;
+
+    for (i = 0; i < list.entry_count; i++) {
+        load_mbr_entry(image_handle, &mbr_entry, i);
+        list.list[i].start = mbr_entry.first_lba * 512;
+        list.list[i].length = mbr_entry.sector_nums * 512;
+        list.list[i].name[0] = mbr_entry.type;
+    }
+
+    return 0;
+}
+
+static int load_gpt_entry(uintptr_t image_handle, gpt_entry_t *entry) {
+    size_t bytes_read;
+    int result;
+
+    assert(entry != NULL);
+    result = io_read(image_handle, (uintptr_t)entry, sizeof(gpt_entry_t),
+                     &bytes_read);
+    if (sizeof(gpt_entry_t) != bytes_read) return -EINVAL;
+    return result;
+}
+
+static int verify_partition_gpt(uintptr_t image_handle) {
+    gpt_entry_t entry;
+    int result, i;
+
+    for (i = 0; i < list.entry_count; i++) {
+        result = load_gpt_entry(image_handle, &entry);
+        assert(result == 0);
+        if (result != 0) {
+            break;
+        }
+        result = parse_gpt_entry(&entry, &list.list[i]);
+        if (result != 0) {
+            break;
+        }
+    }
+    if (i == 0) {
+        return -EINVAL;
+    }
+    /*
+     * Only records the valid partition number that is loaded from
+     * partition table.
+     */
+    list.entry_count = i;
+    dump_entries(list.entry_count);
+
+    return 0;
+}
+
+int load_partition_table(unsigned int image_id) {
+    uintptr_t dev_handle, image_handle, image_spec = 0;
+    mbr_entry_t mbr_entry;
+    int result;
+
+    result = plat_get_image_source(image_id, &dev_handle, &image_spec);
+    if (result != 0) {
+        WARN("Failed to obtain reference to image id=%u (%i)\n", image_id,
+             result);
+        return result;
+    }
+
+    result = io_open(dev_handle, image_spec, &image_handle);
+    if (result != 0) {
+        WARN("Failed to open image id=%u (%i)\n", image_id, result);
+        return result;
+    }
+
+    result = load_mbr_header(image_handle, &mbr_entry);
+    if (result != 0) {
+        ERROR("Loading mbr header failed with image id=%u (%i)\n", image_id,
+              result);
+        return result;
+    }
+    if (mbr_entry.type == PARTITION_TYPE_GPT) {
+        INFO("Loading gpt header");
+        result = load_gpt_header(image_handle);
+        assert(result == 0);
+        if (result != 0) {
+            ERROR("Failed load gpt header! %i", result);
+            goto load_partition_table_exit;
+        }
+        result = io_seek(image_handle, IO_SEEK_SET, GPT_ENTRY_OFFSET);
+        assert(result == 0);
+        if (result != 0) {
+            ERROR("Failed seek gpt header! %i", result);
+            goto load_partition_table_exit;
+        }
+        result = verify_partition_gpt(image_handle);
+        if (result != 0) {
+            ERROR("Failed verify gpt partition %i", result);
+            goto load_partition_table_exit;
+        }
+    } else {
+        result = load_mbr_entries(image_handle);
+    }
+
+load_partition_table_exit:
+    io_close(image_handle);
+    return result;
+}
+
+const partition_entry_t *get_partition_entry(const char *name) {
+    int i;
+
+    for (i = 0; i < list.entry_count; i++) {
+        if (strcmp(name, list.list[i].name) == 0) {
+            return &list.list[i];
+        }
+    }
+    return NULL;
+}
+
+const partition_entry_t *get_partition_entry_by_type(const uuid_t *type_uuid) {
+    int i;
+
+    for (i = 0; i < list.entry_count; i++) {
+        if (guidcmp(type_uuid, &list.list[i].type_guid) == 0) {
+            return &list.list[i];
+        }
+    }
+
+    return NULL;
+}
+
+const partition_entry_t *get_partition_entry_by_uuid(const uuid_t *part_uuid) {
+    int i;
+
+    for (i = 0; i < list.entry_count; i++) {
+        if (guidcmp(part_uuid, &list.list[i].part_guid) == 0) {
+            return &list.list[i];
+        }
+    }
+
+    return NULL;
+}
+
+const partition_entry_list_t *get_partition_entry_list(void) { return &list; }
+
+void partition_init(unsigned int image_id) { load_partition_table(image_id); }
diff --git a/platform/ext/target/arm/corstone1000/partition/partition.h b/platform/ext/target/arm/corstone1000/partition/partition.h
new file mode 100644
index 0000000000..54af47aca4
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/partition/partition.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef PARTITION_H
+#define PARTITION_H
+
+#include <stdint.h>
+
+#include "efi.h"
+#include "uuid.h"
+
+#if !PLAT_PARTITION_MAX_ENTRIES
+#define PLAT_PARTITION_MAX_ENTRIES 16
+#endif /* PLAT_PARTITION_MAX_ENTRIES */
+
+#if !PLAT_PARTITION_BLOCK_SIZE
+#define PLAT_PARTITION_BLOCK_SIZE 512
+#endif /* PLAT_PARTITION_BLOCK_SIZE */
+
+#define LEGACY_PARTITION_BLOCK_SIZE 512
+
+#define DEFAULT_GPT_HEADER_SIZE 92
+
+typedef struct partition_entry {
+    uint64_t start;
+    uint64_t length;
+    char name[EFI_NAMELEN];
+    struct efi_guid part_guid;
+    struct efi_guid type_guid;
+} partition_entry_t;
+
+typedef struct partition_entry_list {
+    partition_entry_t list[PLAT_PARTITION_MAX_ENTRIES];
+    int entry_count;
+} partition_entry_list_t;
+
+int load_partition_table(unsigned int image_id);
+const partition_entry_t *get_partition_entry(const char *name);
+const partition_entry_t *get_partition_entry_by_type(const uuid_t *type_guid);
+const partition_entry_t *get_partition_entry_by_uuid(const uuid_t *part_uuid);
+const partition_entry_list_t *get_partition_entry_list(void);
+void partition_init(unsigned int image_id);
+
+#endif /* PARTITION_H */
diff --git a/platform/ext/target/arm/corstone1000/partition/uuid.h b/platform/ext/target/arm/corstone1000/partition/uuid.h
new file mode 100644
index 0000000000..06fec5a3c0
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/partition/uuid.h
@@ -0,0 +1,76 @@
+/*-
+ * Copyright (c) 2002 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * Portions copyright (c) 2014-2020, ARM Limited and Contributors.
+ * All rights reserved.
+ */
+
+#ifndef UUID_H
+#define UUID_H
+
+#include <stdint.h>
+
+/* Length of a node address (an IEEE 802 address). */
+#define _UUID_NODE_LEN 6
+
+/* Length of UUID string including dashes. */
+#define _UUID_STR_LEN 36
+
+/*
+ * See also:
+ *      http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt
+ *      http://www.opengroup.org/onlinepubs/009629399/apdxa.htm
+ *
+ * A DCE 1.1 compatible source representation of UUIDs.
+ */
+struct uuid {
+    uint8_t time_low[4];
+    uint8_t time_mid[2];
+    uint8_t time_hi_and_version[2];
+    uint8_t clock_seq_hi_and_reserved;
+    uint8_t clock_seq_low;
+    uint8_t node[_UUID_NODE_LEN];
+};
+
+struct efi_guid {
+    uint32_t time_low;
+    uint16_t time_mid;
+    uint16_t time_hi_and_version;
+    uint8_t clock_seq_and_node[8];
+};
+
+union uuid_helper_t {
+    struct uuid uuid_struct;
+    struct efi_guid efi_guid;
+};
+
+/* XXX namespace pollution? */
+typedef struct uuid uuid_t;
+
+#endif /* UUID_H */
diff --git a/platform/ext/target/arm/corstone1000/platform.c b/platform/ext/target/arm/corstone1000/platform.c
new file mode 100644
index 0000000000..908b66b7ac
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/platform.c
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include "platform.h"
+
+#include <stdint.h>
+
+/* Return an IO device handle and specification which can be used to access
+ * an image. This has to be implemented for the GPT parser. */
+int32_t plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
+                              uintptr_t *image_spec) {
+    (void)image_id;
+    *dev_handle = NULL;
+    *image_spec = NULL;
+    return 0;
+}
diff --git a/platform/ext/target/arm/corstone1000/platform.h b/platform/ext/target/arm/corstone1000/platform.h
new file mode 100644
index 0000000000..250f9cd9f5
--- /dev/null
+++ b/platform/ext/target/arm/corstone1000/platform.h
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#ifndef __PLATFORM_H__
+#define __PLATFORM_H__
+
+int32_t plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
+                              uintptr_t *image_spec);
+
+#endif /*__PLATFORM_H__*/
-- 
2.25.1

