1 /****************************************************************************** 2 * 3 * Module Name: asluuid-- compiler UUID support 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2014, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 45 #include "aslcompiler.h" 46 47 #define _COMPONENT ACPI_COMPILER 48 ACPI_MODULE_NAME ("asluuid") 49 50 51 /* 52 * UUID support functions. 53 * 54 * This table is used to convert an input UUID ascii string to a 16 byte 55 * buffer and the reverse. The table maps a UUID buffer index 0-15 to 56 * the index within the 36-byte UUID string where the associated 2-byte 57 * hex value can be found. 58 * 59 * 36-byte UUID strings are of the form: 60 * aabbccdd-eeff-gghh-iijj-kkllmmnnoopp 61 * Where aa-pp are one byte hex numbers, made up of two hex digits 62 * 63 * Note: This table is basically the inverse of the string-to-offset table 64 * found in the ACPI spec in the description of the ToUUID macro. 65 */ 66 static UINT8 Gbl_MapToUuidOffset[16] = 67 { 68 6,4,2,0,11,9,16,14,19,21,24,26,28,30,32,34 69 }; 70 71 #define UUID_BUFFER_LENGTH 16 72 #define UUID_STRING_LENGTH 36 73 74 /* Positions for required hyphens (dashes) in UUID strings */ 75 76 #define UUID_HYPHEN1_OFFSET 8 77 #define UUID_HYPHEN2_OFFSET 13 78 #define UUID_HYPHEN3_OFFSET 18 79 #define UUID_HYPHEN4_OFFSET 23 80 81 82 /******************************************************************************* 83 * 84 * FUNCTION: AuValiduateUuid 85 * 86 * PARAMETERS: InString - 36-byte formatted UUID string 87 * 88 * RETURN: Status 89 * 90 * DESCRIPTION: Check all 36 characters for correct format 91 * 92 ******************************************************************************/ 93 94 ACPI_STATUS 95 AuValidateUuid ( 96 char *InString) 97 { 98 UINT32 i; 99 100 101 if (!InString || (ACPI_STRLEN (InString) != UUID_STRING_LENGTH)) 102 { 103 return (AE_BAD_PARAMETER); 104 } 105 106 /* Check all 36 characters for correct format */ 107 108 for (i = 0; i < UUID_STRING_LENGTH; i++) 109 { 110 /* Must have 4 hyphens (dashes) in these positions: */ 111 112 if ((i == UUID_HYPHEN1_OFFSET) || 113 (i == UUID_HYPHEN2_OFFSET) || 114 (i == UUID_HYPHEN3_OFFSET) || 115 (i == UUID_HYPHEN4_OFFSET)) 116 { 117 if (InString[i] != '-') 118 { 119 return (AE_BAD_PARAMETER); 120 } 121 } 122 123 /* All other positions must contain hex digits */ 124 125 else 126 { 127 if (!isxdigit ((int) InString[i])) 128 { 129 return (AE_BAD_PARAMETER); 130 } 131 } 132 } 133 134 return (AE_OK); 135 } 136 137 138 /******************************************************************************* 139 * 140 * FUNCTION: AuConvertStringToUuid 141 * 142 * PARAMETERS: InString - 36-byte formatted UUID string 143 * UuidBuffer - 16-byte UUID buffer 144 * 145 * RETURN: Status 146 * 147 * DESCRIPTION: Convert 36-byte formatted UUID string to 16-byte UUID buffer 148 * 149 ******************************************************************************/ 150 151 ACPI_STATUS 152 AuConvertStringToUuid ( 153 char *InString, 154 char *UuidBuffer) 155 { 156 UINT32 i; 157 158 159 if (!InString || !UuidBuffer) 160 { 161 return (AE_BAD_PARAMETER); 162 } 163 164 for (i = 0; i < UUID_BUFFER_LENGTH; i++) 165 { 166 UuidBuffer[i] = (char) (UtHexCharToValue (InString[Gbl_MapToUuidOffset[i]]) << 4); 167 UuidBuffer[i] |= (char) UtHexCharToValue (InString[Gbl_MapToUuidOffset[i] + 1]); 168 } 169 170 return (AE_OK); 171 } 172 173 174 /******************************************************************************* 175 * 176 * FUNCTION: AuConvertUuidToString 177 * 178 * PARAMETERS: UuidBuffer - 16-byte UUID buffer 179 * OutString - 36-byte formatted UUID string 180 * 181 * RETURN: Status 182 * 183 * DESCRIPTION: Convert 16-byte UUID buffer to 36-byte formatted UUID string 184 * OutString must be 37 bytes to include null terminator. 185 * 186 ******************************************************************************/ 187 188 ACPI_STATUS 189 AuConvertUuidToString ( 190 char *UuidBuffer, 191 char *OutString) 192 { 193 UINT32 i; 194 195 196 if (!UuidBuffer || !OutString) 197 { 198 return (AE_BAD_PARAMETER); 199 } 200 201 for (i = 0; i < UUID_BUFFER_LENGTH; i++) 202 { 203 OutString[Gbl_MapToUuidOffset[i]] = (UINT8) AslHexLookup[(UuidBuffer[i] >> 4) & 0xF]; 204 OutString[Gbl_MapToUuidOffset[i] + 1] = (UINT8) AslHexLookup[UuidBuffer[i] & 0xF]; 205 } 206 207 /* Insert required hyphens (dashes) */ 208 209 OutString[UUID_HYPHEN1_OFFSET] = 210 OutString[UUID_HYPHEN2_OFFSET] = 211 OutString[UUID_HYPHEN3_OFFSET] = 212 OutString[UUID_HYPHEN4_OFFSET] = '-'; 213 214 OutString[UUID_STRING_LENGTH] = 0; /* Null terminate */ 215 return (AE_OK); 216 }