1217355Sjkim/****************************************************************************** 2217355Sjkim * 3217355Sjkim * Module Name: asluuid-- compiler UUID support 4217355Sjkim * 5217355Sjkim *****************************************************************************/ 6217355Sjkim 7217355Sjkim/* 8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp. 9217355Sjkim * All rights reserved. 10217355Sjkim * 11217355Sjkim * Redistribution and use in source and binary forms, with or without 12217355Sjkim * modification, are permitted provided that the following conditions 13217355Sjkim * are met: 14217355Sjkim * 1. Redistributions of source code must retain the above copyright 15217355Sjkim * notice, this list of conditions, and the following disclaimer, 16217355Sjkim * without modification. 17217355Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217355Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217355Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217355Sjkim * including a substantially similar Disclaimer requirement for further 21217355Sjkim * binary redistribution. 22217355Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217355Sjkim * of any contributors may be used to endorse or promote products derived 24217355Sjkim * from this software without specific prior written permission. 25217355Sjkim * 26217355Sjkim * Alternatively, this software may be distributed under the terms of the 27217355Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217355Sjkim * Software Foundation. 29217355Sjkim * 30217355Sjkim * NO WARRANTY 31217355Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217355Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217355Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217355Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217355Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217355Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217355Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217355Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217355Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217355Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217355Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217355Sjkim */ 43217355Sjkim 44217355Sjkim 45217365Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 46217355Sjkim 47217355Sjkim#define _COMPONENT ACPI_COMPILER 48217355Sjkim ACPI_MODULE_NAME ("asluuid") 49217355Sjkim 50217355Sjkim 51217355Sjkim/* 52217355Sjkim * UUID support functions. 53217355Sjkim * 54217355Sjkim * This table is used to convert an input UUID ascii string to a 16 byte 55217355Sjkim * buffer and the reverse. The table maps a UUID buffer index 0-15 to 56217355Sjkim * the index within the 36-byte UUID string where the associated 2-byte 57217355Sjkim * hex value can be found. 58217355Sjkim * 59217355Sjkim * 36-byte UUID strings are of the form: 60217355Sjkim * aabbccdd-eeff-gghh-iijj-kkllmmnnoopp 61217355Sjkim * Where aa-pp are one byte hex numbers, made up of two hex digits 62217355Sjkim * 63217355Sjkim * Note: This table is basically the inverse of the string-to-offset table 64217355Sjkim * found in the ACPI spec in the description of the ToUUID macro. 65217355Sjkim */ 66217355Sjkimstatic UINT8 Gbl_MapToUuidOffset[16] = 67217355Sjkim{ 68217355Sjkim 6,4,2,0,11,9,16,14,19,21,24,26,28,30,32,34 69217355Sjkim}; 70217355Sjkim 71217355Sjkim#define UUID_BUFFER_LENGTH 16 72217355Sjkim#define UUID_STRING_LENGTH 36 73217355Sjkim 74217355Sjkim/* Positions for required hyphens (dashes) in UUID strings */ 75217355Sjkim 76217355Sjkim#define UUID_HYPHEN1_OFFSET 8 77217355Sjkim#define UUID_HYPHEN2_OFFSET 13 78217355Sjkim#define UUID_HYPHEN3_OFFSET 18 79217355Sjkim#define UUID_HYPHEN4_OFFSET 23 80217355Sjkim 81217355Sjkim 82217355Sjkim/******************************************************************************* 83217355Sjkim * 84217355Sjkim * FUNCTION: AuValiduateUuid 85217355Sjkim * 86217355Sjkim * PARAMETERS: InString - 36-byte formatted UUID string 87217355Sjkim * 88217355Sjkim * RETURN: Status 89217355Sjkim * 90217355Sjkim * DESCRIPTION: Check all 36 characters for correct format 91217355Sjkim * 92217355Sjkim ******************************************************************************/ 93217355Sjkim 94217355SjkimACPI_STATUS 95217355SjkimAuValidateUuid ( 96217355Sjkim char *InString) 97217355Sjkim{ 98217355Sjkim UINT32 i; 99217355Sjkim 100217355Sjkim 101217355Sjkim if (!InString || (ACPI_STRLEN (InString) != UUID_STRING_LENGTH)) 102217355Sjkim { 103217355Sjkim return (AE_BAD_PARAMETER); 104217355Sjkim } 105217355Sjkim 106217355Sjkim /* Check all 36 characters for correct format */ 107217355Sjkim 108217355Sjkim for (i = 0; i < UUID_STRING_LENGTH; i++) 109217355Sjkim { 110217355Sjkim /* Must have 4 hyphens (dashes) in these positions: */ 111217355Sjkim 112217355Sjkim if ((i == UUID_HYPHEN1_OFFSET) || 113217355Sjkim (i == UUID_HYPHEN2_OFFSET) || 114217355Sjkim (i == UUID_HYPHEN3_OFFSET) || 115217355Sjkim (i == UUID_HYPHEN4_OFFSET)) 116217355Sjkim { 117217355Sjkim if (InString[i] != '-') 118217355Sjkim { 119217355Sjkim return (AE_BAD_PARAMETER); 120217355Sjkim } 121217355Sjkim } 122217355Sjkim 123217355Sjkim /* All other positions must contain hex digits */ 124217355Sjkim 125217355Sjkim else 126217355Sjkim { 127217355Sjkim if (!isxdigit ((int) InString[i])) 128217355Sjkim { 129217355Sjkim return (AE_BAD_PARAMETER); 130217355Sjkim } 131217355Sjkim } 132217355Sjkim } 133217355Sjkim 134217355Sjkim return (AE_OK); 135217355Sjkim} 136217355Sjkim 137217355Sjkim 138217355Sjkim/******************************************************************************* 139217355Sjkim * 140217355Sjkim * FUNCTION: AuConvertStringToUuid 141217355Sjkim * 142217355Sjkim * PARAMETERS: InString - 36-byte formatted UUID string 143217355Sjkim * UuidBuffer - 16-byte UUID buffer 144217355Sjkim * 145217355Sjkim * RETURN: Status 146217355Sjkim * 147217355Sjkim * DESCRIPTION: Convert 36-byte formatted UUID string to 16-byte UUID buffer 148217355Sjkim * 149217355Sjkim ******************************************************************************/ 150217355Sjkim 151217355SjkimACPI_STATUS 152217355SjkimAuConvertStringToUuid ( 153217355Sjkim char *InString, 154217355Sjkim char *UuidBuffer) 155217355Sjkim{ 156217355Sjkim UINT32 i; 157217355Sjkim 158217355Sjkim 159217355Sjkim if (!InString || !UuidBuffer) 160217355Sjkim { 161217355Sjkim return (AE_BAD_PARAMETER); 162217355Sjkim } 163217355Sjkim 164217355Sjkim for (i = 0; i < UUID_BUFFER_LENGTH; i++) 165217355Sjkim { 166217355Sjkim UuidBuffer[i] = (char) (UtHexCharToValue (InString[Gbl_MapToUuidOffset[i]]) << 4); 167217355Sjkim UuidBuffer[i] |= (char) UtHexCharToValue (InString[Gbl_MapToUuidOffset[i] + 1]); 168217355Sjkim } 169217355Sjkim 170217355Sjkim return (AE_OK); 171217355Sjkim} 172217355Sjkim 173217355Sjkim 174217355Sjkim/******************************************************************************* 175217355Sjkim * 176217355Sjkim * FUNCTION: AuConvertUuidToString 177217355Sjkim * 178217355Sjkim * PARAMETERS: UuidBuffer - 16-byte UUID buffer 179217355Sjkim * OutString - 36-byte formatted UUID string 180217355Sjkim * 181217355Sjkim * RETURN: Status 182217355Sjkim * 183217355Sjkim * DESCRIPTION: Convert 16-byte UUID buffer to 36-byte formatted UUID string 184217355Sjkim * OutString must be 37 bytes to include null terminator. 185217355Sjkim * 186217355Sjkim ******************************************************************************/ 187217355Sjkim 188217355SjkimACPI_STATUS 189217355SjkimAuConvertUuidToString ( 190217355Sjkim char *UuidBuffer, 191217355Sjkim char *OutString) 192217355Sjkim{ 193217355Sjkim UINT32 i; 194217355Sjkim 195217355Sjkim 196217355Sjkim if (!UuidBuffer || !OutString) 197217355Sjkim { 198217355Sjkim return (AE_BAD_PARAMETER); 199217355Sjkim } 200217355Sjkim 201217355Sjkim for (i = 0; i < UUID_BUFFER_LENGTH; i++) 202217355Sjkim { 203217355Sjkim OutString[Gbl_MapToUuidOffset[i]] = (UINT8) AslHexLookup[(UuidBuffer[i] >> 4) & 0xF]; 204217355Sjkim OutString[Gbl_MapToUuidOffset[i] + 1] = (UINT8) AslHexLookup[UuidBuffer[i] & 0xF]; 205217355Sjkim } 206217355Sjkim 207217355Sjkim /* Insert required hyphens (dashes) */ 208217355Sjkim 209217355Sjkim OutString[UUID_HYPHEN1_OFFSET] = 210217355Sjkim OutString[UUID_HYPHEN2_OFFSET] = 211217355Sjkim OutString[UUID_HYPHEN3_OFFSET] = 212217355Sjkim OutString[UUID_HYPHEN4_OFFSET] = '-'; 213217355Sjkim 214217355Sjkim OutString[UUID_STRING_LENGTH] = 0; /* Null terminate */ 215217355Sjkim return (AE_OK); 216217355Sjkim} 217