xref: /aosp_15_r20/external/arm-trusted-firmware/drivers/partition/gpt.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
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 Park static 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 Park int 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