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