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