1201b66b7SHaojian Zhuang /* 2564f5d47SLionel Debieve * Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved. 3201b66b7SHaojian Zhuang * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5201b66b7SHaojian Zhuang */ 6201b66b7SHaojian Zhuang 7201b66b7SHaojian Zhuang #include <assert.h> 8201b66b7SHaojian Zhuang #include <errno.h> 9201b66b7SHaojian Zhuang #include <string.h> 1009d40e0eSAntonio Nino Diaz 1109d40e0eSAntonio Nino Diaz #include <common/debug.h> 127585ec4dSSughosh Ganu #include <drivers/partition/efi.h> 1309d40e0eSAntonio Nino Diaz #include <drivers/partition/gpt.h> 1409d40e0eSAntonio Nino Diaz #include <lib/utils.h> 15201b66b7SHaojian Zhuang unicode_to_ascii(unsigned short * str_in,unsigned char * str_out)16201b66b7SHaojian Zhuangstatic int unicode_to_ascii(unsigned short *str_in, unsigned char *str_out) 17201b66b7SHaojian Zhuang { 184cb17707SYann Gautier uint8_t *name; 19201b66b7SHaojian Zhuang int i; 20201b66b7SHaojian Zhuang 214cb17707SYann Gautier assert((str_in != NULL) && (str_out != NULL)); 224cb17707SYann Gautier 234cb17707SYann Gautier name = (uint8_t *)str_in; 244cb17707SYann Gautier 254cb17707SYann Gautier assert(name[0] != '\0'); 26201b66b7SHaojian Zhuang 27201b66b7SHaojian Zhuang /* check whether the unicode string is valid */ 28201b66b7SHaojian Zhuang for (i = 1; i < (EFI_NAMELEN << 1); i += 2) { 29*12906620SYann Gautier if (name[i] != '\0') { 30201b66b7SHaojian Zhuang return -EINVAL; 31201b66b7SHaojian Zhuang } 32*12906620SYann Gautier } 33201b66b7SHaojian Zhuang /* convert the unicode string to ascii string */ 34201b66b7SHaojian Zhuang for (i = 0; i < (EFI_NAMELEN << 1); i += 2) { 35201b66b7SHaojian Zhuang str_out[i >> 1] = name[i]; 36*12906620SYann Gautier if (name[i] == '\0') { 37201b66b7SHaojian Zhuang break; 38201b66b7SHaojian Zhuang } 39*12906620SYann Gautier } 40201b66b7SHaojian Zhuang return 0; 41201b66b7SHaojian Zhuang } 42201b66b7SHaojian Zhuang parse_gpt_entry(gpt_entry_t * gpt_entry,partition_entry_t * entry)43201b66b7SHaojian Zhuangint parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry) 44201b66b7SHaojian Zhuang { 45201b66b7SHaojian Zhuang int result; 46201b66b7SHaojian Zhuang 474cb17707SYann Gautier assert((gpt_entry != NULL) && (entry != NULL)); 48201b66b7SHaojian Zhuang 49201b66b7SHaojian Zhuang if ((gpt_entry->first_lba == 0) && (gpt_entry->last_lba == 0)) { 50201b66b7SHaojian Zhuang return -EINVAL; 51201b66b7SHaojian Zhuang } 52201b66b7SHaojian Zhuang 5332f0d3c6SDouglas Raillard zeromem(entry, sizeof(partition_entry_t)); 54201b66b7SHaojian Zhuang result = unicode_to_ascii(gpt_entry->name, (uint8_t *)entry->name); 55201b66b7SHaojian Zhuang if (result != 0) { 56201b66b7SHaojian Zhuang return result; 57201b66b7SHaojian Zhuang } 58f8631f51SHaojian Zhuang entry->start = (uint64_t)gpt_entry->first_lba * 59f8631f51SHaojian Zhuang PLAT_PARTITION_BLOCK_SIZE; 60201b66b7SHaojian Zhuang entry->length = (uint64_t)(gpt_entry->last_lba - 61201b66b7SHaojian Zhuang gpt_entry->first_lba + 1) * 62f8631f51SHaojian Zhuang PLAT_PARTITION_BLOCK_SIZE; 637585ec4dSSughosh Ganu guidcpy(&entry->part_guid, &gpt_entry->unique_uuid); 64564f5d47SLionel Debieve guidcpy(&entry->type_guid, &gpt_entry->type_uuid); 657585ec4dSSughosh Ganu 66201b66b7SHaojian Zhuang return 0; 67201b66b7SHaojian Zhuang } 68