xref: /freebsd/sys/contrib/dev/acpica/compiler/dtfield.c (revision a88e22b7ad0a8400875be9c3d02d09d0a8010b9c)
1*a88e22b7SJung-uk Kim /******************************************************************************
2*a88e22b7SJung-uk Kim  *
3*a88e22b7SJung-uk Kim  * Module Name: dtfield.c - Code generation for individual source fields
4*a88e22b7SJung-uk Kim  *
5*a88e22b7SJung-uk Kim  *****************************************************************************/
6*a88e22b7SJung-uk Kim 
7*a88e22b7SJung-uk Kim /******************************************************************************
8*a88e22b7SJung-uk Kim  *
9*a88e22b7SJung-uk Kim  * 1. Copyright Notice
10*a88e22b7SJung-uk Kim  *
11*a88e22b7SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
12*a88e22b7SJung-uk Kim  * All rights reserved.
13*a88e22b7SJung-uk Kim  *
14*a88e22b7SJung-uk Kim  * 2. License
15*a88e22b7SJung-uk Kim  *
16*a88e22b7SJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
17*a88e22b7SJung-uk Kim  * rights.  You may have additional license terms from the party that provided
18*a88e22b7SJung-uk Kim  * you this software, covering your right to use that party's intellectual
19*a88e22b7SJung-uk Kim  * property rights.
20*a88e22b7SJung-uk Kim  *
21*a88e22b7SJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*a88e22b7SJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
23*a88e22b7SJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*a88e22b7SJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*a88e22b7SJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
26*a88e22b7SJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
27*a88e22b7SJung-uk Kim  *
28*a88e22b7SJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*a88e22b7SJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
30*a88e22b7SJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*a88e22b7SJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
32*a88e22b7SJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
33*a88e22b7SJung-uk Kim  * license, and in no event shall the patent license extend to any additions
34*a88e22b7SJung-uk Kim  * to or modifications of the Original Intel Code.  No other license or right
35*a88e22b7SJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
36*a88e22b7SJung-uk Kim  *
37*a88e22b7SJung-uk Kim  * The above copyright and patent license is granted only if the following
38*a88e22b7SJung-uk Kim  * conditions are met:
39*a88e22b7SJung-uk Kim  *
40*a88e22b7SJung-uk Kim  * 3. Conditions
41*a88e22b7SJung-uk Kim  *
42*a88e22b7SJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*a88e22b7SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
44*a88e22b7SJung-uk Kim  * Code or modification with rights to further distribute source must include
45*a88e22b7SJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
46*a88e22b7SJung-uk Kim  * and the following Disclaimer and Export Compliance provision.  In addition,
47*a88e22b7SJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
48*a88e22b7SJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
49*a88e22b7SJung-uk Kim  * Code and the date of any change.  Licensee must include in that file the
50*a88e22b7SJung-uk Kim  * documentation of any changes made by any predecessor Licensee.  Licensee
51*a88e22b7SJung-uk Kim  * must include a prominent statement that the modification is derived,
52*a88e22b7SJung-uk Kim  * directly or indirectly, from Original Intel Code.
53*a88e22b7SJung-uk Kim  *
54*a88e22b7SJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*a88e22b7SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
56*a88e22b7SJung-uk Kim  * Code or modification without rights to further distribute source must
57*a88e22b7SJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
58*a88e22b7SJung-uk Kim  * documentation and/or other materials provided with distribution.  In
59*a88e22b7SJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
60*a88e22b7SJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
61*a88e22b7SJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
62*a88e22b7SJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
63*a88e22b7SJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
64*a88e22b7SJung-uk Kim  * make.
65*a88e22b7SJung-uk Kim  *
66*a88e22b7SJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*a88e22b7SJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
68*a88e22b7SJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*a88e22b7SJung-uk Kim  * provision in the documentation and/or other materials provided with the
70*a88e22b7SJung-uk Kim  * distribution.
71*a88e22b7SJung-uk Kim  *
72*a88e22b7SJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
73*a88e22b7SJung-uk Kim  * Intel Code.
74*a88e22b7SJung-uk Kim  *
75*a88e22b7SJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*a88e22b7SJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*a88e22b7SJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
78*a88e22b7SJung-uk Kim  * without prior written authorization from Intel.
79*a88e22b7SJung-uk Kim  *
80*a88e22b7SJung-uk Kim  * 4. Disclaimer and Export Compliance
81*a88e22b7SJung-uk Kim  *
82*a88e22b7SJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*a88e22b7SJung-uk Kim  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*a88e22b7SJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85*a88e22b7SJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86*a88e22b7SJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87*a88e22b7SJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*a88e22b7SJung-uk Kim  * PARTICULAR PURPOSE.
89*a88e22b7SJung-uk Kim  *
90*a88e22b7SJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*a88e22b7SJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*a88e22b7SJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*a88e22b7SJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*a88e22b7SJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*a88e22b7SJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96*a88e22b7SJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*a88e22b7SJung-uk Kim  * LIMITED REMEDY.
98*a88e22b7SJung-uk Kim  *
99*a88e22b7SJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*a88e22b7SJung-uk Kim  * software or system incorporating such software without first obtaining any
101*a88e22b7SJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
102*a88e22b7SJung-uk Kim  * any other agency or department of the United States Government.  In the
103*a88e22b7SJung-uk Kim  * event Licensee exports any such software from the United States or
104*a88e22b7SJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
105*a88e22b7SJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
106*a88e22b7SJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
107*a88e22b7SJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*a88e22b7SJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
109*a88e22b7SJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
110*a88e22b7SJung-uk Kim  * United States government or any agency thereof requires an export license,
111*a88e22b7SJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
112*a88e22b7SJung-uk Kim  * such license, approval or letter.
113*a88e22b7SJung-uk Kim  *
114*a88e22b7SJung-uk Kim  *****************************************************************************/
115*a88e22b7SJung-uk Kim 
116*a88e22b7SJung-uk Kim #define __DTFIELD_C__
117*a88e22b7SJung-uk Kim 
118*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
119*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h>
120*a88e22b7SJung-uk Kim 
121*a88e22b7SJung-uk Kim #define _COMPONENT          DT_COMPILER
122*a88e22b7SJung-uk Kim         ACPI_MODULE_NAME    ("dtfield")
123*a88e22b7SJung-uk Kim 
124*a88e22b7SJung-uk Kim 
125*a88e22b7SJung-uk Kim /* Local prototypes */
126*a88e22b7SJung-uk Kim 
127*a88e22b7SJung-uk Kim static void
128*a88e22b7SJung-uk Kim DtCompileString (
129*a88e22b7SJung-uk Kim     UINT8                   *Buffer,
130*a88e22b7SJung-uk Kim     DT_FIELD                *Field,
131*a88e22b7SJung-uk Kim     UINT32                  ByteLength);
132*a88e22b7SJung-uk Kim 
133*a88e22b7SJung-uk Kim static char *
134*a88e22b7SJung-uk Kim DtNormalizeBuffer (
135*a88e22b7SJung-uk Kim     char                    *Buffer,
136*a88e22b7SJung-uk Kim     UINT32                  *Count);
137*a88e22b7SJung-uk Kim 
138*a88e22b7SJung-uk Kim 
139*a88e22b7SJung-uk Kim /******************************************************************************
140*a88e22b7SJung-uk Kim  *
141*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileOneField
142*a88e22b7SJung-uk Kim  *
143*a88e22b7SJung-uk Kim  * PARAMETERS:  Buffer              - Output buffer
144*a88e22b7SJung-uk Kim  *              Field               - Field to be compiled
145*a88e22b7SJung-uk Kim  *              ByteLength          - Byte length of the field
146*a88e22b7SJung-uk Kim  *              Type                - Field type
147*a88e22b7SJung-uk Kim  *
148*a88e22b7SJung-uk Kim  * RETURN:      None
149*a88e22b7SJung-uk Kim  *
150*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile a field value to binary
151*a88e22b7SJung-uk Kim  *
152*a88e22b7SJung-uk Kim  *****************************************************************************/
153*a88e22b7SJung-uk Kim 
154*a88e22b7SJung-uk Kim void
155*a88e22b7SJung-uk Kim DtCompileOneField (
156*a88e22b7SJung-uk Kim     UINT8                   *Buffer,
157*a88e22b7SJung-uk Kim     DT_FIELD                *Field,
158*a88e22b7SJung-uk Kim     UINT32                  ByteLength,
159*a88e22b7SJung-uk Kim     UINT8                   Type,
160*a88e22b7SJung-uk Kim     UINT8                   Flags)
161*a88e22b7SJung-uk Kim {
162*a88e22b7SJung-uk Kim 
163*a88e22b7SJung-uk Kim     switch (Type)
164*a88e22b7SJung-uk Kim     {
165*a88e22b7SJung-uk Kim     case DT_FIELD_TYPE_INTEGER:
166*a88e22b7SJung-uk Kim         DtCompileInteger (Buffer, Field, ByteLength, Flags);
167*a88e22b7SJung-uk Kim         break;
168*a88e22b7SJung-uk Kim 
169*a88e22b7SJung-uk Kim     case DT_FIELD_TYPE_STRING:
170*a88e22b7SJung-uk Kim         DtCompileString (Buffer, Field, ByteLength);
171*a88e22b7SJung-uk Kim         break;
172*a88e22b7SJung-uk Kim 
173*a88e22b7SJung-uk Kim     case DT_FIELD_TYPE_BUFFER:
174*a88e22b7SJung-uk Kim         DtCompileBuffer (Buffer, Field->Value, Field, ByteLength);
175*a88e22b7SJung-uk Kim         break;
176*a88e22b7SJung-uk Kim 
177*a88e22b7SJung-uk Kim     default:
178*a88e22b7SJung-uk Kim         DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type");
179*a88e22b7SJung-uk Kim         break;
180*a88e22b7SJung-uk Kim     }
181*a88e22b7SJung-uk Kim }
182*a88e22b7SJung-uk Kim 
183*a88e22b7SJung-uk Kim 
184*a88e22b7SJung-uk Kim /******************************************************************************
185*a88e22b7SJung-uk Kim  *
186*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileString
187*a88e22b7SJung-uk Kim  *
188*a88e22b7SJung-uk Kim  * PARAMETERS:  Buffer              - Output buffer
189*a88e22b7SJung-uk Kim  *              Field               - String to be copied to buffer
190*a88e22b7SJung-uk Kim  *              ByteLength          - Maximum length of string
191*a88e22b7SJung-uk Kim  *
192*a88e22b7SJung-uk Kim  * RETURN:      None
193*a88e22b7SJung-uk Kim  *
194*a88e22b7SJung-uk Kim  * DESCRIPTION: Copy string to the buffer
195*a88e22b7SJung-uk Kim  *
196*a88e22b7SJung-uk Kim  *****************************************************************************/
197*a88e22b7SJung-uk Kim 
198*a88e22b7SJung-uk Kim static void
199*a88e22b7SJung-uk Kim DtCompileString (
200*a88e22b7SJung-uk Kim     UINT8                   *Buffer,
201*a88e22b7SJung-uk Kim     DT_FIELD                *Field,
202*a88e22b7SJung-uk Kim     UINT32                  ByteLength)
203*a88e22b7SJung-uk Kim {
204*a88e22b7SJung-uk Kim     UINT32                  Length;
205*a88e22b7SJung-uk Kim 
206*a88e22b7SJung-uk Kim 
207*a88e22b7SJung-uk Kim     Length = ACPI_STRLEN (Field->Value);
208*a88e22b7SJung-uk Kim 
209*a88e22b7SJung-uk Kim     /* Check if the string is too long for the field */
210*a88e22b7SJung-uk Kim 
211*a88e22b7SJung-uk Kim     if (Length > ByteLength)
212*a88e22b7SJung-uk Kim     {
213*a88e22b7SJung-uk Kim         sprintf (MsgBuffer, "Maximum %u characters", ByteLength);
214*a88e22b7SJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_STRING_LENGTH, Field, MsgBuffer);
215*a88e22b7SJung-uk Kim         Length = ByteLength;
216*a88e22b7SJung-uk Kim     }
217*a88e22b7SJung-uk Kim 
218*a88e22b7SJung-uk Kim     ACPI_MEMCPY (Buffer, Field->Value, Length);
219*a88e22b7SJung-uk Kim }
220*a88e22b7SJung-uk Kim 
221*a88e22b7SJung-uk Kim 
222*a88e22b7SJung-uk Kim /******************************************************************************
223*a88e22b7SJung-uk Kim  *
224*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileInteger
225*a88e22b7SJung-uk Kim  *
226*a88e22b7SJung-uk Kim  * PARAMETERS:  Buffer              - Output buffer
227*a88e22b7SJung-uk Kim  *              Field               - Field obj with Integer to be compiled
228*a88e22b7SJung-uk Kim  *              ByteLength          - Byte length of the integer
229*a88e22b7SJung-uk Kim  *
230*a88e22b7SJung-uk Kim  * RETURN:      None
231*a88e22b7SJung-uk Kim  *
232*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile an integer
233*a88e22b7SJung-uk Kim  *
234*a88e22b7SJung-uk Kim  *****************************************************************************/
235*a88e22b7SJung-uk Kim 
236*a88e22b7SJung-uk Kim void
237*a88e22b7SJung-uk Kim DtCompileInteger (
238*a88e22b7SJung-uk Kim     UINT8                   *Buffer,
239*a88e22b7SJung-uk Kim     DT_FIELD                *Field,
240*a88e22b7SJung-uk Kim     UINT32                  ByteLength,
241*a88e22b7SJung-uk Kim     UINT8                   Flags)
242*a88e22b7SJung-uk Kim {
243*a88e22b7SJung-uk Kim     UINT64                  Value = 0;
244*a88e22b7SJung-uk Kim     UINT64                  MaxValue;
245*a88e22b7SJung-uk Kim     UINT8                   *Hex;
246*a88e22b7SJung-uk Kim     char                    *Message = NULL;
247*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
248*a88e22b7SJung-uk Kim     int                     i;
249*a88e22b7SJung-uk Kim 
250*a88e22b7SJung-uk Kim 
251*a88e22b7SJung-uk Kim     /* Byte length must be in range 1-8 */
252*a88e22b7SJung-uk Kim 
253*a88e22b7SJung-uk Kim     if ((ByteLength > 8) || (ByteLength == 0))
254*a88e22b7SJung-uk Kim     {
255*a88e22b7SJung-uk Kim         DtFatal (ASL_MSG_COMPILER_INTERNAL, Field,
256*a88e22b7SJung-uk Kim             "Invalid internal Byte length");
257*a88e22b7SJung-uk Kim         return;
258*a88e22b7SJung-uk Kim     }
259*a88e22b7SJung-uk Kim 
260*a88e22b7SJung-uk Kim     /* Convert string to an actual integer */
261*a88e22b7SJung-uk Kim 
262*a88e22b7SJung-uk Kim     Status = DtStrtoul64 (Field->Value, &Value);
263*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
264*a88e22b7SJung-uk Kim     {
265*a88e22b7SJung-uk Kim         if (Status == AE_LIMIT)
266*a88e22b7SJung-uk Kim         {
267*a88e22b7SJung-uk Kim             Message = "Constant larger than 64 bits";
268*a88e22b7SJung-uk Kim         }
269*a88e22b7SJung-uk Kim         else if (Status == AE_BAD_CHARACTER)
270*a88e22b7SJung-uk Kim         {
271*a88e22b7SJung-uk Kim             Message = "Invalid character in constant";
272*a88e22b7SJung-uk Kim         }
273*a88e22b7SJung-uk Kim 
274*a88e22b7SJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, Message);
275*a88e22b7SJung-uk Kim         goto Exit;
276*a88e22b7SJung-uk Kim     }
277*a88e22b7SJung-uk Kim 
278*a88e22b7SJung-uk Kim     /* Ensure that reserved fields are set to zero */
279*a88e22b7SJung-uk Kim     /* TBD: should we set to zero, or just make this an ERROR? */
280*a88e22b7SJung-uk Kim     /* TBD: Probably better to use a flag */
281*a88e22b7SJung-uk Kim 
282*a88e22b7SJung-uk Kim     if (!ACPI_STRCMP (Field->Name, "Reserved") &&
283*a88e22b7SJung-uk Kim         (Value != 0))
284*a88e22b7SJung-uk Kim     {
285*a88e22b7SJung-uk Kim         DtError (ASL_WARNING, ASL_MSG_RESERVED_VALUE, Field,
286*a88e22b7SJung-uk Kim             "Setting to zero");
287*a88e22b7SJung-uk Kim         Value = 0;
288*a88e22b7SJung-uk Kim     }
289*a88e22b7SJung-uk Kim 
290*a88e22b7SJung-uk Kim     /* Check if the value must be non-zero */
291*a88e22b7SJung-uk Kim 
292*a88e22b7SJung-uk Kim     if ((Value == 0) && (Flags & DT_NON_ZERO))
293*a88e22b7SJung-uk Kim     {
294*a88e22b7SJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_ZERO_VALUE, Field, NULL);
295*a88e22b7SJung-uk Kim     }
296*a88e22b7SJung-uk Kim 
297*a88e22b7SJung-uk Kim     /*
298*a88e22b7SJung-uk Kim      * Generate the maximum value for the data type (ByteLength)
299*a88e22b7SJung-uk Kim      * Note: construct chosen for maximum portability
300*a88e22b7SJung-uk Kim      */
301*a88e22b7SJung-uk Kim     MaxValue = ((UINT64) (-1)) >> (64 - (ByteLength * 8));
302*a88e22b7SJung-uk Kim 
303*a88e22b7SJung-uk Kim     /* Validate that the input value is within range of the target */
304*a88e22b7SJung-uk Kim 
305*a88e22b7SJung-uk Kim     if (Value > MaxValue)
306*a88e22b7SJung-uk Kim     {
307*a88e22b7SJung-uk Kim         sprintf (MsgBuffer, "Maximum %u bytes", ByteLength);
308*a88e22b7SJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_INTEGER_SIZE, Field, MsgBuffer);
309*a88e22b7SJung-uk Kim     }
310*a88e22b7SJung-uk Kim 
311*a88e22b7SJung-uk Kim     /*
312*a88e22b7SJung-uk Kim      * TBD: hard code for ASF! Capabilites field.
313*a88e22b7SJung-uk Kim      *
314*a88e22b7SJung-uk Kim      * This field is actually a buffer, not a 56-bit integer --
315*a88e22b7SJung-uk Kim      * so, the ordering is reversed. Something should be fixed
316*a88e22b7SJung-uk Kim      * so we don't need this code.
317*a88e22b7SJung-uk Kim      */
318*a88e22b7SJung-uk Kim     if (ByteLength == 7)
319*a88e22b7SJung-uk Kim     {
320*a88e22b7SJung-uk Kim         Hex = ACPI_CAST_PTR (UINT8, &Value);
321*a88e22b7SJung-uk Kim         for (i = 6; i >= 0; i--)
322*a88e22b7SJung-uk Kim         {
323*a88e22b7SJung-uk Kim             Buffer[i] = *Hex;
324*a88e22b7SJung-uk Kim             Hex++;
325*a88e22b7SJung-uk Kim         }
326*a88e22b7SJung-uk Kim         return;
327*a88e22b7SJung-uk Kim     }
328*a88e22b7SJung-uk Kim 
329*a88e22b7SJung-uk Kim Exit:
330*a88e22b7SJung-uk Kim     ACPI_MEMCPY (Buffer, &Value, ByteLength);
331*a88e22b7SJung-uk Kim     return;
332*a88e22b7SJung-uk Kim }
333*a88e22b7SJung-uk Kim 
334*a88e22b7SJung-uk Kim 
335*a88e22b7SJung-uk Kim /******************************************************************************
336*a88e22b7SJung-uk Kim  *
337*a88e22b7SJung-uk Kim  * FUNCTION:    DtNormalizeBuffer
338*a88e22b7SJung-uk Kim  *
339*a88e22b7SJung-uk Kim  * PARAMETERS:  Buffer              - Input buffer
340*a88e22b7SJung-uk Kim  *              Count               - Output the count of hex number in
341*a88e22b7SJung-uk Kim  *                                    the Buffer
342*a88e22b7SJung-uk Kim  *
343*a88e22b7SJung-uk Kim  * RETURN:      The normalized buffer, freed by caller
344*a88e22b7SJung-uk Kim  *
345*a88e22b7SJung-uk Kim  * DESCRIPTION: [1A,2B,3C,4D] or 1A, 2B, 3C, 4D will be normalized
346*a88e22b7SJung-uk Kim  *              to 1A 2B 3C 4D
347*a88e22b7SJung-uk Kim  *
348*a88e22b7SJung-uk Kim  *****************************************************************************/
349*a88e22b7SJung-uk Kim 
350*a88e22b7SJung-uk Kim static char *
351*a88e22b7SJung-uk Kim DtNormalizeBuffer (
352*a88e22b7SJung-uk Kim     char                    *Buffer,
353*a88e22b7SJung-uk Kim     UINT32                  *Count)
354*a88e22b7SJung-uk Kim {
355*a88e22b7SJung-uk Kim     char                    *NewBuffer;
356*a88e22b7SJung-uk Kim     char                    *TmpBuffer;
357*a88e22b7SJung-uk Kim     UINT32                  BufferCount = 0;
358*a88e22b7SJung-uk Kim     BOOLEAN                 Separator = TRUE;
359*a88e22b7SJung-uk Kim     char                    c;
360*a88e22b7SJung-uk Kim 
361*a88e22b7SJung-uk Kim 
362*a88e22b7SJung-uk Kim     NewBuffer = UtLocalCalloc (ACPI_STRLEN (Buffer) + 1);
363*a88e22b7SJung-uk Kim     TmpBuffer = NewBuffer;
364*a88e22b7SJung-uk Kim 
365*a88e22b7SJung-uk Kim     while ((c = *Buffer++))
366*a88e22b7SJung-uk Kim     {
367*a88e22b7SJung-uk Kim         switch (c)
368*a88e22b7SJung-uk Kim         {
369*a88e22b7SJung-uk Kim         /* Valid separators */
370*a88e22b7SJung-uk Kim 
371*a88e22b7SJung-uk Kim         case '[':
372*a88e22b7SJung-uk Kim         case ']':
373*a88e22b7SJung-uk Kim         case ' ':
374*a88e22b7SJung-uk Kim         case ',':
375*a88e22b7SJung-uk Kim             Separator = TRUE;
376*a88e22b7SJung-uk Kim             break;
377*a88e22b7SJung-uk Kim 
378*a88e22b7SJung-uk Kim         default:
379*a88e22b7SJung-uk Kim             if (Separator)
380*a88e22b7SJung-uk Kim             {
381*a88e22b7SJung-uk Kim                 /* Insert blank as the standard separator */
382*a88e22b7SJung-uk Kim 
383*a88e22b7SJung-uk Kim                 if (NewBuffer[0])
384*a88e22b7SJung-uk Kim                 {
385*a88e22b7SJung-uk Kim                     *TmpBuffer++ = ' ';
386*a88e22b7SJung-uk Kim                     BufferCount++;
387*a88e22b7SJung-uk Kim                 }
388*a88e22b7SJung-uk Kim 
389*a88e22b7SJung-uk Kim                 Separator = FALSE;
390*a88e22b7SJung-uk Kim             }
391*a88e22b7SJung-uk Kim 
392*a88e22b7SJung-uk Kim             *TmpBuffer++ = c;
393*a88e22b7SJung-uk Kim             break;
394*a88e22b7SJung-uk Kim         }
395*a88e22b7SJung-uk Kim     }
396*a88e22b7SJung-uk Kim 
397*a88e22b7SJung-uk Kim     *Count = BufferCount + 1;
398*a88e22b7SJung-uk Kim     return (NewBuffer);
399*a88e22b7SJung-uk Kim }
400*a88e22b7SJung-uk Kim 
401*a88e22b7SJung-uk Kim 
402*a88e22b7SJung-uk Kim /******************************************************************************
403*a88e22b7SJung-uk Kim  *
404*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileBuffer
405*a88e22b7SJung-uk Kim  *
406*a88e22b7SJung-uk Kim  * PARAMETERS:  Buffer              - Output buffer
407*a88e22b7SJung-uk Kim  *              StringValue         - Integer list to be compiled
408*a88e22b7SJung-uk Kim  *              Field               - Current field object
409*a88e22b7SJung-uk Kim  *              ByteLength          - Byte length of the integer list
410*a88e22b7SJung-uk Kim  *
411*a88e22b7SJung-uk Kim  * RETURN:      Count of remaining data in the input list
412*a88e22b7SJung-uk Kim  *
413*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile and pack an integer list, for example
414*a88e22b7SJung-uk Kim  *              "AA 1F 20 3B" ==> Buffer[] = {0xAA,0x1F,0x20,0x3B}
415*a88e22b7SJung-uk Kim  *
416*a88e22b7SJung-uk Kim  *****************************************************************************/
417*a88e22b7SJung-uk Kim 
418*a88e22b7SJung-uk Kim UINT32
419*a88e22b7SJung-uk Kim DtCompileBuffer (
420*a88e22b7SJung-uk Kim     UINT8                   *Buffer,
421*a88e22b7SJung-uk Kim     char                    *StringValue,
422*a88e22b7SJung-uk Kim     DT_FIELD                *Field,
423*a88e22b7SJung-uk Kim     UINT32                  ByteLength)
424*a88e22b7SJung-uk Kim {
425*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
426*a88e22b7SJung-uk Kim     char                    Hex[3];
427*a88e22b7SJung-uk Kim     UINT64                  Value;
428*a88e22b7SJung-uk Kim     UINT32                  i;
429*a88e22b7SJung-uk Kim     UINT32                  Count;
430*a88e22b7SJung-uk Kim 
431*a88e22b7SJung-uk Kim 
432*a88e22b7SJung-uk Kim     /* Allow several different types of value separators */
433*a88e22b7SJung-uk Kim 
434*a88e22b7SJung-uk Kim     StringValue = DtNormalizeBuffer (StringValue, &Count);
435*a88e22b7SJung-uk Kim 
436*a88e22b7SJung-uk Kim     Hex[2] = 0;
437*a88e22b7SJung-uk Kim     for (i = 0; i < Count; i++)
438*a88e22b7SJung-uk Kim     {
439*a88e22b7SJung-uk Kim         /* Each element of StringValue is three chars */
440*a88e22b7SJung-uk Kim 
441*a88e22b7SJung-uk Kim         Hex[0] = StringValue[(3 * i)];
442*a88e22b7SJung-uk Kim         Hex[1] = StringValue[(3 * i) + 1];
443*a88e22b7SJung-uk Kim 
444*a88e22b7SJung-uk Kim         /* Convert one hex byte */
445*a88e22b7SJung-uk Kim 
446*a88e22b7SJung-uk Kim         Value = 0;
447*a88e22b7SJung-uk Kim         Status = DtStrtoul64 (Hex, &Value);
448*a88e22b7SJung-uk Kim         if (ACPI_FAILURE (Status))
449*a88e22b7SJung-uk Kim         {
450*a88e22b7SJung-uk Kim             DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, MsgBuffer);
451*a88e22b7SJung-uk Kim             return (ByteLength - Count);
452*a88e22b7SJung-uk Kim         }
453*a88e22b7SJung-uk Kim 
454*a88e22b7SJung-uk Kim         Buffer[i] = (UINT8) Value;
455*a88e22b7SJung-uk Kim     }
456*a88e22b7SJung-uk Kim 
457*a88e22b7SJung-uk Kim     ACPI_FREE (StringValue);
458*a88e22b7SJung-uk Kim     return (ByteLength - Count);
459*a88e22b7SJung-uk Kim }
460*a88e22b7SJung-uk Kim 
461*a88e22b7SJung-uk Kim 
462*a88e22b7SJung-uk Kim /******************************************************************************
463*a88e22b7SJung-uk Kim  *
464*a88e22b7SJung-uk Kim  * FUNCTION:    DtCompileFlag
465*a88e22b7SJung-uk Kim  *
466*a88e22b7SJung-uk Kim  * PARAMETERS:  Buffer              - Output buffer
467*a88e22b7SJung-uk Kim  *              Field               - Field to be compiled
468*a88e22b7SJung-uk Kim  *              Info                - Flag info
469*a88e22b7SJung-uk Kim  *
470*a88e22b7SJung-uk Kim  * RETURN:
471*a88e22b7SJung-uk Kim  *
472*a88e22b7SJung-uk Kim  * DESCRIPTION: Compile a flag
473*a88e22b7SJung-uk Kim  *
474*a88e22b7SJung-uk Kim  *****************************************************************************/
475*a88e22b7SJung-uk Kim 
476*a88e22b7SJung-uk Kim void
477*a88e22b7SJung-uk Kim DtCompileFlag (
478*a88e22b7SJung-uk Kim     UINT8                   *Buffer,
479*a88e22b7SJung-uk Kim     DT_FIELD                *Field,
480*a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *Info)
481*a88e22b7SJung-uk Kim {
482*a88e22b7SJung-uk Kim     UINT64                  Value = 0;
483*a88e22b7SJung-uk Kim     UINT32                  BitLength = 1;
484*a88e22b7SJung-uk Kim     UINT8                   BitPosition = 0;
485*a88e22b7SJung-uk Kim     ACPI_STATUS             Status;
486*a88e22b7SJung-uk Kim 
487*a88e22b7SJung-uk Kim 
488*a88e22b7SJung-uk Kim     Status = DtStrtoul64 (Field->Value, &Value);
489*a88e22b7SJung-uk Kim     if (ACPI_FAILURE (Status))
490*a88e22b7SJung-uk Kim     {
491*a88e22b7SJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL);
492*a88e22b7SJung-uk Kim     }
493*a88e22b7SJung-uk Kim 
494*a88e22b7SJung-uk Kim     switch (Info->Opcode)
495*a88e22b7SJung-uk Kim     {
496*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG0:
497*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG1:
498*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG2:
499*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG3:
500*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG4:
501*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG5:
502*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG6:
503*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG7:
504*a88e22b7SJung-uk Kim 
505*a88e22b7SJung-uk Kim         BitPosition = Info->Opcode;
506*a88e22b7SJung-uk Kim         BitLength = 1;
507*a88e22b7SJung-uk Kim         break;
508*a88e22b7SJung-uk Kim 
509*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAGS0:
510*a88e22b7SJung-uk Kim 
511*a88e22b7SJung-uk Kim         BitPosition = 0;
512*a88e22b7SJung-uk Kim         BitLength = 2;
513*a88e22b7SJung-uk Kim         break;
514*a88e22b7SJung-uk Kim 
515*a88e22b7SJung-uk Kim 
516*a88e22b7SJung-uk Kim     case ACPI_DMT_FLAGS2:
517*a88e22b7SJung-uk Kim 
518*a88e22b7SJung-uk Kim         BitPosition = 2;
519*a88e22b7SJung-uk Kim         BitLength = 2;
520*a88e22b7SJung-uk Kim         break;
521*a88e22b7SJung-uk Kim 
522*a88e22b7SJung-uk Kim     default:
523*a88e22b7SJung-uk Kim 
524*a88e22b7SJung-uk Kim         DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode");
525*a88e22b7SJung-uk Kim         break;
526*a88e22b7SJung-uk Kim     }
527*a88e22b7SJung-uk Kim 
528*a88e22b7SJung-uk Kim     /* Check range of the input flag value */
529*a88e22b7SJung-uk Kim 
530*a88e22b7SJung-uk Kim     if (Value >= ((UINT64) 1 << BitLength))
531*a88e22b7SJung-uk Kim     {
532*a88e22b7SJung-uk Kim         sprintf (MsgBuffer, "Maximum %u bit", BitLength);
533*a88e22b7SJung-uk Kim         DtError (ASL_ERROR, ASL_MSG_FLAG_VALUE, Field, MsgBuffer);
534*a88e22b7SJung-uk Kim         Value = 0;
535*a88e22b7SJung-uk Kim     }
536*a88e22b7SJung-uk Kim 
537*a88e22b7SJung-uk Kim     *Buffer |= (UINT8) (Value << BitPosition);
538*a88e22b7SJung-uk Kim }
539