1201b66b7SHaojian Zhuang /* 2*32f0d3c6SDouglas Raillard * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved. 3201b66b7SHaojian Zhuang * 4201b66b7SHaojian Zhuang * Redistribution and use in source and binary forms, with or without 5201b66b7SHaojian Zhuang * modification, are permitted provided that the following conditions are met: 6201b66b7SHaojian Zhuang * 7201b66b7SHaojian Zhuang * Redistributions of source code must retain the above copyright notice, this 8201b66b7SHaojian Zhuang * list of conditions and the following disclaimer. 9201b66b7SHaojian Zhuang * 10201b66b7SHaojian Zhuang * Redistributions in binary form must reproduce the above copyright notice, 11201b66b7SHaojian Zhuang * this list of conditions and the following disclaimer in the documentation 12201b66b7SHaojian Zhuang * and/or other materials provided with the distribution. 13201b66b7SHaojian Zhuang * 14201b66b7SHaojian Zhuang * Neither the name of ARM nor the names of its contributors may be used 15201b66b7SHaojian Zhuang * to endorse or promote products derived from this software without specific 16201b66b7SHaojian Zhuang * prior written permission. 17201b66b7SHaojian Zhuang * 18201b66b7SHaojian Zhuang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19201b66b7SHaojian Zhuang * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20201b66b7SHaojian Zhuang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21201b66b7SHaojian Zhuang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22201b66b7SHaojian Zhuang * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23201b66b7SHaojian Zhuang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24201b66b7SHaojian Zhuang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25201b66b7SHaojian Zhuang * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26201b66b7SHaojian Zhuang * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27201b66b7SHaojian Zhuang * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28201b66b7SHaojian Zhuang * POSSIBILITY OF SUCH DAMAGE. 29201b66b7SHaojian Zhuang */ 30201b66b7SHaojian Zhuang 31201b66b7SHaojian Zhuang #include <assert.h> 32201b66b7SHaojian Zhuang #include <debug.h> 33201b66b7SHaojian Zhuang #include <errno.h> 34201b66b7SHaojian Zhuang #include <gpt.h> 35201b66b7SHaojian Zhuang #include <string.h> 36*32f0d3c6SDouglas Raillard #include <utils.h> 37201b66b7SHaojian Zhuang 38201b66b7SHaojian Zhuang static int unicode_to_ascii(unsigned short *str_in, unsigned char *str_out) 39201b66b7SHaojian Zhuang { 40201b66b7SHaojian Zhuang uint8_t *name = (uint8_t *)str_in; 41201b66b7SHaojian Zhuang int i; 42201b66b7SHaojian Zhuang 43201b66b7SHaojian Zhuang assert((str_in != NULL) && (str_out != NULL) && (name[0] != '\0')); 44201b66b7SHaojian Zhuang 45201b66b7SHaojian Zhuang /* check whether the unicode string is valid */ 46201b66b7SHaojian Zhuang for (i = 1; i < (EFI_NAMELEN << 1); i += 2) { 47201b66b7SHaojian Zhuang if (name[i] != '\0') 48201b66b7SHaojian Zhuang return -EINVAL; 49201b66b7SHaojian Zhuang } 50201b66b7SHaojian Zhuang /* convert the unicode string to ascii string */ 51201b66b7SHaojian Zhuang for (i = 0; i < (EFI_NAMELEN << 1); i += 2) { 52201b66b7SHaojian Zhuang str_out[i >> 1] = name[i]; 53201b66b7SHaojian Zhuang if (name[i] == '\0') 54201b66b7SHaojian Zhuang break; 55201b66b7SHaojian Zhuang } 56201b66b7SHaojian Zhuang return 0; 57201b66b7SHaojian Zhuang } 58201b66b7SHaojian Zhuang 59201b66b7SHaojian Zhuang int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry) 60201b66b7SHaojian Zhuang { 61201b66b7SHaojian Zhuang int result; 62201b66b7SHaojian Zhuang 63201b66b7SHaojian Zhuang assert((gpt_entry != 0) && (entry != 0)); 64201b66b7SHaojian Zhuang 65201b66b7SHaojian Zhuang if ((gpt_entry->first_lba == 0) && (gpt_entry->last_lba == 0)) { 66201b66b7SHaojian Zhuang return -EINVAL; 67201b66b7SHaojian Zhuang } 68201b66b7SHaojian Zhuang 69*32f0d3c6SDouglas Raillard zeromem(entry, sizeof(partition_entry_t)); 70201b66b7SHaojian Zhuang result = unicode_to_ascii(gpt_entry->name, (uint8_t *)entry->name); 71201b66b7SHaojian Zhuang if (result != 0) { 72201b66b7SHaojian Zhuang return result; 73201b66b7SHaojian Zhuang } 74201b66b7SHaojian Zhuang entry->start = (uint64_t)gpt_entry->first_lba * PARTITION_BLOCK_SIZE; 75201b66b7SHaojian Zhuang entry->length = (uint64_t)(gpt_entry->last_lba - 76201b66b7SHaojian Zhuang gpt_entry->first_lba + 1) * 77201b66b7SHaojian Zhuang PARTITION_BLOCK_SIZE; 78201b66b7SHaojian Zhuang return 0; 79201b66b7SHaojian Zhuang } 80