1*201b66b7SHaojian Zhuang /* 2*201b66b7SHaojian Zhuang * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3*201b66b7SHaojian Zhuang * 4*201b66b7SHaojian Zhuang * Redistribution and use in source and binary forms, with or without 5*201b66b7SHaojian Zhuang * modification, are permitted provided that the following conditions are met: 6*201b66b7SHaojian Zhuang * 7*201b66b7SHaojian Zhuang * Redistributions of source code must retain the above copyright notice, this 8*201b66b7SHaojian Zhuang * list of conditions and the following disclaimer. 9*201b66b7SHaojian Zhuang * 10*201b66b7SHaojian Zhuang * Redistributions in binary form must reproduce the above copyright notice, 11*201b66b7SHaojian Zhuang * this list of conditions and the following disclaimer in the documentation 12*201b66b7SHaojian Zhuang * and/or other materials provided with the distribution. 13*201b66b7SHaojian Zhuang * 14*201b66b7SHaojian Zhuang * Neither the name of ARM nor the names of its contributors may be used 15*201b66b7SHaojian Zhuang * to endorse or promote products derived from this software without specific 16*201b66b7SHaojian Zhuang * prior written permission. 17*201b66b7SHaojian Zhuang * 18*201b66b7SHaojian Zhuang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*201b66b7SHaojian Zhuang * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*201b66b7SHaojian Zhuang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*201b66b7SHaojian Zhuang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*201b66b7SHaojian Zhuang * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*201b66b7SHaojian Zhuang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*201b66b7SHaojian Zhuang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*201b66b7SHaojian Zhuang * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*201b66b7SHaojian Zhuang * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*201b66b7SHaojian Zhuang * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*201b66b7SHaojian Zhuang * POSSIBILITY OF SUCH DAMAGE. 29*201b66b7SHaojian Zhuang */ 30*201b66b7SHaojian Zhuang 31*201b66b7SHaojian Zhuang #include <assert.h> 32*201b66b7SHaojian Zhuang #include <debug.h> 33*201b66b7SHaojian Zhuang #include <errno.h> 34*201b66b7SHaojian Zhuang #include <gpt.h> 35*201b66b7SHaojian Zhuang #include <string.h> 36*201b66b7SHaojian Zhuang 37*201b66b7SHaojian Zhuang static int unicode_to_ascii(unsigned short *str_in, unsigned char *str_out) 38*201b66b7SHaojian Zhuang { 39*201b66b7SHaojian Zhuang uint8_t *name = (uint8_t *)str_in; 40*201b66b7SHaojian Zhuang int i; 41*201b66b7SHaojian Zhuang 42*201b66b7SHaojian Zhuang assert((str_in != NULL) && (str_out != NULL) && (name[0] != '\0')); 43*201b66b7SHaojian Zhuang 44*201b66b7SHaojian Zhuang /* check whether the unicode string is valid */ 45*201b66b7SHaojian Zhuang for (i = 1; i < (EFI_NAMELEN << 1); i += 2) { 46*201b66b7SHaojian Zhuang if (name[i] != '\0') 47*201b66b7SHaojian Zhuang return -EINVAL; 48*201b66b7SHaojian Zhuang } 49*201b66b7SHaojian Zhuang /* convert the unicode string to ascii string */ 50*201b66b7SHaojian Zhuang for (i = 0; i < (EFI_NAMELEN << 1); i += 2) { 51*201b66b7SHaojian Zhuang str_out[i >> 1] = name[i]; 52*201b66b7SHaojian Zhuang if (name[i] == '\0') 53*201b66b7SHaojian Zhuang break; 54*201b66b7SHaojian Zhuang } 55*201b66b7SHaojian Zhuang return 0; 56*201b66b7SHaojian Zhuang } 57*201b66b7SHaojian Zhuang 58*201b66b7SHaojian Zhuang int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry) 59*201b66b7SHaojian Zhuang { 60*201b66b7SHaojian Zhuang int result; 61*201b66b7SHaojian Zhuang 62*201b66b7SHaojian Zhuang assert((gpt_entry != 0) && (entry != 0)); 63*201b66b7SHaojian Zhuang 64*201b66b7SHaojian Zhuang if ((gpt_entry->first_lba == 0) && (gpt_entry->last_lba == 0)) { 65*201b66b7SHaojian Zhuang return -EINVAL; 66*201b66b7SHaojian Zhuang } 67*201b66b7SHaojian Zhuang 68*201b66b7SHaojian Zhuang memset(entry, 0, sizeof(partition_entry_t)); 69*201b66b7SHaojian Zhuang result = unicode_to_ascii(gpt_entry->name, (uint8_t *)entry->name); 70*201b66b7SHaojian Zhuang if (result != 0) { 71*201b66b7SHaojian Zhuang return result; 72*201b66b7SHaojian Zhuang } 73*201b66b7SHaojian Zhuang entry->start = (uint64_t)gpt_entry->first_lba * PARTITION_BLOCK_SIZE; 74*201b66b7SHaojian Zhuang entry->length = (uint64_t)(gpt_entry->last_lba - 75*201b66b7SHaojian Zhuang gpt_entry->first_lba + 1) * 76*201b66b7SHaojian Zhuang PARTITION_BLOCK_SIZE; 77*201b66b7SHaojian Zhuang return 0; 78*201b66b7SHaojian Zhuang } 79