]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - 6/sys/contrib/dev/acpica/psutils.c
Clone Kip's Xen on stable/6 tree so that I can work on improving FreeBSD/amd64
[FreeBSD/FreeBSD.git] / 6 / sys / contrib / dev / acpica / psutils.c
1 /******************************************************************************
2  *
3  * Module Name: psutils - Parser miscellaneous utilities (Parser only)
4  *              $Revision: 58 $
5  *
6  *****************************************************************************/
7
8 /******************************************************************************
9  *
10  * 1. Copyright Notice
11  *
12  * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp.
13  * All rights reserved.
14  *
15  * 2. License
16  *
17  * 2.1. This is your license from Intel Corp. under its intellectual property
18  * rights.  You may have additional license terms from the party that provided
19  * you this software, covering your right to use that party's intellectual
20  * property rights.
21  *
22  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23  * copy of the source code appearing in this file ("Covered Code") an
24  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25  * base code distributed originally by Intel ("Original Intel Code") to copy,
26  * make derivatives, distribute, use and display any portion of the Covered
27  * Code in any form, with the right to sublicense such rights; and
28  *
29  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30  * license (with the right to sublicense), under only those claims of Intel
31  * patents that are infringed by the Original Intel Code, to make, use, sell,
32  * offer to sell, and import the Covered Code and derivative works thereof
33  * solely to the minimum extent necessary to exercise the above copyright
34  * license, and in no event shall the patent license extend to any additions
35  * to or modifications of the Original Intel Code.  No other license or right
36  * is granted directly or by implication, estoppel or otherwise;
37  *
38  * The above copyright and patent license is granted only if the following
39  * conditions are met:
40  *
41  * 3. Conditions
42  *
43  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44  * Redistribution of source code of any substantial portion of the Covered
45  * Code or modification with rights to further distribute source must include
46  * the above Copyright Notice, the above License, this list of Conditions,
47  * and the following Disclaimer and Export Compliance provision.  In addition,
48  * Licensee must cause all Covered Code to which Licensee contributes to
49  * contain a file documenting the changes Licensee made to create that Covered
50  * Code and the date of any change.  Licensee must include in that file the
51  * documentation of any changes made by any predecessor Licensee.  Licensee
52  * must include a prominent statement that the modification is derived,
53  * directly or indirectly, from Original Intel Code.
54  *
55  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56  * Redistribution of source code of any substantial portion of the Covered
57  * Code or modification without rights to further distribute source must
58  * include the following Disclaimer and Export Compliance provision in the
59  * documentation and/or other materials provided with distribution.  In
60  * addition, Licensee may not authorize further sublicense of source of any
61  * portion of the Covered Code, and must include terms to the effect that the
62  * license from Licensee to its licensee is limited to the intellectual
63  * property embodied in the software Licensee provides to its licensee, and
64  * not to intellectual property embodied in modifications its licensee may
65  * make.
66  *
67  * 3.3. Redistribution of Executable. Redistribution in executable form of any
68  * substantial portion of the Covered Code or modification must reproduce the
69  * above Copyright Notice, and the following Disclaimer and Export Compliance
70  * provision in the documentation and/or other materials provided with the
71  * distribution.
72  *
73  * 3.4. Intel retains all right, title, and interest in and to the Original
74  * Intel Code.
75  *
76  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77  * Intel shall be used in advertising or otherwise to promote the sale, use or
78  * other dealings in products derived from or relating to the Covered Code
79  * without prior written authorization from Intel.
80  *
81  * 4. Disclaimer and Export Compliance
82  *
83  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89  * PARTICULAR PURPOSE.
90  *
91  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98  * LIMITED REMEDY.
99  *
100  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101  * software or system incorporating such software without first obtaining any
102  * required license or other approval from the U. S. Department of Commerce or
103  * any other agency or department of the United States Government.  In the
104  * event Licensee exports any such software from the United States or
105  * re-exports any such software from a foreign destination, Licensee shall
106  * ensure that the distribution and export/re-export of the software is in
107  * compliance with all laws, regulations, orders, or other restrictions of the
108  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109  * any of its subsidiaries will export/re-export any technical data, process,
110  * software, or service, directly or indirectly, to any country for which the
111  * United States government or any agency thereof requires an export license,
112  * other governmental approval, or letter of assurance, without first obtaining
113  * such license, approval or letter.
114  *
115  *****************************************************************************/
116
117
118 #include <contrib/dev/acpica/acpi.h>
119 #include <contrib/dev/acpica/acparser.h>
120 #include <contrib/dev/acpica/amlcode.h>
121 #include <contrib/dev/acpica/acnamesp.h>
122
123 #define _COMPONENT          ACPI_PARSER
124         ACPI_MODULE_NAME    ("psutils")
125
126
127 /*******************************************************************************
128  *
129  * FUNCTION:    AcpiPsCreateScopeOp
130  *
131  * PARAMETERS:  None
132  *
133  * RETURN:      ScopeOp
134  *
135  * DESCRIPTION: Create a Scope and associated namepath op with the root name
136  *
137  ******************************************************************************/
138
139 ACPI_PARSE_OBJECT *
140 AcpiPsCreateScopeOp (
141     void)
142 {
143     ACPI_PARSE_OBJECT       *ScopeOp;
144
145
146     ScopeOp = AcpiPsAllocOp (AML_SCOPE_OP);
147     if (!ScopeOp)
148     {
149         return (NULL);
150     }
151
152
153     ScopeOp->Named.Name = ACPI_ROOT_NAME;
154     return (ScopeOp);
155 }
156
157
158 /*******************************************************************************
159  *
160  * FUNCTION:    AcpiPsInitOp
161  *
162  * PARAMETERS:  Op              - A newly allocated Op object
163  *              Opcode          - Opcode to store in the Op
164  *
165  * RETURN:      Status
166  *
167  * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
168  *              opcode
169  *
170  ******************************************************************************/
171
172 void
173 AcpiPsInitOp (
174     ACPI_PARSE_OBJECT       *Op,
175     UINT16                  Opcode)
176 {
177     ACPI_FUNCTION_ENTRY ();
178
179
180     Op->Common.DataType = ACPI_DESC_TYPE_PARSER;
181     Op->Common.AmlOpcode = Opcode;
182
183     ACPI_DISASM_ONLY_MEMBERS (ACPI_STRNCPY (Op->Common.AmlOpName,
184             (AcpiPsGetOpcodeInfo (Opcode))->Name, sizeof (Op->Common.AmlOpName)));
185 }
186
187
188 /*******************************************************************************
189  *
190  * FUNCTION:    AcpiPsAllocOp
191  *
192  * PARAMETERS:  Opcode          - Opcode that will be stored in the new Op
193  *
194  * RETURN:      Pointer to the new Op.
195  *
196  * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
197  *              opcode.  A cache of opcodes is available for the pure
198  *              GENERIC_OP, since this is by far the most commonly used.
199  *
200  ******************************************************************************/
201
202 ACPI_PARSE_OBJECT*
203 AcpiPsAllocOp (
204     UINT16                  Opcode)
205 {
206     ACPI_PARSE_OBJECT       *Op;
207     const ACPI_OPCODE_INFO  *OpInfo;
208     UINT8                   Flags = ACPI_PARSEOP_GENERIC;
209
210
211     ACPI_FUNCTION_ENTRY ();
212
213
214     OpInfo = AcpiPsGetOpcodeInfo (Opcode);
215
216     /* Determine type of ParseOp required */
217
218     if (OpInfo->Flags & AML_DEFER)
219     {
220         Flags = ACPI_PARSEOP_DEFERRED;
221     }
222     else if (OpInfo->Flags & AML_NAMED)
223     {
224         Flags = ACPI_PARSEOP_NAMED;
225     }
226     else if (Opcode == AML_INT_BYTELIST_OP)
227     {
228         Flags = ACPI_PARSEOP_BYTELIST;
229     }
230
231     /* Allocate the minimum required size object */
232
233     if (Flags == ACPI_PARSEOP_GENERIC)
234     {
235         /* The generic op (default) is by far the most common (16 to 1) */
236
237         Op = AcpiUtAcquireFromCache (ACPI_MEM_LIST_PSNODE);
238     }
239     else
240     {
241         /* Extended parseop */
242
243         Op = AcpiUtAcquireFromCache (ACPI_MEM_LIST_PSNODE_EXT);
244     }
245
246     /* Initialize the Op */
247
248     if (Op)
249     {
250         AcpiPsInitOp (Op, Opcode);
251         Op->Common.Flags = Flags;
252     }
253
254     return (Op);
255 }
256
257
258 /*******************************************************************************
259  *
260  * FUNCTION:    AcpiPsFreeOp
261  *
262  * PARAMETERS:  Op              - Op to be freed
263  *
264  * RETURN:      None.
265  *
266  * DESCRIPTION: Free an Op object.  Either put it on the GENERIC_OP cache list
267  *              or actually free it.
268  *
269  ******************************************************************************/
270
271 void
272 AcpiPsFreeOp (
273     ACPI_PARSE_OBJECT       *Op)
274 {
275     ACPI_FUNCTION_NAME ("PsFreeOp");
276
277
278     if (Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
279     {
280         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n", Op));
281     }
282
283     if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
284     {
285         AcpiUtReleaseToCache (ACPI_MEM_LIST_PSNODE, Op);
286     }
287     else
288     {
289         AcpiUtReleaseToCache (ACPI_MEM_LIST_PSNODE_EXT, Op);
290     }
291 }
292
293
294 /*******************************************************************************
295  *
296  * FUNCTION:    AcpiPsDeleteParseCache
297  *
298  * PARAMETERS:  None
299  *
300  * RETURN:      None
301  *
302  * DESCRIPTION: Free all objects that are on the parse cache list.
303  *
304  ******************************************************************************/
305
306 void
307 AcpiPsDeleteParseCache (
308     void)
309 {
310     ACPI_FUNCTION_TRACE ("PsDeleteParseCache");
311
312
313     AcpiUtDeleteGenericCache (ACPI_MEM_LIST_PSNODE);
314     AcpiUtDeleteGenericCache (ACPI_MEM_LIST_PSNODE_EXT);
315     return_VOID;
316 }
317
318
319 /*******************************************************************************
320  *
321  * FUNCTION:    Utility functions
322  *
323  * DESCRIPTION: Low level character and object functions
324  *
325  ******************************************************************************/
326
327
328 /*
329  * Is "c" a namestring lead character?
330  */
331 BOOLEAN
332 AcpiPsIsLeadingChar (
333     UINT32                  c)
334 {
335     return ((BOOLEAN) (c == '_' || (c >= 'A' && c <= 'Z')));
336 }
337
338
339 /*
340  * Is "c" a namestring prefix character?
341  */
342 BOOLEAN
343 AcpiPsIsPrefixChar (
344     UINT32                  c)
345 {
346     return ((BOOLEAN) (c == '\\' || c == '^'));
347 }
348
349
350 /*
351  * Get op's name (4-byte name segment) or 0 if unnamed
352  */
353 UINT32
354 AcpiPsGetName (
355     ACPI_PARSE_OBJECT       *Op)
356 {
357
358
359     /* The "generic" object has no name associated with it */
360
361     if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
362     {
363         return (0);
364     }
365
366     /* Only the "Extended" parse objects have a name */
367
368     return (Op->Named.Name);
369 }
370
371
372 /*
373  * Set op's name
374  */
375 void
376 AcpiPsSetName (
377     ACPI_PARSE_OBJECT       *Op,
378     UINT32                  name)
379 {
380
381     /* The "generic" object has no name associated with it */
382
383     if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
384     {
385         return;
386     }
387
388     Op->Named.Name = name;
389 }
390