1 /* 2 * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 #include <errno.h> 9 #include <string.h> 10 11 #include <common/debug.h> 12 #include <drivers/partition/gpt.h> 13 #include <lib/utils.h> 14 unicode_to_ascii(unsigned short * str_in,unsigned char * str_out)15static int unicode_to_ascii(unsigned short *str_in, unsigned char *str_out) 16 { 17 uint8_t *name; 18 int i; 19 20 assert((str_in != NULL) && (str_out != NULL)); 21 22 name = (uint8_t *)str_in; 23 24 assert(name[0] != '\0'); 25 26 /* check whether the unicode string is valid */ 27 for (i = 1; i < (EFI_NAMELEN << 1); i += 2) { 28 if (name[i] != '\0') 29 return -EINVAL; 30 } 31 /* convert the unicode string to ascii string */ 32 for (i = 0; i < (EFI_NAMELEN << 1); i += 2) { 33 str_out[i >> 1] = name[i]; 34 if (name[i] == '\0') 35 break; 36 } 37 return 0; 38 } 39 parse_gpt_entry(gpt_entry_t * gpt_entry,partition_entry_t * entry)40int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry) 41 { 42 int result; 43 44 assert((gpt_entry != NULL) && (entry != NULL)); 45 46 if ((gpt_entry->first_lba == 0) && (gpt_entry->last_lba == 0)) { 47 return -EINVAL; 48 } 49 50 zeromem(entry, sizeof(partition_entry_t)); 51 result = unicode_to_ascii(gpt_entry->name, (uint8_t *)entry->name); 52 if (result != 0) { 53 return result; 54 } 55 entry->start = (uint64_t)gpt_entry->first_lba * 56 PLAT_PARTITION_BLOCK_SIZE; 57 entry->length = (uint64_t)(gpt_entry->last_lba - 58 gpt_entry->first_lba + 1) * 59 PLAT_PARTITION_BLOCK_SIZE; 60 return 0; 61 } 62