12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /*
- * Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include <assert.h>
- #include <errno.h>
- #include <string.h>
- #include <common/debug.h>
- #include <drivers/partition/efi.h>
- #include <drivers/partition/gpt.h>
- #include <lib/utils.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;
- }
- zeromem(entry, 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;
- }
|